elf32-hppa.c revision 1.4 1 1.1 skrll /* BFD back-end for HP PA-RISC ELF files.
2 1.1 skrll Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
3 1.3 christos 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 1.1 skrll Free Software Foundation, Inc.
5 1.1 skrll
6 1.1 skrll Original code by
7 1.1 skrll Center for Software Science
8 1.1 skrll Department of Computer Science
9 1.1 skrll University of Utah
10 1.1 skrll Largely rewritten by Alan Modra <alan (at) linuxcare.com.au>
11 1.1 skrll Naming cleanup by Carlos O'Donell <carlos (at) systemhalted.org>
12 1.1 skrll TLS support written by Randolph Chung <tausq (at) debian.org>
13 1.1 skrll
14 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
15 1.1 skrll
16 1.1 skrll This program is free software; you can redistribute it and/or modify
17 1.1 skrll it under the terms of the GNU General Public License as published by
18 1.1 skrll the Free Software Foundation; either version 3 of the License, or
19 1.1 skrll (at your option) any later version.
20 1.1 skrll
21 1.1 skrll This program is distributed in the hope that it will be useful,
22 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
23 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 1.1 skrll GNU General Public License for more details.
25 1.1 skrll
26 1.1 skrll You should have received a copy of the GNU General Public License
27 1.1 skrll along with this program; if not, write to the Free Software
28 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
29 1.1 skrll MA 02110-1301, USA. */
30 1.1 skrll
31 1.1 skrll #include "sysdep.h"
32 1.1 skrll #include "bfd.h"
33 1.1 skrll #include "libbfd.h"
34 1.1 skrll #include "elf-bfd.h"
35 1.1 skrll #include "elf/hppa.h"
36 1.1 skrll #include "libhppa.h"
37 1.1 skrll #include "elf32-hppa.h"
38 1.1 skrll #define ARCH_SIZE 32
39 1.1 skrll #include "elf32-hppa.h"
40 1.1 skrll #include "elf-hppa.h"
41 1.1 skrll
42 1.1 skrll /* In order to gain some understanding of code in this file without
43 1.1 skrll knowing all the intricate details of the linker, note the
44 1.1 skrll following:
45 1.1 skrll
46 1.1 skrll Functions named elf32_hppa_* are called by external routines, other
47 1.1 skrll functions are only called locally. elf32_hppa_* functions appear
48 1.1 skrll in this file more or less in the order in which they are called
49 1.1 skrll from external routines. eg. elf32_hppa_check_relocs is called
50 1.1 skrll early in the link process, elf32_hppa_finish_dynamic_sections is
51 1.1 skrll one of the last functions. */
52 1.1 skrll
53 1.1 skrll /* We use two hash tables to hold information for linking PA ELF objects.
54 1.1 skrll
55 1.1 skrll The first is the elf32_hppa_link_hash_table which is derived
56 1.1 skrll from the standard ELF linker hash table. We use this as a place to
57 1.1 skrll attach other hash tables and static information.
58 1.1 skrll
59 1.1 skrll The second is the stub hash table which is derived from the
60 1.1 skrll base BFD hash table. The stub hash table holds the information
61 1.1 skrll necessary to build the linker stubs during a link.
62 1.1 skrll
63 1.1 skrll There are a number of different stubs generated by the linker.
64 1.1 skrll
65 1.1 skrll Long branch stub:
66 1.1 skrll : ldil LR'X,%r1
67 1.1 skrll : be,n RR'X(%sr4,%r1)
68 1.1 skrll
69 1.1 skrll PIC long branch stub:
70 1.1 skrll : b,l .+8,%r1
71 1.1 skrll : addil LR'X - ($PIC_pcrel$0 - 4),%r1
72 1.1 skrll : be,n RR'X - ($PIC_pcrel$0 - 8)(%sr4,%r1)
73 1.1 skrll
74 1.1 skrll Import stub to call shared library routine from normal object file
75 1.1 skrll (single sub-space version)
76 1.1 skrll : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
77 1.1 skrll : ldw RR'lt_ptr+ltoff(%r1),%r21
78 1.1 skrll : bv %r0(%r21)
79 1.1 skrll : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
80 1.1 skrll
81 1.1 skrll Import stub to call shared library routine from shared library
82 1.1 skrll (single sub-space version)
83 1.1 skrll : addil LR'ltoff,%r19 ; get procedure entry point
84 1.1 skrll : ldw RR'ltoff(%r1),%r21
85 1.1 skrll : bv %r0(%r21)
86 1.1 skrll : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
87 1.1 skrll
88 1.1 skrll Import stub to call shared library routine from normal object file
89 1.1 skrll (multiple sub-space support)
90 1.1 skrll : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
91 1.1 skrll : ldw RR'lt_ptr+ltoff(%r1),%r21
92 1.1 skrll : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
93 1.1 skrll : ldsid (%r21),%r1
94 1.1 skrll : mtsp %r1,%sr0
95 1.1 skrll : be 0(%sr0,%r21) ; branch to target
96 1.1 skrll : stw %rp,-24(%sp) ; save rp
97 1.1 skrll
98 1.1 skrll Import stub to call shared library routine from shared library
99 1.1 skrll (multiple sub-space support)
100 1.1 skrll : addil LR'ltoff,%r19 ; get procedure entry point
101 1.1 skrll : ldw RR'ltoff(%r1),%r21
102 1.1 skrll : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
103 1.1 skrll : ldsid (%r21),%r1
104 1.1 skrll : mtsp %r1,%sr0
105 1.1 skrll : be 0(%sr0,%r21) ; branch to target
106 1.1 skrll : stw %rp,-24(%sp) ; save rp
107 1.1 skrll
108 1.1 skrll Export stub to return from shared lib routine (multiple sub-space support)
109 1.1 skrll One of these is created for each exported procedure in a shared
110 1.1 skrll library (and stored in the shared lib). Shared lib routines are
111 1.1 skrll called via the first instruction in the export stub so that we can
112 1.1 skrll do an inter-space return. Not required for single sub-space.
113 1.1 skrll : bl,n X,%rp ; trap the return
114 1.1 skrll : nop
115 1.1 skrll : ldw -24(%sp),%rp ; restore the original rp
116 1.1 skrll : ldsid (%rp),%r1
117 1.1 skrll : mtsp %r1,%sr0
118 1.1 skrll : be,n 0(%sr0,%rp) ; inter-space return. */
119 1.1 skrll
120 1.1 skrll
121 1.1 skrll /* Variable names follow a coding style.
122 1.1 skrll Please follow this (Apps Hungarian) style:
123 1.1 skrll
124 1.1 skrll Structure/Variable Prefix
125 1.1 skrll elf_link_hash_table "etab"
126 1.1 skrll elf_link_hash_entry "eh"
127 1.1 skrll
128 1.1 skrll elf32_hppa_link_hash_table "htab"
129 1.1 skrll elf32_hppa_link_hash_entry "hh"
130 1.1 skrll
131 1.1 skrll bfd_hash_table "btab"
132 1.1 skrll bfd_hash_entry "bh"
133 1.1 skrll
134 1.1 skrll bfd_hash_table containing stubs "bstab"
135 1.1 skrll elf32_hppa_stub_hash_entry "hsh"
136 1.1 skrll
137 1.1 skrll elf32_hppa_dyn_reloc_entry "hdh"
138 1.1 skrll
139 1.1 skrll Always remember to use GNU Coding Style. */
140 1.1 skrll
141 1.1 skrll #define PLT_ENTRY_SIZE 8
142 1.1 skrll #define GOT_ENTRY_SIZE 4
143 1.1 skrll #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
144 1.1 skrll
145 1.1 skrll static const bfd_byte plt_stub[] =
146 1.1 skrll {
147 1.1 skrll 0x0e, 0x80, 0x10, 0x96, /* 1: ldw 0(%r20),%r22 */
148 1.1 skrll 0xea, 0xc0, 0xc0, 0x00, /* bv %r0(%r22) */
149 1.1 skrll 0x0e, 0x88, 0x10, 0x95, /* ldw 4(%r20),%r21 */
150 1.1 skrll #define PLT_STUB_ENTRY (3*4)
151 1.1 skrll 0xea, 0x9f, 0x1f, 0xdd, /* b,l 1b,%r20 */
152 1.1 skrll 0xd6, 0x80, 0x1c, 0x1e, /* depi 0,31,2,%r20 */
153 1.1 skrll 0x00, 0xc0, 0xff, 0xee, /* 9: .word fixup_func */
154 1.1 skrll 0xde, 0xad, 0xbe, 0xef /* .word fixup_ltp */
155 1.1 skrll };
156 1.1 skrll
157 1.1 skrll /* Section name for stubs is the associated section name plus this
158 1.1 skrll string. */
159 1.1 skrll #define STUB_SUFFIX ".stub"
160 1.1 skrll
161 1.1 skrll /* We don't need to copy certain PC- or GP-relative dynamic relocs
162 1.1 skrll into a shared object's dynamic section. All the relocs of the
163 1.1 skrll limited class we are interested in, are absolute. */
164 1.1 skrll #ifndef RELATIVE_DYNRELOCS
165 1.1 skrll #define RELATIVE_DYNRELOCS 0
166 1.1 skrll #define IS_ABSOLUTE_RELOC(r_type) 1
167 1.1 skrll #endif
168 1.1 skrll
169 1.1 skrll /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
170 1.1 skrll copying dynamic variables from a shared lib into an app's dynbss
171 1.1 skrll section, and instead use a dynamic relocation to point into the
172 1.1 skrll shared lib. */
173 1.1 skrll #define ELIMINATE_COPY_RELOCS 1
174 1.1 skrll
175 1.1 skrll enum elf32_hppa_stub_type
176 1.1 skrll {
177 1.1 skrll hppa_stub_long_branch,
178 1.1 skrll hppa_stub_long_branch_shared,
179 1.1 skrll hppa_stub_import,
180 1.1 skrll hppa_stub_import_shared,
181 1.1 skrll hppa_stub_export,
182 1.1 skrll hppa_stub_none
183 1.1 skrll };
184 1.1 skrll
185 1.1 skrll struct elf32_hppa_stub_hash_entry
186 1.1 skrll {
187 1.1 skrll /* Base hash table entry structure. */
188 1.1 skrll struct bfd_hash_entry bh_root;
189 1.1 skrll
190 1.1 skrll /* The stub section. */
191 1.1 skrll asection *stub_sec;
192 1.1 skrll
193 1.1 skrll /* Offset within stub_sec of the beginning of this stub. */
194 1.1 skrll bfd_vma stub_offset;
195 1.1 skrll
196 1.1 skrll /* Given the symbol's value and its section we can determine its final
197 1.1 skrll value when building the stubs (so the stub knows where to jump. */
198 1.1 skrll bfd_vma target_value;
199 1.1 skrll asection *target_section;
200 1.1 skrll
201 1.1 skrll enum elf32_hppa_stub_type stub_type;
202 1.1 skrll
203 1.1 skrll /* The symbol table entry, if any, that this was derived from. */
204 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
205 1.1 skrll
206 1.1 skrll /* Where this stub is being called from, or, in the case of combined
207 1.1 skrll stub sections, the first input section in the group. */
208 1.1 skrll asection *id_sec;
209 1.1 skrll };
210 1.1 skrll
211 1.1 skrll struct elf32_hppa_link_hash_entry
212 1.1 skrll {
213 1.1 skrll struct elf_link_hash_entry eh;
214 1.1 skrll
215 1.1 skrll /* A pointer to the most recently used stub hash entry against this
216 1.1 skrll symbol. */
217 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh_cache;
218 1.1 skrll
219 1.1 skrll /* Used to count relocations for delayed sizing of relocation
220 1.1 skrll sections. */
221 1.1 skrll struct elf32_hppa_dyn_reloc_entry
222 1.1 skrll {
223 1.1 skrll /* Next relocation in the chain. */
224 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_next;
225 1.1 skrll
226 1.1 skrll /* The input section of the reloc. */
227 1.1 skrll asection *sec;
228 1.1 skrll
229 1.1 skrll /* Number of relocs copied in this section. */
230 1.1 skrll bfd_size_type count;
231 1.1 skrll
232 1.1 skrll #if RELATIVE_DYNRELOCS
233 1.1 skrll /* Number of relative relocs copied for the input section. */
234 1.1 skrll bfd_size_type relative_count;
235 1.1 skrll #endif
236 1.1 skrll } *dyn_relocs;
237 1.1 skrll
238 1.1 skrll enum
239 1.1 skrll {
240 1.1 skrll GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_GD = 2, GOT_TLS_LDM = 4, GOT_TLS_IE = 8
241 1.1 skrll } tls_type;
242 1.1 skrll
243 1.1 skrll /* Set if this symbol is used by a plabel reloc. */
244 1.1 skrll unsigned int plabel:1;
245 1.1 skrll };
246 1.1 skrll
247 1.1 skrll struct elf32_hppa_link_hash_table
248 1.1 skrll {
249 1.1 skrll /* The main hash table. */
250 1.1 skrll struct elf_link_hash_table etab;
251 1.1 skrll
252 1.1 skrll /* The stub hash table. */
253 1.1 skrll struct bfd_hash_table bstab;
254 1.1 skrll
255 1.1 skrll /* Linker stub bfd. */
256 1.1 skrll bfd *stub_bfd;
257 1.1 skrll
258 1.1 skrll /* Linker call-backs. */
259 1.1 skrll asection * (*add_stub_section) (const char *, asection *);
260 1.1 skrll void (*layout_sections_again) (void);
261 1.1 skrll
262 1.1 skrll /* Array to keep track of which stub sections have been created, and
263 1.1 skrll information on stub grouping. */
264 1.1 skrll struct map_stub
265 1.1 skrll {
266 1.1 skrll /* This is the section to which stubs in the group will be
267 1.1 skrll attached. */
268 1.1 skrll asection *link_sec;
269 1.1 skrll /* The stub section. */
270 1.1 skrll asection *stub_sec;
271 1.1 skrll } *stub_group;
272 1.1 skrll
273 1.1 skrll /* Assorted information used by elf32_hppa_size_stubs. */
274 1.1 skrll unsigned int bfd_count;
275 1.1 skrll int top_index;
276 1.1 skrll asection **input_list;
277 1.1 skrll Elf_Internal_Sym **all_local_syms;
278 1.1 skrll
279 1.1 skrll /* Short-cuts to get to dynamic linker sections. */
280 1.1 skrll asection *sgot;
281 1.1 skrll asection *srelgot;
282 1.1 skrll asection *splt;
283 1.1 skrll asection *srelplt;
284 1.1 skrll asection *sdynbss;
285 1.1 skrll asection *srelbss;
286 1.1 skrll
287 1.1 skrll /* Used during a final link to store the base of the text and data
288 1.1 skrll segments so that we can perform SEGREL relocations. */
289 1.1 skrll bfd_vma text_segment_base;
290 1.1 skrll bfd_vma data_segment_base;
291 1.1 skrll
292 1.1 skrll /* Whether we support multiple sub-spaces for shared libs. */
293 1.1 skrll unsigned int multi_subspace:1;
294 1.1 skrll
295 1.1 skrll /* Flags set when various size branches are detected. Used to
296 1.1 skrll select suitable defaults for the stub group size. */
297 1.1 skrll unsigned int has_12bit_branch:1;
298 1.1 skrll unsigned int has_17bit_branch:1;
299 1.1 skrll unsigned int has_22bit_branch:1;
300 1.1 skrll
301 1.1 skrll /* Set if we need a .plt stub to support lazy dynamic linking. */
302 1.1 skrll unsigned int need_plt_stub:1;
303 1.1 skrll
304 1.3 christos /* Small local sym cache. */
305 1.3 christos struct sym_cache sym_cache;
306 1.1 skrll
307 1.1 skrll /* Data for LDM relocations. */
308 1.1 skrll union
309 1.1 skrll {
310 1.1 skrll bfd_signed_vma refcount;
311 1.1 skrll bfd_vma offset;
312 1.1 skrll } tls_ldm_got;
313 1.1 skrll };
314 1.1 skrll
315 1.1 skrll /* Various hash macros and functions. */
316 1.1 skrll #define hppa_link_hash_table(p) \
317 1.3 christos (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
318 1.3 christos == HPPA32_ELF_DATA ? ((struct elf32_hppa_link_hash_table *) ((p)->hash)) : NULL)
319 1.1 skrll
320 1.1 skrll #define hppa_elf_hash_entry(ent) \
321 1.1 skrll ((struct elf32_hppa_link_hash_entry *)(ent))
322 1.1 skrll
323 1.1 skrll #define hppa_stub_hash_entry(ent) \
324 1.1 skrll ((struct elf32_hppa_stub_hash_entry *)(ent))
325 1.1 skrll
326 1.1 skrll #define hppa_stub_hash_lookup(table, string, create, copy) \
327 1.1 skrll ((struct elf32_hppa_stub_hash_entry *) \
328 1.1 skrll bfd_hash_lookup ((table), (string), (create), (copy)))
329 1.1 skrll
330 1.1 skrll #define hppa_elf_local_got_tls_type(abfd) \
331 1.1 skrll ((char *)(elf_local_got_offsets (abfd) + (elf_tdata (abfd)->symtab_hdr.sh_info * 2)))
332 1.1 skrll
333 1.1 skrll #define hh_name(hh) \
334 1.1 skrll (hh ? hh->eh.root.root.string : "<undef>")
335 1.1 skrll
336 1.1 skrll #define eh_name(eh) \
337 1.1 skrll (eh ? eh->root.root.string : "<undef>")
338 1.1 skrll
339 1.1 skrll /* Assorted hash table functions. */
340 1.1 skrll
341 1.1 skrll /* Initialize an entry in the stub hash table. */
342 1.1 skrll
343 1.1 skrll static struct bfd_hash_entry *
344 1.1 skrll stub_hash_newfunc (struct bfd_hash_entry *entry,
345 1.1 skrll struct bfd_hash_table *table,
346 1.1 skrll const char *string)
347 1.1 skrll {
348 1.1 skrll /* Allocate the structure if it has not already been allocated by a
349 1.1 skrll subclass. */
350 1.1 skrll if (entry == NULL)
351 1.1 skrll {
352 1.1 skrll entry = bfd_hash_allocate (table,
353 1.1 skrll sizeof (struct elf32_hppa_stub_hash_entry));
354 1.1 skrll if (entry == NULL)
355 1.1 skrll return entry;
356 1.1 skrll }
357 1.1 skrll
358 1.1 skrll /* Call the allocation method of the superclass. */
359 1.1 skrll entry = bfd_hash_newfunc (entry, table, string);
360 1.1 skrll if (entry != NULL)
361 1.1 skrll {
362 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
363 1.1 skrll
364 1.1 skrll /* Initialize the local fields. */
365 1.1 skrll hsh = hppa_stub_hash_entry (entry);
366 1.1 skrll hsh->stub_sec = NULL;
367 1.1 skrll hsh->stub_offset = 0;
368 1.1 skrll hsh->target_value = 0;
369 1.1 skrll hsh->target_section = NULL;
370 1.1 skrll hsh->stub_type = hppa_stub_long_branch;
371 1.1 skrll hsh->hh = NULL;
372 1.1 skrll hsh->id_sec = NULL;
373 1.1 skrll }
374 1.1 skrll
375 1.1 skrll return entry;
376 1.1 skrll }
377 1.1 skrll
378 1.1 skrll /* Initialize an entry in the link hash table. */
379 1.1 skrll
380 1.1 skrll static struct bfd_hash_entry *
381 1.1 skrll hppa_link_hash_newfunc (struct bfd_hash_entry *entry,
382 1.1 skrll struct bfd_hash_table *table,
383 1.1 skrll const char *string)
384 1.1 skrll {
385 1.1 skrll /* Allocate the structure if it has not already been allocated by a
386 1.1 skrll subclass. */
387 1.1 skrll if (entry == NULL)
388 1.1 skrll {
389 1.1 skrll entry = bfd_hash_allocate (table,
390 1.1 skrll sizeof (struct elf32_hppa_link_hash_entry));
391 1.1 skrll if (entry == NULL)
392 1.1 skrll return entry;
393 1.1 skrll }
394 1.1 skrll
395 1.1 skrll /* Call the allocation method of the superclass. */
396 1.1 skrll entry = _bfd_elf_link_hash_newfunc (entry, table, string);
397 1.1 skrll if (entry != NULL)
398 1.1 skrll {
399 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
400 1.1 skrll
401 1.1 skrll /* Initialize the local fields. */
402 1.1 skrll hh = hppa_elf_hash_entry (entry);
403 1.1 skrll hh->hsh_cache = NULL;
404 1.1 skrll hh->dyn_relocs = NULL;
405 1.1 skrll hh->plabel = 0;
406 1.1 skrll hh->tls_type = GOT_UNKNOWN;
407 1.1 skrll }
408 1.1 skrll
409 1.1 skrll return entry;
410 1.1 skrll }
411 1.1 skrll
412 1.1 skrll /* Create the derived linker hash table. The PA ELF port uses the derived
413 1.1 skrll hash table to keep information specific to the PA ELF linker (without
414 1.1 skrll using static variables). */
415 1.1 skrll
416 1.1 skrll static struct bfd_link_hash_table *
417 1.1 skrll elf32_hppa_link_hash_table_create (bfd *abfd)
418 1.1 skrll {
419 1.1 skrll struct elf32_hppa_link_hash_table *htab;
420 1.1 skrll bfd_size_type amt = sizeof (*htab);
421 1.1 skrll
422 1.1 skrll htab = bfd_malloc (amt);
423 1.1 skrll if (htab == NULL)
424 1.1 skrll return NULL;
425 1.1 skrll
426 1.1 skrll if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd, hppa_link_hash_newfunc,
427 1.3 christos sizeof (struct elf32_hppa_link_hash_entry),
428 1.3 christos HPPA32_ELF_DATA))
429 1.1 skrll {
430 1.1 skrll free (htab);
431 1.1 skrll return NULL;
432 1.1 skrll }
433 1.1 skrll
434 1.1 skrll /* Init the stub hash table too. */
435 1.1 skrll if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
436 1.1 skrll sizeof (struct elf32_hppa_stub_hash_entry)))
437 1.1 skrll return NULL;
438 1.1 skrll
439 1.1 skrll htab->stub_bfd = NULL;
440 1.1 skrll htab->add_stub_section = NULL;
441 1.1 skrll htab->layout_sections_again = NULL;
442 1.1 skrll htab->stub_group = NULL;
443 1.1 skrll htab->sgot = NULL;
444 1.1 skrll htab->srelgot = NULL;
445 1.1 skrll htab->splt = NULL;
446 1.1 skrll htab->srelplt = NULL;
447 1.1 skrll htab->sdynbss = NULL;
448 1.1 skrll htab->srelbss = NULL;
449 1.1 skrll htab->text_segment_base = (bfd_vma) -1;
450 1.1 skrll htab->data_segment_base = (bfd_vma) -1;
451 1.1 skrll htab->multi_subspace = 0;
452 1.1 skrll htab->has_12bit_branch = 0;
453 1.1 skrll htab->has_17bit_branch = 0;
454 1.1 skrll htab->has_22bit_branch = 0;
455 1.1 skrll htab->need_plt_stub = 0;
456 1.3 christos htab->sym_cache.abfd = NULL;
457 1.1 skrll htab->tls_ldm_got.refcount = 0;
458 1.1 skrll
459 1.1 skrll return &htab->etab.root;
460 1.1 skrll }
461 1.1 skrll
462 1.1 skrll /* Free the derived linker hash table. */
463 1.1 skrll
464 1.1 skrll static void
465 1.1 skrll elf32_hppa_link_hash_table_free (struct bfd_link_hash_table *btab)
466 1.1 skrll {
467 1.1 skrll struct elf32_hppa_link_hash_table *htab
468 1.1 skrll = (struct elf32_hppa_link_hash_table *) btab;
469 1.1 skrll
470 1.1 skrll bfd_hash_table_free (&htab->bstab);
471 1.1 skrll _bfd_generic_link_hash_table_free (btab);
472 1.1 skrll }
473 1.1 skrll
474 1.1 skrll /* Build a name for an entry in the stub hash table. */
475 1.1 skrll
476 1.1 skrll static char *
477 1.1 skrll hppa_stub_name (const asection *input_section,
478 1.1 skrll const asection *sym_sec,
479 1.1 skrll const struct elf32_hppa_link_hash_entry *hh,
480 1.1 skrll const Elf_Internal_Rela *rela)
481 1.1 skrll {
482 1.1 skrll char *stub_name;
483 1.1 skrll bfd_size_type len;
484 1.1 skrll
485 1.1 skrll if (hh)
486 1.1 skrll {
487 1.1 skrll len = 8 + 1 + strlen (hh_name (hh)) + 1 + 8 + 1;
488 1.1 skrll stub_name = bfd_malloc (len);
489 1.1 skrll if (stub_name != NULL)
490 1.1 skrll sprintf (stub_name, "%08x_%s+%x",
491 1.1 skrll input_section->id & 0xffffffff,
492 1.1 skrll hh_name (hh),
493 1.1 skrll (int) rela->r_addend & 0xffffffff);
494 1.1 skrll }
495 1.1 skrll else
496 1.1 skrll {
497 1.1 skrll len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
498 1.1 skrll stub_name = bfd_malloc (len);
499 1.1 skrll if (stub_name != NULL)
500 1.1 skrll sprintf (stub_name, "%08x_%x:%x+%x",
501 1.1 skrll input_section->id & 0xffffffff,
502 1.1 skrll sym_sec->id & 0xffffffff,
503 1.1 skrll (int) ELF32_R_SYM (rela->r_info) & 0xffffffff,
504 1.1 skrll (int) rela->r_addend & 0xffffffff);
505 1.1 skrll }
506 1.1 skrll return stub_name;
507 1.1 skrll }
508 1.1 skrll
509 1.1 skrll /* Look up an entry in the stub hash. Stub entries are cached because
510 1.1 skrll creating the stub name takes a bit of time. */
511 1.1 skrll
512 1.1 skrll static struct elf32_hppa_stub_hash_entry *
513 1.1 skrll hppa_get_stub_entry (const asection *input_section,
514 1.1 skrll const asection *sym_sec,
515 1.1 skrll struct elf32_hppa_link_hash_entry *hh,
516 1.1 skrll const Elf_Internal_Rela *rela,
517 1.1 skrll struct elf32_hppa_link_hash_table *htab)
518 1.1 skrll {
519 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh_entry;
520 1.1 skrll const asection *id_sec;
521 1.1 skrll
522 1.1 skrll /* If this input section is part of a group of sections sharing one
523 1.1 skrll stub section, then use the id of the first section in the group.
524 1.1 skrll Stub names need to include a section id, as there may well be
525 1.1 skrll more than one stub used to reach say, printf, and we need to
526 1.1 skrll distinguish between them. */
527 1.1 skrll id_sec = htab->stub_group[input_section->id].link_sec;
528 1.1 skrll
529 1.1 skrll if (hh != NULL && hh->hsh_cache != NULL
530 1.1 skrll && hh->hsh_cache->hh == hh
531 1.1 skrll && hh->hsh_cache->id_sec == id_sec)
532 1.1 skrll {
533 1.1 skrll hsh_entry = hh->hsh_cache;
534 1.1 skrll }
535 1.1 skrll else
536 1.1 skrll {
537 1.1 skrll char *stub_name;
538 1.1 skrll
539 1.1 skrll stub_name = hppa_stub_name (id_sec, sym_sec, hh, rela);
540 1.1 skrll if (stub_name == NULL)
541 1.1 skrll return NULL;
542 1.1 skrll
543 1.1 skrll hsh_entry = hppa_stub_hash_lookup (&htab->bstab,
544 1.1 skrll stub_name, FALSE, FALSE);
545 1.1 skrll if (hh != NULL)
546 1.1 skrll hh->hsh_cache = hsh_entry;
547 1.1 skrll
548 1.1 skrll free (stub_name);
549 1.1 skrll }
550 1.1 skrll
551 1.1 skrll return hsh_entry;
552 1.1 skrll }
553 1.1 skrll
554 1.1 skrll /* Add a new stub entry to the stub hash. Not all fields of the new
555 1.1 skrll stub entry are initialised. */
556 1.1 skrll
557 1.1 skrll static struct elf32_hppa_stub_hash_entry *
558 1.1 skrll hppa_add_stub (const char *stub_name,
559 1.1 skrll asection *section,
560 1.1 skrll struct elf32_hppa_link_hash_table *htab)
561 1.1 skrll {
562 1.1 skrll asection *link_sec;
563 1.1 skrll asection *stub_sec;
564 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
565 1.1 skrll
566 1.1 skrll link_sec = htab->stub_group[section->id].link_sec;
567 1.1 skrll stub_sec = htab->stub_group[section->id].stub_sec;
568 1.1 skrll if (stub_sec == NULL)
569 1.1 skrll {
570 1.1 skrll stub_sec = htab->stub_group[link_sec->id].stub_sec;
571 1.1 skrll if (stub_sec == NULL)
572 1.1 skrll {
573 1.1 skrll size_t namelen;
574 1.1 skrll bfd_size_type len;
575 1.1 skrll char *s_name;
576 1.1 skrll
577 1.1 skrll namelen = strlen (link_sec->name);
578 1.1 skrll len = namelen + sizeof (STUB_SUFFIX);
579 1.1 skrll s_name = bfd_alloc (htab->stub_bfd, len);
580 1.1 skrll if (s_name == NULL)
581 1.1 skrll return NULL;
582 1.1 skrll
583 1.1 skrll memcpy (s_name, link_sec->name, namelen);
584 1.1 skrll memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
585 1.1 skrll stub_sec = (*htab->add_stub_section) (s_name, link_sec);
586 1.1 skrll if (stub_sec == NULL)
587 1.1 skrll return NULL;
588 1.1 skrll htab->stub_group[link_sec->id].stub_sec = stub_sec;
589 1.1 skrll }
590 1.1 skrll htab->stub_group[section->id].stub_sec = stub_sec;
591 1.1 skrll }
592 1.1 skrll
593 1.1 skrll /* Enter this entry into the linker stub hash table. */
594 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab, stub_name,
595 1.1 skrll TRUE, FALSE);
596 1.1 skrll if (hsh == NULL)
597 1.1 skrll {
598 1.1 skrll (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
599 1.1 skrll section->owner,
600 1.1 skrll stub_name);
601 1.1 skrll return NULL;
602 1.1 skrll }
603 1.1 skrll
604 1.1 skrll hsh->stub_sec = stub_sec;
605 1.1 skrll hsh->stub_offset = 0;
606 1.1 skrll hsh->id_sec = link_sec;
607 1.1 skrll return hsh;
608 1.1 skrll }
609 1.1 skrll
610 1.1 skrll /* Determine the type of stub needed, if any, for a call. */
611 1.1 skrll
612 1.1 skrll static enum elf32_hppa_stub_type
613 1.1 skrll hppa_type_of_stub (asection *input_sec,
614 1.1 skrll const Elf_Internal_Rela *rela,
615 1.1 skrll struct elf32_hppa_link_hash_entry *hh,
616 1.1 skrll bfd_vma destination,
617 1.1 skrll struct bfd_link_info *info)
618 1.1 skrll {
619 1.1 skrll bfd_vma location;
620 1.1 skrll bfd_vma branch_offset;
621 1.1 skrll bfd_vma max_branch_offset;
622 1.1 skrll unsigned int r_type;
623 1.1 skrll
624 1.1 skrll if (hh != NULL
625 1.1 skrll && hh->eh.plt.offset != (bfd_vma) -1
626 1.1 skrll && hh->eh.dynindx != -1
627 1.1 skrll && !hh->plabel
628 1.1 skrll && (info->shared
629 1.1 skrll || !hh->eh.def_regular
630 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak))
631 1.1 skrll {
632 1.1 skrll /* We need an import stub. Decide between hppa_stub_import
633 1.1 skrll and hppa_stub_import_shared later. */
634 1.1 skrll return hppa_stub_import;
635 1.1 skrll }
636 1.1 skrll
637 1.1 skrll /* Determine where the call point is. */
638 1.1 skrll location = (input_sec->output_offset
639 1.1 skrll + input_sec->output_section->vma
640 1.1 skrll + rela->r_offset);
641 1.1 skrll
642 1.1 skrll branch_offset = destination - location - 8;
643 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
644 1.1 skrll
645 1.1 skrll /* Determine if a long branch stub is needed. parisc branch offsets
646 1.1 skrll are relative to the second instruction past the branch, ie. +8
647 1.1 skrll bytes on from the branch instruction location. The offset is
648 1.1 skrll signed and counts in units of 4 bytes. */
649 1.1 skrll if (r_type == (unsigned int) R_PARISC_PCREL17F)
650 1.1 skrll max_branch_offset = (1 << (17 - 1)) << 2;
651 1.1 skrll
652 1.1 skrll else if (r_type == (unsigned int) R_PARISC_PCREL12F)
653 1.1 skrll max_branch_offset = (1 << (12 - 1)) << 2;
654 1.1 skrll
655 1.1 skrll else /* R_PARISC_PCREL22F. */
656 1.1 skrll max_branch_offset = (1 << (22 - 1)) << 2;
657 1.1 skrll
658 1.1 skrll if (branch_offset + max_branch_offset >= 2*max_branch_offset)
659 1.1 skrll return hppa_stub_long_branch;
660 1.1 skrll
661 1.1 skrll return hppa_stub_none;
662 1.1 skrll }
663 1.1 skrll
664 1.1 skrll /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
665 1.1 skrll IN_ARG contains the link info pointer. */
666 1.1 skrll
667 1.1 skrll #define LDIL_R1 0x20200000 /* ldil LR'XXX,%r1 */
668 1.1 skrll #define BE_SR4_R1 0xe0202002 /* be,n RR'XXX(%sr4,%r1) */
669 1.1 skrll
670 1.1 skrll #define BL_R1 0xe8200000 /* b,l .+8,%r1 */
671 1.1 skrll #define ADDIL_R1 0x28200000 /* addil LR'XXX,%r1,%r1 */
672 1.1 skrll #define DEPI_R1 0xd4201c1e /* depi 0,31,2,%r1 */
673 1.1 skrll
674 1.1 skrll #define ADDIL_DP 0x2b600000 /* addil LR'XXX,%dp,%r1 */
675 1.1 skrll #define LDW_R1_R21 0x48350000 /* ldw RR'XXX(%sr0,%r1),%r21 */
676 1.1 skrll #define BV_R0_R21 0xeaa0c000 /* bv %r0(%r21) */
677 1.1 skrll #define LDW_R1_R19 0x48330000 /* ldw RR'XXX(%sr0,%r1),%r19 */
678 1.1 skrll
679 1.1 skrll #define ADDIL_R19 0x2a600000 /* addil LR'XXX,%r19,%r1 */
680 1.1 skrll #define LDW_R1_DP 0x483b0000 /* ldw RR'XXX(%sr0,%r1),%dp */
681 1.1 skrll
682 1.1 skrll #define LDSID_R21_R1 0x02a010a1 /* ldsid (%sr0,%r21),%r1 */
683 1.1 skrll #define MTSP_R1 0x00011820 /* mtsp %r1,%sr0 */
684 1.1 skrll #define BE_SR0_R21 0xe2a00000 /* be 0(%sr0,%r21) */
685 1.1 skrll #define STW_RP 0x6bc23fd1 /* stw %rp,-24(%sr0,%sp) */
686 1.1 skrll
687 1.1 skrll #define BL22_RP 0xe800a002 /* b,l,n XXX,%rp */
688 1.1 skrll #define BL_RP 0xe8400002 /* b,l,n XXX,%rp */
689 1.1 skrll #define NOP 0x08000240 /* nop */
690 1.1 skrll #define LDW_RP 0x4bc23fd1 /* ldw -24(%sr0,%sp),%rp */
691 1.1 skrll #define LDSID_RP_R1 0x004010a1 /* ldsid (%sr0,%rp),%r1 */
692 1.1 skrll #define BE_SR0_RP 0xe0400002 /* be,n 0(%sr0,%rp) */
693 1.1 skrll
694 1.1 skrll #ifndef R19_STUBS
695 1.1 skrll #define R19_STUBS 1
696 1.1 skrll #endif
697 1.1 skrll
698 1.1 skrll #if R19_STUBS
699 1.1 skrll #define LDW_R1_DLT LDW_R1_R19
700 1.1 skrll #else
701 1.1 skrll #define LDW_R1_DLT LDW_R1_DP
702 1.1 skrll #endif
703 1.1 skrll
704 1.1 skrll static bfd_boolean
705 1.1 skrll hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
706 1.1 skrll {
707 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
708 1.1 skrll struct bfd_link_info *info;
709 1.1 skrll struct elf32_hppa_link_hash_table *htab;
710 1.1 skrll asection *stub_sec;
711 1.1 skrll bfd *stub_bfd;
712 1.1 skrll bfd_byte *loc;
713 1.1 skrll bfd_vma sym_value;
714 1.1 skrll bfd_vma insn;
715 1.1 skrll bfd_vma off;
716 1.1 skrll int val;
717 1.1 skrll int size;
718 1.1 skrll
719 1.1 skrll /* Massage our args to the form they really have. */
720 1.1 skrll hsh = hppa_stub_hash_entry (bh);
721 1.1 skrll info = (struct bfd_link_info *)in_arg;
722 1.1 skrll
723 1.1 skrll htab = hppa_link_hash_table (info);
724 1.3 christos if (htab == NULL)
725 1.3 christos return FALSE;
726 1.3 christos
727 1.1 skrll stub_sec = hsh->stub_sec;
728 1.1 skrll
729 1.1 skrll /* Make a note of the offset within the stubs for this entry. */
730 1.1 skrll hsh->stub_offset = stub_sec->size;
731 1.1 skrll loc = stub_sec->contents + hsh->stub_offset;
732 1.1 skrll
733 1.1 skrll stub_bfd = stub_sec->owner;
734 1.1 skrll
735 1.1 skrll switch (hsh->stub_type)
736 1.1 skrll {
737 1.1 skrll case hppa_stub_long_branch:
738 1.1 skrll /* Create the long branch. A long branch is formed with "ldil"
739 1.1 skrll loading the upper bits of the target address into a register,
740 1.1 skrll then branching with "be" which adds in the lower bits.
741 1.1 skrll The "be" has its delay slot nullified. */
742 1.1 skrll sym_value = (hsh->target_value
743 1.1 skrll + hsh->target_section->output_offset
744 1.1 skrll + hsh->target_section->output_section->vma);
745 1.1 skrll
746 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_lrsel);
747 1.1 skrll insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
748 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
749 1.1 skrll
750 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_rrsel) >> 2;
751 1.1 skrll insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
752 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
753 1.1 skrll
754 1.1 skrll size = 8;
755 1.1 skrll break;
756 1.1 skrll
757 1.1 skrll case hppa_stub_long_branch_shared:
758 1.1 skrll /* Branches are relative. This is where we are going to. */
759 1.1 skrll sym_value = (hsh->target_value
760 1.1 skrll + hsh->target_section->output_offset
761 1.1 skrll + hsh->target_section->output_section->vma);
762 1.1 skrll
763 1.1 skrll /* And this is where we are coming from, more or less. */
764 1.1 skrll sym_value -= (hsh->stub_offset
765 1.1 skrll + stub_sec->output_offset
766 1.1 skrll + stub_sec->output_section->vma);
767 1.1 skrll
768 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BL_R1, loc);
769 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_lrsel);
770 1.1 skrll insn = hppa_rebuild_insn ((int) ADDIL_R1, val, 21);
771 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
772 1.1 skrll
773 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_rrsel) >> 2;
774 1.1 skrll insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
775 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 8);
776 1.1 skrll size = 12;
777 1.1 skrll break;
778 1.1 skrll
779 1.1 skrll case hppa_stub_import:
780 1.1 skrll case hppa_stub_import_shared:
781 1.1 skrll off = hsh->hh->eh.plt.offset;
782 1.1 skrll if (off >= (bfd_vma) -2)
783 1.1 skrll abort ();
784 1.1 skrll
785 1.1 skrll off &= ~ (bfd_vma) 1;
786 1.1 skrll sym_value = (off
787 1.1 skrll + htab->splt->output_offset
788 1.1 skrll + htab->splt->output_section->vma
789 1.1 skrll - elf_gp (htab->splt->output_section->owner));
790 1.1 skrll
791 1.1 skrll insn = ADDIL_DP;
792 1.1 skrll #if R19_STUBS
793 1.1 skrll if (hsh->stub_type == hppa_stub_import_shared)
794 1.1 skrll insn = ADDIL_R19;
795 1.1 skrll #endif
796 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_lrsel),
797 1.1 skrll insn = hppa_rebuild_insn ((int) insn, val, 21);
798 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
799 1.1 skrll
800 1.1 skrll /* It is critical to use lrsel/rrsel here because we are using
801 1.1 skrll two different offsets (+0 and +4) from sym_value. If we use
802 1.1 skrll lsel/rsel then with unfortunate sym_values we will round
803 1.1 skrll sym_value+4 up to the next 2k block leading to a mis-match
804 1.1 skrll between the lsel and rsel value. */
805 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_rrsel);
806 1.1 skrll insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14);
807 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
808 1.1 skrll
809 1.1 skrll if (htab->multi_subspace)
810 1.1 skrll {
811 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
812 1.1 skrll insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
813 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 8);
814 1.1 skrll
815 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDSID_R21_R1, loc + 12);
816 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
817 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_R21, loc + 20);
818 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) STW_RP, loc + 24);
819 1.1 skrll
820 1.1 skrll size = 28;
821 1.1 skrll }
822 1.1 skrll else
823 1.1 skrll {
824 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BV_R0_R21, loc + 8);
825 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
826 1.1 skrll insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
827 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 12);
828 1.1 skrll
829 1.1 skrll size = 16;
830 1.1 skrll }
831 1.1 skrll
832 1.1 skrll break;
833 1.1 skrll
834 1.1 skrll case hppa_stub_export:
835 1.1 skrll /* Branches are relative. This is where we are going to. */
836 1.1 skrll sym_value = (hsh->target_value
837 1.1 skrll + hsh->target_section->output_offset
838 1.1 skrll + hsh->target_section->output_section->vma);
839 1.1 skrll
840 1.1 skrll /* And this is where we are coming from. */
841 1.1 skrll sym_value -= (hsh->stub_offset
842 1.1 skrll + stub_sec->output_offset
843 1.1 skrll + stub_sec->output_section->vma);
844 1.1 skrll
845 1.1 skrll if (sym_value - 8 + (1 << (17 + 1)) >= (1 << (17 + 2))
846 1.1 skrll && (!htab->has_22bit_branch
847 1.1 skrll || sym_value - 8 + (1 << (22 + 1)) >= (1 << (22 + 2))))
848 1.1 skrll {
849 1.1 skrll (*_bfd_error_handler)
850 1.1 skrll (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
851 1.1 skrll hsh->target_section->owner,
852 1.1 skrll stub_sec,
853 1.1 skrll (long) hsh->stub_offset,
854 1.1 skrll hsh->bh_root.string);
855 1.1 skrll bfd_set_error (bfd_error_bad_value);
856 1.1 skrll return FALSE;
857 1.1 skrll }
858 1.1 skrll
859 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_fsel) >> 2;
860 1.1 skrll if (!htab->has_22bit_branch)
861 1.1 skrll insn = hppa_rebuild_insn ((int) BL_RP, val, 17);
862 1.1 skrll else
863 1.1 skrll insn = hppa_rebuild_insn ((int) BL22_RP, val, 22);
864 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
865 1.1 skrll
866 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) NOP, loc + 4);
867 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDW_RP, loc + 8);
868 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDSID_RP_R1, loc + 12);
869 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
870 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_RP, loc + 20);
871 1.1 skrll
872 1.1 skrll /* Point the function symbol at the stub. */
873 1.1 skrll hsh->hh->eh.root.u.def.section = stub_sec;
874 1.1 skrll hsh->hh->eh.root.u.def.value = stub_sec->size;
875 1.1 skrll
876 1.1 skrll size = 24;
877 1.1 skrll break;
878 1.1 skrll
879 1.1 skrll default:
880 1.1 skrll BFD_FAIL ();
881 1.1 skrll return FALSE;
882 1.1 skrll }
883 1.1 skrll
884 1.1 skrll stub_sec->size += size;
885 1.1 skrll return TRUE;
886 1.1 skrll }
887 1.1 skrll
888 1.1 skrll #undef LDIL_R1
889 1.1 skrll #undef BE_SR4_R1
890 1.1 skrll #undef BL_R1
891 1.1 skrll #undef ADDIL_R1
892 1.1 skrll #undef DEPI_R1
893 1.1 skrll #undef LDW_R1_R21
894 1.1 skrll #undef LDW_R1_DLT
895 1.1 skrll #undef LDW_R1_R19
896 1.1 skrll #undef ADDIL_R19
897 1.1 skrll #undef LDW_R1_DP
898 1.1 skrll #undef LDSID_R21_R1
899 1.1 skrll #undef MTSP_R1
900 1.1 skrll #undef BE_SR0_R21
901 1.1 skrll #undef STW_RP
902 1.1 skrll #undef BV_R0_R21
903 1.1 skrll #undef BL_RP
904 1.1 skrll #undef NOP
905 1.1 skrll #undef LDW_RP
906 1.1 skrll #undef LDSID_RP_R1
907 1.1 skrll #undef BE_SR0_RP
908 1.1 skrll
909 1.1 skrll /* As above, but don't actually build the stub. Just bump offset so
910 1.1 skrll we know stub section sizes. */
911 1.1 skrll
912 1.1 skrll static bfd_boolean
913 1.1 skrll hppa_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
914 1.1 skrll {
915 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
916 1.1 skrll struct elf32_hppa_link_hash_table *htab;
917 1.1 skrll int size;
918 1.1 skrll
919 1.1 skrll /* Massage our args to the form they really have. */
920 1.1 skrll hsh = hppa_stub_hash_entry (bh);
921 1.1 skrll htab = in_arg;
922 1.1 skrll
923 1.1 skrll if (hsh->stub_type == hppa_stub_long_branch)
924 1.1 skrll size = 8;
925 1.1 skrll else if (hsh->stub_type == hppa_stub_long_branch_shared)
926 1.1 skrll size = 12;
927 1.1 skrll else if (hsh->stub_type == hppa_stub_export)
928 1.1 skrll size = 24;
929 1.1 skrll else /* hppa_stub_import or hppa_stub_import_shared. */
930 1.1 skrll {
931 1.1 skrll if (htab->multi_subspace)
932 1.1 skrll size = 28;
933 1.1 skrll else
934 1.1 skrll size = 16;
935 1.1 skrll }
936 1.1 skrll
937 1.1 skrll hsh->stub_sec->size += size;
938 1.1 skrll return TRUE;
939 1.1 skrll }
940 1.1 skrll
941 1.1 skrll /* Return nonzero if ABFD represents an HPPA ELF32 file.
942 1.1 skrll Additionally we set the default architecture and machine. */
943 1.1 skrll
944 1.1 skrll static bfd_boolean
945 1.1 skrll elf32_hppa_object_p (bfd *abfd)
946 1.1 skrll {
947 1.1 skrll Elf_Internal_Ehdr * i_ehdrp;
948 1.1 skrll unsigned int flags;
949 1.1 skrll
950 1.1 skrll i_ehdrp = elf_elfheader (abfd);
951 1.1 skrll if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
952 1.1 skrll {
953 1.1 skrll /* GCC on hppa-linux produces binaries with OSABI=Linux,
954 1.1 skrll but the kernel produces corefiles with OSABI=SysV. */
955 1.1 skrll if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX &&
956 1.1 skrll i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
957 1.1 skrll return FALSE;
958 1.1 skrll }
959 1.1 skrll else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
960 1.1 skrll {
961 1.1 skrll /* GCC on hppa-netbsd produces binaries with OSABI=NetBSD,
962 1.1 skrll but the kernel produces corefiles with OSABI=SysV. */
963 1.1 skrll if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NETBSD &&
964 1.1 skrll i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
965 1.1 skrll return FALSE;
966 1.1 skrll }
967 1.1 skrll else
968 1.1 skrll {
969 1.1 skrll if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
970 1.1 skrll return FALSE;
971 1.1 skrll }
972 1.1 skrll
973 1.1 skrll flags = i_ehdrp->e_flags;
974 1.1 skrll switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
975 1.1 skrll {
976 1.1 skrll case EFA_PARISC_1_0:
977 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
978 1.1 skrll case EFA_PARISC_1_1:
979 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
980 1.1 skrll case EFA_PARISC_2_0:
981 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
982 1.1 skrll case EFA_PARISC_2_0 | EF_PARISC_WIDE:
983 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
984 1.1 skrll }
985 1.1 skrll return TRUE;
986 1.1 skrll }
987 1.1 skrll
988 1.1 skrll /* Create the .plt and .got sections, and set up our hash table
989 1.1 skrll short-cuts to various dynamic sections. */
990 1.1 skrll
991 1.1 skrll static bfd_boolean
992 1.1 skrll elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
993 1.1 skrll {
994 1.1 skrll struct elf32_hppa_link_hash_table *htab;
995 1.1 skrll struct elf_link_hash_entry *eh;
996 1.1 skrll
997 1.1 skrll /* Don't try to create the .plt and .got twice. */
998 1.1 skrll htab = hppa_link_hash_table (info);
999 1.3 christos if (htab == NULL)
1000 1.3 christos return FALSE;
1001 1.1 skrll if (htab->splt != NULL)
1002 1.1 skrll return TRUE;
1003 1.1 skrll
1004 1.1 skrll /* Call the generic code to do most of the work. */
1005 1.1 skrll if (! _bfd_elf_create_dynamic_sections (abfd, info))
1006 1.1 skrll return FALSE;
1007 1.1 skrll
1008 1.1 skrll htab->splt = bfd_get_section_by_name (abfd, ".plt");
1009 1.1 skrll htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
1010 1.1 skrll
1011 1.1 skrll htab->sgot = bfd_get_section_by_name (abfd, ".got");
1012 1.3 christos htab->srelgot = bfd_get_section_by_name (abfd, ".rela.got");
1013 1.1 skrll
1014 1.1 skrll htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
1015 1.1 skrll htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
1016 1.1 skrll
1017 1.1 skrll /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main
1018 1.1 skrll application, because __canonicalize_funcptr_for_compare needs it. */
1019 1.1 skrll eh = elf_hash_table (info)->hgot;
1020 1.1 skrll eh->forced_local = 0;
1021 1.1 skrll eh->other = STV_DEFAULT;
1022 1.1 skrll return bfd_elf_link_record_dynamic_symbol (info, eh);
1023 1.1 skrll }
1024 1.1 skrll
1025 1.1 skrll /* Copy the extra info we tack onto an elf_link_hash_entry. */
1026 1.1 skrll
1027 1.1 skrll static void
1028 1.1 skrll elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
1029 1.1 skrll struct elf_link_hash_entry *eh_dir,
1030 1.1 skrll struct elf_link_hash_entry *eh_ind)
1031 1.1 skrll {
1032 1.1 skrll struct elf32_hppa_link_hash_entry *hh_dir, *hh_ind;
1033 1.1 skrll
1034 1.1 skrll hh_dir = hppa_elf_hash_entry (eh_dir);
1035 1.1 skrll hh_ind = hppa_elf_hash_entry (eh_ind);
1036 1.1 skrll
1037 1.1 skrll if (hh_ind->dyn_relocs != NULL)
1038 1.1 skrll {
1039 1.1 skrll if (hh_dir->dyn_relocs != NULL)
1040 1.1 skrll {
1041 1.1 skrll struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1042 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
1043 1.1 skrll
1044 1.1 skrll /* Add reloc counts against the indirect sym to the direct sym
1045 1.1 skrll list. Merge any entries against the same section. */
1046 1.1 skrll for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
1047 1.1 skrll {
1048 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_q;
1049 1.1 skrll
1050 1.1 skrll for (hdh_q = hh_dir->dyn_relocs;
1051 1.1 skrll hdh_q != NULL;
1052 1.1 skrll hdh_q = hdh_q->hdh_next)
1053 1.1 skrll if (hdh_q->sec == hdh_p->sec)
1054 1.1 skrll {
1055 1.1 skrll #if RELATIVE_DYNRELOCS
1056 1.1 skrll hdh_q->relative_count += hdh_p->relative_count;
1057 1.1 skrll #endif
1058 1.1 skrll hdh_q->count += hdh_p->count;
1059 1.1 skrll *hdh_pp = hdh_p->hdh_next;
1060 1.1 skrll break;
1061 1.1 skrll }
1062 1.1 skrll if (hdh_q == NULL)
1063 1.1 skrll hdh_pp = &hdh_p->hdh_next;
1064 1.1 skrll }
1065 1.1 skrll *hdh_pp = hh_dir->dyn_relocs;
1066 1.1 skrll }
1067 1.1 skrll
1068 1.1 skrll hh_dir->dyn_relocs = hh_ind->dyn_relocs;
1069 1.1 skrll hh_ind->dyn_relocs = NULL;
1070 1.1 skrll }
1071 1.1 skrll
1072 1.1 skrll if (ELIMINATE_COPY_RELOCS
1073 1.1 skrll && eh_ind->root.type != bfd_link_hash_indirect
1074 1.1 skrll && eh_dir->dynamic_adjusted)
1075 1.1 skrll {
1076 1.1 skrll /* If called to transfer flags for a weakdef during processing
1077 1.1 skrll of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1078 1.1 skrll We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1079 1.1 skrll eh_dir->ref_dynamic |= eh_ind->ref_dynamic;
1080 1.1 skrll eh_dir->ref_regular |= eh_ind->ref_regular;
1081 1.1 skrll eh_dir->ref_regular_nonweak |= eh_ind->ref_regular_nonweak;
1082 1.1 skrll eh_dir->needs_plt |= eh_ind->needs_plt;
1083 1.1 skrll }
1084 1.1 skrll else
1085 1.1 skrll {
1086 1.1 skrll if (eh_ind->root.type == bfd_link_hash_indirect
1087 1.1 skrll && eh_dir->got.refcount <= 0)
1088 1.1 skrll {
1089 1.1 skrll hh_dir->tls_type = hh_ind->tls_type;
1090 1.1 skrll hh_ind->tls_type = GOT_UNKNOWN;
1091 1.1 skrll }
1092 1.1 skrll
1093 1.1 skrll _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
1094 1.1 skrll }
1095 1.1 skrll }
1096 1.1 skrll
1097 1.1 skrll static int
1098 1.1 skrll elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1099 1.1 skrll int r_type, int is_local ATTRIBUTE_UNUSED)
1100 1.1 skrll {
1101 1.1 skrll /* For now we don't support linker optimizations. */
1102 1.1 skrll return r_type;
1103 1.1 skrll }
1104 1.1 skrll
1105 1.3 christos /* Return a pointer to the local GOT, PLT and TLS reference counts
1106 1.3 christos for ABFD. Returns NULL if the storage allocation fails. */
1107 1.3 christos
1108 1.3 christos static bfd_signed_vma *
1109 1.3 christos hppa32_elf_local_refcounts (bfd *abfd)
1110 1.3 christos {
1111 1.3 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1112 1.3 christos bfd_signed_vma *local_refcounts;
1113 1.3 christos
1114 1.3 christos local_refcounts = elf_local_got_refcounts (abfd);
1115 1.3 christos if (local_refcounts == NULL)
1116 1.3 christos {
1117 1.3 christos bfd_size_type size;
1118 1.3 christos
1119 1.3 christos /* Allocate space for local GOT and PLT reference
1120 1.3 christos counts. Done this way to save polluting elf_obj_tdata
1121 1.3 christos with another target specific pointer. */
1122 1.3 christos size = symtab_hdr->sh_info;
1123 1.3 christos size *= 2 * sizeof (bfd_signed_vma);
1124 1.3 christos /* Add in space to store the local GOT TLS types. */
1125 1.3 christos size += symtab_hdr->sh_info;
1126 1.3 christos local_refcounts = bfd_zalloc (abfd, size);
1127 1.3 christos if (local_refcounts == NULL)
1128 1.3 christos return NULL;
1129 1.3 christos elf_local_got_refcounts (abfd) = local_refcounts;
1130 1.3 christos memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN,
1131 1.3 christos symtab_hdr->sh_info);
1132 1.3 christos }
1133 1.3 christos return local_refcounts;
1134 1.3 christos }
1135 1.3 christos
1136 1.3 christos
1137 1.1 skrll /* Look through the relocs for a section during the first phase, and
1138 1.1 skrll calculate needed space in the global offset table, procedure linkage
1139 1.1 skrll table, and dynamic reloc sections. At this point we haven't
1140 1.1 skrll necessarily read all the input files. */
1141 1.1 skrll
1142 1.1 skrll static bfd_boolean
1143 1.1 skrll elf32_hppa_check_relocs (bfd *abfd,
1144 1.1 skrll struct bfd_link_info *info,
1145 1.1 skrll asection *sec,
1146 1.1 skrll const Elf_Internal_Rela *relocs)
1147 1.1 skrll {
1148 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1149 1.1 skrll struct elf_link_hash_entry **eh_syms;
1150 1.1 skrll const Elf_Internal_Rela *rela;
1151 1.1 skrll const Elf_Internal_Rela *rela_end;
1152 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1153 1.1 skrll asection *sreloc;
1154 1.1 skrll int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
1155 1.1 skrll
1156 1.1 skrll if (info->relocatable)
1157 1.1 skrll return TRUE;
1158 1.1 skrll
1159 1.1 skrll htab = hppa_link_hash_table (info);
1160 1.3 christos if (htab == NULL)
1161 1.3 christos return FALSE;
1162 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1163 1.1 skrll eh_syms = elf_sym_hashes (abfd);
1164 1.1 skrll sreloc = NULL;
1165 1.1 skrll
1166 1.1 skrll rela_end = relocs + sec->reloc_count;
1167 1.1 skrll for (rela = relocs; rela < rela_end; rela++)
1168 1.1 skrll {
1169 1.1 skrll enum {
1170 1.1 skrll NEED_GOT = 1,
1171 1.1 skrll NEED_PLT = 2,
1172 1.1 skrll NEED_DYNREL = 4,
1173 1.1 skrll PLT_PLABEL = 8
1174 1.1 skrll };
1175 1.1 skrll
1176 1.1 skrll unsigned int r_symndx, r_type;
1177 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1178 1.1 skrll int need_entry = 0;
1179 1.1 skrll
1180 1.1 skrll r_symndx = ELF32_R_SYM (rela->r_info);
1181 1.1 skrll
1182 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
1183 1.1 skrll hh = NULL;
1184 1.1 skrll else
1185 1.1 skrll {
1186 1.1 skrll hh = hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1187 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
1188 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
1189 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1190 1.1 skrll }
1191 1.1 skrll
1192 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
1193 1.1 skrll r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1194 1.1 skrll
1195 1.1 skrll switch (r_type)
1196 1.1 skrll {
1197 1.1 skrll case R_PARISC_DLTIND14F:
1198 1.1 skrll case R_PARISC_DLTIND14R:
1199 1.1 skrll case R_PARISC_DLTIND21L:
1200 1.1 skrll /* This symbol requires a global offset table entry. */
1201 1.1 skrll need_entry = NEED_GOT;
1202 1.1 skrll break;
1203 1.1 skrll
1204 1.1 skrll case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1205 1.1 skrll case R_PARISC_PLABEL21L:
1206 1.1 skrll case R_PARISC_PLABEL32:
1207 1.1 skrll /* If the addend is non-zero, we break badly. */
1208 1.1 skrll if (rela->r_addend != 0)
1209 1.1 skrll abort ();
1210 1.1 skrll
1211 1.1 skrll /* If we are creating a shared library, then we need to
1212 1.1 skrll create a PLT entry for all PLABELs, because PLABELs with
1213 1.1 skrll local symbols may be passed via a pointer to another
1214 1.1 skrll object. Additionally, output a dynamic relocation
1215 1.1 skrll pointing to the PLT entry.
1216 1.1 skrll
1217 1.1 skrll For executables, the original 32-bit ABI allowed two
1218 1.1 skrll different styles of PLABELs (function pointers): For
1219 1.1 skrll global functions, the PLABEL word points into the .plt
1220 1.1 skrll two bytes past a (function address, gp) pair, and for
1221 1.1 skrll local functions the PLABEL points directly at the
1222 1.1 skrll function. The magic +2 for the first type allows us to
1223 1.1 skrll differentiate between the two. As you can imagine, this
1224 1.1 skrll is a real pain when it comes to generating code to call
1225 1.1 skrll functions indirectly or to compare function pointers.
1226 1.1 skrll We avoid the mess by always pointing a PLABEL into the
1227 1.1 skrll .plt, even for local functions. */
1228 1.1 skrll need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
1229 1.1 skrll break;
1230 1.1 skrll
1231 1.1 skrll case R_PARISC_PCREL12F:
1232 1.1 skrll htab->has_12bit_branch = 1;
1233 1.1 skrll goto branch_common;
1234 1.1 skrll
1235 1.1 skrll case R_PARISC_PCREL17C:
1236 1.1 skrll case R_PARISC_PCREL17F:
1237 1.1 skrll htab->has_17bit_branch = 1;
1238 1.1 skrll goto branch_common;
1239 1.1 skrll
1240 1.1 skrll case R_PARISC_PCREL22F:
1241 1.1 skrll htab->has_22bit_branch = 1;
1242 1.1 skrll branch_common:
1243 1.1 skrll /* Function calls might need to go through the .plt, and
1244 1.1 skrll might require long branch stubs. */
1245 1.1 skrll if (hh == NULL)
1246 1.1 skrll {
1247 1.1 skrll /* We know local syms won't need a .plt entry, and if
1248 1.1 skrll they need a long branch stub we can't guarantee that
1249 1.1 skrll we can reach the stub. So just flag an error later
1250 1.1 skrll if we're doing a shared link and find we need a long
1251 1.1 skrll branch stub. */
1252 1.1 skrll continue;
1253 1.1 skrll }
1254 1.1 skrll else
1255 1.1 skrll {
1256 1.1 skrll /* Global symbols will need a .plt entry if they remain
1257 1.1 skrll global, and in most cases won't need a long branch
1258 1.1 skrll stub. Unfortunately, we have to cater for the case
1259 1.1 skrll where a symbol is forced local by versioning, or due
1260 1.1 skrll to symbolic linking, and we lose the .plt entry. */
1261 1.1 skrll need_entry = NEED_PLT;
1262 1.1 skrll if (hh->eh.type == STT_PARISC_MILLI)
1263 1.1 skrll need_entry = 0;
1264 1.1 skrll }
1265 1.1 skrll break;
1266 1.1 skrll
1267 1.1 skrll case R_PARISC_SEGBASE: /* Used to set segment base. */
1268 1.1 skrll case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
1269 1.1 skrll case R_PARISC_PCREL14F: /* PC relative load/store. */
1270 1.1 skrll case R_PARISC_PCREL14R:
1271 1.1 skrll case R_PARISC_PCREL17R: /* External branches. */
1272 1.1 skrll case R_PARISC_PCREL21L: /* As above, and for load/store too. */
1273 1.1 skrll case R_PARISC_PCREL32:
1274 1.1 skrll /* We don't need to propagate the relocation if linking a
1275 1.1 skrll shared object since these are section relative. */
1276 1.1 skrll continue;
1277 1.1 skrll
1278 1.1 skrll case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1279 1.1 skrll case R_PARISC_DPREL14R:
1280 1.1 skrll case R_PARISC_DPREL21L:
1281 1.1 skrll if (info->shared)
1282 1.1 skrll {
1283 1.1 skrll (*_bfd_error_handler)
1284 1.1 skrll (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1285 1.1 skrll abfd,
1286 1.1 skrll elf_hppa_howto_table[r_type].name);
1287 1.1 skrll bfd_set_error (bfd_error_bad_value);
1288 1.1 skrll return FALSE;
1289 1.1 skrll }
1290 1.1 skrll /* Fall through. */
1291 1.1 skrll
1292 1.1 skrll case R_PARISC_DIR17F: /* Used for external branches. */
1293 1.1 skrll case R_PARISC_DIR17R:
1294 1.1 skrll case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1295 1.1 skrll case R_PARISC_DIR14R:
1296 1.1 skrll case R_PARISC_DIR21L: /* As above, and for ext branches too. */
1297 1.1 skrll case R_PARISC_DIR32: /* .word relocs. */
1298 1.1 skrll /* We may want to output a dynamic relocation later. */
1299 1.1 skrll need_entry = NEED_DYNREL;
1300 1.1 skrll break;
1301 1.1 skrll
1302 1.1 skrll /* This relocation describes the C++ object vtable hierarchy.
1303 1.1 skrll Reconstruct it for later use during GC. */
1304 1.1 skrll case R_PARISC_GNU_VTINHERIT:
1305 1.1 skrll if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1306 1.1 skrll return FALSE;
1307 1.1 skrll continue;
1308 1.1 skrll
1309 1.1 skrll /* This relocation describes which C++ vtable entries are actually
1310 1.1 skrll used. Record for later use during GC. */
1311 1.1 skrll case R_PARISC_GNU_VTENTRY:
1312 1.1 skrll BFD_ASSERT (hh != NULL);
1313 1.1 skrll if (hh != NULL
1314 1.1 skrll && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1315 1.1 skrll return FALSE;
1316 1.1 skrll continue;
1317 1.1 skrll
1318 1.1 skrll case R_PARISC_TLS_GD21L:
1319 1.1 skrll case R_PARISC_TLS_GD14R:
1320 1.1 skrll case R_PARISC_TLS_LDM21L:
1321 1.1 skrll case R_PARISC_TLS_LDM14R:
1322 1.1 skrll need_entry = NEED_GOT;
1323 1.1 skrll break;
1324 1.1 skrll
1325 1.1 skrll case R_PARISC_TLS_IE21L:
1326 1.1 skrll case R_PARISC_TLS_IE14R:
1327 1.1 skrll if (info->shared)
1328 1.1 skrll info->flags |= DF_STATIC_TLS;
1329 1.1 skrll need_entry = NEED_GOT;
1330 1.1 skrll break;
1331 1.1 skrll
1332 1.1 skrll default:
1333 1.1 skrll continue;
1334 1.1 skrll }
1335 1.1 skrll
1336 1.1 skrll /* Now carry out our orders. */
1337 1.1 skrll if (need_entry & NEED_GOT)
1338 1.1 skrll {
1339 1.1 skrll switch (r_type)
1340 1.1 skrll {
1341 1.1 skrll default:
1342 1.1 skrll tls_type = GOT_NORMAL;
1343 1.1 skrll break;
1344 1.1 skrll case R_PARISC_TLS_GD21L:
1345 1.1 skrll case R_PARISC_TLS_GD14R:
1346 1.1 skrll tls_type |= GOT_TLS_GD;
1347 1.1 skrll break;
1348 1.1 skrll case R_PARISC_TLS_LDM21L:
1349 1.1 skrll case R_PARISC_TLS_LDM14R:
1350 1.1 skrll tls_type |= GOT_TLS_LDM;
1351 1.1 skrll break;
1352 1.1 skrll case R_PARISC_TLS_IE21L:
1353 1.1 skrll case R_PARISC_TLS_IE14R:
1354 1.1 skrll tls_type |= GOT_TLS_IE;
1355 1.1 skrll break;
1356 1.1 skrll }
1357 1.1 skrll
1358 1.1 skrll /* Allocate space for a GOT entry, as well as a dynamic
1359 1.1 skrll relocation for this entry. */
1360 1.1 skrll if (htab->sgot == NULL)
1361 1.1 skrll {
1362 1.1 skrll if (htab->etab.dynobj == NULL)
1363 1.1 skrll htab->etab.dynobj = abfd;
1364 1.1 skrll if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1365 1.1 skrll return FALSE;
1366 1.1 skrll }
1367 1.1 skrll
1368 1.1 skrll if (r_type == R_PARISC_TLS_LDM21L
1369 1.1 skrll || r_type == R_PARISC_TLS_LDM14R)
1370 1.3 christos htab->tls_ldm_got.refcount += 1;
1371 1.1 skrll else
1372 1.1 skrll {
1373 1.1 skrll if (hh != NULL)
1374 1.1 skrll {
1375 1.1 skrll hh->eh.got.refcount += 1;
1376 1.1 skrll old_tls_type = hh->tls_type;
1377 1.1 skrll }
1378 1.1 skrll else
1379 1.1 skrll {
1380 1.1 skrll bfd_signed_vma *local_got_refcounts;
1381 1.1 skrll
1382 1.1 skrll /* This is a global offset table entry for a local symbol. */
1383 1.3 christos local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1384 1.1 skrll if (local_got_refcounts == NULL)
1385 1.3 christos return FALSE;
1386 1.1 skrll local_got_refcounts[r_symndx] += 1;
1387 1.1 skrll
1388 1.1 skrll old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1389 1.1 skrll }
1390 1.1 skrll
1391 1.1 skrll tls_type |= old_tls_type;
1392 1.1 skrll
1393 1.1 skrll if (old_tls_type != tls_type)
1394 1.1 skrll {
1395 1.1 skrll if (hh != NULL)
1396 1.1 skrll hh->tls_type = tls_type;
1397 1.1 skrll else
1398 1.1 skrll hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1399 1.1 skrll }
1400 1.1 skrll
1401 1.1 skrll }
1402 1.1 skrll }
1403 1.1 skrll
1404 1.1 skrll if (need_entry & NEED_PLT)
1405 1.1 skrll {
1406 1.1 skrll /* If we are creating a shared library, and this is a reloc
1407 1.1 skrll against a weak symbol or a global symbol in a dynamic
1408 1.1 skrll object, then we will be creating an import stub and a
1409 1.1 skrll .plt entry for the symbol. Similarly, on a normal link
1410 1.1 skrll to symbols defined in a dynamic object we'll need the
1411 1.1 skrll import stub and a .plt entry. We don't know yet whether
1412 1.1 skrll the symbol is defined or not, so make an entry anyway and
1413 1.1 skrll clean up later in adjust_dynamic_symbol. */
1414 1.1 skrll if ((sec->flags & SEC_ALLOC) != 0)
1415 1.1 skrll {
1416 1.1 skrll if (hh != NULL)
1417 1.1 skrll {
1418 1.1 skrll hh->eh.needs_plt = 1;
1419 1.1 skrll hh->eh.plt.refcount += 1;
1420 1.1 skrll
1421 1.1 skrll /* If this .plt entry is for a plabel, mark it so
1422 1.1 skrll that adjust_dynamic_symbol will keep the entry
1423 1.1 skrll even if it appears to be local. */
1424 1.1 skrll if (need_entry & PLT_PLABEL)
1425 1.1 skrll hh->plabel = 1;
1426 1.1 skrll }
1427 1.1 skrll else if (need_entry & PLT_PLABEL)
1428 1.1 skrll {
1429 1.1 skrll bfd_signed_vma *local_got_refcounts;
1430 1.1 skrll bfd_signed_vma *local_plt_refcounts;
1431 1.1 skrll
1432 1.3 christos local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1433 1.1 skrll if (local_got_refcounts == NULL)
1434 1.3 christos return FALSE;
1435 1.1 skrll local_plt_refcounts = (local_got_refcounts
1436 1.1 skrll + symtab_hdr->sh_info);
1437 1.1 skrll local_plt_refcounts[r_symndx] += 1;
1438 1.1 skrll }
1439 1.1 skrll }
1440 1.1 skrll }
1441 1.1 skrll
1442 1.1 skrll if (need_entry & NEED_DYNREL)
1443 1.1 skrll {
1444 1.1 skrll /* Flag this symbol as having a non-got, non-plt reference
1445 1.1 skrll so that we generate copy relocs if it turns out to be
1446 1.1 skrll dynamic. */
1447 1.1 skrll if (hh != NULL && !info->shared)
1448 1.1 skrll hh->eh.non_got_ref = 1;
1449 1.1 skrll
1450 1.1 skrll /* If we are creating a shared library then we need to copy
1451 1.1 skrll the reloc into the shared library. However, if we are
1452 1.1 skrll linking with -Bsymbolic, we need only copy absolute
1453 1.1 skrll relocs or relocs against symbols that are not defined in
1454 1.1 skrll an object we are including in the link. PC- or DP- or
1455 1.1 skrll DLT-relative relocs against any local sym or global sym
1456 1.1 skrll with DEF_REGULAR set, can be discarded. At this point we
1457 1.1 skrll have not seen all the input files, so it is possible that
1458 1.1 skrll DEF_REGULAR is not set now but will be set later (it is
1459 1.1 skrll never cleared). We account for that possibility below by
1460 1.1 skrll storing information in the dyn_relocs field of the
1461 1.1 skrll hash table entry.
1462 1.1 skrll
1463 1.1 skrll A similar situation to the -Bsymbolic case occurs when
1464 1.1 skrll creating shared libraries and symbol visibility changes
1465 1.1 skrll render the symbol local.
1466 1.1 skrll
1467 1.1 skrll As it turns out, all the relocs we will be creating here
1468 1.1 skrll are absolute, so we cannot remove them on -Bsymbolic
1469 1.1 skrll links or visibility changes anyway. A STUB_REL reloc
1470 1.1 skrll is absolute too, as in that case it is the reloc in the
1471 1.1 skrll stub we will be creating, rather than copying the PCREL
1472 1.1 skrll reloc in the branch.
1473 1.1 skrll
1474 1.1 skrll If on the other hand, we are creating an executable, we
1475 1.1 skrll may need to keep relocations for symbols satisfied by a
1476 1.1 skrll dynamic library if we manage to avoid copy relocs for the
1477 1.1 skrll symbol. */
1478 1.1 skrll if ((info->shared
1479 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
1480 1.1 skrll && (IS_ABSOLUTE_RELOC (r_type)
1481 1.1 skrll || (hh != NULL
1482 1.1 skrll && (!info->symbolic
1483 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak
1484 1.1 skrll || !hh->eh.def_regular))))
1485 1.1 skrll || (ELIMINATE_COPY_RELOCS
1486 1.1 skrll && !info->shared
1487 1.1 skrll && (sec->flags & SEC_ALLOC) != 0
1488 1.1 skrll && hh != NULL
1489 1.1 skrll && (hh->eh.root.type == bfd_link_hash_defweak
1490 1.1 skrll || !hh->eh.def_regular)))
1491 1.1 skrll {
1492 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
1493 1.1 skrll struct elf32_hppa_dyn_reloc_entry **hdh_head;
1494 1.1 skrll
1495 1.1 skrll /* Create a reloc section in dynobj and make room for
1496 1.1 skrll this reloc. */
1497 1.1 skrll if (sreloc == NULL)
1498 1.1 skrll {
1499 1.1 skrll if (htab->etab.dynobj == NULL)
1500 1.1 skrll htab->etab.dynobj = abfd;
1501 1.1 skrll
1502 1.3 christos sreloc = _bfd_elf_make_dynamic_reloc_section
1503 1.3 christos (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1504 1.3 christos
1505 1.1 skrll if (sreloc == NULL)
1506 1.1 skrll {
1507 1.3 christos bfd_set_error (bfd_error_bad_value);
1508 1.3 christos return FALSE;
1509 1.1 skrll }
1510 1.1 skrll }
1511 1.1 skrll
1512 1.1 skrll /* If this is a global symbol, we count the number of
1513 1.1 skrll relocations we need for this symbol. */
1514 1.1 skrll if (hh != NULL)
1515 1.1 skrll {
1516 1.1 skrll hdh_head = &hh->dyn_relocs;
1517 1.1 skrll }
1518 1.1 skrll else
1519 1.1 skrll {
1520 1.1 skrll /* Track dynamic relocs needed for local syms too.
1521 1.1 skrll We really need local syms available to do this
1522 1.1 skrll easily. Oh well. */
1523 1.1 skrll asection *sr;
1524 1.1 skrll void *vpp;
1525 1.3 christos Elf_Internal_Sym *isym;
1526 1.3 christos
1527 1.3 christos isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1528 1.3 christos abfd, r_symndx);
1529 1.3 christos if (isym == NULL)
1530 1.3 christos return FALSE;
1531 1.1 skrll
1532 1.3 christos sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1533 1.1 skrll if (sr == NULL)
1534 1.3 christos sr = sec;
1535 1.1 skrll
1536 1.1 skrll vpp = &elf_section_data (sr)->local_dynrel;
1537 1.1 skrll hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
1538 1.1 skrll }
1539 1.1 skrll
1540 1.1 skrll hdh_p = *hdh_head;
1541 1.1 skrll if (hdh_p == NULL || hdh_p->sec != sec)
1542 1.1 skrll {
1543 1.1 skrll hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1544 1.1 skrll if (hdh_p == NULL)
1545 1.1 skrll return FALSE;
1546 1.1 skrll hdh_p->hdh_next = *hdh_head;
1547 1.1 skrll *hdh_head = hdh_p;
1548 1.1 skrll hdh_p->sec = sec;
1549 1.1 skrll hdh_p->count = 0;
1550 1.1 skrll #if RELATIVE_DYNRELOCS
1551 1.1 skrll hdh_p->relative_count = 0;
1552 1.1 skrll #endif
1553 1.1 skrll }
1554 1.1 skrll
1555 1.1 skrll hdh_p->count += 1;
1556 1.1 skrll #if RELATIVE_DYNRELOCS
1557 1.1 skrll if (!IS_ABSOLUTE_RELOC (rtype))
1558 1.1 skrll hdh_p->relative_count += 1;
1559 1.1 skrll #endif
1560 1.1 skrll }
1561 1.1 skrll }
1562 1.1 skrll }
1563 1.1 skrll
1564 1.1 skrll return TRUE;
1565 1.1 skrll }
1566 1.1 skrll
1567 1.1 skrll /* Return the section that should be marked against garbage collection
1568 1.1 skrll for a given relocation. */
1569 1.1 skrll
1570 1.1 skrll static asection *
1571 1.1 skrll elf32_hppa_gc_mark_hook (asection *sec,
1572 1.1 skrll struct bfd_link_info *info,
1573 1.1 skrll Elf_Internal_Rela *rela,
1574 1.1 skrll struct elf_link_hash_entry *hh,
1575 1.1 skrll Elf_Internal_Sym *sym)
1576 1.1 skrll {
1577 1.1 skrll if (hh != NULL)
1578 1.1 skrll switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1579 1.1 skrll {
1580 1.1 skrll case R_PARISC_GNU_VTINHERIT:
1581 1.1 skrll case R_PARISC_GNU_VTENTRY:
1582 1.1 skrll return NULL;
1583 1.1 skrll }
1584 1.1 skrll
1585 1.1 skrll return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1586 1.1 skrll }
1587 1.1 skrll
1588 1.1 skrll /* Update the got and plt entry reference counts for the section being
1589 1.1 skrll removed. */
1590 1.1 skrll
1591 1.1 skrll static bfd_boolean
1592 1.1 skrll elf32_hppa_gc_sweep_hook (bfd *abfd,
1593 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED,
1594 1.1 skrll asection *sec,
1595 1.1 skrll const Elf_Internal_Rela *relocs)
1596 1.1 skrll {
1597 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1598 1.1 skrll struct elf_link_hash_entry **eh_syms;
1599 1.1 skrll bfd_signed_vma *local_got_refcounts;
1600 1.1 skrll bfd_signed_vma *local_plt_refcounts;
1601 1.1 skrll const Elf_Internal_Rela *rela, *relend;
1602 1.3 christos struct elf32_hppa_link_hash_table *htab;
1603 1.1 skrll
1604 1.1 skrll if (info->relocatable)
1605 1.1 skrll return TRUE;
1606 1.1 skrll
1607 1.3 christos htab = hppa_link_hash_table (info);
1608 1.3 christos if (htab == NULL)
1609 1.3 christos return FALSE;
1610 1.3 christos
1611 1.1 skrll elf_section_data (sec)->local_dynrel = NULL;
1612 1.1 skrll
1613 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1614 1.1 skrll eh_syms = elf_sym_hashes (abfd);
1615 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd);
1616 1.1 skrll local_plt_refcounts = local_got_refcounts;
1617 1.1 skrll if (local_plt_refcounts != NULL)
1618 1.1 skrll local_plt_refcounts += symtab_hdr->sh_info;
1619 1.1 skrll
1620 1.1 skrll relend = relocs + sec->reloc_count;
1621 1.1 skrll for (rela = relocs; rela < relend; rela++)
1622 1.1 skrll {
1623 1.1 skrll unsigned long r_symndx;
1624 1.1 skrll unsigned int r_type;
1625 1.1 skrll struct elf_link_hash_entry *eh = NULL;
1626 1.1 skrll
1627 1.1 skrll r_symndx = ELF32_R_SYM (rela->r_info);
1628 1.1 skrll if (r_symndx >= symtab_hdr->sh_info)
1629 1.1 skrll {
1630 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1631 1.1 skrll struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1632 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
1633 1.1 skrll
1634 1.1 skrll eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1635 1.1 skrll while (eh->root.type == bfd_link_hash_indirect
1636 1.1 skrll || eh->root.type == bfd_link_hash_warning)
1637 1.1 skrll eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1638 1.1 skrll hh = hppa_elf_hash_entry (eh);
1639 1.1 skrll
1640 1.1 skrll for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
1641 1.1 skrll if (hdh_p->sec == sec)
1642 1.1 skrll {
1643 1.1 skrll /* Everything must go for SEC. */
1644 1.1 skrll *hdh_pp = hdh_p->hdh_next;
1645 1.1 skrll break;
1646 1.1 skrll }
1647 1.1 skrll }
1648 1.1 skrll
1649 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
1650 1.1 skrll r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1651 1.1 skrll
1652 1.1 skrll switch (r_type)
1653 1.1 skrll {
1654 1.1 skrll case R_PARISC_DLTIND14F:
1655 1.1 skrll case R_PARISC_DLTIND14R:
1656 1.1 skrll case R_PARISC_DLTIND21L:
1657 1.1 skrll case R_PARISC_TLS_GD21L:
1658 1.1 skrll case R_PARISC_TLS_GD14R:
1659 1.1 skrll case R_PARISC_TLS_IE21L:
1660 1.1 skrll case R_PARISC_TLS_IE14R:
1661 1.1 skrll if (eh != NULL)
1662 1.1 skrll {
1663 1.1 skrll if (eh->got.refcount > 0)
1664 1.1 skrll eh->got.refcount -= 1;
1665 1.1 skrll }
1666 1.1 skrll else if (local_got_refcounts != NULL)
1667 1.1 skrll {
1668 1.1 skrll if (local_got_refcounts[r_symndx] > 0)
1669 1.1 skrll local_got_refcounts[r_symndx] -= 1;
1670 1.1 skrll }
1671 1.1 skrll break;
1672 1.1 skrll
1673 1.1 skrll case R_PARISC_TLS_LDM21L:
1674 1.1 skrll case R_PARISC_TLS_LDM14R:
1675 1.3 christos htab->tls_ldm_got.refcount -= 1;
1676 1.1 skrll break;
1677 1.1 skrll
1678 1.1 skrll case R_PARISC_PCREL12F:
1679 1.1 skrll case R_PARISC_PCREL17C:
1680 1.1 skrll case R_PARISC_PCREL17F:
1681 1.1 skrll case R_PARISC_PCREL22F:
1682 1.1 skrll if (eh != NULL)
1683 1.1 skrll {
1684 1.1 skrll if (eh->plt.refcount > 0)
1685 1.1 skrll eh->plt.refcount -= 1;
1686 1.1 skrll }
1687 1.1 skrll break;
1688 1.1 skrll
1689 1.1 skrll case R_PARISC_PLABEL14R:
1690 1.1 skrll case R_PARISC_PLABEL21L:
1691 1.1 skrll case R_PARISC_PLABEL32:
1692 1.1 skrll if (eh != NULL)
1693 1.1 skrll {
1694 1.1 skrll if (eh->plt.refcount > 0)
1695 1.1 skrll eh->plt.refcount -= 1;
1696 1.1 skrll }
1697 1.1 skrll else if (local_plt_refcounts != NULL)
1698 1.1 skrll {
1699 1.1 skrll if (local_plt_refcounts[r_symndx] > 0)
1700 1.1 skrll local_plt_refcounts[r_symndx] -= 1;
1701 1.1 skrll }
1702 1.1 skrll break;
1703 1.1 skrll
1704 1.1 skrll default:
1705 1.1 skrll break;
1706 1.1 skrll }
1707 1.1 skrll }
1708 1.1 skrll
1709 1.1 skrll return TRUE;
1710 1.1 skrll }
1711 1.1 skrll
1712 1.1 skrll /* Support for core dump NOTE sections. */
1713 1.1 skrll
1714 1.1 skrll static bfd_boolean
1715 1.1 skrll elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1716 1.1 skrll {
1717 1.1 skrll int offset;
1718 1.1 skrll size_t size;
1719 1.1 skrll
1720 1.1 skrll switch (note->descsz)
1721 1.1 skrll {
1722 1.1 skrll default:
1723 1.1 skrll return FALSE;
1724 1.1 skrll
1725 1.1 skrll case 396: /* Linux/hppa */
1726 1.1 skrll /* pr_cursig */
1727 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1728 1.1 skrll
1729 1.1 skrll /* pr_pid */
1730 1.3 christos elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
1731 1.1 skrll
1732 1.1 skrll /* pr_reg */
1733 1.1 skrll offset = 72;
1734 1.1 skrll size = 320;
1735 1.1 skrll
1736 1.1 skrll break;
1737 1.1 skrll }
1738 1.1 skrll
1739 1.1 skrll /* Make a ".reg/999" section. */
1740 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1741 1.1 skrll size, note->descpos + offset);
1742 1.1 skrll }
1743 1.1 skrll
1744 1.1 skrll static bfd_boolean
1745 1.1 skrll elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1746 1.1 skrll {
1747 1.1 skrll switch (note->descsz)
1748 1.1 skrll {
1749 1.1 skrll default:
1750 1.1 skrll return FALSE;
1751 1.1 skrll
1752 1.1 skrll case 124: /* Linux/hppa elf_prpsinfo. */
1753 1.1 skrll elf_tdata (abfd)->core_program
1754 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1755 1.1 skrll elf_tdata (abfd)->core_command
1756 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1757 1.1 skrll }
1758 1.1 skrll
1759 1.1 skrll /* Note that for some reason, a spurious space is tacked
1760 1.1 skrll onto the end of the args in some (at least one anyway)
1761 1.1 skrll implementations, so strip it off if it exists. */
1762 1.1 skrll {
1763 1.1 skrll char *command = elf_tdata (abfd)->core_command;
1764 1.1 skrll int n = strlen (command);
1765 1.1 skrll
1766 1.1 skrll if (0 < n && command[n - 1] == ' ')
1767 1.1 skrll command[n - 1] = '\0';
1768 1.1 skrll }
1769 1.1 skrll
1770 1.1 skrll return TRUE;
1771 1.1 skrll }
1772 1.1 skrll
1773 1.1 skrll /* Our own version of hide_symbol, so that we can keep plt entries for
1774 1.1 skrll plabels. */
1775 1.1 skrll
1776 1.1 skrll static void
1777 1.1 skrll elf32_hppa_hide_symbol (struct bfd_link_info *info,
1778 1.1 skrll struct elf_link_hash_entry *eh,
1779 1.1 skrll bfd_boolean force_local)
1780 1.1 skrll {
1781 1.1 skrll if (force_local)
1782 1.1 skrll {
1783 1.1 skrll eh->forced_local = 1;
1784 1.1 skrll if (eh->dynindx != -1)
1785 1.1 skrll {
1786 1.1 skrll eh->dynindx = -1;
1787 1.1 skrll _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1788 1.1 skrll eh->dynstr_index);
1789 1.1 skrll }
1790 1.1 skrll }
1791 1.1 skrll
1792 1.1 skrll if (! hppa_elf_hash_entry (eh)->plabel)
1793 1.1 skrll {
1794 1.1 skrll eh->needs_plt = 0;
1795 1.1 skrll eh->plt = elf_hash_table (info)->init_plt_refcount;
1796 1.1 skrll }
1797 1.1 skrll }
1798 1.1 skrll
1799 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a
1800 1.1 skrll regular object. The current definition is in some section of the
1801 1.1 skrll dynamic object, but we're not including those sections. We have to
1802 1.1 skrll change the definition to something the rest of the link can
1803 1.1 skrll understand. */
1804 1.1 skrll
1805 1.1 skrll static bfd_boolean
1806 1.1 skrll elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1807 1.1 skrll struct elf_link_hash_entry *eh)
1808 1.1 skrll {
1809 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1810 1.1 skrll asection *sec;
1811 1.1 skrll
1812 1.1 skrll /* If this is a function, put it in the procedure linkage table. We
1813 1.1 skrll will fill in the contents of the procedure linkage table later. */
1814 1.1 skrll if (eh->type == STT_FUNC
1815 1.1 skrll || eh->needs_plt)
1816 1.1 skrll {
1817 1.1 skrll if (eh->plt.refcount <= 0
1818 1.1 skrll || (eh->def_regular
1819 1.1 skrll && eh->root.type != bfd_link_hash_defweak
1820 1.1 skrll && ! hppa_elf_hash_entry (eh)->plabel
1821 1.1 skrll && (!info->shared || info->symbolic)))
1822 1.1 skrll {
1823 1.1 skrll /* The .plt entry is not needed when:
1824 1.1 skrll a) Garbage collection has removed all references to the
1825 1.1 skrll symbol, or
1826 1.1 skrll b) We know for certain the symbol is defined in this
1827 1.1 skrll object, and it's not a weak definition, nor is the symbol
1828 1.1 skrll used by a plabel relocation. Either this object is the
1829 1.1 skrll application or we are doing a shared symbolic link. */
1830 1.1 skrll
1831 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1832 1.1 skrll eh->needs_plt = 0;
1833 1.1 skrll }
1834 1.1 skrll
1835 1.1 skrll return TRUE;
1836 1.1 skrll }
1837 1.1 skrll else
1838 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1839 1.1 skrll
1840 1.1 skrll /* If this is a weak symbol, and there is a real definition, the
1841 1.1 skrll processor independent code will have arranged for us to see the
1842 1.1 skrll real definition first, and we can just use the same value. */
1843 1.1 skrll if (eh->u.weakdef != NULL)
1844 1.1 skrll {
1845 1.1 skrll if (eh->u.weakdef->root.type != bfd_link_hash_defined
1846 1.1 skrll && eh->u.weakdef->root.type != bfd_link_hash_defweak)
1847 1.1 skrll abort ();
1848 1.1 skrll eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1849 1.1 skrll eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1850 1.1 skrll if (ELIMINATE_COPY_RELOCS)
1851 1.1 skrll eh->non_got_ref = eh->u.weakdef->non_got_ref;
1852 1.1 skrll return TRUE;
1853 1.1 skrll }
1854 1.1 skrll
1855 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which
1856 1.1 skrll is not a function. */
1857 1.1 skrll
1858 1.1 skrll /* If we are creating a shared library, we must presume that the
1859 1.1 skrll only references to the symbol are via the global offset table.
1860 1.1 skrll For such cases we need not do anything here; the relocations will
1861 1.1 skrll be handled correctly by relocate_section. */
1862 1.1 skrll if (info->shared)
1863 1.1 skrll return TRUE;
1864 1.1 skrll
1865 1.1 skrll /* If there are no references to this symbol that do not use the
1866 1.1 skrll GOT, we don't need to generate a copy reloc. */
1867 1.1 skrll if (!eh->non_got_ref)
1868 1.1 skrll return TRUE;
1869 1.1 skrll
1870 1.1 skrll if (ELIMINATE_COPY_RELOCS)
1871 1.1 skrll {
1872 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1873 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
1874 1.1 skrll
1875 1.1 skrll hh = hppa_elf_hash_entry (eh);
1876 1.1 skrll for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
1877 1.1 skrll {
1878 1.1 skrll sec = hdh_p->sec->output_section;
1879 1.1 skrll if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1880 1.1 skrll break;
1881 1.1 skrll }
1882 1.1 skrll
1883 1.1 skrll /* If we didn't find any dynamic relocs in read-only sections, then
1884 1.1 skrll we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1885 1.1 skrll if (hdh_p == NULL)
1886 1.1 skrll {
1887 1.1 skrll eh->non_got_ref = 0;
1888 1.1 skrll return TRUE;
1889 1.1 skrll }
1890 1.1 skrll }
1891 1.1 skrll
1892 1.1 skrll if (eh->size == 0)
1893 1.1 skrll {
1894 1.1 skrll (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1895 1.1 skrll eh->root.root.string);
1896 1.1 skrll return TRUE;
1897 1.1 skrll }
1898 1.1 skrll
1899 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will
1900 1.1 skrll become part of the .bss section of the executable. There will be
1901 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic
1902 1.1 skrll object will contain position independent code, so all references
1903 1.1 skrll from the dynamic object to this symbol will go through the global
1904 1.1 skrll offset table. The dynamic linker will use the .dynsym entry to
1905 1.1 skrll determine the address it must put in the global offset table, so
1906 1.1 skrll both the dynamic object and the regular object will refer to the
1907 1.1 skrll same memory location for the variable. */
1908 1.1 skrll
1909 1.1 skrll htab = hppa_link_hash_table (info);
1910 1.3 christos if (htab == NULL)
1911 1.3 christos return FALSE;
1912 1.1 skrll
1913 1.1 skrll /* We must generate a COPY reloc to tell the dynamic linker to
1914 1.1 skrll copy the initial value out of the dynamic object and into the
1915 1.1 skrll runtime process image. */
1916 1.1 skrll if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
1917 1.1 skrll {
1918 1.1 skrll htab->srelbss->size += sizeof (Elf32_External_Rela);
1919 1.1 skrll eh->needs_copy = 1;
1920 1.1 skrll }
1921 1.1 skrll
1922 1.1 skrll sec = htab->sdynbss;
1923 1.1 skrll
1924 1.1 skrll return _bfd_elf_adjust_dynamic_copy (eh, sec);
1925 1.1 skrll }
1926 1.1 skrll
1927 1.1 skrll /* Allocate space in the .plt for entries that won't have relocations.
1928 1.1 skrll ie. plabel entries. */
1929 1.1 skrll
1930 1.1 skrll static bfd_boolean
1931 1.1 skrll allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1932 1.1 skrll {
1933 1.1 skrll struct bfd_link_info *info;
1934 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1935 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1936 1.1 skrll asection *sec;
1937 1.1 skrll
1938 1.1 skrll if (eh->root.type == bfd_link_hash_indirect)
1939 1.1 skrll return TRUE;
1940 1.1 skrll
1941 1.1 skrll if (eh->root.type == bfd_link_hash_warning)
1942 1.1 skrll eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1943 1.1 skrll
1944 1.1 skrll info = (struct bfd_link_info *) inf;
1945 1.1 skrll hh = hppa_elf_hash_entry (eh);
1946 1.1 skrll htab = hppa_link_hash_table (info);
1947 1.3 christos if (htab == NULL)
1948 1.3 christos return FALSE;
1949 1.3 christos
1950 1.1 skrll if (htab->etab.dynamic_sections_created
1951 1.1 skrll && eh->plt.refcount > 0)
1952 1.1 skrll {
1953 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
1954 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
1955 1.1 skrll if (eh->dynindx == -1
1956 1.1 skrll && !eh->forced_local
1957 1.1 skrll && eh->type != STT_PARISC_MILLI)
1958 1.1 skrll {
1959 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, eh))
1960 1.1 skrll return FALSE;
1961 1.1 skrll }
1962 1.1 skrll
1963 1.1 skrll if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
1964 1.1 skrll {
1965 1.1 skrll /* Allocate these later. From this point on, h->plabel
1966 1.1 skrll means that the plt entry is only used by a plabel.
1967 1.1 skrll We'll be using a normal plt entry for this symbol, so
1968 1.1 skrll clear the plabel indicator. */
1969 1.1 skrll
1970 1.1 skrll hh->plabel = 0;
1971 1.1 skrll }
1972 1.1 skrll else if (hh->plabel)
1973 1.1 skrll {
1974 1.1 skrll /* Make an entry in the .plt section for plabel references
1975 1.1 skrll that won't have a .plt entry for other reasons. */
1976 1.1 skrll sec = htab->splt;
1977 1.1 skrll eh->plt.offset = sec->size;
1978 1.1 skrll sec->size += PLT_ENTRY_SIZE;
1979 1.1 skrll }
1980 1.1 skrll else
1981 1.1 skrll {
1982 1.1 skrll /* No .plt entry needed. */
1983 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1984 1.1 skrll eh->needs_plt = 0;
1985 1.1 skrll }
1986 1.1 skrll }
1987 1.1 skrll else
1988 1.1 skrll {
1989 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1990 1.1 skrll eh->needs_plt = 0;
1991 1.1 skrll }
1992 1.1 skrll
1993 1.1 skrll return TRUE;
1994 1.1 skrll }
1995 1.1 skrll
1996 1.1 skrll /* Allocate space in .plt, .got and associated reloc sections for
1997 1.1 skrll global syms. */
1998 1.1 skrll
1999 1.1 skrll static bfd_boolean
2000 1.1 skrll allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2001 1.1 skrll {
2002 1.1 skrll struct bfd_link_info *info;
2003 1.1 skrll struct elf32_hppa_link_hash_table *htab;
2004 1.1 skrll asection *sec;
2005 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2006 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
2007 1.1 skrll
2008 1.1 skrll if (eh->root.type == bfd_link_hash_indirect)
2009 1.1 skrll return TRUE;
2010 1.1 skrll
2011 1.1 skrll if (eh->root.type == bfd_link_hash_warning)
2012 1.1 skrll eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2013 1.1 skrll
2014 1.1 skrll info = inf;
2015 1.1 skrll htab = hppa_link_hash_table (info);
2016 1.3 christos if (htab == NULL)
2017 1.3 christos return FALSE;
2018 1.3 christos
2019 1.1 skrll hh = hppa_elf_hash_entry (eh);
2020 1.1 skrll
2021 1.1 skrll if (htab->etab.dynamic_sections_created
2022 1.1 skrll && eh->plt.offset != (bfd_vma) -1
2023 1.1 skrll && !hh->plabel
2024 1.1 skrll && eh->plt.refcount > 0)
2025 1.1 skrll {
2026 1.1 skrll /* Make an entry in the .plt section. */
2027 1.1 skrll sec = htab->splt;
2028 1.1 skrll eh->plt.offset = sec->size;
2029 1.1 skrll sec->size += PLT_ENTRY_SIZE;
2030 1.1 skrll
2031 1.1 skrll /* We also need to make an entry in the .rela.plt section. */
2032 1.1 skrll htab->srelplt->size += sizeof (Elf32_External_Rela);
2033 1.1 skrll htab->need_plt_stub = 1;
2034 1.1 skrll }
2035 1.1 skrll
2036 1.1 skrll if (eh->got.refcount > 0)
2037 1.1 skrll {
2038 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
2039 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
2040 1.1 skrll if (eh->dynindx == -1
2041 1.1 skrll && !eh->forced_local
2042 1.1 skrll && eh->type != STT_PARISC_MILLI)
2043 1.1 skrll {
2044 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2045 1.1 skrll return FALSE;
2046 1.1 skrll }
2047 1.1 skrll
2048 1.1 skrll sec = htab->sgot;
2049 1.1 skrll eh->got.offset = sec->size;
2050 1.1 skrll sec->size += GOT_ENTRY_SIZE;
2051 1.1 skrll /* R_PARISC_TLS_GD* needs two GOT entries */
2052 1.1 skrll if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2053 1.1 skrll sec->size += GOT_ENTRY_SIZE * 2;
2054 1.1 skrll else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2055 1.1 skrll sec->size += GOT_ENTRY_SIZE;
2056 1.1 skrll if (htab->etab.dynamic_sections_created
2057 1.1 skrll && (info->shared
2058 1.1 skrll || (eh->dynindx != -1
2059 1.1 skrll && !eh->forced_local)))
2060 1.1 skrll {
2061 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
2062 1.1 skrll if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2063 1.1 skrll htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2064 1.1 skrll else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2065 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
2066 1.1 skrll }
2067 1.1 skrll }
2068 1.1 skrll else
2069 1.1 skrll eh->got.offset = (bfd_vma) -1;
2070 1.1 skrll
2071 1.1 skrll if (hh->dyn_relocs == NULL)
2072 1.1 skrll return TRUE;
2073 1.1 skrll
2074 1.1 skrll /* If this is a -Bsymbolic shared link, then we need to discard all
2075 1.1 skrll space allocated for dynamic pc-relative relocs against symbols
2076 1.1 skrll defined in a regular object. For the normal shared case, discard
2077 1.1 skrll space for relocs that have become local due to symbol visibility
2078 1.1 skrll changes. */
2079 1.1 skrll if (info->shared)
2080 1.1 skrll {
2081 1.1 skrll #if RELATIVE_DYNRELOCS
2082 1.1 skrll if (SYMBOL_CALLS_LOCAL (info, eh))
2083 1.1 skrll {
2084 1.1 skrll struct elf32_hppa_dyn_reloc_entry **hdh_pp;
2085 1.1 skrll
2086 1.1 skrll for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2087 1.1 skrll {
2088 1.1 skrll hdh_p->count -= hdh_p->relative_count;
2089 1.1 skrll hdh_p->relative_count = 0;
2090 1.1 skrll if (hdh_p->count == 0)
2091 1.1 skrll *hdh_pp = hdh_p->hdh_next;
2092 1.1 skrll else
2093 1.1 skrll hdh_pp = &hdh_p->hdh_next;
2094 1.1 skrll }
2095 1.1 skrll }
2096 1.1 skrll #endif
2097 1.1 skrll
2098 1.1 skrll /* Also discard relocs on undefined weak syms with non-default
2099 1.1 skrll visibility. */
2100 1.1 skrll if (hh->dyn_relocs != NULL
2101 1.1 skrll && eh->root.type == bfd_link_hash_undefweak)
2102 1.1 skrll {
2103 1.1 skrll if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2104 1.1 skrll hh->dyn_relocs = NULL;
2105 1.1 skrll
2106 1.1 skrll /* Make sure undefined weak symbols are output as a dynamic
2107 1.1 skrll symbol in PIEs. */
2108 1.1 skrll else if (eh->dynindx == -1
2109 1.1 skrll && !eh->forced_local)
2110 1.1 skrll {
2111 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2112 1.1 skrll return FALSE;
2113 1.1 skrll }
2114 1.1 skrll }
2115 1.1 skrll }
2116 1.1 skrll else
2117 1.1 skrll {
2118 1.1 skrll /* For the non-shared case, discard space for relocs against
2119 1.1 skrll symbols which turn out to need copy relocs or are not
2120 1.1 skrll dynamic. */
2121 1.1 skrll
2122 1.1 skrll if (!eh->non_got_ref
2123 1.1 skrll && ((ELIMINATE_COPY_RELOCS
2124 1.1 skrll && eh->def_dynamic
2125 1.1 skrll && !eh->def_regular)
2126 1.1 skrll || (htab->etab.dynamic_sections_created
2127 1.1 skrll && (eh->root.type == bfd_link_hash_undefweak
2128 1.1 skrll || eh->root.type == bfd_link_hash_undefined))))
2129 1.1 skrll {
2130 1.1 skrll /* Make sure this symbol is output as a dynamic symbol.
2131 1.1 skrll Undefined weak syms won't yet be marked as dynamic. */
2132 1.1 skrll if (eh->dynindx == -1
2133 1.1 skrll && !eh->forced_local
2134 1.1 skrll && eh->type != STT_PARISC_MILLI)
2135 1.1 skrll {
2136 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2137 1.1 skrll return FALSE;
2138 1.1 skrll }
2139 1.1 skrll
2140 1.1 skrll /* If that succeeded, we know we'll be keeping all the
2141 1.1 skrll relocs. */
2142 1.1 skrll if (eh->dynindx != -1)
2143 1.1 skrll goto keep;
2144 1.1 skrll }
2145 1.1 skrll
2146 1.1 skrll hh->dyn_relocs = NULL;
2147 1.1 skrll return TRUE;
2148 1.1 skrll
2149 1.1 skrll keep: ;
2150 1.1 skrll }
2151 1.1 skrll
2152 1.1 skrll /* Finally, allocate space. */
2153 1.1 skrll for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2154 1.1 skrll {
2155 1.1 skrll asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2156 1.1 skrll sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2157 1.1 skrll }
2158 1.1 skrll
2159 1.1 skrll return TRUE;
2160 1.1 skrll }
2161 1.1 skrll
2162 1.1 skrll /* This function is called via elf_link_hash_traverse to force
2163 1.1 skrll millicode symbols local so they do not end up as globals in the
2164 1.1 skrll dynamic symbol table. We ought to be able to do this in
2165 1.1 skrll adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2166 1.1 skrll for all dynamic symbols. Arguably, this is a bug in
2167 1.1 skrll elf_adjust_dynamic_symbol. */
2168 1.1 skrll
2169 1.1 skrll static bfd_boolean
2170 1.1 skrll clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2171 1.1 skrll struct bfd_link_info *info)
2172 1.1 skrll {
2173 1.1 skrll if (eh->root.type == bfd_link_hash_warning)
2174 1.1 skrll eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2175 1.1 skrll
2176 1.1 skrll if (eh->type == STT_PARISC_MILLI
2177 1.1 skrll && !eh->forced_local)
2178 1.1 skrll {
2179 1.1 skrll elf32_hppa_hide_symbol (info, eh, TRUE);
2180 1.1 skrll }
2181 1.1 skrll return TRUE;
2182 1.1 skrll }
2183 1.1 skrll
2184 1.1 skrll /* Find any dynamic relocs that apply to read-only sections. */
2185 1.1 skrll
2186 1.1 skrll static bfd_boolean
2187 1.1 skrll readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2188 1.1 skrll {
2189 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2190 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
2191 1.1 skrll
2192 1.1 skrll if (eh->root.type == bfd_link_hash_warning)
2193 1.1 skrll eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2194 1.1 skrll
2195 1.1 skrll hh = hppa_elf_hash_entry (eh);
2196 1.1 skrll for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2197 1.1 skrll {
2198 1.1 skrll asection *sec = hdh_p->sec->output_section;
2199 1.1 skrll
2200 1.1 skrll if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2201 1.1 skrll {
2202 1.1 skrll struct bfd_link_info *info = inf;
2203 1.1 skrll
2204 1.2 skrll if (info->warn_shared_textrel)
2205 1.2 skrll (*_bfd_error_handler)
2206 1.2 skrll (_("warning: dynamic relocation in readonly section `%s'"),
2207 1.2 skrll eh->root.root.string);
2208 1.1 skrll info->flags |= DF_TEXTREL;
2209 1.1 skrll
2210 1.1 skrll /* Not an error, just cut short the traversal. */
2211 1.1 skrll return FALSE;
2212 1.1 skrll }
2213 1.1 skrll }
2214 1.1 skrll return TRUE;
2215 1.1 skrll }
2216 1.1 skrll
2217 1.1 skrll /* Set the sizes of the dynamic sections. */
2218 1.1 skrll
2219 1.1 skrll static bfd_boolean
2220 1.1 skrll elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2221 1.1 skrll struct bfd_link_info *info)
2222 1.1 skrll {
2223 1.1 skrll struct elf32_hppa_link_hash_table *htab;
2224 1.1 skrll bfd *dynobj;
2225 1.1 skrll bfd *ibfd;
2226 1.1 skrll asection *sec;
2227 1.1 skrll bfd_boolean relocs;
2228 1.1 skrll
2229 1.1 skrll htab = hppa_link_hash_table (info);
2230 1.3 christos if (htab == NULL)
2231 1.3 christos return FALSE;
2232 1.3 christos
2233 1.1 skrll dynobj = htab->etab.dynobj;
2234 1.1 skrll if (dynobj == NULL)
2235 1.1 skrll abort ();
2236 1.1 skrll
2237 1.1 skrll if (htab->etab.dynamic_sections_created)
2238 1.1 skrll {
2239 1.1 skrll /* Set the contents of the .interp section to the interpreter. */
2240 1.1 skrll if (info->executable)
2241 1.1 skrll {
2242 1.1 skrll sec = bfd_get_section_by_name (dynobj, ".interp");
2243 1.1 skrll if (sec == NULL)
2244 1.1 skrll abort ();
2245 1.1 skrll sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2246 1.1 skrll sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2247 1.1 skrll }
2248 1.1 skrll
2249 1.1 skrll /* Force millicode symbols local. */
2250 1.1 skrll elf_link_hash_traverse (&htab->etab,
2251 1.1 skrll clobber_millicode_symbols,
2252 1.1 skrll info);
2253 1.1 skrll }
2254 1.1 skrll
2255 1.1 skrll /* Set up .got and .plt offsets for local syms, and space for local
2256 1.1 skrll dynamic relocs. */
2257 1.1 skrll for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2258 1.1 skrll {
2259 1.1 skrll bfd_signed_vma *local_got;
2260 1.1 skrll bfd_signed_vma *end_local_got;
2261 1.1 skrll bfd_signed_vma *local_plt;
2262 1.1 skrll bfd_signed_vma *end_local_plt;
2263 1.1 skrll bfd_size_type locsymcount;
2264 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2265 1.1 skrll asection *srel;
2266 1.1 skrll char *local_tls_type;
2267 1.1 skrll
2268 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2269 1.1 skrll continue;
2270 1.1 skrll
2271 1.1 skrll for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2272 1.1 skrll {
2273 1.1 skrll struct elf32_hppa_dyn_reloc_entry *hdh_p;
2274 1.1 skrll
2275 1.1 skrll for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2276 1.1 skrll elf_section_data (sec)->local_dynrel);
2277 1.1 skrll hdh_p != NULL;
2278 1.1 skrll hdh_p = hdh_p->hdh_next)
2279 1.1 skrll {
2280 1.1 skrll if (!bfd_is_abs_section (hdh_p->sec)
2281 1.1 skrll && bfd_is_abs_section (hdh_p->sec->output_section))
2282 1.1 skrll {
2283 1.1 skrll /* Input section has been discarded, either because
2284 1.1 skrll it is a copy of a linkonce section or due to
2285 1.1 skrll linker script /DISCARD/, so we'll be discarding
2286 1.1 skrll the relocs too. */
2287 1.1 skrll }
2288 1.1 skrll else if (hdh_p->count != 0)
2289 1.1 skrll {
2290 1.1 skrll srel = elf_section_data (hdh_p->sec)->sreloc;
2291 1.1 skrll srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2292 1.1 skrll if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2293 1.1 skrll info->flags |= DF_TEXTREL;
2294 1.1 skrll }
2295 1.1 skrll }
2296 1.1 skrll }
2297 1.1 skrll
2298 1.1 skrll local_got = elf_local_got_refcounts (ibfd);
2299 1.1 skrll if (!local_got)
2300 1.1 skrll continue;
2301 1.1 skrll
2302 1.1 skrll symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2303 1.1 skrll locsymcount = symtab_hdr->sh_info;
2304 1.1 skrll end_local_got = local_got + locsymcount;
2305 1.1 skrll local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2306 1.1 skrll sec = htab->sgot;
2307 1.1 skrll srel = htab->srelgot;
2308 1.1 skrll for (; local_got < end_local_got; ++local_got)
2309 1.1 skrll {
2310 1.1 skrll if (*local_got > 0)
2311 1.1 skrll {
2312 1.1 skrll *local_got = sec->size;
2313 1.1 skrll sec->size += GOT_ENTRY_SIZE;
2314 1.1 skrll if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2315 1.1 skrll sec->size += 2 * GOT_ENTRY_SIZE;
2316 1.1 skrll else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2317 1.1 skrll sec->size += GOT_ENTRY_SIZE;
2318 1.1 skrll if (info->shared)
2319 1.1 skrll {
2320 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2321 1.1 skrll if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2322 1.1 skrll srel->size += 2 * sizeof (Elf32_External_Rela);
2323 1.1 skrll else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2324 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2325 1.1 skrll }
2326 1.1 skrll }
2327 1.1 skrll else
2328 1.1 skrll *local_got = (bfd_vma) -1;
2329 1.1 skrll
2330 1.1 skrll ++local_tls_type;
2331 1.1 skrll }
2332 1.1 skrll
2333 1.1 skrll local_plt = end_local_got;
2334 1.1 skrll end_local_plt = local_plt + locsymcount;
2335 1.1 skrll if (! htab->etab.dynamic_sections_created)
2336 1.1 skrll {
2337 1.1 skrll /* Won't be used, but be safe. */
2338 1.1 skrll for (; local_plt < end_local_plt; ++local_plt)
2339 1.1 skrll *local_plt = (bfd_vma) -1;
2340 1.1 skrll }
2341 1.1 skrll else
2342 1.1 skrll {
2343 1.1 skrll sec = htab->splt;
2344 1.1 skrll srel = htab->srelplt;
2345 1.1 skrll for (; local_plt < end_local_plt; ++local_plt)
2346 1.1 skrll {
2347 1.1 skrll if (*local_plt > 0)
2348 1.1 skrll {
2349 1.1 skrll *local_plt = sec->size;
2350 1.1 skrll sec->size += PLT_ENTRY_SIZE;
2351 1.1 skrll if (info->shared)
2352 1.1 skrll srel->size += sizeof (Elf32_External_Rela);
2353 1.1 skrll }
2354 1.1 skrll else
2355 1.1 skrll *local_plt = (bfd_vma) -1;
2356 1.1 skrll }
2357 1.1 skrll }
2358 1.1 skrll }
2359 1.1 skrll
2360 1.1 skrll if (htab->tls_ldm_got.refcount > 0)
2361 1.1 skrll {
2362 1.1 skrll /* Allocate 2 got entries and 1 dynamic reloc for
2363 1.1 skrll R_PARISC_TLS_DTPMOD32 relocs. */
2364 1.1 skrll htab->tls_ldm_got.offset = htab->sgot->size;
2365 1.1 skrll htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2366 1.1 skrll htab->srelgot->size += sizeof (Elf32_External_Rela);
2367 1.1 skrll }
2368 1.1 skrll else
2369 1.1 skrll htab->tls_ldm_got.offset = -1;
2370 1.1 skrll
2371 1.1 skrll /* Do all the .plt entries without relocs first. The dynamic linker
2372 1.1 skrll uses the last .plt reloc to find the end of the .plt (and hence
2373 1.1 skrll the start of the .got) for lazy linking. */
2374 1.1 skrll elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2375 1.1 skrll
2376 1.1 skrll /* Allocate global sym .plt and .got entries, and space for global
2377 1.1 skrll sym dynamic relocs. */
2378 1.1 skrll elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2379 1.1 skrll
2380 1.1 skrll /* The check_relocs and adjust_dynamic_symbol entry points have
2381 1.1 skrll determined the sizes of the various dynamic sections. Allocate
2382 1.1 skrll memory for them. */
2383 1.1 skrll relocs = FALSE;
2384 1.1 skrll for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2385 1.1 skrll {
2386 1.1 skrll if ((sec->flags & SEC_LINKER_CREATED) == 0)
2387 1.1 skrll continue;
2388 1.1 skrll
2389 1.1 skrll if (sec == htab->splt)
2390 1.1 skrll {
2391 1.1 skrll if (htab->need_plt_stub)
2392 1.1 skrll {
2393 1.1 skrll /* Make space for the plt stub at the end of the .plt
2394 1.1 skrll section. We want this stub right at the end, up
2395 1.1 skrll against the .got section. */
2396 1.1 skrll int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2397 1.1 skrll int pltalign = bfd_section_alignment (dynobj, sec);
2398 1.1 skrll bfd_size_type mask;
2399 1.1 skrll
2400 1.1 skrll if (gotalign > pltalign)
2401 1.1 skrll bfd_set_section_alignment (dynobj, sec, gotalign);
2402 1.1 skrll mask = ((bfd_size_type) 1 << gotalign) - 1;
2403 1.1 skrll sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2404 1.1 skrll }
2405 1.1 skrll }
2406 1.1 skrll else if (sec == htab->sgot
2407 1.1 skrll || sec == htab->sdynbss)
2408 1.1 skrll ;
2409 1.1 skrll else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2410 1.1 skrll {
2411 1.1 skrll if (sec->size != 0)
2412 1.1 skrll {
2413 1.1 skrll /* Remember whether there are any reloc sections other
2414 1.1 skrll than .rela.plt. */
2415 1.1 skrll if (sec != htab->srelplt)
2416 1.1 skrll relocs = TRUE;
2417 1.1 skrll
2418 1.1 skrll /* We use the reloc_count field as a counter if we need
2419 1.1 skrll to copy relocs into the output file. */
2420 1.1 skrll sec->reloc_count = 0;
2421 1.1 skrll }
2422 1.1 skrll }
2423 1.1 skrll else
2424 1.1 skrll {
2425 1.1 skrll /* It's not one of our sections, so don't allocate space. */
2426 1.1 skrll continue;
2427 1.1 skrll }
2428 1.1 skrll
2429 1.1 skrll if (sec->size == 0)
2430 1.1 skrll {
2431 1.1 skrll /* If we don't need this section, strip it from the
2432 1.1 skrll output file. This is mostly to handle .rela.bss and
2433 1.1 skrll .rela.plt. We must create both sections in
2434 1.1 skrll create_dynamic_sections, because they must be created
2435 1.1 skrll before the linker maps input sections to output
2436 1.1 skrll sections. The linker does that before
2437 1.1 skrll adjust_dynamic_symbol is called, and it is that
2438 1.1 skrll function which decides whether anything needs to go
2439 1.1 skrll into these sections. */
2440 1.1 skrll sec->flags |= SEC_EXCLUDE;
2441 1.1 skrll continue;
2442 1.1 skrll }
2443 1.1 skrll
2444 1.1 skrll if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2445 1.1 skrll continue;
2446 1.1 skrll
2447 1.1 skrll /* Allocate memory for the section contents. Zero it, because
2448 1.1 skrll we may not fill in all the reloc sections. */
2449 1.1 skrll sec->contents = bfd_zalloc (dynobj, sec->size);
2450 1.1 skrll if (sec->contents == NULL)
2451 1.1 skrll return FALSE;
2452 1.1 skrll }
2453 1.1 skrll
2454 1.1 skrll if (htab->etab.dynamic_sections_created)
2455 1.1 skrll {
2456 1.1 skrll /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2457 1.1 skrll actually has nothing to do with the PLT, it is how we
2458 1.1 skrll communicate the LTP value of a load module to the dynamic
2459 1.1 skrll linker. */
2460 1.1 skrll #define add_dynamic_entry(TAG, VAL) \
2461 1.1 skrll _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2462 1.1 skrll
2463 1.1 skrll if (!add_dynamic_entry (DT_PLTGOT, 0))
2464 1.1 skrll return FALSE;
2465 1.1 skrll
2466 1.1 skrll /* Add some entries to the .dynamic section. We fill in the
2467 1.1 skrll values later, in elf32_hppa_finish_dynamic_sections, but we
2468 1.1 skrll must add the entries now so that we get the correct size for
2469 1.1 skrll the .dynamic section. The DT_DEBUG entry is filled in by the
2470 1.1 skrll dynamic linker and used by the debugger. */
2471 1.1 skrll if (info->executable)
2472 1.1 skrll {
2473 1.1 skrll if (!add_dynamic_entry (DT_DEBUG, 0))
2474 1.1 skrll return FALSE;
2475 1.1 skrll }
2476 1.1 skrll
2477 1.1 skrll if (htab->srelplt->size != 0)
2478 1.1 skrll {
2479 1.1 skrll if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2480 1.1 skrll || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2481 1.1 skrll || !add_dynamic_entry (DT_JMPREL, 0))
2482 1.1 skrll return FALSE;
2483 1.1 skrll }
2484 1.1 skrll
2485 1.1 skrll if (relocs)
2486 1.1 skrll {
2487 1.1 skrll if (!add_dynamic_entry (DT_RELA, 0)
2488 1.1 skrll || !add_dynamic_entry (DT_RELASZ, 0)
2489 1.1 skrll || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2490 1.1 skrll return FALSE;
2491 1.1 skrll
2492 1.1 skrll /* If any dynamic relocs apply to a read-only section,
2493 1.1 skrll then we need a DT_TEXTREL entry. */
2494 1.1 skrll if ((info->flags & DF_TEXTREL) == 0)
2495 1.1 skrll elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2496 1.1 skrll
2497 1.1 skrll if ((info->flags & DF_TEXTREL) != 0)
2498 1.1 skrll {
2499 1.1 skrll if (!add_dynamic_entry (DT_TEXTREL, 0))
2500 1.1 skrll return FALSE;
2501 1.1 skrll }
2502 1.1 skrll }
2503 1.1 skrll }
2504 1.1 skrll #undef add_dynamic_entry
2505 1.1 skrll
2506 1.1 skrll return TRUE;
2507 1.1 skrll }
2508 1.1 skrll
2509 1.1 skrll /* External entry points for sizing and building linker stubs. */
2510 1.1 skrll
2511 1.1 skrll /* Set up various things so that we can make a list of input sections
2512 1.1 skrll for each output section included in the link. Returns -1 on error,
2513 1.1 skrll 0 when no stubs will be needed, and 1 on success. */
2514 1.1 skrll
2515 1.1 skrll int
2516 1.1 skrll elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2517 1.1 skrll {
2518 1.1 skrll bfd *input_bfd;
2519 1.1 skrll unsigned int bfd_count;
2520 1.1 skrll int top_id, top_index;
2521 1.1 skrll asection *section;
2522 1.1 skrll asection **input_list, **list;
2523 1.1 skrll bfd_size_type amt;
2524 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2525 1.1 skrll
2526 1.3 christos if (htab == NULL)
2527 1.3 christos return -1;
2528 1.3 christos
2529 1.1 skrll /* Count the number of input BFDs and find the top input section id. */
2530 1.1 skrll for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2531 1.1 skrll input_bfd != NULL;
2532 1.1 skrll input_bfd = input_bfd->link_next)
2533 1.1 skrll {
2534 1.1 skrll bfd_count += 1;
2535 1.1 skrll for (section = input_bfd->sections;
2536 1.1 skrll section != NULL;
2537 1.1 skrll section = section->next)
2538 1.1 skrll {
2539 1.1 skrll if (top_id < section->id)
2540 1.1 skrll top_id = section->id;
2541 1.1 skrll }
2542 1.1 skrll }
2543 1.1 skrll htab->bfd_count = bfd_count;
2544 1.1 skrll
2545 1.1 skrll amt = sizeof (struct map_stub) * (top_id + 1);
2546 1.1 skrll htab->stub_group = bfd_zmalloc (amt);
2547 1.1 skrll if (htab->stub_group == NULL)
2548 1.1 skrll return -1;
2549 1.1 skrll
2550 1.1 skrll /* We can't use output_bfd->section_count here to find the top output
2551 1.1 skrll section index as some sections may have been removed, and
2552 1.1 skrll strip_excluded_output_sections doesn't renumber the indices. */
2553 1.1 skrll for (section = output_bfd->sections, top_index = 0;
2554 1.1 skrll section != NULL;
2555 1.1 skrll section = section->next)
2556 1.1 skrll {
2557 1.1 skrll if (top_index < section->index)
2558 1.1 skrll top_index = section->index;
2559 1.1 skrll }
2560 1.1 skrll
2561 1.1 skrll htab->top_index = top_index;
2562 1.1 skrll amt = sizeof (asection *) * (top_index + 1);
2563 1.1 skrll input_list = bfd_malloc (amt);
2564 1.1 skrll htab->input_list = input_list;
2565 1.1 skrll if (input_list == NULL)
2566 1.1 skrll return -1;
2567 1.1 skrll
2568 1.1 skrll /* For sections we aren't interested in, mark their entries with a
2569 1.1 skrll value we can check later. */
2570 1.1 skrll list = input_list + top_index;
2571 1.1 skrll do
2572 1.1 skrll *list = bfd_abs_section_ptr;
2573 1.1 skrll while (list-- != input_list);
2574 1.1 skrll
2575 1.1 skrll for (section = output_bfd->sections;
2576 1.1 skrll section != NULL;
2577 1.1 skrll section = section->next)
2578 1.1 skrll {
2579 1.1 skrll if ((section->flags & SEC_CODE) != 0)
2580 1.1 skrll input_list[section->index] = NULL;
2581 1.1 skrll }
2582 1.1 skrll
2583 1.1 skrll return 1;
2584 1.1 skrll }
2585 1.1 skrll
2586 1.1 skrll /* The linker repeatedly calls this function for each input section,
2587 1.1 skrll in the order that input sections are linked into output sections.
2588 1.1 skrll Build lists of input sections to determine groupings between which
2589 1.1 skrll we may insert linker stubs. */
2590 1.1 skrll
2591 1.1 skrll void
2592 1.1 skrll elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2593 1.1 skrll {
2594 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2595 1.1 skrll
2596 1.3 christos if (htab == NULL)
2597 1.3 christos return;
2598 1.3 christos
2599 1.1 skrll if (isec->output_section->index <= htab->top_index)
2600 1.1 skrll {
2601 1.1 skrll asection **list = htab->input_list + isec->output_section->index;
2602 1.1 skrll if (*list != bfd_abs_section_ptr)
2603 1.1 skrll {
2604 1.1 skrll /* Steal the link_sec pointer for our list. */
2605 1.1 skrll #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2606 1.1 skrll /* This happens to make the list in reverse order,
2607 1.1 skrll which is what we want. */
2608 1.1 skrll PREV_SEC (isec) = *list;
2609 1.1 skrll *list = isec;
2610 1.1 skrll }
2611 1.1 skrll }
2612 1.1 skrll }
2613 1.1 skrll
2614 1.1 skrll /* See whether we can group stub sections together. Grouping stub
2615 1.1 skrll sections may result in fewer stubs. More importantly, we need to
2616 1.1 skrll put all .init* and .fini* stubs at the beginning of the .init or
2617 1.1 skrll .fini output sections respectively, because glibc splits the
2618 1.1 skrll _init and _fini functions into multiple parts. Putting a stub in
2619 1.1 skrll the middle of a function is not a good idea. */
2620 1.1 skrll
2621 1.1 skrll static void
2622 1.1 skrll group_sections (struct elf32_hppa_link_hash_table *htab,
2623 1.1 skrll bfd_size_type stub_group_size,
2624 1.1 skrll bfd_boolean stubs_always_before_branch)
2625 1.1 skrll {
2626 1.1 skrll asection **list = htab->input_list + htab->top_index;
2627 1.1 skrll do
2628 1.1 skrll {
2629 1.1 skrll asection *tail = *list;
2630 1.1 skrll if (tail == bfd_abs_section_ptr)
2631 1.1 skrll continue;
2632 1.1 skrll while (tail != NULL)
2633 1.1 skrll {
2634 1.1 skrll asection *curr;
2635 1.1 skrll asection *prev;
2636 1.1 skrll bfd_size_type total;
2637 1.1 skrll bfd_boolean big_sec;
2638 1.1 skrll
2639 1.1 skrll curr = tail;
2640 1.1 skrll total = tail->size;
2641 1.1 skrll big_sec = total >= stub_group_size;
2642 1.1 skrll
2643 1.1 skrll while ((prev = PREV_SEC (curr)) != NULL
2644 1.1 skrll && ((total += curr->output_offset - prev->output_offset)
2645 1.1 skrll < stub_group_size))
2646 1.1 skrll curr = prev;
2647 1.1 skrll
2648 1.1 skrll /* OK, the size from the start of CURR to the end is less
2649 1.1 skrll than 240000 bytes and thus can be handled by one stub
2650 1.1 skrll section. (or the tail section is itself larger than
2651 1.1 skrll 240000 bytes, in which case we may be toast.)
2652 1.1 skrll We should really be keeping track of the total size of
2653 1.1 skrll stubs added here, as stubs contribute to the final output
2654 1.1 skrll section size. That's a little tricky, and this way will
2655 1.1 skrll only break if stubs added total more than 22144 bytes, or
2656 1.1 skrll 2768 long branch stubs. It seems unlikely for more than
2657 1.1 skrll 2768 different functions to be called, especially from
2658 1.1 skrll code only 240000 bytes long. This limit used to be
2659 1.1 skrll 250000, but c++ code tends to generate lots of little
2660 1.1 skrll functions, and sometimes violated the assumption. */
2661 1.1 skrll do
2662 1.1 skrll {
2663 1.1 skrll prev = PREV_SEC (tail);
2664 1.1 skrll /* Set up this stub group. */
2665 1.1 skrll htab->stub_group[tail->id].link_sec = curr;
2666 1.1 skrll }
2667 1.1 skrll while (tail != curr && (tail = prev) != NULL);
2668 1.1 skrll
2669 1.1 skrll /* But wait, there's more! Input sections up to 240000
2670 1.1 skrll bytes before the stub section can be handled by it too.
2671 1.1 skrll Don't do this if we have a really large section after the
2672 1.1 skrll stubs, as adding more stubs increases the chance that
2673 1.1 skrll branches may not reach into the stub section. */
2674 1.1 skrll if (!stubs_always_before_branch && !big_sec)
2675 1.1 skrll {
2676 1.1 skrll total = 0;
2677 1.1 skrll while (prev != NULL
2678 1.1 skrll && ((total += tail->output_offset - prev->output_offset)
2679 1.1 skrll < stub_group_size))
2680 1.1 skrll {
2681 1.1 skrll tail = prev;
2682 1.1 skrll prev = PREV_SEC (tail);
2683 1.1 skrll htab->stub_group[tail->id].link_sec = curr;
2684 1.1 skrll }
2685 1.1 skrll }
2686 1.1 skrll tail = prev;
2687 1.1 skrll }
2688 1.1 skrll }
2689 1.1 skrll while (list-- != htab->input_list);
2690 1.1 skrll free (htab->input_list);
2691 1.1 skrll #undef PREV_SEC
2692 1.1 skrll }
2693 1.1 skrll
2694 1.1 skrll /* Read in all local syms for all input bfds, and create hash entries
2695 1.1 skrll for export stubs if we are building a multi-subspace shared lib.
2696 1.1 skrll Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2697 1.1 skrll
2698 1.1 skrll static int
2699 1.1 skrll get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2700 1.1 skrll {
2701 1.1 skrll unsigned int bfd_indx;
2702 1.1 skrll Elf_Internal_Sym *local_syms, **all_local_syms;
2703 1.1 skrll int stub_changed = 0;
2704 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2705 1.1 skrll
2706 1.3 christos if (htab == NULL)
2707 1.3 christos return -1;
2708 1.3 christos
2709 1.1 skrll /* We want to read in symbol extension records only once. To do this
2710 1.1 skrll we need to read in the local symbols in parallel and save them for
2711 1.1 skrll later use; so hold pointers to the local symbols in an array. */
2712 1.1 skrll bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2713 1.1 skrll all_local_syms = bfd_zmalloc (amt);
2714 1.1 skrll htab->all_local_syms = all_local_syms;
2715 1.1 skrll if (all_local_syms == NULL)
2716 1.1 skrll return -1;
2717 1.1 skrll
2718 1.1 skrll /* Walk over all the input BFDs, swapping in local symbols.
2719 1.1 skrll If we are creating a shared library, create hash entries for the
2720 1.1 skrll export stubs. */
2721 1.1 skrll for (bfd_indx = 0;
2722 1.1 skrll input_bfd != NULL;
2723 1.1 skrll input_bfd = input_bfd->link_next, bfd_indx++)
2724 1.1 skrll {
2725 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2726 1.1 skrll
2727 1.1 skrll /* We'll need the symbol table in a second. */
2728 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2729 1.1 skrll if (symtab_hdr->sh_info == 0)
2730 1.1 skrll continue;
2731 1.1 skrll
2732 1.1 skrll /* We need an array of the local symbols attached to the input bfd. */
2733 1.1 skrll local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2734 1.1 skrll if (local_syms == NULL)
2735 1.1 skrll {
2736 1.1 skrll local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2737 1.1 skrll symtab_hdr->sh_info, 0,
2738 1.1 skrll NULL, NULL, NULL);
2739 1.1 skrll /* Cache them for elf_link_input_bfd. */
2740 1.1 skrll symtab_hdr->contents = (unsigned char *) local_syms;
2741 1.1 skrll }
2742 1.1 skrll if (local_syms == NULL)
2743 1.1 skrll return -1;
2744 1.1 skrll
2745 1.1 skrll all_local_syms[bfd_indx] = local_syms;
2746 1.1 skrll
2747 1.1 skrll if (info->shared && htab->multi_subspace)
2748 1.1 skrll {
2749 1.1 skrll struct elf_link_hash_entry **eh_syms;
2750 1.1 skrll struct elf_link_hash_entry **eh_symend;
2751 1.1 skrll unsigned int symcount;
2752 1.1 skrll
2753 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2754 1.1 skrll - symtab_hdr->sh_info);
2755 1.1 skrll eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2756 1.1 skrll eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2757 1.1 skrll
2758 1.1 skrll /* Look through the global syms for functions; We need to
2759 1.1 skrll build export stubs for all globally visible functions. */
2760 1.1 skrll for (; eh_syms < eh_symend; eh_syms++)
2761 1.1 skrll {
2762 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2763 1.1 skrll
2764 1.1 skrll hh = hppa_elf_hash_entry (*eh_syms);
2765 1.1 skrll
2766 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
2767 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
2768 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2769 1.1 skrll
2770 1.1 skrll /* At this point in the link, undefined syms have been
2771 1.1 skrll resolved, so we need to check that the symbol was
2772 1.1 skrll defined in this BFD. */
2773 1.1 skrll if ((hh->eh.root.type == bfd_link_hash_defined
2774 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak)
2775 1.1 skrll && hh->eh.type == STT_FUNC
2776 1.1 skrll && hh->eh.root.u.def.section->output_section != NULL
2777 1.1 skrll && (hh->eh.root.u.def.section->output_section->owner
2778 1.1 skrll == output_bfd)
2779 1.1 skrll && hh->eh.root.u.def.section->owner == input_bfd
2780 1.1 skrll && hh->eh.def_regular
2781 1.1 skrll && !hh->eh.forced_local
2782 1.1 skrll && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2783 1.1 skrll {
2784 1.1 skrll asection *sec;
2785 1.1 skrll const char *stub_name;
2786 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
2787 1.1 skrll
2788 1.1 skrll sec = hh->eh.root.u.def.section;
2789 1.1 skrll stub_name = hh_name (hh);
2790 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab,
2791 1.1 skrll stub_name,
2792 1.1 skrll FALSE, FALSE);
2793 1.1 skrll if (hsh == NULL)
2794 1.1 skrll {
2795 1.1 skrll hsh = hppa_add_stub (stub_name, sec, htab);
2796 1.1 skrll if (!hsh)
2797 1.1 skrll return -1;
2798 1.1 skrll
2799 1.1 skrll hsh->target_value = hh->eh.root.u.def.value;
2800 1.1 skrll hsh->target_section = hh->eh.root.u.def.section;
2801 1.1 skrll hsh->stub_type = hppa_stub_export;
2802 1.1 skrll hsh->hh = hh;
2803 1.1 skrll stub_changed = 1;
2804 1.1 skrll }
2805 1.1 skrll else
2806 1.1 skrll {
2807 1.1 skrll (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2808 1.1 skrll input_bfd,
2809 1.1 skrll stub_name);
2810 1.1 skrll }
2811 1.1 skrll }
2812 1.1 skrll }
2813 1.1 skrll }
2814 1.1 skrll }
2815 1.1 skrll
2816 1.1 skrll return stub_changed;
2817 1.1 skrll }
2818 1.1 skrll
2819 1.1 skrll /* Determine and set the size of the stub section for a final link.
2820 1.1 skrll
2821 1.1 skrll The basic idea here is to examine all the relocations looking for
2822 1.1 skrll PC-relative calls to a target that is unreachable with a "bl"
2823 1.1 skrll instruction. */
2824 1.1 skrll
2825 1.1 skrll bfd_boolean
2826 1.1 skrll elf32_hppa_size_stubs
2827 1.1 skrll (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2828 1.1 skrll bfd_boolean multi_subspace, bfd_signed_vma group_size,
2829 1.1 skrll asection * (*add_stub_section) (const char *, asection *),
2830 1.1 skrll void (*layout_sections_again) (void))
2831 1.1 skrll {
2832 1.1 skrll bfd_size_type stub_group_size;
2833 1.1 skrll bfd_boolean stubs_always_before_branch;
2834 1.1 skrll bfd_boolean stub_changed;
2835 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2836 1.1 skrll
2837 1.3 christos if (htab == NULL)
2838 1.3 christos return FALSE;
2839 1.3 christos
2840 1.1 skrll /* Stash our params away. */
2841 1.1 skrll htab->stub_bfd = stub_bfd;
2842 1.1 skrll htab->multi_subspace = multi_subspace;
2843 1.1 skrll htab->add_stub_section = add_stub_section;
2844 1.1 skrll htab->layout_sections_again = layout_sections_again;
2845 1.1 skrll stubs_always_before_branch = group_size < 0;
2846 1.1 skrll if (group_size < 0)
2847 1.1 skrll stub_group_size = -group_size;
2848 1.1 skrll else
2849 1.1 skrll stub_group_size = group_size;
2850 1.1 skrll if (stub_group_size == 1)
2851 1.1 skrll {
2852 1.1 skrll /* Default values. */
2853 1.1 skrll if (stubs_always_before_branch)
2854 1.1 skrll {
2855 1.1 skrll stub_group_size = 7680000;
2856 1.1 skrll if (htab->has_17bit_branch || htab->multi_subspace)
2857 1.1 skrll stub_group_size = 240000;
2858 1.1 skrll if (htab->has_12bit_branch)
2859 1.1 skrll stub_group_size = 7500;
2860 1.1 skrll }
2861 1.1 skrll else
2862 1.1 skrll {
2863 1.1 skrll stub_group_size = 6971392;
2864 1.1 skrll if (htab->has_17bit_branch || htab->multi_subspace)
2865 1.1 skrll stub_group_size = 217856;
2866 1.1 skrll if (htab->has_12bit_branch)
2867 1.1 skrll stub_group_size = 6808;
2868 1.1 skrll }
2869 1.1 skrll }
2870 1.1 skrll
2871 1.1 skrll group_sections (htab, stub_group_size, stubs_always_before_branch);
2872 1.1 skrll
2873 1.1 skrll switch (get_local_syms (output_bfd, info->input_bfds, info))
2874 1.1 skrll {
2875 1.1 skrll default:
2876 1.1 skrll if (htab->all_local_syms)
2877 1.1 skrll goto error_ret_free_local;
2878 1.1 skrll return FALSE;
2879 1.1 skrll
2880 1.1 skrll case 0:
2881 1.1 skrll stub_changed = FALSE;
2882 1.1 skrll break;
2883 1.1 skrll
2884 1.1 skrll case 1:
2885 1.1 skrll stub_changed = TRUE;
2886 1.1 skrll break;
2887 1.1 skrll }
2888 1.1 skrll
2889 1.1 skrll while (1)
2890 1.1 skrll {
2891 1.1 skrll bfd *input_bfd;
2892 1.1 skrll unsigned int bfd_indx;
2893 1.1 skrll asection *stub_sec;
2894 1.1 skrll
2895 1.1 skrll for (input_bfd = info->input_bfds, bfd_indx = 0;
2896 1.1 skrll input_bfd != NULL;
2897 1.1 skrll input_bfd = input_bfd->link_next, bfd_indx++)
2898 1.1 skrll {
2899 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2900 1.1 skrll asection *section;
2901 1.1 skrll Elf_Internal_Sym *local_syms;
2902 1.1 skrll
2903 1.1 skrll /* We'll need the symbol table in a second. */
2904 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2905 1.1 skrll if (symtab_hdr->sh_info == 0)
2906 1.1 skrll continue;
2907 1.1 skrll
2908 1.1 skrll local_syms = htab->all_local_syms[bfd_indx];
2909 1.1 skrll
2910 1.1 skrll /* Walk over each section attached to the input bfd. */
2911 1.1 skrll for (section = input_bfd->sections;
2912 1.1 skrll section != NULL;
2913 1.1 skrll section = section->next)
2914 1.1 skrll {
2915 1.1 skrll Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2916 1.1 skrll
2917 1.1 skrll /* If there aren't any relocs, then there's nothing more
2918 1.1 skrll to do. */
2919 1.1 skrll if ((section->flags & SEC_RELOC) == 0
2920 1.1 skrll || section->reloc_count == 0)
2921 1.1 skrll continue;
2922 1.1 skrll
2923 1.1 skrll /* If this section is a link-once section that will be
2924 1.1 skrll discarded, then don't create any stubs. */
2925 1.1 skrll if (section->output_section == NULL
2926 1.1 skrll || section->output_section->owner != output_bfd)
2927 1.1 skrll continue;
2928 1.1 skrll
2929 1.1 skrll /* Get the relocs. */
2930 1.1 skrll internal_relocs
2931 1.1 skrll = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2932 1.1 skrll info->keep_memory);
2933 1.1 skrll if (internal_relocs == NULL)
2934 1.1 skrll goto error_ret_free_local;
2935 1.1 skrll
2936 1.1 skrll /* Now examine each relocation. */
2937 1.1 skrll irela = internal_relocs;
2938 1.1 skrll irelaend = irela + section->reloc_count;
2939 1.1 skrll for (; irela < irelaend; irela++)
2940 1.1 skrll {
2941 1.1 skrll unsigned int r_type, r_indx;
2942 1.1 skrll enum elf32_hppa_stub_type stub_type;
2943 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
2944 1.1 skrll asection *sym_sec;
2945 1.1 skrll bfd_vma sym_value;
2946 1.1 skrll bfd_vma destination;
2947 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2948 1.1 skrll char *stub_name;
2949 1.1 skrll const asection *id_sec;
2950 1.1 skrll
2951 1.1 skrll r_type = ELF32_R_TYPE (irela->r_info);
2952 1.1 skrll r_indx = ELF32_R_SYM (irela->r_info);
2953 1.1 skrll
2954 1.1 skrll if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2955 1.1 skrll {
2956 1.1 skrll bfd_set_error (bfd_error_bad_value);
2957 1.1 skrll error_ret_free_internal:
2958 1.1 skrll if (elf_section_data (section)->relocs == NULL)
2959 1.1 skrll free (internal_relocs);
2960 1.1 skrll goto error_ret_free_local;
2961 1.1 skrll }
2962 1.1 skrll
2963 1.1 skrll /* Only look for stubs on call instructions. */
2964 1.1 skrll if (r_type != (unsigned int) R_PARISC_PCREL12F
2965 1.1 skrll && r_type != (unsigned int) R_PARISC_PCREL17F
2966 1.1 skrll && r_type != (unsigned int) R_PARISC_PCREL22F)
2967 1.1 skrll continue;
2968 1.1 skrll
2969 1.1 skrll /* Now determine the call target, its name, value,
2970 1.1 skrll section. */
2971 1.1 skrll sym_sec = NULL;
2972 1.1 skrll sym_value = 0;
2973 1.1 skrll destination = 0;
2974 1.1 skrll hh = NULL;
2975 1.1 skrll if (r_indx < symtab_hdr->sh_info)
2976 1.1 skrll {
2977 1.1 skrll /* It's a local symbol. */
2978 1.1 skrll Elf_Internal_Sym *sym;
2979 1.1 skrll Elf_Internal_Shdr *hdr;
2980 1.1 skrll unsigned int shndx;
2981 1.1 skrll
2982 1.1 skrll sym = local_syms + r_indx;
2983 1.1 skrll if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2984 1.1 skrll sym_value = sym->st_value;
2985 1.1 skrll shndx = sym->st_shndx;
2986 1.1 skrll if (shndx < elf_numsections (input_bfd))
2987 1.1 skrll {
2988 1.1 skrll hdr = elf_elfsections (input_bfd)[shndx];
2989 1.1 skrll sym_sec = hdr->bfd_section;
2990 1.1 skrll destination = (sym_value + irela->r_addend
2991 1.1 skrll + sym_sec->output_offset
2992 1.1 skrll + sym_sec->output_section->vma);
2993 1.1 skrll }
2994 1.1 skrll }
2995 1.1 skrll else
2996 1.1 skrll {
2997 1.1 skrll /* It's an external symbol. */
2998 1.1 skrll int e_indx;
2999 1.1 skrll
3000 1.1 skrll e_indx = r_indx - symtab_hdr->sh_info;
3001 1.1 skrll hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
3002 1.1 skrll
3003 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
3004 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
3005 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
3006 1.1 skrll
3007 1.1 skrll if (hh->eh.root.type == bfd_link_hash_defined
3008 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak)
3009 1.1 skrll {
3010 1.1 skrll sym_sec = hh->eh.root.u.def.section;
3011 1.1 skrll sym_value = hh->eh.root.u.def.value;
3012 1.1 skrll if (sym_sec->output_section != NULL)
3013 1.1 skrll destination = (sym_value + irela->r_addend
3014 1.1 skrll + sym_sec->output_offset
3015 1.1 skrll + sym_sec->output_section->vma);
3016 1.1 skrll }
3017 1.1 skrll else if (hh->eh.root.type == bfd_link_hash_undefweak)
3018 1.1 skrll {
3019 1.1 skrll if (! info->shared)
3020 1.1 skrll continue;
3021 1.1 skrll }
3022 1.1 skrll else if (hh->eh.root.type == bfd_link_hash_undefined)
3023 1.1 skrll {
3024 1.1 skrll if (! (info->unresolved_syms_in_objects == RM_IGNORE
3025 1.1 skrll && (ELF_ST_VISIBILITY (hh->eh.other)
3026 1.1 skrll == STV_DEFAULT)
3027 1.1 skrll && hh->eh.type != STT_PARISC_MILLI))
3028 1.1 skrll continue;
3029 1.1 skrll }
3030 1.1 skrll else
3031 1.1 skrll {
3032 1.1 skrll bfd_set_error (bfd_error_bad_value);
3033 1.1 skrll goto error_ret_free_internal;
3034 1.1 skrll }
3035 1.1 skrll }
3036 1.1 skrll
3037 1.1 skrll /* Determine what (if any) linker stub is needed. */
3038 1.1 skrll stub_type = hppa_type_of_stub (section, irela, hh,
3039 1.1 skrll destination, info);
3040 1.1 skrll if (stub_type == hppa_stub_none)
3041 1.1 skrll continue;
3042 1.1 skrll
3043 1.1 skrll /* Support for grouping stub sections. */
3044 1.1 skrll id_sec = htab->stub_group[section->id].link_sec;
3045 1.1 skrll
3046 1.1 skrll /* Get the name of this stub. */
3047 1.1 skrll stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
3048 1.1 skrll if (!stub_name)
3049 1.1 skrll goto error_ret_free_internal;
3050 1.1 skrll
3051 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab,
3052 1.1 skrll stub_name,
3053 1.1 skrll FALSE, FALSE);
3054 1.1 skrll if (hsh != NULL)
3055 1.1 skrll {
3056 1.1 skrll /* The proper stub has already been created. */
3057 1.1 skrll free (stub_name);
3058 1.1 skrll continue;
3059 1.1 skrll }
3060 1.1 skrll
3061 1.1 skrll hsh = hppa_add_stub (stub_name, section, htab);
3062 1.1 skrll if (hsh == NULL)
3063 1.1 skrll {
3064 1.1 skrll free (stub_name);
3065 1.1 skrll goto error_ret_free_internal;
3066 1.1 skrll }
3067 1.1 skrll
3068 1.1 skrll hsh->target_value = sym_value;
3069 1.1 skrll hsh->target_section = sym_sec;
3070 1.1 skrll hsh->stub_type = stub_type;
3071 1.1 skrll if (info->shared)
3072 1.1 skrll {
3073 1.1 skrll if (stub_type == hppa_stub_import)
3074 1.1 skrll hsh->stub_type = hppa_stub_import_shared;
3075 1.1 skrll else if (stub_type == hppa_stub_long_branch)
3076 1.1 skrll hsh->stub_type = hppa_stub_long_branch_shared;
3077 1.1 skrll }
3078 1.1 skrll hsh->hh = hh;
3079 1.1 skrll stub_changed = TRUE;
3080 1.1 skrll }
3081 1.1 skrll
3082 1.1 skrll /* We're done with the internal relocs, free them. */
3083 1.1 skrll if (elf_section_data (section)->relocs == NULL)
3084 1.1 skrll free (internal_relocs);
3085 1.1 skrll }
3086 1.1 skrll }
3087 1.1 skrll
3088 1.1 skrll if (!stub_changed)
3089 1.1 skrll break;
3090 1.1 skrll
3091 1.1 skrll /* OK, we've added some stubs. Find out the new size of the
3092 1.1 skrll stub sections. */
3093 1.1 skrll for (stub_sec = htab->stub_bfd->sections;
3094 1.1 skrll stub_sec != NULL;
3095 1.1 skrll stub_sec = stub_sec->next)
3096 1.1 skrll stub_sec->size = 0;
3097 1.1 skrll
3098 1.1 skrll bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
3099 1.1 skrll
3100 1.1 skrll /* Ask the linker to do its stuff. */
3101 1.1 skrll (*htab->layout_sections_again) ();
3102 1.1 skrll stub_changed = FALSE;
3103 1.1 skrll }
3104 1.1 skrll
3105 1.1 skrll free (htab->all_local_syms);
3106 1.1 skrll return TRUE;
3107 1.1 skrll
3108 1.1 skrll error_ret_free_local:
3109 1.1 skrll free (htab->all_local_syms);
3110 1.1 skrll return FALSE;
3111 1.1 skrll }
3112 1.1 skrll
3113 1.1 skrll /* For a final link, this function is called after we have sized the
3114 1.1 skrll stubs to provide a value for __gp. */
3115 1.1 skrll
3116 1.1 skrll bfd_boolean
3117 1.1 skrll elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
3118 1.1 skrll {
3119 1.1 skrll struct bfd_link_hash_entry *h;
3120 1.1 skrll asection *sec = NULL;
3121 1.1 skrll bfd_vma gp_val = 0;
3122 1.1 skrll struct elf32_hppa_link_hash_table *htab;
3123 1.1 skrll
3124 1.1 skrll htab = hppa_link_hash_table (info);
3125 1.3 christos if (htab == NULL)
3126 1.3 christos return FALSE;
3127 1.3 christos
3128 1.1 skrll h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3129 1.1 skrll
3130 1.1 skrll if (h != NULL
3131 1.1 skrll && (h->type == bfd_link_hash_defined
3132 1.1 skrll || h->type == bfd_link_hash_defweak))
3133 1.1 skrll {
3134 1.1 skrll gp_val = h->u.def.value;
3135 1.1 skrll sec = h->u.def.section;
3136 1.1 skrll }
3137 1.1 skrll else
3138 1.1 skrll {
3139 1.1 skrll asection *splt = bfd_get_section_by_name (abfd, ".plt");
3140 1.1 skrll asection *sgot = bfd_get_section_by_name (abfd, ".got");
3141 1.1 skrll
3142 1.1 skrll /* Choose to point our LTP at, in this order, one of .plt, .got,
3143 1.1 skrll or .data, if these sections exist. In the case of choosing
3144 1.1 skrll .plt try to make the LTP ideal for addressing anywhere in the
3145 1.1 skrll .plt or .got with a 14 bit signed offset. Typically, the end
3146 1.1 skrll of the .plt is the start of the .got, so choose .plt + 0x2000
3147 1.1 skrll if either the .plt or .got is larger than 0x2000. If both
3148 1.1 skrll the .plt and .got are smaller than 0x2000, choose the end of
3149 1.1 skrll the .plt section. */
3150 1.1 skrll sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3151 1.1 skrll ? NULL : splt;
3152 1.1 skrll if (sec != NULL)
3153 1.1 skrll {
3154 1.1 skrll gp_val = sec->size;
3155 1.1 skrll if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3156 1.1 skrll {
3157 1.1 skrll gp_val = 0x2000;
3158 1.1 skrll }
3159 1.1 skrll }
3160 1.1 skrll else
3161 1.1 skrll {
3162 1.1 skrll sec = sgot;
3163 1.1 skrll if (sec != NULL)
3164 1.1 skrll {
3165 1.1 skrll if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3166 1.1 skrll {
3167 1.1 skrll /* We know we don't have a .plt. If .got is large,
3168 1.1 skrll offset our LTP. */
3169 1.1 skrll if (sec->size > 0x2000)
3170 1.1 skrll gp_val = 0x2000;
3171 1.1 skrll }
3172 1.1 skrll }
3173 1.1 skrll else
3174 1.1 skrll {
3175 1.1 skrll /* No .plt or .got. Who cares what the LTP is? */
3176 1.1 skrll sec = bfd_get_section_by_name (abfd, ".data");
3177 1.1 skrll }
3178 1.1 skrll }
3179 1.1 skrll
3180 1.1 skrll if (h != NULL)
3181 1.1 skrll {
3182 1.1 skrll h->type = bfd_link_hash_defined;
3183 1.1 skrll h->u.def.value = gp_val;
3184 1.1 skrll if (sec != NULL)
3185 1.1 skrll h->u.def.section = sec;
3186 1.1 skrll else
3187 1.1 skrll h->u.def.section = bfd_abs_section_ptr;
3188 1.1 skrll }
3189 1.1 skrll }
3190 1.1 skrll
3191 1.1 skrll if (sec != NULL && sec->output_section != NULL)
3192 1.1 skrll gp_val += sec->output_section->vma + sec->output_offset;
3193 1.1 skrll
3194 1.1 skrll elf_gp (abfd) = gp_val;
3195 1.1 skrll return TRUE;
3196 1.1 skrll }
3197 1.1 skrll
3198 1.1 skrll /* Build all the stubs associated with the current output file. The
3199 1.1 skrll stubs are kept in a hash table attached to the main linker hash
3200 1.1 skrll table. We also set up the .plt entries for statically linked PIC
3201 1.1 skrll functions here. This function is called via hppaelf_finish in the
3202 1.1 skrll linker. */
3203 1.1 skrll
3204 1.1 skrll bfd_boolean
3205 1.1 skrll elf32_hppa_build_stubs (struct bfd_link_info *info)
3206 1.1 skrll {
3207 1.1 skrll asection *stub_sec;
3208 1.1 skrll struct bfd_hash_table *table;
3209 1.1 skrll struct elf32_hppa_link_hash_table *htab;
3210 1.1 skrll
3211 1.1 skrll htab = hppa_link_hash_table (info);
3212 1.3 christos if (htab == NULL)
3213 1.3 christos return FALSE;
3214 1.1 skrll
3215 1.1 skrll for (stub_sec = htab->stub_bfd->sections;
3216 1.1 skrll stub_sec != NULL;
3217 1.1 skrll stub_sec = stub_sec->next)
3218 1.1 skrll {
3219 1.1 skrll bfd_size_type size;
3220 1.1 skrll
3221 1.1 skrll /* Allocate memory to hold the linker stubs. */
3222 1.1 skrll size = stub_sec->size;
3223 1.1 skrll stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3224 1.1 skrll if (stub_sec->contents == NULL && size != 0)
3225 1.1 skrll return FALSE;
3226 1.1 skrll stub_sec->size = 0;
3227 1.1 skrll }
3228 1.1 skrll
3229 1.1 skrll /* Build the stubs as directed by the stub hash table. */
3230 1.1 skrll table = &htab->bstab;
3231 1.1 skrll bfd_hash_traverse (table, hppa_build_one_stub, info);
3232 1.1 skrll
3233 1.1 skrll return TRUE;
3234 1.1 skrll }
3235 1.1 skrll
3236 1.1 skrll /* Return the base vma address which should be subtracted from the real
3237 1.1 skrll address when resolving a dtpoff relocation.
3238 1.1 skrll This is PT_TLS segment p_vaddr. */
3239 1.1 skrll
3240 1.1 skrll static bfd_vma
3241 1.1 skrll dtpoff_base (struct bfd_link_info *info)
3242 1.1 skrll {
3243 1.1 skrll /* If tls_sec is NULL, we should have signalled an error already. */
3244 1.1 skrll if (elf_hash_table (info)->tls_sec == NULL)
3245 1.1 skrll return 0;
3246 1.1 skrll return elf_hash_table (info)->tls_sec->vma;
3247 1.1 skrll }
3248 1.1 skrll
3249 1.1 skrll /* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3250 1.1 skrll
3251 1.1 skrll static bfd_vma
3252 1.1 skrll tpoff (struct bfd_link_info *info, bfd_vma address)
3253 1.1 skrll {
3254 1.1 skrll struct elf_link_hash_table *htab = elf_hash_table (info);
3255 1.1 skrll
3256 1.1 skrll /* If tls_sec is NULL, we should have signalled an error already. */
3257 1.1 skrll if (htab->tls_sec == NULL)
3258 1.1 skrll return 0;
3259 1.1 skrll /* hppa TLS ABI is variant I and static TLS block start just after
3260 1.1 skrll tcbhead structure which has 2 pointer fields. */
3261 1.1 skrll return (address - htab->tls_sec->vma
3262 1.1 skrll + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3263 1.1 skrll }
3264 1.1 skrll
3265 1.1 skrll /* Perform a final link. */
3266 1.1 skrll
3267 1.1 skrll static bfd_boolean
3268 1.1 skrll elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3269 1.1 skrll {
3270 1.1 skrll /* Invoke the regular ELF linker to do all the work. */
3271 1.1 skrll if (!bfd_elf_final_link (abfd, info))
3272 1.1 skrll return FALSE;
3273 1.1 skrll
3274 1.1 skrll /* If we're producing a final executable, sort the contents of the
3275 1.1 skrll unwind section. */
3276 1.3 christos if (info->relocatable)
3277 1.3 christos return TRUE;
3278 1.3 christos
3279 1.1 skrll return elf_hppa_sort_unwind (abfd);
3280 1.1 skrll }
3281 1.1 skrll
3282 1.1 skrll /* Record the lowest address for the data and text segments. */
3283 1.1 skrll
3284 1.1 skrll static void
3285 1.1 skrll hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3286 1.1 skrll {
3287 1.1 skrll struct elf32_hppa_link_hash_table *htab;
3288 1.1 skrll
3289 1.1 skrll htab = (struct elf32_hppa_link_hash_table*) data;
3290 1.3 christos if (htab == NULL)
3291 1.3 christos return;
3292 1.1 skrll
3293 1.1 skrll if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3294 1.1 skrll {
3295 1.1 skrll bfd_vma value;
3296 1.1 skrll Elf_Internal_Phdr *p;
3297 1.1 skrll
3298 1.1 skrll p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3299 1.1 skrll BFD_ASSERT (p != NULL);
3300 1.1 skrll value = p->p_vaddr;
3301 1.1 skrll
3302 1.1 skrll if ((section->flags & SEC_READONLY) != 0)
3303 1.1 skrll {
3304 1.1 skrll if (value < htab->text_segment_base)
3305 1.1 skrll htab->text_segment_base = value;
3306 1.1 skrll }
3307 1.1 skrll else
3308 1.1 skrll {
3309 1.1 skrll if (value < htab->data_segment_base)
3310 1.1 skrll htab->data_segment_base = value;
3311 1.1 skrll }
3312 1.1 skrll }
3313 1.1 skrll }
3314 1.1 skrll
3315 1.1 skrll /* Perform a relocation as part of a final link. */
3316 1.1 skrll
3317 1.1 skrll static bfd_reloc_status_type
3318 1.1 skrll final_link_relocate (asection *input_section,
3319 1.1 skrll bfd_byte *contents,
3320 1.1 skrll const Elf_Internal_Rela *rela,
3321 1.1 skrll bfd_vma value,
3322 1.1 skrll struct elf32_hppa_link_hash_table *htab,
3323 1.1 skrll asection *sym_sec,
3324 1.1 skrll struct elf32_hppa_link_hash_entry *hh,
3325 1.1 skrll struct bfd_link_info *info)
3326 1.1 skrll {
3327 1.1 skrll int insn;
3328 1.1 skrll unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3329 1.1 skrll unsigned int orig_r_type = r_type;
3330 1.1 skrll reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3331 1.1 skrll int r_format = howto->bitsize;
3332 1.1 skrll enum hppa_reloc_field_selector_type_alt r_field;
3333 1.1 skrll bfd *input_bfd = input_section->owner;
3334 1.1 skrll bfd_vma offset = rela->r_offset;
3335 1.1 skrll bfd_vma max_branch_offset = 0;
3336 1.1 skrll bfd_byte *hit_data = contents + offset;
3337 1.1 skrll bfd_signed_vma addend = rela->r_addend;
3338 1.1 skrll bfd_vma location;
3339 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh = NULL;
3340 1.1 skrll int val;
3341 1.1 skrll
3342 1.1 skrll if (r_type == R_PARISC_NONE)
3343 1.1 skrll return bfd_reloc_ok;
3344 1.1 skrll
3345 1.1 skrll insn = bfd_get_32 (input_bfd, hit_data);
3346 1.1 skrll
3347 1.1 skrll /* Find out where we are and where we're going. */
3348 1.1 skrll location = (offset +
3349 1.1 skrll input_section->output_offset +
3350 1.1 skrll input_section->output_section->vma);
3351 1.1 skrll
3352 1.1 skrll /* If we are not building a shared library, convert DLTIND relocs to
3353 1.1 skrll DPREL relocs. */
3354 1.1 skrll if (!info->shared)
3355 1.1 skrll {
3356 1.1 skrll switch (r_type)
3357 1.1 skrll {
3358 1.1 skrll case R_PARISC_DLTIND21L:
3359 1.1 skrll r_type = R_PARISC_DPREL21L;
3360 1.1 skrll break;
3361 1.1 skrll
3362 1.1 skrll case R_PARISC_DLTIND14R:
3363 1.1 skrll r_type = R_PARISC_DPREL14R;
3364 1.1 skrll break;
3365 1.1 skrll
3366 1.1 skrll case R_PARISC_DLTIND14F:
3367 1.1 skrll r_type = R_PARISC_DPREL14F;
3368 1.1 skrll break;
3369 1.1 skrll }
3370 1.1 skrll }
3371 1.1 skrll
3372 1.1 skrll switch (r_type)
3373 1.1 skrll {
3374 1.1 skrll case R_PARISC_PCREL12F:
3375 1.1 skrll case R_PARISC_PCREL17F:
3376 1.1 skrll case R_PARISC_PCREL22F:
3377 1.1 skrll /* If this call should go via the plt, find the import stub in
3378 1.1 skrll the stub hash. */
3379 1.1 skrll if (sym_sec == NULL
3380 1.1 skrll || sym_sec->output_section == NULL
3381 1.1 skrll || (hh != NULL
3382 1.1 skrll && hh->eh.plt.offset != (bfd_vma) -1
3383 1.1 skrll && hh->eh.dynindx != -1
3384 1.1 skrll && !hh->plabel
3385 1.1 skrll && (info->shared
3386 1.1 skrll || !hh->eh.def_regular
3387 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak)))
3388 1.1 skrll {
3389 1.1 skrll hsh = hppa_get_stub_entry (input_section, sym_sec,
3390 1.1 skrll hh, rela, htab);
3391 1.1 skrll if (hsh != NULL)
3392 1.1 skrll {
3393 1.1 skrll value = (hsh->stub_offset
3394 1.1 skrll + hsh->stub_sec->output_offset
3395 1.1 skrll + hsh->stub_sec->output_section->vma);
3396 1.1 skrll addend = 0;
3397 1.1 skrll }
3398 1.1 skrll else if (sym_sec == NULL && hh != NULL
3399 1.1 skrll && hh->eh.root.type == bfd_link_hash_undefweak)
3400 1.1 skrll {
3401 1.1 skrll /* It's OK if undefined weak. Calls to undefined weak
3402 1.1 skrll symbols behave as if the "called" function
3403 1.1 skrll immediately returns. We can thus call to a weak
3404 1.1 skrll function without first checking whether the function
3405 1.1 skrll is defined. */
3406 1.1 skrll value = location;
3407 1.1 skrll addend = 8;
3408 1.1 skrll }
3409 1.1 skrll else
3410 1.1 skrll return bfd_reloc_undefined;
3411 1.1 skrll }
3412 1.1 skrll /* Fall thru. */
3413 1.1 skrll
3414 1.1 skrll case R_PARISC_PCREL21L:
3415 1.1 skrll case R_PARISC_PCREL17C:
3416 1.1 skrll case R_PARISC_PCREL17R:
3417 1.1 skrll case R_PARISC_PCREL14R:
3418 1.1 skrll case R_PARISC_PCREL14F:
3419 1.1 skrll case R_PARISC_PCREL32:
3420 1.1 skrll /* Make it a pc relative offset. */
3421 1.1 skrll value -= location;
3422 1.1 skrll addend -= 8;
3423 1.1 skrll break;
3424 1.1 skrll
3425 1.1 skrll case R_PARISC_DPREL21L:
3426 1.1 skrll case R_PARISC_DPREL14R:
3427 1.1 skrll case R_PARISC_DPREL14F:
3428 1.1 skrll /* Convert instructions that use the linkage table pointer (r19) to
3429 1.1 skrll instructions that use the global data pointer (dp). This is the
3430 1.1 skrll most efficient way of using PIC code in an incomplete executable,
3431 1.1 skrll but the user must follow the standard runtime conventions for
3432 1.1 skrll accessing data for this to work. */
3433 1.4 skrll if (orig_r_type == R_PARISC_DLTIND21L)
3434 1.1 skrll {
3435 1.1 skrll /* Convert addil instructions if the original reloc was a
3436 1.1 skrll DLTIND21L. GCC sometimes uses a register other than r19 for
3437 1.1 skrll the operation, so we must convert any addil instruction
3438 1.1 skrll that uses this relocation. */
3439 1.1 skrll if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3440 1.1 skrll insn = ADDIL_DP;
3441 1.1 skrll else
3442 1.1 skrll /* We must have a ldil instruction. It's too hard to find
3443 1.1 skrll and convert the associated add instruction, so issue an
3444 1.1 skrll error. */
3445 1.1 skrll (*_bfd_error_handler)
3446 1.1 skrll (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3447 1.1 skrll input_bfd,
3448 1.1 skrll input_section,
3449 1.3 christos (long) offset,
3450 1.1 skrll howto->name,
3451 1.1 skrll insn);
3452 1.1 skrll }
3453 1.1 skrll else if (orig_r_type == R_PARISC_DLTIND14F)
3454 1.1 skrll {
3455 1.1 skrll /* This must be a format 1 load/store. Change the base
3456 1.1 skrll register to dp. */
3457 1.1 skrll insn = (insn & 0xfc1ffff) | (27 << 21);
3458 1.1 skrll }
3459 1.1 skrll
3460 1.1 skrll /* For all the DP relative relocations, we need to examine the symbol's
3461 1.1 skrll section. If it has no section or if it's a code section, then
3462 1.1 skrll "data pointer relative" makes no sense. In that case we don't
3463 1.1 skrll adjust the "value", and for 21 bit addil instructions, we change the
3464 1.1 skrll source addend register from %dp to %r0. This situation commonly
3465 1.1 skrll arises for undefined weak symbols and when a variable's "constness"
3466 1.1 skrll is declared differently from the way the variable is defined. For
3467 1.1 skrll instance: "extern int foo" with foo defined as "const int foo". */
3468 1.1 skrll if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3469 1.1 skrll {
3470 1.1 skrll if ((insn & ((0x3f << 26) | (0x1f << 21)))
3471 1.1 skrll == (((int) OP_ADDIL << 26) | (27 << 21)))
3472 1.1 skrll {
3473 1.1 skrll insn &= ~ (0x1f << 21);
3474 1.1 skrll }
3475 1.1 skrll /* Now try to make things easy for the dynamic linker. */
3476 1.1 skrll
3477 1.1 skrll break;
3478 1.1 skrll }
3479 1.1 skrll /* Fall thru. */
3480 1.1 skrll
3481 1.1 skrll case R_PARISC_DLTIND21L:
3482 1.1 skrll case R_PARISC_DLTIND14R:
3483 1.1 skrll case R_PARISC_DLTIND14F:
3484 1.4 skrll case R_PARISC_TLS_GD21L:
3485 1.1 skrll case R_PARISC_TLS_GD14R:
3486 1.4 skrll case R_PARISC_TLS_LDM21L:
3487 1.1 skrll case R_PARISC_TLS_LDM14R:
3488 1.4 skrll case R_PARISC_TLS_IE21L:
3489 1.1 skrll case R_PARISC_TLS_IE14R:
3490 1.1 skrll value -= elf_gp (input_section->output_section->owner);
3491 1.1 skrll break;
3492 1.1 skrll
3493 1.1 skrll case R_PARISC_SEGREL32:
3494 1.1 skrll if ((sym_sec->flags & SEC_CODE) != 0)
3495 1.1 skrll value -= htab->text_segment_base;
3496 1.1 skrll else
3497 1.1 skrll value -= htab->data_segment_base;
3498 1.1 skrll break;
3499 1.1 skrll
3500 1.1 skrll default:
3501 1.1 skrll break;
3502 1.1 skrll }
3503 1.1 skrll
3504 1.1 skrll switch (r_type)
3505 1.1 skrll {
3506 1.1 skrll case R_PARISC_DIR32:
3507 1.1 skrll case R_PARISC_DIR14F:
3508 1.1 skrll case R_PARISC_DIR17F:
3509 1.1 skrll case R_PARISC_PCREL17C:
3510 1.1 skrll case R_PARISC_PCREL14F:
3511 1.1 skrll case R_PARISC_PCREL32:
3512 1.1 skrll case R_PARISC_DPREL14F:
3513 1.1 skrll case R_PARISC_PLABEL32:
3514 1.1 skrll case R_PARISC_DLTIND14F:
3515 1.1 skrll case R_PARISC_SEGBASE:
3516 1.1 skrll case R_PARISC_SEGREL32:
3517 1.1 skrll case R_PARISC_TLS_DTPMOD32:
3518 1.1 skrll case R_PARISC_TLS_DTPOFF32:
3519 1.1 skrll case R_PARISC_TLS_TPREL32:
3520 1.1 skrll r_field = e_fsel;
3521 1.1 skrll break;
3522 1.1 skrll
3523 1.1 skrll case R_PARISC_DLTIND21L:
3524 1.1 skrll case R_PARISC_PCREL21L:
3525 1.1 skrll case R_PARISC_PLABEL21L:
3526 1.1 skrll r_field = e_lsel;
3527 1.1 skrll break;
3528 1.1 skrll
3529 1.1 skrll case R_PARISC_DIR21L:
3530 1.1 skrll case R_PARISC_DPREL21L:
3531 1.1 skrll case R_PARISC_TLS_GD21L:
3532 1.1 skrll case R_PARISC_TLS_LDM21L:
3533 1.1 skrll case R_PARISC_TLS_LDO21L:
3534 1.1 skrll case R_PARISC_TLS_IE21L:
3535 1.1 skrll case R_PARISC_TLS_LE21L:
3536 1.1 skrll r_field = e_lrsel;
3537 1.1 skrll break;
3538 1.1 skrll
3539 1.1 skrll case R_PARISC_PCREL17R:
3540 1.1 skrll case R_PARISC_PCREL14R:
3541 1.1 skrll case R_PARISC_PLABEL14R:
3542 1.1 skrll case R_PARISC_DLTIND14R:
3543 1.1 skrll r_field = e_rsel;
3544 1.1 skrll break;
3545 1.1 skrll
3546 1.1 skrll case R_PARISC_DIR17R:
3547 1.1 skrll case R_PARISC_DIR14R:
3548 1.1 skrll case R_PARISC_DPREL14R:
3549 1.1 skrll case R_PARISC_TLS_GD14R:
3550 1.1 skrll case R_PARISC_TLS_LDM14R:
3551 1.1 skrll case R_PARISC_TLS_LDO14R:
3552 1.1 skrll case R_PARISC_TLS_IE14R:
3553 1.1 skrll case R_PARISC_TLS_LE14R:
3554 1.1 skrll r_field = e_rrsel;
3555 1.1 skrll break;
3556 1.1 skrll
3557 1.1 skrll case R_PARISC_PCREL12F:
3558 1.1 skrll case R_PARISC_PCREL17F:
3559 1.1 skrll case R_PARISC_PCREL22F:
3560 1.1 skrll r_field = e_fsel;
3561 1.1 skrll
3562 1.1 skrll if (r_type == (unsigned int) R_PARISC_PCREL17F)
3563 1.1 skrll {
3564 1.1 skrll max_branch_offset = (1 << (17-1)) << 2;
3565 1.1 skrll }
3566 1.1 skrll else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3567 1.1 skrll {
3568 1.1 skrll max_branch_offset = (1 << (12-1)) << 2;
3569 1.1 skrll }
3570 1.1 skrll else
3571 1.1 skrll {
3572 1.1 skrll max_branch_offset = (1 << (22-1)) << 2;
3573 1.1 skrll }
3574 1.1 skrll
3575 1.1 skrll /* sym_sec is NULL on undefined weak syms or when shared on
3576 1.1 skrll undefined syms. We've already checked for a stub for the
3577 1.1 skrll shared undefined case. */
3578 1.1 skrll if (sym_sec == NULL)
3579 1.1 skrll break;
3580 1.1 skrll
3581 1.1 skrll /* If the branch is out of reach, then redirect the
3582 1.1 skrll call to the local stub for this function. */
3583 1.1 skrll if (value + addend + max_branch_offset >= 2*max_branch_offset)
3584 1.1 skrll {
3585 1.1 skrll hsh = hppa_get_stub_entry (input_section, sym_sec,
3586 1.1 skrll hh, rela, htab);
3587 1.1 skrll if (hsh == NULL)
3588 1.1 skrll return bfd_reloc_undefined;
3589 1.1 skrll
3590 1.1 skrll /* Munge up the value and addend so that we call the stub
3591 1.1 skrll rather than the procedure directly. */
3592 1.1 skrll value = (hsh->stub_offset
3593 1.1 skrll + hsh->stub_sec->output_offset
3594 1.1 skrll + hsh->stub_sec->output_section->vma
3595 1.1 skrll - location);
3596 1.1 skrll addend = -8;
3597 1.1 skrll }
3598 1.1 skrll break;
3599 1.1 skrll
3600 1.1 skrll /* Something we don't know how to handle. */
3601 1.1 skrll default:
3602 1.1 skrll return bfd_reloc_notsupported;
3603 1.1 skrll }
3604 1.1 skrll
3605 1.1 skrll /* Make sure we can reach the stub. */
3606 1.1 skrll if (max_branch_offset != 0
3607 1.1 skrll && value + addend + max_branch_offset >= 2*max_branch_offset)
3608 1.1 skrll {
3609 1.1 skrll (*_bfd_error_handler)
3610 1.1 skrll (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3611 1.1 skrll input_bfd,
3612 1.1 skrll input_section,
3613 1.3 christos (long) offset,
3614 1.1 skrll hsh->bh_root.string);
3615 1.1 skrll bfd_set_error (bfd_error_bad_value);
3616 1.1 skrll return bfd_reloc_notsupported;
3617 1.1 skrll }
3618 1.1 skrll
3619 1.1 skrll val = hppa_field_adjust (value, addend, r_field);
3620 1.1 skrll
3621 1.1 skrll switch (r_type)
3622 1.1 skrll {
3623 1.1 skrll case R_PARISC_PCREL12F:
3624 1.1 skrll case R_PARISC_PCREL17C:
3625 1.1 skrll case R_PARISC_PCREL17F:
3626 1.1 skrll case R_PARISC_PCREL17R:
3627 1.1 skrll case R_PARISC_PCREL22F:
3628 1.1 skrll case R_PARISC_DIR17F:
3629 1.1 skrll case R_PARISC_DIR17R:
3630 1.1 skrll /* This is a branch. Divide the offset by four.
3631 1.1 skrll Note that we need to decide whether it's a branch or
3632 1.1 skrll otherwise by inspecting the reloc. Inspecting insn won't
3633 1.1 skrll work as insn might be from a .word directive. */
3634 1.1 skrll val >>= 2;
3635 1.1 skrll break;
3636 1.1 skrll
3637 1.1 skrll default:
3638 1.1 skrll break;
3639 1.1 skrll }
3640 1.1 skrll
3641 1.1 skrll insn = hppa_rebuild_insn (insn, val, r_format);
3642 1.1 skrll
3643 1.1 skrll /* Update the instruction word. */
3644 1.1 skrll bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3645 1.1 skrll return bfd_reloc_ok;
3646 1.1 skrll }
3647 1.1 skrll
3648 1.1 skrll /* Relocate an HPPA ELF section. */
3649 1.1 skrll
3650 1.1 skrll static bfd_boolean
3651 1.1 skrll elf32_hppa_relocate_section (bfd *output_bfd,
3652 1.1 skrll struct bfd_link_info *info,
3653 1.1 skrll bfd *input_bfd,
3654 1.1 skrll asection *input_section,
3655 1.1 skrll bfd_byte *contents,
3656 1.1 skrll Elf_Internal_Rela *relocs,
3657 1.1 skrll Elf_Internal_Sym *local_syms,
3658 1.1 skrll asection **local_sections)
3659 1.1 skrll {
3660 1.1 skrll bfd_vma *local_got_offsets;
3661 1.1 skrll struct elf32_hppa_link_hash_table *htab;
3662 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
3663 1.1 skrll Elf_Internal_Rela *rela;
3664 1.1 skrll Elf_Internal_Rela *relend;
3665 1.1 skrll
3666 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3667 1.1 skrll
3668 1.1 skrll htab = hppa_link_hash_table (info);
3669 1.3 christos if (htab == NULL)
3670 1.3 christos return FALSE;
3671 1.3 christos
3672 1.1 skrll local_got_offsets = elf_local_got_offsets (input_bfd);
3673 1.1 skrll
3674 1.1 skrll rela = relocs;
3675 1.1 skrll relend = relocs + input_section->reloc_count;
3676 1.1 skrll for (; rela < relend; rela++)
3677 1.1 skrll {
3678 1.1 skrll unsigned int r_type;
3679 1.1 skrll reloc_howto_type *howto;
3680 1.1 skrll unsigned int r_symndx;
3681 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
3682 1.1 skrll Elf_Internal_Sym *sym;
3683 1.1 skrll asection *sym_sec;
3684 1.1 skrll bfd_vma relocation;
3685 1.1 skrll bfd_reloc_status_type rstatus;
3686 1.1 skrll const char *sym_name;
3687 1.1 skrll bfd_boolean plabel;
3688 1.1 skrll bfd_boolean warned_undef;
3689 1.1 skrll
3690 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
3691 1.1 skrll if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3692 1.1 skrll {
3693 1.1 skrll bfd_set_error (bfd_error_bad_value);
3694 1.1 skrll return FALSE;
3695 1.1 skrll }
3696 1.1 skrll if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3697 1.1 skrll || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3698 1.1 skrll continue;
3699 1.1 skrll
3700 1.1 skrll r_symndx = ELF32_R_SYM (rela->r_info);
3701 1.1 skrll hh = NULL;
3702 1.1 skrll sym = NULL;
3703 1.1 skrll sym_sec = NULL;
3704 1.1 skrll warned_undef = FALSE;
3705 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
3706 1.1 skrll {
3707 1.1 skrll /* This is a local symbol, h defaults to NULL. */
3708 1.1 skrll sym = local_syms + r_symndx;
3709 1.1 skrll sym_sec = local_sections[r_symndx];
3710 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3711 1.1 skrll }
3712 1.1 skrll else
3713 1.1 skrll {
3714 1.1 skrll struct elf_link_hash_entry *eh;
3715 1.1 skrll bfd_boolean unresolved_reloc;
3716 1.1 skrll struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3717 1.1 skrll
3718 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3719 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
3720 1.1 skrll eh, sym_sec, relocation,
3721 1.1 skrll unresolved_reloc, warned_undef);
3722 1.1 skrll
3723 1.1 skrll if (!info->relocatable
3724 1.1 skrll && relocation == 0
3725 1.1 skrll && eh->root.type != bfd_link_hash_defined
3726 1.1 skrll && eh->root.type != bfd_link_hash_defweak
3727 1.1 skrll && eh->root.type != bfd_link_hash_undefweak)
3728 1.1 skrll {
3729 1.1 skrll if (info->unresolved_syms_in_objects == RM_IGNORE
3730 1.1 skrll && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3731 1.1 skrll && eh->type == STT_PARISC_MILLI)
3732 1.1 skrll {
3733 1.1 skrll if (! info->callbacks->undefined_symbol
3734 1.1 skrll (info, eh_name (eh), input_bfd,
3735 1.1 skrll input_section, rela->r_offset, FALSE))
3736 1.1 skrll return FALSE;
3737 1.1 skrll warned_undef = TRUE;
3738 1.1 skrll }
3739 1.1 skrll }
3740 1.1 skrll hh = hppa_elf_hash_entry (eh);
3741 1.1 skrll }
3742 1.1 skrll
3743 1.1 skrll if (sym_sec != NULL && elf_discarded_section (sym_sec))
3744 1.3 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3745 1.3 christos rela, relend,
3746 1.3 christos elf_hppa_howto_table + r_type,
3747 1.3 christos contents);
3748 1.1 skrll
3749 1.1 skrll if (info->relocatable)
3750 1.1 skrll continue;
3751 1.1 skrll
3752 1.1 skrll /* Do any required modifications to the relocation value, and
3753 1.1 skrll determine what types of dynamic info we need to output, if
3754 1.1 skrll any. */
3755 1.1 skrll plabel = 0;
3756 1.1 skrll switch (r_type)
3757 1.1 skrll {
3758 1.1 skrll case R_PARISC_DLTIND14F:
3759 1.1 skrll case R_PARISC_DLTIND14R:
3760 1.1 skrll case R_PARISC_DLTIND21L:
3761 1.1 skrll {
3762 1.1 skrll bfd_vma off;
3763 1.1 skrll bfd_boolean do_got = 0;
3764 1.1 skrll
3765 1.1 skrll /* Relocation is to the entry for this symbol in the
3766 1.1 skrll global offset table. */
3767 1.1 skrll if (hh != NULL)
3768 1.1 skrll {
3769 1.1 skrll bfd_boolean dyn;
3770 1.1 skrll
3771 1.1 skrll off = hh->eh.got.offset;
3772 1.1 skrll dyn = htab->etab.dynamic_sections_created;
3773 1.1 skrll if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3774 1.1 skrll &hh->eh))
3775 1.1 skrll {
3776 1.1 skrll /* If we aren't going to call finish_dynamic_symbol,
3777 1.1 skrll then we need to handle initialisation of the .got
3778 1.1 skrll entry and create needed relocs here. Since the
3779 1.1 skrll offset must always be a multiple of 4, we use the
3780 1.1 skrll least significant bit to record whether we have
3781 1.1 skrll initialised it already. */
3782 1.1 skrll if ((off & 1) != 0)
3783 1.1 skrll off &= ~1;
3784 1.1 skrll else
3785 1.1 skrll {
3786 1.1 skrll hh->eh.got.offset |= 1;
3787 1.1 skrll do_got = 1;
3788 1.1 skrll }
3789 1.1 skrll }
3790 1.1 skrll }
3791 1.1 skrll else
3792 1.1 skrll {
3793 1.1 skrll /* Local symbol case. */
3794 1.1 skrll if (local_got_offsets == NULL)
3795 1.1 skrll abort ();
3796 1.1 skrll
3797 1.1 skrll off = local_got_offsets[r_symndx];
3798 1.1 skrll
3799 1.1 skrll /* The offset must always be a multiple of 4. We use
3800 1.1 skrll the least significant bit to record whether we have
3801 1.1 skrll already generated the necessary reloc. */
3802 1.1 skrll if ((off & 1) != 0)
3803 1.1 skrll off &= ~1;
3804 1.1 skrll else
3805 1.1 skrll {
3806 1.1 skrll local_got_offsets[r_symndx] |= 1;
3807 1.1 skrll do_got = 1;
3808 1.1 skrll }
3809 1.1 skrll }
3810 1.1 skrll
3811 1.1 skrll if (do_got)
3812 1.1 skrll {
3813 1.1 skrll if (info->shared)
3814 1.1 skrll {
3815 1.1 skrll /* Output a dynamic relocation for this GOT entry.
3816 1.1 skrll In this case it is relative to the base of the
3817 1.1 skrll object because the symbol index is zero. */
3818 1.1 skrll Elf_Internal_Rela outrel;
3819 1.1 skrll bfd_byte *loc;
3820 1.1 skrll asection *sec = htab->srelgot;
3821 1.1 skrll
3822 1.1 skrll outrel.r_offset = (off
3823 1.1 skrll + htab->sgot->output_offset
3824 1.1 skrll + htab->sgot->output_section->vma);
3825 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3826 1.1 skrll outrel.r_addend = relocation;
3827 1.1 skrll loc = sec->contents;
3828 1.1 skrll loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3829 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3830 1.1 skrll }
3831 1.1 skrll else
3832 1.1 skrll bfd_put_32 (output_bfd, relocation,
3833 1.1 skrll htab->sgot->contents + off);
3834 1.1 skrll }
3835 1.1 skrll
3836 1.1 skrll if (off >= (bfd_vma) -2)
3837 1.1 skrll abort ();
3838 1.1 skrll
3839 1.1 skrll /* Add the base of the GOT to the relocation value. */
3840 1.1 skrll relocation = (off
3841 1.1 skrll + htab->sgot->output_offset
3842 1.1 skrll + htab->sgot->output_section->vma);
3843 1.1 skrll }
3844 1.1 skrll break;
3845 1.1 skrll
3846 1.1 skrll case R_PARISC_SEGREL32:
3847 1.1 skrll /* If this is the first SEGREL relocation, then initialize
3848 1.1 skrll the segment base values. */
3849 1.1 skrll if (htab->text_segment_base == (bfd_vma) -1)
3850 1.1 skrll bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3851 1.1 skrll break;
3852 1.1 skrll
3853 1.1 skrll case R_PARISC_PLABEL14R:
3854 1.1 skrll case R_PARISC_PLABEL21L:
3855 1.1 skrll case R_PARISC_PLABEL32:
3856 1.1 skrll if (htab->etab.dynamic_sections_created)
3857 1.1 skrll {
3858 1.1 skrll bfd_vma off;
3859 1.1 skrll bfd_boolean do_plt = 0;
3860 1.1 skrll /* If we have a global symbol with a PLT slot, then
3861 1.1 skrll redirect this relocation to it. */
3862 1.1 skrll if (hh != NULL)
3863 1.1 skrll {
3864 1.1 skrll off = hh->eh.plt.offset;
3865 1.1 skrll if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3866 1.1 skrll &hh->eh))
3867 1.1 skrll {
3868 1.1 skrll /* In a non-shared link, adjust_dynamic_symbols
3869 1.1 skrll isn't called for symbols forced local. We
3870 1.1 skrll need to write out the plt entry here. */
3871 1.1 skrll if ((off & 1) != 0)
3872 1.1 skrll off &= ~1;
3873 1.1 skrll else
3874 1.1 skrll {
3875 1.1 skrll hh->eh.plt.offset |= 1;
3876 1.1 skrll do_plt = 1;
3877 1.1 skrll }
3878 1.1 skrll }
3879 1.1 skrll }
3880 1.1 skrll else
3881 1.1 skrll {
3882 1.1 skrll bfd_vma *local_plt_offsets;
3883 1.1 skrll
3884 1.1 skrll if (local_got_offsets == NULL)
3885 1.1 skrll abort ();
3886 1.1 skrll
3887 1.1 skrll local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3888 1.1 skrll off = local_plt_offsets[r_symndx];
3889 1.1 skrll
3890 1.1 skrll /* As for the local .got entry case, we use the last
3891 1.1 skrll bit to record whether we've already initialised
3892 1.1 skrll this local .plt entry. */
3893 1.1 skrll if ((off & 1) != 0)
3894 1.1 skrll off &= ~1;
3895 1.1 skrll else
3896 1.1 skrll {
3897 1.1 skrll local_plt_offsets[r_symndx] |= 1;
3898 1.1 skrll do_plt = 1;
3899 1.1 skrll }
3900 1.1 skrll }
3901 1.1 skrll
3902 1.1 skrll if (do_plt)
3903 1.1 skrll {
3904 1.1 skrll if (info->shared)
3905 1.1 skrll {
3906 1.1 skrll /* Output a dynamic IPLT relocation for this
3907 1.1 skrll PLT entry. */
3908 1.1 skrll Elf_Internal_Rela outrel;
3909 1.1 skrll bfd_byte *loc;
3910 1.1 skrll asection *s = htab->srelplt;
3911 1.1 skrll
3912 1.1 skrll outrel.r_offset = (off
3913 1.1 skrll + htab->splt->output_offset
3914 1.1 skrll + htab->splt->output_section->vma);
3915 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3916 1.1 skrll outrel.r_addend = relocation;
3917 1.1 skrll loc = s->contents;
3918 1.1 skrll loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3919 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3920 1.1 skrll }
3921 1.1 skrll else
3922 1.1 skrll {
3923 1.1 skrll bfd_put_32 (output_bfd,
3924 1.1 skrll relocation,
3925 1.1 skrll htab->splt->contents + off);
3926 1.1 skrll bfd_put_32 (output_bfd,
3927 1.1 skrll elf_gp (htab->splt->output_section->owner),
3928 1.1 skrll htab->splt->contents + off + 4);
3929 1.1 skrll }
3930 1.1 skrll }
3931 1.1 skrll
3932 1.1 skrll if (off >= (bfd_vma) -2)
3933 1.1 skrll abort ();
3934 1.1 skrll
3935 1.1 skrll /* PLABELs contain function pointers. Relocation is to
3936 1.1 skrll the entry for the function in the .plt. The magic +2
3937 1.1 skrll offset signals to $$dyncall that the function pointer
3938 1.1 skrll is in the .plt and thus has a gp pointer too.
3939 1.1 skrll Exception: Undefined PLABELs should have a value of
3940 1.1 skrll zero. */
3941 1.1 skrll if (hh == NULL
3942 1.1 skrll || (hh->eh.root.type != bfd_link_hash_undefweak
3943 1.1 skrll && hh->eh.root.type != bfd_link_hash_undefined))
3944 1.1 skrll {
3945 1.1 skrll relocation = (off
3946 1.1 skrll + htab->splt->output_offset
3947 1.1 skrll + htab->splt->output_section->vma
3948 1.1 skrll + 2);
3949 1.1 skrll }
3950 1.1 skrll plabel = 1;
3951 1.1 skrll }
3952 1.1 skrll /* Fall through and possibly emit a dynamic relocation. */
3953 1.1 skrll
3954 1.1 skrll case R_PARISC_DIR17F:
3955 1.1 skrll case R_PARISC_DIR17R:
3956 1.1 skrll case R_PARISC_DIR14F:
3957 1.1 skrll case R_PARISC_DIR14R:
3958 1.1 skrll case R_PARISC_DIR21L:
3959 1.1 skrll case R_PARISC_DPREL14F:
3960 1.1 skrll case R_PARISC_DPREL14R:
3961 1.1 skrll case R_PARISC_DPREL21L:
3962 1.1 skrll case R_PARISC_DIR32:
3963 1.1 skrll if ((input_section->flags & SEC_ALLOC) == 0)
3964 1.1 skrll break;
3965 1.1 skrll
3966 1.1 skrll /* The reloc types handled here and this conditional
3967 1.1 skrll expression must match the code in ..check_relocs and
3968 1.1 skrll allocate_dynrelocs. ie. We need exactly the same condition
3969 1.1 skrll as in ..check_relocs, with some extra conditions (dynindx
3970 1.1 skrll test in this case) to cater for relocs removed by
3971 1.1 skrll allocate_dynrelocs. If you squint, the non-shared test
3972 1.1 skrll here does indeed match the one in ..check_relocs, the
3973 1.1 skrll difference being that here we test DEF_DYNAMIC as well as
3974 1.1 skrll !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3975 1.1 skrll which is why we can't use just that test here.
3976 1.1 skrll Conversely, DEF_DYNAMIC can't be used in check_relocs as
3977 1.1 skrll there all files have not been loaded. */
3978 1.1 skrll if ((info->shared
3979 1.1 skrll && (hh == NULL
3980 1.1 skrll || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3981 1.1 skrll || hh->eh.root.type != bfd_link_hash_undefweak)
3982 1.1 skrll && (IS_ABSOLUTE_RELOC (r_type)
3983 1.1 skrll || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
3984 1.1 skrll || (!info->shared
3985 1.1 skrll && hh != NULL
3986 1.1 skrll && hh->eh.dynindx != -1
3987 1.1 skrll && !hh->eh.non_got_ref
3988 1.1 skrll && ((ELIMINATE_COPY_RELOCS
3989 1.1 skrll && hh->eh.def_dynamic
3990 1.1 skrll && !hh->eh.def_regular)
3991 1.1 skrll || hh->eh.root.type == bfd_link_hash_undefweak
3992 1.1 skrll || hh->eh.root.type == bfd_link_hash_undefined)))
3993 1.1 skrll {
3994 1.1 skrll Elf_Internal_Rela outrel;
3995 1.1 skrll bfd_boolean skip;
3996 1.1 skrll asection *sreloc;
3997 1.1 skrll bfd_byte *loc;
3998 1.1 skrll
3999 1.1 skrll /* When generating a shared object, these relocations
4000 1.1 skrll are copied into the output file to be resolved at run
4001 1.1 skrll time. */
4002 1.1 skrll
4003 1.1 skrll outrel.r_addend = rela->r_addend;
4004 1.1 skrll outrel.r_offset =
4005 1.1 skrll _bfd_elf_section_offset (output_bfd, info, input_section,
4006 1.1 skrll rela->r_offset);
4007 1.1 skrll skip = (outrel.r_offset == (bfd_vma) -1
4008 1.1 skrll || outrel.r_offset == (bfd_vma) -2);
4009 1.1 skrll outrel.r_offset += (input_section->output_offset
4010 1.1 skrll + input_section->output_section->vma);
4011 1.1 skrll
4012 1.1 skrll if (skip)
4013 1.1 skrll {
4014 1.1 skrll memset (&outrel, 0, sizeof (outrel));
4015 1.1 skrll }
4016 1.1 skrll else if (hh != NULL
4017 1.1 skrll && hh->eh.dynindx != -1
4018 1.1 skrll && (plabel
4019 1.1 skrll || !IS_ABSOLUTE_RELOC (r_type)
4020 1.1 skrll || !info->shared
4021 1.1 skrll || !info->symbolic
4022 1.1 skrll || !hh->eh.def_regular))
4023 1.1 skrll {
4024 1.1 skrll outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4025 1.1 skrll }
4026 1.1 skrll else /* It's a local symbol, or one marked to become local. */
4027 1.1 skrll {
4028 1.1 skrll int indx = 0;
4029 1.1 skrll
4030 1.1 skrll /* Add the absolute offset of the symbol. */
4031 1.1 skrll outrel.r_addend += relocation;
4032 1.1 skrll
4033 1.1 skrll /* Global plabels need to be processed by the
4034 1.1 skrll dynamic linker so that functions have at most one
4035 1.1 skrll fptr. For this reason, we need to differentiate
4036 1.1 skrll between global and local plabels, which we do by
4037 1.1 skrll providing the function symbol for a global plabel
4038 1.1 skrll reloc, and no symbol for local plabels. */
4039 1.1 skrll if (! plabel
4040 1.1 skrll && sym_sec != NULL
4041 1.1 skrll && sym_sec->output_section != NULL
4042 1.1 skrll && ! bfd_is_abs_section (sym_sec))
4043 1.1 skrll {
4044 1.1 skrll asection *osec;
4045 1.1 skrll
4046 1.1 skrll osec = sym_sec->output_section;
4047 1.1 skrll indx = elf_section_data (osec)->dynindx;
4048 1.1 skrll if (indx == 0)
4049 1.1 skrll {
4050 1.1 skrll osec = htab->etab.text_index_section;
4051 1.1 skrll indx = elf_section_data (osec)->dynindx;
4052 1.1 skrll }
4053 1.1 skrll BFD_ASSERT (indx != 0);
4054 1.1 skrll
4055 1.1 skrll /* We are turning this relocation into one
4056 1.1 skrll against a section symbol, so subtract out the
4057 1.1 skrll output section's address but not the offset
4058 1.1 skrll of the input section in the output section. */
4059 1.1 skrll outrel.r_addend -= osec->vma;
4060 1.1 skrll }
4061 1.1 skrll
4062 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, r_type);
4063 1.1 skrll }
4064 1.1 skrll sreloc = elf_section_data (input_section)->sreloc;
4065 1.1 skrll if (sreloc == NULL)
4066 1.1 skrll abort ();
4067 1.1 skrll
4068 1.1 skrll loc = sreloc->contents;
4069 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4070 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4071 1.1 skrll }
4072 1.1 skrll break;
4073 1.1 skrll
4074 1.1 skrll case R_PARISC_TLS_LDM21L:
4075 1.1 skrll case R_PARISC_TLS_LDM14R:
4076 1.1 skrll {
4077 1.1 skrll bfd_vma off;
4078 1.1 skrll
4079 1.1 skrll off = htab->tls_ldm_got.offset;
4080 1.1 skrll if (off & 1)
4081 1.1 skrll off &= ~1;
4082 1.1 skrll else
4083 1.1 skrll {
4084 1.1 skrll Elf_Internal_Rela outrel;
4085 1.1 skrll bfd_byte *loc;
4086 1.1 skrll
4087 1.1 skrll outrel.r_offset = (off
4088 1.1 skrll + htab->sgot->output_section->vma
4089 1.1 skrll + htab->sgot->output_offset);
4090 1.1 skrll outrel.r_addend = 0;
4091 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4092 1.1 skrll loc = htab->srelgot->contents;
4093 1.1 skrll loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4094 1.1 skrll
4095 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4096 1.1 skrll htab->tls_ldm_got.offset |= 1;
4097 1.1 skrll }
4098 1.1 skrll
4099 1.1 skrll /* Add the base of the GOT to the relocation value. */
4100 1.1 skrll relocation = (off
4101 1.1 skrll + htab->sgot->output_offset
4102 1.1 skrll + htab->sgot->output_section->vma);
4103 1.1 skrll
4104 1.1 skrll break;
4105 1.1 skrll }
4106 1.1 skrll
4107 1.1 skrll case R_PARISC_TLS_LDO21L:
4108 1.1 skrll case R_PARISC_TLS_LDO14R:
4109 1.1 skrll relocation -= dtpoff_base (info);
4110 1.1 skrll break;
4111 1.1 skrll
4112 1.1 skrll case R_PARISC_TLS_GD21L:
4113 1.1 skrll case R_PARISC_TLS_GD14R:
4114 1.1 skrll case R_PARISC_TLS_IE21L:
4115 1.1 skrll case R_PARISC_TLS_IE14R:
4116 1.1 skrll {
4117 1.1 skrll bfd_vma off;
4118 1.1 skrll int indx;
4119 1.1 skrll char tls_type;
4120 1.1 skrll
4121 1.1 skrll indx = 0;
4122 1.1 skrll if (hh != NULL)
4123 1.1 skrll {
4124 1.1 skrll bfd_boolean dyn;
4125 1.1 skrll dyn = htab->etab.dynamic_sections_created;
4126 1.1 skrll
4127 1.1 skrll if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4128 1.1 skrll && (!info->shared
4129 1.1 skrll || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4130 1.1 skrll {
4131 1.1 skrll indx = hh->eh.dynindx;
4132 1.1 skrll }
4133 1.1 skrll off = hh->eh.got.offset;
4134 1.1 skrll tls_type = hh->tls_type;
4135 1.1 skrll }
4136 1.1 skrll else
4137 1.1 skrll {
4138 1.1 skrll off = local_got_offsets[r_symndx];
4139 1.1 skrll tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4140 1.1 skrll }
4141 1.1 skrll
4142 1.1 skrll if (tls_type == GOT_UNKNOWN)
4143 1.1 skrll abort ();
4144 1.1 skrll
4145 1.1 skrll if ((off & 1) != 0)
4146 1.1 skrll off &= ~1;
4147 1.1 skrll else
4148 1.1 skrll {
4149 1.1 skrll bfd_boolean need_relocs = FALSE;
4150 1.1 skrll Elf_Internal_Rela outrel;
4151 1.1 skrll bfd_byte *loc = NULL;
4152 1.1 skrll int cur_off = off;
4153 1.1 skrll
4154 1.1 skrll /* The GOT entries have not been initialized yet. Do it
4155 1.1 skrll now, and emit any relocations. If both an IE GOT and a
4156 1.1 skrll GD GOT are necessary, we emit the GD first. */
4157 1.1 skrll
4158 1.1 skrll if ((info->shared || indx != 0)
4159 1.1 skrll && (hh == NULL
4160 1.1 skrll || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4161 1.1 skrll || hh->eh.root.type != bfd_link_hash_undefweak))
4162 1.1 skrll {
4163 1.1 skrll need_relocs = TRUE;
4164 1.1 skrll loc = htab->srelgot->contents;
4165 1.1 skrll /* FIXME (CAO): Should this be reloc_count++ ? */
4166 1.1 skrll loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4167 1.1 skrll }
4168 1.1 skrll
4169 1.1 skrll if (tls_type & GOT_TLS_GD)
4170 1.1 skrll {
4171 1.1 skrll if (need_relocs)
4172 1.1 skrll {
4173 1.1 skrll outrel.r_offset = (cur_off
4174 1.1 skrll + htab->sgot->output_section->vma
4175 1.1 skrll + htab->sgot->output_offset);
4176 1.1 skrll outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4177 1.1 skrll outrel.r_addend = 0;
4178 1.1 skrll bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4179 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4180 1.1 skrll htab->srelgot->reloc_count++;
4181 1.1 skrll loc += sizeof (Elf32_External_Rela);
4182 1.1 skrll
4183 1.1 skrll if (indx == 0)
4184 1.1 skrll bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4185 1.1 skrll htab->sgot->contents + cur_off + 4);
4186 1.1 skrll else
4187 1.1 skrll {
4188 1.1 skrll bfd_put_32 (output_bfd, 0,
4189 1.1 skrll htab->sgot->contents + cur_off + 4);
4190 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4191 1.1 skrll outrel.r_offset += 4;
4192 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4193 1.1 skrll htab->srelgot->reloc_count++;
4194 1.1 skrll loc += sizeof (Elf32_External_Rela);
4195 1.1 skrll }
4196 1.1 skrll }
4197 1.1 skrll else
4198 1.1 skrll {
4199 1.1 skrll /* If we are not emitting relocations for a
4200 1.1 skrll general dynamic reference, then we must be in a
4201 1.1 skrll static link or an executable link with the
4202 1.1 skrll symbol binding locally. Mark it as belonging
4203 1.1 skrll to module 1, the executable. */
4204 1.1 skrll bfd_put_32 (output_bfd, 1,
4205 1.1 skrll htab->sgot->contents + cur_off);
4206 1.1 skrll bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4207 1.1 skrll htab->sgot->contents + cur_off + 4);
4208 1.1 skrll }
4209 1.1 skrll
4210 1.1 skrll
4211 1.1 skrll cur_off += 8;
4212 1.1 skrll }
4213 1.1 skrll
4214 1.1 skrll if (tls_type & GOT_TLS_IE)
4215 1.1 skrll {
4216 1.1 skrll if (need_relocs)
4217 1.1 skrll {
4218 1.1 skrll outrel.r_offset = (cur_off
4219 1.1 skrll + htab->sgot->output_section->vma
4220 1.1 skrll + htab->sgot->output_offset);
4221 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4222 1.1 skrll
4223 1.1 skrll if (indx == 0)
4224 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info);
4225 1.1 skrll else
4226 1.1 skrll outrel.r_addend = 0;
4227 1.1 skrll
4228 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4229 1.1 skrll htab->srelgot->reloc_count++;
4230 1.1 skrll loc += sizeof (Elf32_External_Rela);
4231 1.1 skrll }
4232 1.1 skrll else
4233 1.1 skrll bfd_put_32 (output_bfd, tpoff (info, relocation),
4234 1.1 skrll htab->sgot->contents + cur_off);
4235 1.1 skrll
4236 1.1 skrll cur_off += 4;
4237 1.1 skrll }
4238 1.1 skrll
4239 1.1 skrll if (hh != NULL)
4240 1.1 skrll hh->eh.got.offset |= 1;
4241 1.1 skrll else
4242 1.1 skrll local_got_offsets[r_symndx] |= 1;
4243 1.1 skrll }
4244 1.1 skrll
4245 1.1 skrll if ((tls_type & GOT_TLS_GD)
4246 1.1 skrll && r_type != R_PARISC_TLS_GD21L
4247 1.1 skrll && r_type != R_PARISC_TLS_GD14R)
4248 1.1 skrll off += 2 * GOT_ENTRY_SIZE;
4249 1.1 skrll
4250 1.1 skrll /* Add the base of the GOT to the relocation value. */
4251 1.1 skrll relocation = (off
4252 1.1 skrll + htab->sgot->output_offset
4253 1.1 skrll + htab->sgot->output_section->vma);
4254 1.1 skrll
4255 1.1 skrll break;
4256 1.1 skrll }
4257 1.1 skrll
4258 1.1 skrll case R_PARISC_TLS_LE21L:
4259 1.1 skrll case R_PARISC_TLS_LE14R:
4260 1.1 skrll {
4261 1.1 skrll relocation = tpoff (info, relocation);
4262 1.1 skrll break;
4263 1.1 skrll }
4264 1.1 skrll break;
4265 1.1 skrll
4266 1.1 skrll default:
4267 1.1 skrll break;
4268 1.1 skrll }
4269 1.1 skrll
4270 1.1 skrll rstatus = final_link_relocate (input_section, contents, rela, relocation,
4271 1.1 skrll htab, sym_sec, hh, info);
4272 1.1 skrll
4273 1.1 skrll if (rstatus == bfd_reloc_ok)
4274 1.1 skrll continue;
4275 1.1 skrll
4276 1.1 skrll if (hh != NULL)
4277 1.1 skrll sym_name = hh_name (hh);
4278 1.1 skrll else
4279 1.1 skrll {
4280 1.1 skrll sym_name = bfd_elf_string_from_elf_section (input_bfd,
4281 1.1 skrll symtab_hdr->sh_link,
4282 1.1 skrll sym->st_name);
4283 1.1 skrll if (sym_name == NULL)
4284 1.1 skrll return FALSE;
4285 1.1 skrll if (*sym_name == '\0')
4286 1.1 skrll sym_name = bfd_section_name (input_bfd, sym_sec);
4287 1.1 skrll }
4288 1.1 skrll
4289 1.1 skrll howto = elf_hppa_howto_table + r_type;
4290 1.1 skrll
4291 1.1 skrll if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4292 1.1 skrll {
4293 1.1 skrll if (rstatus == bfd_reloc_notsupported || !warned_undef)
4294 1.1 skrll {
4295 1.1 skrll (*_bfd_error_handler)
4296 1.1 skrll (_("%B(%A+0x%lx): cannot handle %s for %s"),
4297 1.1 skrll input_bfd,
4298 1.1 skrll input_section,
4299 1.1 skrll (long) rela->r_offset,
4300 1.1 skrll howto->name,
4301 1.1 skrll sym_name);
4302 1.1 skrll bfd_set_error (bfd_error_bad_value);
4303 1.1 skrll return FALSE;
4304 1.1 skrll }
4305 1.1 skrll }
4306 1.1 skrll else
4307 1.1 skrll {
4308 1.1 skrll if (!((*info->callbacks->reloc_overflow)
4309 1.1 skrll (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4310 1.1 skrll (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4311 1.1 skrll return FALSE;
4312 1.1 skrll }
4313 1.1 skrll }
4314 1.1 skrll
4315 1.1 skrll return TRUE;
4316 1.1 skrll }
4317 1.1 skrll
4318 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
4319 1.1 skrll dynamic sections here. */
4320 1.1 skrll
4321 1.1 skrll static bfd_boolean
4322 1.1 skrll elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4323 1.1 skrll struct bfd_link_info *info,
4324 1.1 skrll struct elf_link_hash_entry *eh,
4325 1.1 skrll Elf_Internal_Sym *sym)
4326 1.1 skrll {
4327 1.1 skrll struct elf32_hppa_link_hash_table *htab;
4328 1.1 skrll Elf_Internal_Rela rela;
4329 1.1 skrll bfd_byte *loc;
4330 1.1 skrll
4331 1.1 skrll htab = hppa_link_hash_table (info);
4332 1.3 christos if (htab == NULL)
4333 1.3 christos return FALSE;
4334 1.1 skrll
4335 1.1 skrll if (eh->plt.offset != (bfd_vma) -1)
4336 1.1 skrll {
4337 1.1 skrll bfd_vma value;
4338 1.1 skrll
4339 1.1 skrll if (eh->plt.offset & 1)
4340 1.1 skrll abort ();
4341 1.1 skrll
4342 1.1 skrll /* This symbol has an entry in the procedure linkage table. Set
4343 1.1 skrll it up.
4344 1.1 skrll
4345 1.1 skrll The format of a plt entry is
4346 1.1 skrll <funcaddr>
4347 1.1 skrll <__gp>
4348 1.1 skrll */
4349 1.1 skrll value = 0;
4350 1.1 skrll if (eh->root.type == bfd_link_hash_defined
4351 1.1 skrll || eh->root.type == bfd_link_hash_defweak)
4352 1.1 skrll {
4353 1.1 skrll value = eh->root.u.def.value;
4354 1.1 skrll if (eh->root.u.def.section->output_section != NULL)
4355 1.1 skrll value += (eh->root.u.def.section->output_offset
4356 1.1 skrll + eh->root.u.def.section->output_section->vma);
4357 1.1 skrll }
4358 1.1 skrll
4359 1.1 skrll /* Create a dynamic IPLT relocation for this entry. */
4360 1.1 skrll rela.r_offset = (eh->plt.offset
4361 1.1 skrll + htab->splt->output_offset
4362 1.1 skrll + htab->splt->output_section->vma);
4363 1.1 skrll if (eh->dynindx != -1)
4364 1.1 skrll {
4365 1.1 skrll rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4366 1.1 skrll rela.r_addend = 0;
4367 1.1 skrll }
4368 1.1 skrll else
4369 1.1 skrll {
4370 1.1 skrll /* This symbol has been marked to become local, and is
4371 1.1 skrll used by a plabel so must be kept in the .plt. */
4372 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4373 1.1 skrll rela.r_addend = value;
4374 1.1 skrll }
4375 1.1 skrll
4376 1.1 skrll loc = htab->srelplt->contents;
4377 1.1 skrll loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4378 1.1 skrll bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4379 1.1 skrll
4380 1.1 skrll if (!eh->def_regular)
4381 1.1 skrll {
4382 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
4383 1.1 skrll the .plt section. Leave the value alone. */
4384 1.1 skrll sym->st_shndx = SHN_UNDEF;
4385 1.1 skrll }
4386 1.1 skrll }
4387 1.1 skrll
4388 1.1 skrll if (eh->got.offset != (bfd_vma) -1
4389 1.1 skrll && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4390 1.1 skrll && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4391 1.1 skrll {
4392 1.1 skrll /* This symbol has an entry in the global offset table. Set it
4393 1.1 skrll up. */
4394 1.1 skrll
4395 1.1 skrll rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4396 1.1 skrll + htab->sgot->output_offset
4397 1.1 skrll + htab->sgot->output_section->vma);
4398 1.1 skrll
4399 1.1 skrll /* If this is a -Bsymbolic link and the symbol is defined
4400 1.1 skrll locally or was forced to be local because of a version file,
4401 1.1 skrll we just want to emit a RELATIVE reloc. The entry in the
4402 1.1 skrll global offset table will already have been initialized in the
4403 1.1 skrll relocate_section function. */
4404 1.1 skrll if (info->shared
4405 1.1 skrll && (info->symbolic || eh->dynindx == -1)
4406 1.1 skrll && eh->def_regular)
4407 1.1 skrll {
4408 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4409 1.1 skrll rela.r_addend = (eh->root.u.def.value
4410 1.1 skrll + eh->root.u.def.section->output_offset
4411 1.1 skrll + eh->root.u.def.section->output_section->vma);
4412 1.1 skrll }
4413 1.1 skrll else
4414 1.1 skrll {
4415 1.1 skrll if ((eh->got.offset & 1) != 0)
4416 1.1 skrll abort ();
4417 1.1 skrll
4418 1.1 skrll bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4419 1.1 skrll rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4420 1.1 skrll rela.r_addend = 0;
4421 1.1 skrll }
4422 1.1 skrll
4423 1.1 skrll loc = htab->srelgot->contents;
4424 1.1 skrll loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4425 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4426 1.1 skrll }
4427 1.1 skrll
4428 1.1 skrll if (eh->needs_copy)
4429 1.1 skrll {
4430 1.1 skrll asection *sec;
4431 1.1 skrll
4432 1.1 skrll /* This symbol needs a copy reloc. Set it up. */
4433 1.1 skrll
4434 1.1 skrll if (! (eh->dynindx != -1
4435 1.1 skrll && (eh->root.type == bfd_link_hash_defined
4436 1.1 skrll || eh->root.type == bfd_link_hash_defweak)))
4437 1.1 skrll abort ();
4438 1.1 skrll
4439 1.1 skrll sec = htab->srelbss;
4440 1.1 skrll
4441 1.1 skrll rela.r_offset = (eh->root.u.def.value
4442 1.1 skrll + eh->root.u.def.section->output_offset
4443 1.1 skrll + eh->root.u.def.section->output_section->vma);
4444 1.1 skrll rela.r_addend = 0;
4445 1.1 skrll rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4446 1.1 skrll loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4447 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4448 1.1 skrll }
4449 1.1 skrll
4450 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4451 1.1 skrll if (eh_name (eh)[0] == '_'
4452 1.1 skrll && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4453 1.1 skrll || eh == htab->etab.hgot))
4454 1.1 skrll {
4455 1.1 skrll sym->st_shndx = SHN_ABS;
4456 1.1 skrll }
4457 1.1 skrll
4458 1.1 skrll return TRUE;
4459 1.1 skrll }
4460 1.1 skrll
4461 1.1 skrll /* Used to decide how to sort relocs in an optimal manner for the
4462 1.1 skrll dynamic linker, before writing them out. */
4463 1.1 skrll
4464 1.1 skrll static enum elf_reloc_type_class
4465 1.1 skrll elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4466 1.1 skrll {
4467 1.1 skrll /* Handle TLS relocs first; we don't want them to be marked
4468 1.3 christos relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
4469 1.1 skrll check below. */
4470 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
4471 1.1 skrll {
4472 1.1 skrll case R_PARISC_TLS_DTPMOD32:
4473 1.1 skrll case R_PARISC_TLS_DTPOFF32:
4474 1.1 skrll case R_PARISC_TLS_TPREL32:
4475 1.1 skrll return reloc_class_normal;
4476 1.1 skrll }
4477 1.1 skrll
4478 1.3 christos if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)
4479 1.1 skrll return reloc_class_relative;
4480 1.1 skrll
4481 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
4482 1.1 skrll {
4483 1.1 skrll case R_PARISC_IPLT:
4484 1.1 skrll return reloc_class_plt;
4485 1.1 skrll case R_PARISC_COPY:
4486 1.1 skrll return reloc_class_copy;
4487 1.1 skrll default:
4488 1.1 skrll return reloc_class_normal;
4489 1.1 skrll }
4490 1.1 skrll }
4491 1.1 skrll
4492 1.1 skrll /* Finish up the dynamic sections. */
4493 1.1 skrll
4494 1.1 skrll static bfd_boolean
4495 1.1 skrll elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4496 1.1 skrll struct bfd_link_info *info)
4497 1.1 skrll {
4498 1.1 skrll bfd *dynobj;
4499 1.1 skrll struct elf32_hppa_link_hash_table *htab;
4500 1.1 skrll asection *sdyn;
4501 1.1 skrll
4502 1.1 skrll htab = hppa_link_hash_table (info);
4503 1.3 christos if (htab == NULL)
4504 1.3 christos return FALSE;
4505 1.3 christos
4506 1.1 skrll dynobj = htab->etab.dynobj;
4507 1.1 skrll
4508 1.1 skrll sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4509 1.1 skrll
4510 1.1 skrll if (htab->etab.dynamic_sections_created)
4511 1.1 skrll {
4512 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend;
4513 1.1 skrll
4514 1.1 skrll if (sdyn == NULL)
4515 1.1 skrll abort ();
4516 1.1 skrll
4517 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents;
4518 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4519 1.1 skrll for (; dyncon < dynconend; dyncon++)
4520 1.1 skrll {
4521 1.1 skrll Elf_Internal_Dyn dyn;
4522 1.1 skrll asection *s;
4523 1.1 skrll
4524 1.1 skrll bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4525 1.1 skrll
4526 1.1 skrll switch (dyn.d_tag)
4527 1.1 skrll {
4528 1.1 skrll default:
4529 1.1 skrll continue;
4530 1.1 skrll
4531 1.1 skrll case DT_PLTGOT:
4532 1.1 skrll /* Use PLTGOT to set the GOT register. */
4533 1.1 skrll dyn.d_un.d_ptr = elf_gp (output_bfd);
4534 1.1 skrll break;
4535 1.1 skrll
4536 1.1 skrll case DT_JMPREL:
4537 1.1 skrll s = htab->srelplt;
4538 1.1 skrll dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4539 1.1 skrll break;
4540 1.1 skrll
4541 1.1 skrll case DT_PLTRELSZ:
4542 1.1 skrll s = htab->srelplt;
4543 1.1 skrll dyn.d_un.d_val = s->size;
4544 1.1 skrll break;
4545 1.1 skrll
4546 1.1 skrll case DT_RELASZ:
4547 1.1 skrll /* Don't count procedure linkage table relocs in the
4548 1.1 skrll overall reloc count. */
4549 1.1 skrll s = htab->srelplt;
4550 1.1 skrll if (s == NULL)
4551 1.1 skrll continue;
4552 1.1 skrll dyn.d_un.d_val -= s->size;
4553 1.1 skrll break;
4554 1.1 skrll
4555 1.1 skrll case DT_RELA:
4556 1.1 skrll /* We may not be using the standard ELF linker script.
4557 1.1 skrll If .rela.plt is the first .rela section, we adjust
4558 1.1 skrll DT_RELA to not include it. */
4559 1.1 skrll s = htab->srelplt;
4560 1.1 skrll if (s == NULL)
4561 1.1 skrll continue;
4562 1.1 skrll if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4563 1.1 skrll continue;
4564 1.1 skrll dyn.d_un.d_ptr += s->size;
4565 1.1 skrll break;
4566 1.1 skrll }
4567 1.1 skrll
4568 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4569 1.1 skrll }
4570 1.1 skrll }
4571 1.1 skrll
4572 1.1 skrll if (htab->sgot != NULL && htab->sgot->size != 0)
4573 1.1 skrll {
4574 1.1 skrll /* Fill in the first entry in the global offset table.
4575 1.1 skrll We use it to point to our dynamic section, if we have one. */
4576 1.1 skrll bfd_put_32 (output_bfd,
4577 1.1 skrll sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4578 1.1 skrll htab->sgot->contents);
4579 1.1 skrll
4580 1.1 skrll /* The second entry is reserved for use by the dynamic linker. */
4581 1.1 skrll memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4582 1.1 skrll
4583 1.1 skrll /* Set .got entry size. */
4584 1.1 skrll elf_section_data (htab->sgot->output_section)
4585 1.1 skrll ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4586 1.1 skrll }
4587 1.1 skrll
4588 1.1 skrll if (htab->splt != NULL && htab->splt->size != 0)
4589 1.1 skrll {
4590 1.1 skrll /* Set plt entry size. */
4591 1.1 skrll elf_section_data (htab->splt->output_section)
4592 1.1 skrll ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4593 1.1 skrll
4594 1.1 skrll if (htab->need_plt_stub)
4595 1.1 skrll {
4596 1.1 skrll /* Set up the .plt stub. */
4597 1.1 skrll memcpy (htab->splt->contents
4598 1.1 skrll + htab->splt->size - sizeof (plt_stub),
4599 1.1 skrll plt_stub, sizeof (plt_stub));
4600 1.1 skrll
4601 1.1 skrll if ((htab->splt->output_offset
4602 1.1 skrll + htab->splt->output_section->vma
4603 1.1 skrll + htab->splt->size)
4604 1.1 skrll != (htab->sgot->output_offset
4605 1.1 skrll + htab->sgot->output_section->vma))
4606 1.1 skrll {
4607 1.1 skrll (*_bfd_error_handler)
4608 1.1 skrll (_(".got section not immediately after .plt section"));
4609 1.1 skrll return FALSE;
4610 1.1 skrll }
4611 1.1 skrll }
4612 1.1 skrll }
4613 1.1 skrll
4614 1.1 skrll return TRUE;
4615 1.1 skrll }
4616 1.1 skrll
4617 1.1 skrll /* Called when writing out an object file to decide the type of a
4618 1.1 skrll symbol. */
4619 1.1 skrll static int
4620 1.1 skrll elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4621 1.1 skrll {
4622 1.1 skrll if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4623 1.1 skrll return STT_PARISC_MILLI;
4624 1.1 skrll else
4625 1.1 skrll return type;
4626 1.1 skrll }
4627 1.1 skrll
4628 1.1 skrll /* Misc BFD support code. */
4629 1.1 skrll #define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4630 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4631 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4632 1.1 skrll #define elf_info_to_howto elf_hppa_info_to_howto
4633 1.1 skrll #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4634 1.1 skrll
4635 1.1 skrll /* Stuff for the BFD linker. */
4636 1.1 skrll #define bfd_elf32_bfd_final_link elf32_hppa_final_link
4637 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4638 1.1 skrll #define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
4639 1.1 skrll #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
4640 1.1 skrll #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
4641 1.1 skrll #define elf_backend_check_relocs elf32_hppa_check_relocs
4642 1.1 skrll #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4643 1.1 skrll #define elf_backend_fake_sections elf_hppa_fake_sections
4644 1.1 skrll #define elf_backend_relocate_section elf32_hppa_relocate_section
4645 1.1 skrll #define elf_backend_hide_symbol elf32_hppa_hide_symbol
4646 1.1 skrll #define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4647 1.1 skrll #define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4648 1.1 skrll #define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
4649 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4650 1.1 skrll #define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4651 1.1 skrll #define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
4652 1.1 skrll #define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4653 1.1 skrll #define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
4654 1.1 skrll #define elf_backend_object_p elf32_hppa_object_p
4655 1.1 skrll #define elf_backend_final_write_processing elf_hppa_final_write_processing
4656 1.1 skrll #define elf_backend_post_process_headers _bfd_elf_set_osabi
4657 1.1 skrll #define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
4658 1.1 skrll #define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
4659 1.1 skrll #define elf_backend_action_discarded elf_hppa_action_discarded
4660 1.1 skrll
4661 1.1 skrll #define elf_backend_can_gc_sections 1
4662 1.1 skrll #define elf_backend_can_refcount 1
4663 1.1 skrll #define elf_backend_plt_alignment 2
4664 1.1 skrll #define elf_backend_want_got_plt 0
4665 1.1 skrll #define elf_backend_plt_readonly 0
4666 1.1 skrll #define elf_backend_want_plt_sym 0
4667 1.1 skrll #define elf_backend_got_header_size 8
4668 1.1 skrll #define elf_backend_rela_normal 1
4669 1.1 skrll
4670 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_hppa_vec
4671 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa"
4672 1.1 skrll #define ELF_ARCH bfd_arch_hppa
4673 1.3 christos #define ELF_TARGET_ID HPPA32_ELF_DATA
4674 1.1 skrll #define ELF_MACHINE_CODE EM_PARISC
4675 1.1 skrll #define ELF_MAXPAGESIZE 0x1000
4676 1.1 skrll #define ELF_OSABI ELFOSABI_HPUX
4677 1.1 skrll #define elf32_bed elf32_hppa_hpux_bed
4678 1.1 skrll
4679 1.1 skrll #include "elf32-target.h"
4680 1.1 skrll
4681 1.1 skrll #undef TARGET_BIG_SYM
4682 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
4683 1.1 skrll #undef TARGET_BIG_NAME
4684 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa-linux"
4685 1.1 skrll #undef ELF_OSABI
4686 1.1 skrll #define ELF_OSABI ELFOSABI_LINUX
4687 1.1 skrll #undef elf32_bed
4688 1.1 skrll #define elf32_bed elf32_hppa_linux_bed
4689 1.1 skrll
4690 1.1 skrll #include "elf32-target.h"
4691 1.1 skrll
4692 1.1 skrll #undef TARGET_BIG_SYM
4693 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec
4694 1.1 skrll #undef TARGET_BIG_NAME
4695 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa-netbsd"
4696 1.1 skrll #undef ELF_OSABI
4697 1.1 skrll #define ELF_OSABI ELFOSABI_NETBSD
4698 1.1 skrll #undef elf32_bed
4699 1.1 skrll #define elf32_bed elf32_hppa_netbsd_bed
4700 1.1 skrll
4701 1.1 skrll #include "elf32-target.h"
4702