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