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