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