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