elf32-hppa.c revision 1.17 1 1.1 skrll /* BFD back-end for HP PA-RISC ELF files.
2 1.17 christos Copyright (C) 1990-2026 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.16 christos sizeof (struct elf32_hppa_link_hash_entry)))
422 1.1 skrll {
423 1.1 skrll free (htab);
424 1.1 skrll return NULL;
425 1.1 skrll }
426 1.1 skrll
427 1.1 skrll /* Init the stub hash table too. */
428 1.1 skrll if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
429 1.1 skrll sizeof (struct elf32_hppa_stub_hash_entry)))
430 1.7 christos {
431 1.7 christos _bfd_elf_link_hash_table_free (abfd);
432 1.7 christos return NULL;
433 1.7 christos }
434 1.7 christos htab->etab.root.hash_table_free = elf32_hppa_link_hash_table_free;
435 1.14 christos htab->etab.dt_pltgot_required = true;
436 1.1 skrll
437 1.1 skrll htab->text_segment_base = (bfd_vma) -1;
438 1.1 skrll htab->data_segment_base = (bfd_vma) -1;
439 1.1 skrll return &htab->etab.root;
440 1.1 skrll }
441 1.1 skrll
442 1.10 christos /* Initialize the linker stubs BFD so that we can use it for linker
443 1.10 christos created dynamic sections. */
444 1.10 christos
445 1.10 christos void
446 1.10 christos elf32_hppa_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
447 1.10 christos {
448 1.10 christos struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
449 1.10 christos
450 1.10 christos elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS32;
451 1.10 christos htab->etab.dynobj = abfd;
452 1.10 christos }
453 1.10 christos
454 1.1 skrll /* Build a name for an entry in the stub hash table. */
455 1.1 skrll
456 1.1 skrll static char *
457 1.1 skrll hppa_stub_name (const asection *input_section,
458 1.1 skrll const asection *sym_sec,
459 1.1 skrll const struct elf32_hppa_link_hash_entry *hh,
460 1.1 skrll const Elf_Internal_Rela *rela)
461 1.1 skrll {
462 1.1 skrll char *stub_name;
463 1.1 skrll bfd_size_type len;
464 1.1 skrll
465 1.1 skrll if (hh)
466 1.1 skrll {
467 1.1 skrll len = 8 + 1 + strlen (hh_name (hh)) + 1 + 8 + 1;
468 1.1 skrll stub_name = bfd_malloc (len);
469 1.1 skrll if (stub_name != NULL)
470 1.1 skrll sprintf (stub_name, "%08x_%s+%x",
471 1.1 skrll input_section->id & 0xffffffff,
472 1.1 skrll hh_name (hh),
473 1.1 skrll (int) rela->r_addend & 0xffffffff);
474 1.1 skrll }
475 1.1 skrll else
476 1.1 skrll {
477 1.1 skrll len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
478 1.1 skrll stub_name = bfd_malloc (len);
479 1.1 skrll if (stub_name != NULL)
480 1.1 skrll sprintf (stub_name, "%08x_%x:%x+%x",
481 1.1 skrll input_section->id & 0xffffffff,
482 1.1 skrll sym_sec->id & 0xffffffff,
483 1.1 skrll (int) ELF32_R_SYM (rela->r_info) & 0xffffffff,
484 1.1 skrll (int) rela->r_addend & 0xffffffff);
485 1.1 skrll }
486 1.1 skrll return stub_name;
487 1.1 skrll }
488 1.1 skrll
489 1.1 skrll /* Look up an entry in the stub hash. Stub entries are cached because
490 1.1 skrll creating the stub name takes a bit of time. */
491 1.1 skrll
492 1.1 skrll static struct elf32_hppa_stub_hash_entry *
493 1.1 skrll hppa_get_stub_entry (const asection *input_section,
494 1.1 skrll const asection *sym_sec,
495 1.1 skrll struct elf32_hppa_link_hash_entry *hh,
496 1.1 skrll const Elf_Internal_Rela *rela,
497 1.1 skrll struct elf32_hppa_link_hash_table *htab)
498 1.1 skrll {
499 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh_entry;
500 1.1 skrll const asection *id_sec;
501 1.1 skrll
502 1.1 skrll /* If this input section is part of a group of sections sharing one
503 1.1 skrll stub section, then use the id of the first section in the group.
504 1.1 skrll Stub names need to include a section id, as there may well be
505 1.1 skrll more than one stub used to reach say, printf, and we need to
506 1.1 skrll distinguish between them. */
507 1.1 skrll id_sec = htab->stub_group[input_section->id].link_sec;
508 1.12 christos if (id_sec == NULL)
509 1.12 christos return NULL;
510 1.1 skrll
511 1.1 skrll if (hh != NULL && hh->hsh_cache != NULL
512 1.1 skrll && hh->hsh_cache->hh == hh
513 1.1 skrll && hh->hsh_cache->id_sec == id_sec)
514 1.1 skrll {
515 1.1 skrll hsh_entry = hh->hsh_cache;
516 1.1 skrll }
517 1.1 skrll else
518 1.1 skrll {
519 1.1 skrll char *stub_name;
520 1.1 skrll
521 1.1 skrll stub_name = hppa_stub_name (id_sec, sym_sec, hh, rela);
522 1.1 skrll if (stub_name == NULL)
523 1.1 skrll return NULL;
524 1.1 skrll
525 1.1 skrll hsh_entry = hppa_stub_hash_lookup (&htab->bstab,
526 1.14 christos stub_name, false, false);
527 1.1 skrll if (hh != NULL)
528 1.1 skrll hh->hsh_cache = hsh_entry;
529 1.1 skrll
530 1.1 skrll free (stub_name);
531 1.1 skrll }
532 1.1 skrll
533 1.1 skrll return hsh_entry;
534 1.1 skrll }
535 1.1 skrll
536 1.1 skrll /* Add a new stub entry to the stub hash. Not all fields of the new
537 1.1 skrll stub entry are initialised. */
538 1.1 skrll
539 1.1 skrll static struct elf32_hppa_stub_hash_entry *
540 1.1 skrll hppa_add_stub (const char *stub_name,
541 1.1 skrll asection *section,
542 1.1 skrll struct elf32_hppa_link_hash_table *htab)
543 1.1 skrll {
544 1.1 skrll asection *link_sec;
545 1.1 skrll asection *stub_sec;
546 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
547 1.1 skrll
548 1.1 skrll link_sec = htab->stub_group[section->id].link_sec;
549 1.1 skrll stub_sec = htab->stub_group[section->id].stub_sec;
550 1.1 skrll if (stub_sec == NULL)
551 1.1 skrll {
552 1.1 skrll stub_sec = htab->stub_group[link_sec->id].stub_sec;
553 1.1 skrll if (stub_sec == NULL)
554 1.1 skrll {
555 1.1 skrll size_t namelen;
556 1.1 skrll bfd_size_type len;
557 1.1 skrll char *s_name;
558 1.1 skrll
559 1.1 skrll namelen = strlen (link_sec->name);
560 1.1 skrll len = namelen + sizeof (STUB_SUFFIX);
561 1.1 skrll s_name = bfd_alloc (htab->stub_bfd, len);
562 1.1 skrll if (s_name == NULL)
563 1.1 skrll return NULL;
564 1.1 skrll
565 1.1 skrll memcpy (s_name, link_sec->name, namelen);
566 1.1 skrll memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
567 1.1 skrll stub_sec = (*htab->add_stub_section) (s_name, link_sec);
568 1.1 skrll if (stub_sec == NULL)
569 1.1 skrll return NULL;
570 1.1 skrll htab->stub_group[link_sec->id].stub_sec = stub_sec;
571 1.1 skrll }
572 1.1 skrll htab->stub_group[section->id].stub_sec = stub_sec;
573 1.1 skrll }
574 1.1 skrll
575 1.1 skrll /* Enter this entry into the linker stub hash table. */
576 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab, stub_name,
577 1.14 christos true, false);
578 1.1 skrll if (hsh == NULL)
579 1.1 skrll {
580 1.11 christos /* xgettext:c-format */
581 1.12 christos _bfd_error_handler (_("%pB: cannot create stub entry %s"),
582 1.11 christos section->owner, stub_name);
583 1.1 skrll return NULL;
584 1.1 skrll }
585 1.1 skrll
586 1.1 skrll hsh->stub_sec = stub_sec;
587 1.1 skrll hsh->stub_offset = 0;
588 1.1 skrll hsh->id_sec = link_sec;
589 1.1 skrll return hsh;
590 1.1 skrll }
591 1.1 skrll
592 1.1 skrll /* Determine the type of stub needed, if any, for a call. */
593 1.1 skrll
594 1.1 skrll static enum elf32_hppa_stub_type
595 1.1 skrll hppa_type_of_stub (asection *input_sec,
596 1.1 skrll const Elf_Internal_Rela *rela,
597 1.1 skrll struct elf32_hppa_link_hash_entry *hh,
598 1.1 skrll bfd_vma destination,
599 1.1 skrll struct bfd_link_info *info)
600 1.1 skrll {
601 1.1 skrll bfd_vma location;
602 1.1 skrll bfd_vma branch_offset;
603 1.1 skrll bfd_vma max_branch_offset;
604 1.1 skrll unsigned int r_type;
605 1.1 skrll
606 1.1 skrll if (hh != NULL
607 1.1 skrll && hh->eh.plt.offset != (bfd_vma) -1
608 1.1 skrll && hh->eh.dynindx != -1
609 1.1 skrll && !hh->plabel
610 1.7 christos && (bfd_link_pic (info)
611 1.1 skrll || !hh->eh.def_regular
612 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak))
613 1.1 skrll {
614 1.1 skrll /* We need an import stub. Decide between hppa_stub_import
615 1.1 skrll and hppa_stub_import_shared later. */
616 1.1 skrll return hppa_stub_import;
617 1.1 skrll }
618 1.1 skrll
619 1.12 christos if (destination == (bfd_vma) -1)
620 1.12 christos return hppa_stub_none;
621 1.12 christos
622 1.1 skrll /* Determine where the call point is. */
623 1.1 skrll location = (input_sec->output_offset
624 1.1 skrll + input_sec->output_section->vma
625 1.1 skrll + rela->r_offset);
626 1.1 skrll
627 1.1 skrll branch_offset = destination - location - 8;
628 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
629 1.1 skrll
630 1.1 skrll /* Determine if a long branch stub is needed. parisc branch offsets
631 1.1 skrll are relative to the second instruction past the branch, ie. +8
632 1.1 skrll bytes on from the branch instruction location. The offset is
633 1.1 skrll signed and counts in units of 4 bytes. */
634 1.1 skrll if (r_type == (unsigned int) R_PARISC_PCREL17F)
635 1.1 skrll max_branch_offset = (1 << (17 - 1)) << 2;
636 1.1 skrll
637 1.1 skrll else if (r_type == (unsigned int) R_PARISC_PCREL12F)
638 1.1 skrll max_branch_offset = (1 << (12 - 1)) << 2;
639 1.1 skrll
640 1.1 skrll else /* R_PARISC_PCREL22F. */
641 1.1 skrll max_branch_offset = (1 << (22 - 1)) << 2;
642 1.1 skrll
643 1.1 skrll if (branch_offset + max_branch_offset >= 2*max_branch_offset)
644 1.1 skrll return hppa_stub_long_branch;
645 1.1 skrll
646 1.1 skrll return hppa_stub_none;
647 1.1 skrll }
648 1.1 skrll
649 1.1 skrll /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
650 1.1 skrll IN_ARG contains the link info pointer. */
651 1.1 skrll
652 1.1 skrll #define LDIL_R1 0x20200000 /* ldil LR'XXX,%r1 */
653 1.1 skrll #define BE_SR4_R1 0xe0202002 /* be,n RR'XXX(%sr4,%r1) */
654 1.1 skrll
655 1.1 skrll #define BL_R1 0xe8200000 /* b,l .+8,%r1 */
656 1.1 skrll #define ADDIL_R1 0x28200000 /* addil LR'XXX,%r1,%r1 */
657 1.1 skrll #define DEPI_R1 0xd4201c1e /* depi 0,31,2,%r1 */
658 1.1 skrll
659 1.1 skrll #define ADDIL_DP 0x2b600000 /* addil LR'XXX,%dp,%r1 */
660 1.1 skrll #define LDW_R1_R21 0x48350000 /* ldw RR'XXX(%sr0,%r1),%r21 */
661 1.1 skrll #define BV_R0_R21 0xeaa0c000 /* bv %r0(%r21) */
662 1.1 skrll #define LDW_R1_R19 0x48330000 /* ldw RR'XXX(%sr0,%r1),%r19 */
663 1.1 skrll
664 1.1 skrll #define ADDIL_R19 0x2a600000 /* addil LR'XXX,%r19,%r1 */
665 1.1 skrll #define LDW_R1_DP 0x483b0000 /* ldw RR'XXX(%sr0,%r1),%dp */
666 1.1 skrll
667 1.13 christos #define LDO_R1_R22 0x34360000 /* ldo RR'XXX(%r1),%r22 */
668 1.13 christos #define LDW_R22_R21 0x0ec01095 /* ldw 0(%r22),%r21 */
669 1.13 christos #define LDW_R22_R19 0x0ec81093 /* ldw 4(%r22),%r19 */
670 1.13 christos
671 1.1 skrll #define LDSID_R21_R1 0x02a010a1 /* ldsid (%sr0,%r21),%r1 */
672 1.1 skrll #define MTSP_R1 0x00011820 /* mtsp %r1,%sr0 */
673 1.1 skrll #define BE_SR0_R21 0xe2a00000 /* be 0(%sr0,%r21) */
674 1.1 skrll #define STW_RP 0x6bc23fd1 /* stw %rp,-24(%sr0,%sp) */
675 1.1 skrll
676 1.1 skrll #define BL22_RP 0xe800a002 /* b,l,n XXX,%rp */
677 1.1 skrll #define BL_RP 0xe8400002 /* b,l,n XXX,%rp */
678 1.1 skrll #define NOP 0x08000240 /* nop */
679 1.1 skrll #define LDW_RP 0x4bc23fd1 /* ldw -24(%sr0,%sp),%rp */
680 1.1 skrll #define LDSID_RP_R1 0x004010a1 /* ldsid (%sr0,%rp),%r1 */
681 1.1 skrll #define BE_SR0_RP 0xe0400002 /* be,n 0(%sr0,%rp) */
682 1.1 skrll
683 1.1 skrll #ifndef R19_STUBS
684 1.1 skrll #define R19_STUBS 1
685 1.1 skrll #endif
686 1.1 skrll
687 1.1 skrll #if R19_STUBS
688 1.1 skrll #define LDW_R1_DLT LDW_R1_R19
689 1.1 skrll #else
690 1.1 skrll #define LDW_R1_DLT LDW_R1_DP
691 1.1 skrll #endif
692 1.1 skrll
693 1.14 christos static bool
694 1.1 skrll hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
695 1.1 skrll {
696 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
697 1.1 skrll struct bfd_link_info *info;
698 1.1 skrll struct elf32_hppa_link_hash_table *htab;
699 1.1 skrll asection *stub_sec;
700 1.1 skrll bfd *stub_bfd;
701 1.1 skrll bfd_byte *loc;
702 1.1 skrll bfd_vma sym_value;
703 1.1 skrll bfd_vma insn;
704 1.1 skrll bfd_vma off;
705 1.1 skrll int val;
706 1.1 skrll int size;
707 1.1 skrll
708 1.1 skrll /* Massage our args to the form they really have. */
709 1.1 skrll hsh = hppa_stub_hash_entry (bh);
710 1.1 skrll info = (struct bfd_link_info *)in_arg;
711 1.1 skrll
712 1.1 skrll htab = hppa_link_hash_table (info);
713 1.3 christos if (htab == NULL)
714 1.14 christos return false;
715 1.3 christos
716 1.1 skrll stub_sec = hsh->stub_sec;
717 1.1 skrll
718 1.1 skrll /* Make a note of the offset within the stubs for this entry. */
719 1.1 skrll hsh->stub_offset = stub_sec->size;
720 1.1 skrll loc = stub_sec->contents + hsh->stub_offset;
721 1.1 skrll
722 1.1 skrll stub_bfd = stub_sec->owner;
723 1.1 skrll
724 1.1 skrll switch (hsh->stub_type)
725 1.1 skrll {
726 1.1 skrll case hppa_stub_long_branch:
727 1.14 christos /* Fail if the target section could not be assigned to an output
728 1.14 christos section. The user should fix his linker script. */
729 1.14 christos if (hsh->target_section->output_section == NULL
730 1.14 christos && info->non_contiguous_regions)
731 1.16 christos info->callbacks->fatal (_("%P: Could not assign `%pA' to an output "
732 1.14 christos "section. Retry without "
733 1.14 christos "--enable-non-contiguous-regions.\n"),
734 1.14 christos hsh->target_section);
735 1.14 christos
736 1.1 skrll /* Create the long branch. A long branch is formed with "ldil"
737 1.1 skrll loading the upper bits of the target address into a register,
738 1.1 skrll then branching with "be" which adds in the lower bits.
739 1.1 skrll The "be" has its delay slot nullified. */
740 1.1 skrll sym_value = (hsh->target_value
741 1.1 skrll + hsh->target_section->output_offset
742 1.1 skrll + hsh->target_section->output_section->vma);
743 1.1 skrll
744 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_lrsel);
745 1.1 skrll insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
746 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
747 1.1 skrll
748 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_rrsel) >> 2;
749 1.1 skrll insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
750 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
751 1.1 skrll
752 1.13 christos size = LONG_BRANCH_STUB_SIZE;
753 1.1 skrll break;
754 1.1 skrll
755 1.1 skrll case hppa_stub_long_branch_shared:
756 1.14 christos /* Fail if the target section could not be assigned to an output
757 1.14 christos section. The user should fix his linker script. */
758 1.14 christos if (hsh->target_section->output_section == NULL
759 1.14 christos && info->non_contiguous_regions)
760 1.16 christos info->callbacks->fatal (_("%P: Could not assign `%pA' to an output "
761 1.14 christos "section. Retry without "
762 1.14 christos "--enable-non-contiguous-regions.\n"),
763 1.14 christos hsh->target_section);
764 1.14 christos
765 1.1 skrll /* Branches are relative. This is where we are going to. */
766 1.1 skrll sym_value = (hsh->target_value
767 1.1 skrll + hsh->target_section->output_offset
768 1.1 skrll + hsh->target_section->output_section->vma);
769 1.1 skrll
770 1.1 skrll /* And this is where we are coming from, more or less. */
771 1.1 skrll sym_value -= (hsh->stub_offset
772 1.1 skrll + stub_sec->output_offset
773 1.1 skrll + stub_sec->output_section->vma);
774 1.1 skrll
775 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BL_R1, loc);
776 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_lrsel);
777 1.1 skrll insn = hppa_rebuild_insn ((int) ADDIL_R1, val, 21);
778 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
779 1.1 skrll
780 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_rrsel) >> 2;
781 1.1 skrll insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
782 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 8);
783 1.13 christos size = LONG_BRANCH_SHARED_STUB_SIZE;
784 1.1 skrll break;
785 1.1 skrll
786 1.1 skrll case hppa_stub_import:
787 1.1 skrll case hppa_stub_import_shared:
788 1.1 skrll off = hsh->hh->eh.plt.offset;
789 1.1 skrll if (off >= (bfd_vma) -2)
790 1.1 skrll abort ();
791 1.1 skrll
792 1.1 skrll off &= ~ (bfd_vma) 1;
793 1.1 skrll sym_value = (off
794 1.11 christos + htab->etab.splt->output_offset
795 1.11 christos + htab->etab.splt->output_section->vma
796 1.11 christos - elf_gp (htab->etab.splt->output_section->owner));
797 1.1 skrll
798 1.1 skrll insn = ADDIL_DP;
799 1.1 skrll #if R19_STUBS
800 1.1 skrll if (hsh->stub_type == hppa_stub_import_shared)
801 1.1 skrll insn = ADDIL_R19;
802 1.1 skrll #endif
803 1.13 christos
804 1.13 christos /* Load function descriptor address into register %r22. It is
805 1.13 christos sometimes needed for lazy binding. */
806 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_lrsel),
807 1.1 skrll insn = hppa_rebuild_insn ((int) insn, val, 21);
808 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
809 1.1 skrll
810 1.1 skrll val = hppa_field_adjust (sym_value, 0, e_rrsel);
811 1.13 christos insn = hppa_rebuild_insn ((int) LDO_R1_R22, val, 14);
812 1.1 skrll bfd_put_32 (stub_bfd, insn, loc + 4);
813 1.1 skrll
814 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) LDW_R22_R21, loc + 8);
815 1.13 christos
816 1.1 skrll if (htab->multi_subspace)
817 1.1 skrll {
818 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDSID_R21_R1, loc + 12);
819 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) LDW_R22_R19, loc + 16);
820 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 20);
821 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_R21, loc + 24);
822 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) STW_RP, loc + 28);
823 1.1 skrll
824 1.13 christos size = IMPORT_SHARED_STUB_SIZE;
825 1.1 skrll }
826 1.1 skrll else
827 1.1 skrll {
828 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) BV_R0_R21, loc + 12);
829 1.13 christos bfd_put_32 (stub_bfd, (bfd_vma) LDW_R22_R19, loc + 16);
830 1.1 skrll
831 1.13 christos size = IMPORT_STUB_SIZE;
832 1.1 skrll }
833 1.1 skrll
834 1.1 skrll break;
835 1.1 skrll
836 1.1 skrll case hppa_stub_export:
837 1.14 christos /* Fail if the target section could not be assigned to an output
838 1.14 christos section. The user should fix his linker script. */
839 1.14 christos if (hsh->target_section->output_section == NULL
840 1.14 christos && info->non_contiguous_regions)
841 1.16 christos info->callbacks->fatal (_("%P: Could not assign `%pA' to an output "
842 1.14 christos "section. Retry without "
843 1.14 christos "--enable-non-contiguous-regions.\n"),
844 1.14 christos hsh->target_section);
845 1.14 christos
846 1.1 skrll /* Branches are relative. This is where we are going to. */
847 1.1 skrll sym_value = (hsh->target_value
848 1.1 skrll + hsh->target_section->output_offset
849 1.1 skrll + hsh->target_section->output_section->vma);
850 1.1 skrll
851 1.1 skrll /* And this is where we are coming from. */
852 1.1 skrll sym_value -= (hsh->stub_offset
853 1.1 skrll + stub_sec->output_offset
854 1.1 skrll + stub_sec->output_section->vma);
855 1.1 skrll
856 1.1 skrll if (sym_value - 8 + (1 << (17 + 1)) >= (1 << (17 + 2))
857 1.1 skrll && (!htab->has_22bit_branch
858 1.1 skrll || sym_value - 8 + (1 << (22 + 1)) >= (1 << (22 + 2))))
859 1.1 skrll {
860 1.11 christos _bfd_error_handler
861 1.11 christos /* xgettext:c-format */
862 1.12 christos (_("%pB(%pA+%#" PRIx64 "): "
863 1.12 christos "cannot reach %s, recompile with -ffunction-sections"),
864 1.1 skrll hsh->target_section->owner,
865 1.1 skrll stub_sec,
866 1.12 christos (uint64_t) hsh->stub_offset,
867 1.1 skrll hsh->bh_root.string);
868 1.1 skrll bfd_set_error (bfd_error_bad_value);
869 1.14 christos return false;
870 1.1 skrll }
871 1.1 skrll
872 1.1 skrll val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_fsel) >> 2;
873 1.1 skrll if (!htab->has_22bit_branch)
874 1.1 skrll insn = hppa_rebuild_insn ((int) BL_RP, val, 17);
875 1.1 skrll else
876 1.1 skrll insn = hppa_rebuild_insn ((int) BL22_RP, val, 22);
877 1.1 skrll bfd_put_32 (stub_bfd, insn, loc);
878 1.1 skrll
879 1.11 christos bfd_put_32 (stub_bfd, (bfd_vma) NOP, loc + 4);
880 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDW_RP, loc + 8);
881 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) LDSID_RP_R1, loc + 12);
882 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
883 1.1 skrll bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_RP, loc + 20);
884 1.1 skrll
885 1.1 skrll /* Point the function symbol at the stub. */
886 1.1 skrll hsh->hh->eh.root.u.def.section = stub_sec;
887 1.1 skrll hsh->hh->eh.root.u.def.value = stub_sec->size;
888 1.1 skrll
889 1.13 christos size = EXPORT_STUB_SIZE;
890 1.1 skrll break;
891 1.1 skrll
892 1.1 skrll default:
893 1.1 skrll BFD_FAIL ();
894 1.14 christos return false;
895 1.1 skrll }
896 1.1 skrll
897 1.1 skrll stub_sec->size += size;
898 1.14 christos return true;
899 1.1 skrll }
900 1.1 skrll
901 1.1 skrll #undef LDIL_R1
902 1.1 skrll #undef BE_SR4_R1
903 1.1 skrll #undef BL_R1
904 1.1 skrll #undef ADDIL_R1
905 1.1 skrll #undef DEPI_R1
906 1.1 skrll #undef LDW_R1_R21
907 1.1 skrll #undef LDW_R1_DLT
908 1.1 skrll #undef LDW_R1_R19
909 1.1 skrll #undef ADDIL_R19
910 1.1 skrll #undef LDW_R1_DP
911 1.1 skrll #undef LDSID_R21_R1
912 1.1 skrll #undef MTSP_R1
913 1.1 skrll #undef BE_SR0_R21
914 1.1 skrll #undef STW_RP
915 1.1 skrll #undef BV_R0_R21
916 1.1 skrll #undef BL_RP
917 1.1 skrll #undef NOP
918 1.1 skrll #undef LDW_RP
919 1.1 skrll #undef LDSID_RP_R1
920 1.1 skrll #undef BE_SR0_RP
921 1.1 skrll
922 1.1 skrll /* As above, but don't actually build the stub. Just bump offset so
923 1.1 skrll we know stub section sizes. */
924 1.1 skrll
925 1.14 christos static bool
926 1.1 skrll hppa_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
927 1.1 skrll {
928 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
929 1.1 skrll struct elf32_hppa_link_hash_table *htab;
930 1.1 skrll int size;
931 1.1 skrll
932 1.1 skrll /* Massage our args to the form they really have. */
933 1.1 skrll hsh = hppa_stub_hash_entry (bh);
934 1.1 skrll htab = in_arg;
935 1.1 skrll
936 1.1 skrll if (hsh->stub_type == hppa_stub_long_branch)
937 1.13 christos size = LONG_BRANCH_STUB_SIZE;
938 1.1 skrll else if (hsh->stub_type == hppa_stub_long_branch_shared)
939 1.13 christos size = LONG_BRANCH_SHARED_STUB_SIZE;
940 1.1 skrll else if (hsh->stub_type == hppa_stub_export)
941 1.13 christos size = EXPORT_STUB_SIZE;
942 1.1 skrll else /* hppa_stub_import or hppa_stub_import_shared. */
943 1.1 skrll {
944 1.1 skrll if (htab->multi_subspace)
945 1.13 christos size = IMPORT_SHARED_STUB_SIZE;
946 1.1 skrll else
947 1.13 christos size = IMPORT_STUB_SIZE;
948 1.1 skrll }
949 1.1 skrll
950 1.1 skrll hsh->stub_sec->size += size;
951 1.14 christos return true;
952 1.1 skrll }
953 1.1 skrll
954 1.1 skrll /* Return nonzero if ABFD represents an HPPA ELF32 file.
955 1.1 skrll Additionally we set the default architecture and machine. */
956 1.1 skrll
957 1.14 christos static bool
958 1.1 skrll elf32_hppa_object_p (bfd *abfd)
959 1.1 skrll {
960 1.1 skrll Elf_Internal_Ehdr * i_ehdrp;
961 1.1 skrll unsigned int flags;
962 1.1 skrll
963 1.1 skrll i_ehdrp = elf_elfheader (abfd);
964 1.1 skrll if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
965 1.1 skrll {
966 1.6 christos /* GCC on hppa-linux produces binaries with OSABI=GNU,
967 1.1 skrll but the kernel produces corefiles with OSABI=SysV. */
968 1.6 christos if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU &&
969 1.1 skrll i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
970 1.14 christos return false;
971 1.1 skrll }
972 1.1 skrll else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
973 1.1 skrll {
974 1.1 skrll /* GCC on hppa-netbsd produces binaries with OSABI=NetBSD,
975 1.1 skrll but the kernel produces corefiles with OSABI=SysV. */
976 1.1 skrll if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NETBSD &&
977 1.1 skrll i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
978 1.14 christos return false;
979 1.1 skrll }
980 1.1 skrll else
981 1.1 skrll {
982 1.1 skrll if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
983 1.14 christos return false;
984 1.1 skrll }
985 1.1 skrll
986 1.1 skrll flags = i_ehdrp->e_flags;
987 1.1 skrll switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
988 1.1 skrll {
989 1.1 skrll case EFA_PARISC_1_0:
990 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
991 1.1 skrll case EFA_PARISC_1_1:
992 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
993 1.1 skrll case EFA_PARISC_2_0:
994 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
995 1.1 skrll case EFA_PARISC_2_0 | EF_PARISC_WIDE:
996 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
997 1.1 skrll }
998 1.14 christos return true;
999 1.1 skrll }
1000 1.1 skrll
1001 1.1 skrll /* Create the .plt and .got sections, and set up our hash table
1002 1.1 skrll short-cuts to various dynamic sections. */
1003 1.1 skrll
1004 1.14 christos static bool
1005 1.1 skrll elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
1006 1.1 skrll {
1007 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1008 1.1 skrll struct elf_link_hash_entry *eh;
1009 1.1 skrll
1010 1.1 skrll /* Don't try to create the .plt and .got twice. */
1011 1.1 skrll htab = hppa_link_hash_table (info);
1012 1.3 christos if (htab == NULL)
1013 1.14 christos return false;
1014 1.11 christos if (htab->etab.splt != NULL)
1015 1.14 christos return true;
1016 1.1 skrll
1017 1.1 skrll /* Call the generic code to do most of the work. */
1018 1.1 skrll if (! _bfd_elf_create_dynamic_sections (abfd, info))
1019 1.14 christos return false;
1020 1.1 skrll
1021 1.1 skrll /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main
1022 1.1 skrll application, because __canonicalize_funcptr_for_compare needs it. */
1023 1.1 skrll eh = elf_hash_table (info)->hgot;
1024 1.1 skrll eh->forced_local = 0;
1025 1.1 skrll eh->other = STV_DEFAULT;
1026 1.1 skrll return bfd_elf_link_record_dynamic_symbol (info, eh);
1027 1.1 skrll }
1028 1.1 skrll
1029 1.1 skrll /* Copy the extra info we tack onto an elf_link_hash_entry. */
1030 1.1 skrll
1031 1.1 skrll static void
1032 1.1 skrll elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
1033 1.1 skrll struct elf_link_hash_entry *eh_dir,
1034 1.1 skrll struct elf_link_hash_entry *eh_ind)
1035 1.1 skrll {
1036 1.1 skrll struct elf32_hppa_link_hash_entry *hh_dir, *hh_ind;
1037 1.1 skrll
1038 1.1 skrll hh_dir = hppa_elf_hash_entry (eh_dir);
1039 1.1 skrll hh_ind = hppa_elf_hash_entry (eh_ind);
1040 1.1 skrll
1041 1.11 christos if (eh_ind->root.type == bfd_link_hash_indirect)
1042 1.1 skrll {
1043 1.11 christos hh_dir->plabel |= hh_ind->plabel;
1044 1.11 christos hh_dir->tls_type |= hh_ind->tls_type;
1045 1.11 christos hh_ind->tls_type = GOT_UNKNOWN;
1046 1.1 skrll }
1047 1.1 skrll
1048 1.11 christos _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
1049 1.1 skrll }
1050 1.1 skrll
1051 1.1 skrll static int
1052 1.1 skrll elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1053 1.1 skrll int r_type, int is_local ATTRIBUTE_UNUSED)
1054 1.1 skrll {
1055 1.1 skrll /* For now we don't support linker optimizations. */
1056 1.1 skrll return r_type;
1057 1.1 skrll }
1058 1.1 skrll
1059 1.3 christos /* Return a pointer to the local GOT, PLT and TLS reference counts
1060 1.3 christos for ABFD. Returns NULL if the storage allocation fails. */
1061 1.3 christos
1062 1.3 christos static bfd_signed_vma *
1063 1.3 christos hppa32_elf_local_refcounts (bfd *abfd)
1064 1.3 christos {
1065 1.3 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1066 1.3 christos bfd_signed_vma *local_refcounts;
1067 1.7 christos
1068 1.3 christos local_refcounts = elf_local_got_refcounts (abfd);
1069 1.3 christos if (local_refcounts == NULL)
1070 1.3 christos {
1071 1.3 christos bfd_size_type size;
1072 1.3 christos
1073 1.3 christos /* Allocate space for local GOT and PLT reference
1074 1.3 christos counts. Done this way to save polluting elf_obj_tdata
1075 1.3 christos with another target specific pointer. */
1076 1.3 christos size = symtab_hdr->sh_info;
1077 1.3 christos size *= 2 * sizeof (bfd_signed_vma);
1078 1.3 christos /* Add in space to store the local GOT TLS types. */
1079 1.3 christos size += symtab_hdr->sh_info;
1080 1.3 christos local_refcounts = bfd_zalloc (abfd, size);
1081 1.3 christos if (local_refcounts == NULL)
1082 1.3 christos return NULL;
1083 1.3 christos elf_local_got_refcounts (abfd) = local_refcounts;
1084 1.3 christos memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN,
1085 1.3 christos symtab_hdr->sh_info);
1086 1.3 christos }
1087 1.3 christos return local_refcounts;
1088 1.3 christos }
1089 1.3 christos
1090 1.3 christos
1091 1.1 skrll /* Look through the relocs for a section during the first phase, and
1092 1.1 skrll calculate needed space in the global offset table, procedure linkage
1093 1.1 skrll table, and dynamic reloc sections. At this point we haven't
1094 1.1 skrll necessarily read all the input files. */
1095 1.1 skrll
1096 1.14 christos static bool
1097 1.1 skrll elf32_hppa_check_relocs (bfd *abfd,
1098 1.1 skrll struct bfd_link_info *info,
1099 1.1 skrll asection *sec,
1100 1.1 skrll const Elf_Internal_Rela *relocs)
1101 1.1 skrll {
1102 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1103 1.1 skrll struct elf_link_hash_entry **eh_syms;
1104 1.1 skrll const Elf_Internal_Rela *rela;
1105 1.1 skrll const Elf_Internal_Rela *rela_end;
1106 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1107 1.1 skrll asection *sreloc;
1108 1.1 skrll
1109 1.7 christos if (bfd_link_relocatable (info))
1110 1.14 christos return true;
1111 1.1 skrll
1112 1.1 skrll htab = hppa_link_hash_table (info);
1113 1.3 christos if (htab == NULL)
1114 1.14 christos return false;
1115 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1116 1.1 skrll eh_syms = elf_sym_hashes (abfd);
1117 1.1 skrll sreloc = NULL;
1118 1.1 skrll
1119 1.1 skrll rela_end = relocs + sec->reloc_count;
1120 1.1 skrll for (rela = relocs; rela < rela_end; rela++)
1121 1.1 skrll {
1122 1.1 skrll enum {
1123 1.1 skrll NEED_GOT = 1,
1124 1.1 skrll NEED_PLT = 2,
1125 1.1 skrll NEED_DYNREL = 4,
1126 1.1 skrll PLT_PLABEL = 8
1127 1.1 skrll };
1128 1.1 skrll
1129 1.1 skrll unsigned int r_symndx, r_type;
1130 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1131 1.1 skrll int need_entry = 0;
1132 1.1 skrll
1133 1.1 skrll r_symndx = ELF32_R_SYM (rela->r_info);
1134 1.1 skrll
1135 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
1136 1.1 skrll hh = NULL;
1137 1.1 skrll else
1138 1.1 skrll {
1139 1.1 skrll hh = hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1140 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
1141 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
1142 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1143 1.1 skrll }
1144 1.1 skrll
1145 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
1146 1.1 skrll r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1147 1.1 skrll
1148 1.1 skrll switch (r_type)
1149 1.1 skrll {
1150 1.1 skrll case R_PARISC_DLTIND14F:
1151 1.1 skrll case R_PARISC_DLTIND14R:
1152 1.1 skrll case R_PARISC_DLTIND21L:
1153 1.1 skrll /* This symbol requires a global offset table entry. */
1154 1.1 skrll need_entry = NEED_GOT;
1155 1.1 skrll break;
1156 1.1 skrll
1157 1.1 skrll case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1158 1.1 skrll case R_PARISC_PLABEL21L:
1159 1.1 skrll case R_PARISC_PLABEL32:
1160 1.1 skrll /* If the addend is non-zero, we break badly. */
1161 1.1 skrll if (rela->r_addend != 0)
1162 1.1 skrll abort ();
1163 1.1 skrll
1164 1.1 skrll /* If we are creating a shared library, then we need to
1165 1.1 skrll create a PLT entry for all PLABELs, because PLABELs with
1166 1.1 skrll local symbols may be passed via a pointer to another
1167 1.1 skrll object. Additionally, output a dynamic relocation
1168 1.1 skrll pointing to the PLT entry.
1169 1.1 skrll
1170 1.1 skrll For executables, the original 32-bit ABI allowed two
1171 1.1 skrll different styles of PLABELs (function pointers): For
1172 1.1 skrll global functions, the PLABEL word points into the .plt
1173 1.1 skrll two bytes past a (function address, gp) pair, and for
1174 1.1 skrll local functions the PLABEL points directly at the
1175 1.1 skrll function. The magic +2 for the first type allows us to
1176 1.1 skrll differentiate between the two. As you can imagine, this
1177 1.1 skrll is a real pain when it comes to generating code to call
1178 1.1 skrll functions indirectly or to compare function pointers.
1179 1.1 skrll We avoid the mess by always pointing a PLABEL into the
1180 1.1 skrll .plt, even for local functions. */
1181 1.11 christos need_entry = PLT_PLABEL | NEED_PLT;
1182 1.11 christos if (bfd_link_pic (info))
1183 1.11 christos need_entry |= NEED_DYNREL;
1184 1.1 skrll break;
1185 1.1 skrll
1186 1.1 skrll case R_PARISC_PCREL12F:
1187 1.1 skrll htab->has_12bit_branch = 1;
1188 1.1 skrll goto branch_common;
1189 1.1 skrll
1190 1.1 skrll case R_PARISC_PCREL17C:
1191 1.1 skrll case R_PARISC_PCREL17F:
1192 1.1 skrll htab->has_17bit_branch = 1;
1193 1.1 skrll goto branch_common;
1194 1.1 skrll
1195 1.1 skrll case R_PARISC_PCREL22F:
1196 1.1 skrll htab->has_22bit_branch = 1;
1197 1.1 skrll branch_common:
1198 1.1 skrll /* Function calls might need to go through the .plt, and
1199 1.1 skrll might require long branch stubs. */
1200 1.1 skrll if (hh == NULL)
1201 1.1 skrll {
1202 1.1 skrll /* We know local syms won't need a .plt entry, and if
1203 1.1 skrll they need a long branch stub we can't guarantee that
1204 1.1 skrll we can reach the stub. So just flag an error later
1205 1.1 skrll if we're doing a shared link and find we need a long
1206 1.1 skrll branch stub. */
1207 1.1 skrll continue;
1208 1.1 skrll }
1209 1.1 skrll else
1210 1.1 skrll {
1211 1.1 skrll /* Global symbols will need a .plt entry if they remain
1212 1.1 skrll global, and in most cases won't need a long branch
1213 1.1 skrll stub. Unfortunately, we have to cater for the case
1214 1.1 skrll where a symbol is forced local by versioning, or due
1215 1.1 skrll to symbolic linking, and we lose the .plt entry. */
1216 1.1 skrll need_entry = NEED_PLT;
1217 1.1 skrll if (hh->eh.type == STT_PARISC_MILLI)
1218 1.1 skrll need_entry = 0;
1219 1.1 skrll }
1220 1.1 skrll break;
1221 1.1 skrll
1222 1.1 skrll case R_PARISC_SEGBASE: /* Used to set segment base. */
1223 1.1 skrll case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
1224 1.1 skrll case R_PARISC_PCREL14F: /* PC relative load/store. */
1225 1.1 skrll case R_PARISC_PCREL14R:
1226 1.1 skrll case R_PARISC_PCREL17R: /* External branches. */
1227 1.1 skrll case R_PARISC_PCREL21L: /* As above, and for load/store too. */
1228 1.1 skrll case R_PARISC_PCREL32:
1229 1.1 skrll /* We don't need to propagate the relocation if linking a
1230 1.1 skrll shared object since these are section relative. */
1231 1.1 skrll continue;
1232 1.1 skrll
1233 1.1 skrll case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1234 1.1 skrll case R_PARISC_DPREL14R:
1235 1.1 skrll case R_PARISC_DPREL21L:
1236 1.7 christos if (bfd_link_pic (info))
1237 1.1 skrll {
1238 1.11 christos _bfd_error_handler
1239 1.11 christos /* xgettext:c-format */
1240 1.12 christos (_("%pB: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1241 1.1 skrll abfd,
1242 1.1 skrll elf_hppa_howto_table[r_type].name);
1243 1.1 skrll bfd_set_error (bfd_error_bad_value);
1244 1.14 christos return false;
1245 1.1 skrll }
1246 1.1 skrll /* Fall through. */
1247 1.1 skrll
1248 1.1 skrll case R_PARISC_DIR17F: /* Used for external branches. */
1249 1.1 skrll case R_PARISC_DIR17R:
1250 1.1 skrll case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1251 1.1 skrll case R_PARISC_DIR14R:
1252 1.1 skrll case R_PARISC_DIR21L: /* As above, and for ext branches too. */
1253 1.1 skrll case R_PARISC_DIR32: /* .word relocs. */
1254 1.1 skrll /* We may want to output a dynamic relocation later. */
1255 1.1 skrll need_entry = NEED_DYNREL;
1256 1.1 skrll break;
1257 1.1 skrll
1258 1.1 skrll /* This relocation describes the C++ object vtable hierarchy.
1259 1.1 skrll Reconstruct it for later use during GC. */
1260 1.1 skrll case R_PARISC_GNU_VTINHERIT:
1261 1.1 skrll if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1262 1.14 christos return false;
1263 1.1 skrll continue;
1264 1.1 skrll
1265 1.1 skrll /* This relocation describes which C++ vtable entries are actually
1266 1.1 skrll used. Record for later use during GC. */
1267 1.1 skrll case R_PARISC_GNU_VTENTRY:
1268 1.13 christos if (!bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1269 1.14 christos return false;
1270 1.1 skrll continue;
1271 1.1 skrll
1272 1.1 skrll case R_PARISC_TLS_GD21L:
1273 1.1 skrll case R_PARISC_TLS_GD14R:
1274 1.1 skrll case R_PARISC_TLS_LDM21L:
1275 1.1 skrll case R_PARISC_TLS_LDM14R:
1276 1.1 skrll need_entry = NEED_GOT;
1277 1.1 skrll break;
1278 1.1 skrll
1279 1.1 skrll case R_PARISC_TLS_IE21L:
1280 1.1 skrll case R_PARISC_TLS_IE14R:
1281 1.11 christos if (bfd_link_dll (info))
1282 1.11 christos info->flags |= DF_STATIC_TLS;
1283 1.1 skrll need_entry = NEED_GOT;
1284 1.1 skrll break;
1285 1.1 skrll
1286 1.1 skrll default:
1287 1.1 skrll continue;
1288 1.1 skrll }
1289 1.1 skrll
1290 1.1 skrll /* Now carry out our orders. */
1291 1.1 skrll if (need_entry & NEED_GOT)
1292 1.1 skrll {
1293 1.11 christos int tls_type = GOT_NORMAL;
1294 1.11 christos
1295 1.1 skrll switch (r_type)
1296 1.1 skrll {
1297 1.1 skrll default:
1298 1.1 skrll break;
1299 1.1 skrll case R_PARISC_TLS_GD21L:
1300 1.1 skrll case R_PARISC_TLS_GD14R:
1301 1.11 christos tls_type = GOT_TLS_GD;
1302 1.1 skrll break;
1303 1.1 skrll case R_PARISC_TLS_LDM21L:
1304 1.1 skrll case R_PARISC_TLS_LDM14R:
1305 1.11 christos tls_type = GOT_TLS_LDM;
1306 1.1 skrll break;
1307 1.1 skrll case R_PARISC_TLS_IE21L:
1308 1.1 skrll case R_PARISC_TLS_IE14R:
1309 1.11 christos tls_type = GOT_TLS_IE;
1310 1.1 skrll break;
1311 1.1 skrll }
1312 1.1 skrll
1313 1.1 skrll /* Allocate space for a GOT entry, as well as a dynamic
1314 1.1 skrll relocation for this entry. */
1315 1.11 christos if (htab->etab.sgot == NULL)
1316 1.1 skrll {
1317 1.1 skrll if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1318 1.14 christos return false;
1319 1.1 skrll }
1320 1.1 skrll
1321 1.11 christos if (hh != NULL)
1322 1.11 christos {
1323 1.11 christos if (tls_type == GOT_TLS_LDM)
1324 1.11 christos htab->tls_ldm_got.refcount += 1;
1325 1.11 christos else
1326 1.11 christos hh->eh.got.refcount += 1;
1327 1.11 christos hh->tls_type |= tls_type;
1328 1.11 christos }
1329 1.1 skrll else
1330 1.1 skrll {
1331 1.11 christos bfd_signed_vma *local_got_refcounts;
1332 1.11 christos
1333 1.11 christos /* This is a global offset table entry for a local symbol. */
1334 1.11 christos local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1335 1.11 christos if (local_got_refcounts == NULL)
1336 1.14 christos return false;
1337 1.11 christos if (tls_type == GOT_TLS_LDM)
1338 1.11 christos htab->tls_ldm_got.refcount += 1;
1339 1.1 skrll else
1340 1.11 christos local_got_refcounts[r_symndx] += 1;
1341 1.1 skrll
1342 1.11 christos hppa_elf_local_got_tls_type (abfd) [r_symndx] |= tls_type;
1343 1.1 skrll }
1344 1.1 skrll }
1345 1.1 skrll
1346 1.1 skrll if (need_entry & NEED_PLT)
1347 1.1 skrll {
1348 1.1 skrll /* If we are creating a shared library, and this is a reloc
1349 1.1 skrll against a weak symbol or a global symbol in a dynamic
1350 1.1 skrll object, then we will be creating an import stub and a
1351 1.1 skrll .plt entry for the symbol. Similarly, on a normal link
1352 1.1 skrll to symbols defined in a dynamic object we'll need the
1353 1.1 skrll import stub and a .plt entry. We don't know yet whether
1354 1.1 skrll the symbol is defined or not, so make an entry anyway and
1355 1.1 skrll clean up later in adjust_dynamic_symbol. */
1356 1.1 skrll if ((sec->flags & SEC_ALLOC) != 0)
1357 1.1 skrll {
1358 1.1 skrll if (hh != NULL)
1359 1.1 skrll {
1360 1.1 skrll hh->eh.needs_plt = 1;
1361 1.1 skrll hh->eh.plt.refcount += 1;
1362 1.1 skrll
1363 1.1 skrll /* If this .plt entry is for a plabel, mark it so
1364 1.1 skrll that adjust_dynamic_symbol will keep the entry
1365 1.1 skrll even if it appears to be local. */
1366 1.1 skrll if (need_entry & PLT_PLABEL)
1367 1.1 skrll hh->plabel = 1;
1368 1.1 skrll }
1369 1.1 skrll else if (need_entry & PLT_PLABEL)
1370 1.1 skrll {
1371 1.1 skrll bfd_signed_vma *local_got_refcounts;
1372 1.1 skrll bfd_signed_vma *local_plt_refcounts;
1373 1.1 skrll
1374 1.3 christos local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1375 1.1 skrll if (local_got_refcounts == NULL)
1376 1.14 christos return false;
1377 1.1 skrll local_plt_refcounts = (local_got_refcounts
1378 1.1 skrll + symtab_hdr->sh_info);
1379 1.1 skrll local_plt_refcounts[r_symndx] += 1;
1380 1.1 skrll }
1381 1.1 skrll }
1382 1.1 skrll }
1383 1.1 skrll
1384 1.11 christos if ((need_entry & NEED_DYNREL) != 0
1385 1.11 christos && (sec->flags & SEC_ALLOC) != 0)
1386 1.1 skrll {
1387 1.1 skrll /* Flag this symbol as having a non-got, non-plt reference
1388 1.1 skrll so that we generate copy relocs if it turns out to be
1389 1.1 skrll dynamic. */
1390 1.11 christos if (hh != NULL)
1391 1.1 skrll hh->eh.non_got_ref = 1;
1392 1.1 skrll
1393 1.1 skrll /* If we are creating a shared library then we need to copy
1394 1.1 skrll the reloc into the shared library. However, if we are
1395 1.1 skrll linking with -Bsymbolic, we need only copy absolute
1396 1.1 skrll relocs or relocs against symbols that are not defined in
1397 1.1 skrll an object we are including in the link. PC- or DP- or
1398 1.1 skrll DLT-relative relocs against any local sym or global sym
1399 1.1 skrll with DEF_REGULAR set, can be discarded. At this point we
1400 1.1 skrll have not seen all the input files, so it is possible that
1401 1.1 skrll DEF_REGULAR is not set now but will be set later (it is
1402 1.1 skrll never cleared). We account for that possibility below by
1403 1.1 skrll storing information in the dyn_relocs field of the
1404 1.1 skrll hash table entry.
1405 1.1 skrll
1406 1.1 skrll A similar situation to the -Bsymbolic case occurs when
1407 1.1 skrll creating shared libraries and symbol visibility changes
1408 1.1 skrll render the symbol local.
1409 1.1 skrll
1410 1.1 skrll As it turns out, all the relocs we will be creating here
1411 1.1 skrll are absolute, so we cannot remove them on -Bsymbolic
1412 1.1 skrll links or visibility changes anyway. A STUB_REL reloc
1413 1.1 skrll is absolute too, as in that case it is the reloc in the
1414 1.1 skrll stub we will be creating, rather than copying the PCREL
1415 1.1 skrll reloc in the branch.
1416 1.1 skrll
1417 1.1 skrll If on the other hand, we are creating an executable, we
1418 1.1 skrll may need to keep relocations for symbols satisfied by a
1419 1.1 skrll dynamic library if we manage to avoid copy relocs for the
1420 1.1 skrll symbol. */
1421 1.7 christos if ((bfd_link_pic (info)
1422 1.1 skrll && (IS_ABSOLUTE_RELOC (r_type)
1423 1.1 skrll || (hh != NULL
1424 1.7 christos && (!SYMBOLIC_BIND (info, &hh->eh)
1425 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak
1426 1.1 skrll || !hh->eh.def_regular))))
1427 1.1 skrll || (ELIMINATE_COPY_RELOCS
1428 1.7 christos && !bfd_link_pic (info)
1429 1.1 skrll && hh != NULL
1430 1.1 skrll && (hh->eh.root.type == bfd_link_hash_defweak
1431 1.1 skrll || !hh->eh.def_regular)))
1432 1.1 skrll {
1433 1.11 christos struct elf_dyn_relocs *hdh_p;
1434 1.11 christos struct elf_dyn_relocs **hdh_head;
1435 1.1 skrll
1436 1.1 skrll /* Create a reloc section in dynobj and make room for
1437 1.1 skrll this reloc. */
1438 1.1 skrll if (sreloc == NULL)
1439 1.1 skrll {
1440 1.3 christos sreloc = _bfd_elf_make_dynamic_reloc_section
1441 1.14 christos (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ true);
1442 1.3 christos
1443 1.1 skrll if (sreloc == NULL)
1444 1.1 skrll {
1445 1.3 christos bfd_set_error (bfd_error_bad_value);
1446 1.14 christos return false;
1447 1.1 skrll }
1448 1.1 skrll }
1449 1.1 skrll
1450 1.1 skrll /* If this is a global symbol, we count the number of
1451 1.1 skrll relocations we need for this symbol. */
1452 1.1 skrll if (hh != NULL)
1453 1.1 skrll {
1454 1.14 christos hdh_head = &hh->eh.dyn_relocs;
1455 1.1 skrll }
1456 1.1 skrll else
1457 1.1 skrll {
1458 1.1 skrll /* Track dynamic relocs needed for local syms too.
1459 1.1 skrll We really need local syms available to do this
1460 1.1 skrll easily. Oh well. */
1461 1.1 skrll asection *sr;
1462 1.1 skrll void *vpp;
1463 1.3 christos Elf_Internal_Sym *isym;
1464 1.3 christos
1465 1.14 christos isym = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
1466 1.3 christos abfd, r_symndx);
1467 1.3 christos if (isym == NULL)
1468 1.14 christos return false;
1469 1.1 skrll
1470 1.3 christos sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1471 1.1 skrll if (sr == NULL)
1472 1.3 christos sr = sec;
1473 1.1 skrll
1474 1.1 skrll vpp = &elf_section_data (sr)->local_dynrel;
1475 1.11 christos hdh_head = (struct elf_dyn_relocs **) vpp;
1476 1.1 skrll }
1477 1.1 skrll
1478 1.1 skrll hdh_p = *hdh_head;
1479 1.1 skrll if (hdh_p == NULL || hdh_p->sec != sec)
1480 1.1 skrll {
1481 1.1 skrll hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1482 1.1 skrll if (hdh_p == NULL)
1483 1.14 christos return false;
1484 1.11 christos hdh_p->next = *hdh_head;
1485 1.1 skrll *hdh_head = hdh_p;
1486 1.1 skrll hdh_p->sec = sec;
1487 1.1 skrll hdh_p->count = 0;
1488 1.1 skrll #if RELATIVE_DYNRELOCS
1489 1.11 christos hdh_p->pc_count = 0;
1490 1.1 skrll #endif
1491 1.1 skrll }
1492 1.1 skrll
1493 1.1 skrll hdh_p->count += 1;
1494 1.1 skrll #if RELATIVE_DYNRELOCS
1495 1.1 skrll if (!IS_ABSOLUTE_RELOC (rtype))
1496 1.11 christos hdh_p->pc_count += 1;
1497 1.1 skrll #endif
1498 1.1 skrll }
1499 1.1 skrll }
1500 1.1 skrll }
1501 1.1 skrll
1502 1.14 christos return true;
1503 1.1 skrll }
1504 1.1 skrll
1505 1.1 skrll /* Return the section that should be marked against garbage collection
1506 1.1 skrll for a given relocation. */
1507 1.1 skrll
1508 1.1 skrll static asection *
1509 1.1 skrll elf32_hppa_gc_mark_hook (asection *sec,
1510 1.1 skrll struct bfd_link_info *info,
1511 1.17 christos struct elf_reloc_cookie *cookie,
1512 1.1 skrll struct elf_link_hash_entry *hh,
1513 1.17 christos unsigned int symndx)
1514 1.1 skrll {
1515 1.1 skrll if (hh != NULL)
1516 1.17 christos switch (ELF32_R_TYPE (cookie->rel->r_info))
1517 1.1 skrll {
1518 1.1 skrll case R_PARISC_GNU_VTINHERIT:
1519 1.1 skrll case R_PARISC_GNU_VTENTRY:
1520 1.1 skrll return NULL;
1521 1.1 skrll }
1522 1.1 skrll
1523 1.17 christos return _bfd_elf_gc_mark_hook (sec, info, cookie, hh, symndx);
1524 1.1 skrll }
1525 1.1 skrll
1526 1.1 skrll /* Support for core dump NOTE sections. */
1527 1.1 skrll
1528 1.14 christos static bool
1529 1.1 skrll elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1530 1.1 skrll {
1531 1.1 skrll int offset;
1532 1.1 skrll size_t size;
1533 1.1 skrll
1534 1.1 skrll switch (note->descsz)
1535 1.1 skrll {
1536 1.1 skrll default:
1537 1.14 christos return false;
1538 1.1 skrll
1539 1.1 skrll case 396: /* Linux/hppa */
1540 1.1 skrll /* pr_cursig */
1541 1.7 christos elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1542 1.1 skrll
1543 1.1 skrll /* pr_pid */
1544 1.7 christos elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
1545 1.1 skrll
1546 1.1 skrll /* pr_reg */
1547 1.1 skrll offset = 72;
1548 1.1 skrll size = 320;
1549 1.1 skrll
1550 1.1 skrll break;
1551 1.1 skrll }
1552 1.1 skrll
1553 1.1 skrll /* Make a ".reg/999" section. */
1554 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1555 1.1 skrll size, note->descpos + offset);
1556 1.1 skrll }
1557 1.1 skrll
1558 1.14 christos static bool
1559 1.1 skrll elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1560 1.1 skrll {
1561 1.1 skrll switch (note->descsz)
1562 1.1 skrll {
1563 1.1 skrll default:
1564 1.14 christos return false;
1565 1.1 skrll
1566 1.1 skrll case 124: /* Linux/hppa elf_prpsinfo. */
1567 1.7 christos elf_tdata (abfd)->core->program
1568 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1569 1.7 christos elf_tdata (abfd)->core->command
1570 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1571 1.1 skrll }
1572 1.1 skrll
1573 1.1 skrll /* Note that for some reason, a spurious space is tacked
1574 1.1 skrll onto the end of the args in some (at least one anyway)
1575 1.1 skrll implementations, so strip it off if it exists. */
1576 1.1 skrll {
1577 1.7 christos char *command = elf_tdata (abfd)->core->command;
1578 1.1 skrll int n = strlen (command);
1579 1.1 skrll
1580 1.1 skrll if (0 < n && command[n - 1] == ' ')
1581 1.1 skrll command[n - 1] = '\0';
1582 1.1 skrll }
1583 1.1 skrll
1584 1.14 christos return true;
1585 1.1 skrll }
1586 1.1 skrll
1587 1.1 skrll /* Our own version of hide_symbol, so that we can keep plt entries for
1588 1.1 skrll plabels. */
1589 1.1 skrll
1590 1.1 skrll static void
1591 1.1 skrll elf32_hppa_hide_symbol (struct bfd_link_info *info,
1592 1.1 skrll struct elf_link_hash_entry *eh,
1593 1.14 christos bool force_local)
1594 1.1 skrll {
1595 1.1 skrll if (force_local)
1596 1.1 skrll {
1597 1.1 skrll eh->forced_local = 1;
1598 1.1 skrll if (eh->dynindx != -1)
1599 1.1 skrll {
1600 1.1 skrll eh->dynindx = -1;
1601 1.1 skrll _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1602 1.1 skrll eh->dynstr_index);
1603 1.1 skrll }
1604 1.7 christos
1605 1.7 christos /* PR 16082: Remove version information from hidden symbol. */
1606 1.7 christos eh->verinfo.verdef = NULL;
1607 1.7 christos eh->verinfo.vertree = NULL;
1608 1.1 skrll }
1609 1.1 skrll
1610 1.6 christos /* STT_GNU_IFUNC symbol must go through PLT. */
1611 1.6 christos if (! hppa_elf_hash_entry (eh)->plabel
1612 1.6 christos && eh->type != STT_GNU_IFUNC)
1613 1.1 skrll {
1614 1.1 skrll eh->needs_plt = 0;
1615 1.6 christos eh->plt = elf_hash_table (info)->init_plt_offset;
1616 1.1 skrll }
1617 1.1 skrll }
1618 1.1 skrll
1619 1.11 christos /* Return true if we have dynamic relocs against H or any of its weak
1620 1.11 christos aliases, that apply to read-only sections. Cannot be used after
1621 1.11 christos size_dynamic_sections. */
1622 1.11 christos
1623 1.14 christos static bool
1624 1.11 christos alias_readonly_dynrelocs (struct elf_link_hash_entry *eh)
1625 1.11 christos {
1626 1.11 christos struct elf32_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1627 1.11 christos do
1628 1.11 christos {
1629 1.14 christos if (_bfd_elf_readonly_dynrelocs (&hh->eh))
1630 1.14 christos return true;
1631 1.11 christos hh = hppa_elf_hash_entry (hh->eh.u.alias);
1632 1.11 christos } while (hh != NULL && &hh->eh != eh);
1633 1.11 christos
1634 1.14 christos return false;
1635 1.11 christos }
1636 1.11 christos
1637 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a
1638 1.1 skrll regular object. The current definition is in some section of the
1639 1.1 skrll dynamic object, but we're not including those sections. We have to
1640 1.1 skrll change the definition to something the rest of the link can
1641 1.1 skrll understand. */
1642 1.1 skrll
1643 1.14 christos static bool
1644 1.1 skrll elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1645 1.1 skrll struct elf_link_hash_entry *eh)
1646 1.1 skrll {
1647 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1648 1.11 christos asection *sec, *srel;
1649 1.1 skrll
1650 1.1 skrll /* If this is a function, put it in the procedure linkage table. We
1651 1.1 skrll will fill in the contents of the procedure linkage table later. */
1652 1.1 skrll if (eh->type == STT_FUNC
1653 1.1 skrll || eh->needs_plt)
1654 1.1 skrll {
1655 1.14 christos bool local = (SYMBOL_CALLS_LOCAL (info, eh)
1656 1.14 christos || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh));
1657 1.11 christos /* Discard dyn_relocs when non-pic if we've decided that a
1658 1.11 christos function symbol is local. */
1659 1.11 christos if (!bfd_link_pic (info) && local)
1660 1.14 christos eh->dyn_relocs = NULL;
1661 1.11 christos
1662 1.6 christos /* If the symbol is used by a plabel, we must allocate a PLT slot.
1663 1.6 christos The refcounts are not reliable when it has been hidden since
1664 1.6 christos hide_symbol can be called before the plabel flag is set. */
1665 1.11 christos if (hppa_elf_hash_entry (eh)->plabel)
1666 1.6 christos eh->plt.refcount = 1;
1667 1.6 christos
1668 1.11 christos /* Note that unlike some other backends, the refcount is not
1669 1.11 christos incremented for a non-call (and non-plabel) function reference. */
1670 1.11 christos else if (eh->plt.refcount <= 0
1671 1.11 christos || local)
1672 1.1 skrll {
1673 1.1 skrll /* The .plt entry is not needed when:
1674 1.1 skrll a) Garbage collection has removed all references to the
1675 1.1 skrll symbol, or
1676 1.1 skrll b) We know for certain the symbol is defined in this
1677 1.1 skrll object, and it's not a weak definition, nor is the symbol
1678 1.1 skrll used by a plabel relocation. Either this object is the
1679 1.1 skrll application or we are doing a shared symbolic link. */
1680 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1681 1.1 skrll eh->needs_plt = 0;
1682 1.1 skrll }
1683 1.1 skrll
1684 1.11 christos /* Unlike other targets, elf32-hppa.c does not define a function
1685 1.11 christos symbol in a non-pic executable on PLT stub code, so we don't
1686 1.11 christos have a local definition in that case. ie. dyn_relocs can't
1687 1.11 christos be discarded. */
1688 1.11 christos
1689 1.11 christos /* Function symbols can't have copy relocs. */
1690 1.14 christos return true;
1691 1.1 skrll }
1692 1.1 skrll else
1693 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1694 1.1 skrll
1695 1.11 christos htab = hppa_link_hash_table (info);
1696 1.11 christos if (htab == NULL)
1697 1.14 christos return false;
1698 1.11 christos
1699 1.1 skrll /* If this is a weak symbol, and there is a real definition, the
1700 1.1 skrll processor independent code will have arranged for us to see the
1701 1.1 skrll real definition first, and we can just use the same value. */
1702 1.11 christos if (eh->is_weakalias)
1703 1.1 skrll {
1704 1.11 christos struct elf_link_hash_entry *def = weakdef (eh);
1705 1.11 christos BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1706 1.11 christos eh->root.u.def.section = def->root.u.def.section;
1707 1.11 christos eh->root.u.def.value = def->root.u.def.value;
1708 1.11 christos if (def->root.u.def.section == htab->etab.sdynbss
1709 1.11 christos || def->root.u.def.section == htab->etab.sdynrelro)
1710 1.14 christos eh->dyn_relocs = NULL;
1711 1.14 christos return true;
1712 1.1 skrll }
1713 1.1 skrll
1714 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which
1715 1.1 skrll is not a function. */
1716 1.1 skrll
1717 1.1 skrll /* If we are creating a shared library, we must presume that the
1718 1.1 skrll only references to the symbol are via the global offset table.
1719 1.1 skrll For such cases we need not do anything here; the relocations will
1720 1.1 skrll be handled correctly by relocate_section. */
1721 1.7 christos if (bfd_link_pic (info))
1722 1.14 christos return true;
1723 1.1 skrll
1724 1.1 skrll /* If there are no references to this symbol that do not use the
1725 1.1 skrll GOT, we don't need to generate a copy reloc. */
1726 1.1 skrll if (!eh->non_got_ref)
1727 1.14 christos return true;
1728 1.1 skrll
1729 1.11 christos /* If -z nocopyreloc was given, we won't generate them either. */
1730 1.11 christos if (info->nocopyreloc)
1731 1.14 christos return true;
1732 1.1 skrll
1733 1.11 christos /* If we don't find any dynamic relocs in read-only sections, then
1734 1.11 christos we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1735 1.11 christos if (ELIMINATE_COPY_RELOCS
1736 1.11 christos && !alias_readonly_dynrelocs (eh))
1737 1.14 christos return true;
1738 1.1 skrll
1739 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will
1740 1.1 skrll become part of the .bss section of the executable. There will be
1741 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic
1742 1.1 skrll object will contain position independent code, so all references
1743 1.1 skrll from the dynamic object to this symbol will go through the global
1744 1.1 skrll offset table. The dynamic linker will use the .dynsym entry to
1745 1.1 skrll determine the address it must put in the global offset table, so
1746 1.1 skrll both the dynamic object and the regular object will refer to the
1747 1.1 skrll same memory location for the variable. */
1748 1.11 christos if ((eh->root.u.def.section->flags & SEC_READONLY) != 0)
1749 1.11 christos {
1750 1.11 christos sec = htab->etab.sdynrelro;
1751 1.11 christos srel = htab->etab.sreldynrelro;
1752 1.11 christos }
1753 1.11 christos else
1754 1.11 christos {
1755 1.11 christos sec = htab->etab.sdynbss;
1756 1.11 christos srel = htab->etab.srelbss;
1757 1.11 christos }
1758 1.6 christos if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
1759 1.1 skrll {
1760 1.11 christos /* We must generate a COPY reloc to tell the dynamic linker to
1761 1.11 christos copy the initial value out of the dynamic object and into the
1762 1.11 christos runtime process image. */
1763 1.11 christos srel->size += sizeof (Elf32_External_Rela);
1764 1.1 skrll eh->needs_copy = 1;
1765 1.1 skrll }
1766 1.1 skrll
1767 1.11 christos /* We no longer want dyn_relocs. */
1768 1.14 christos eh->dyn_relocs = NULL;
1769 1.11 christos return _bfd_elf_adjust_dynamic_copy (info, eh, sec);
1770 1.11 christos }
1771 1.11 christos
1772 1.11 christos /* If EH is undefined, make it dynamic if that makes sense. */
1773 1.11 christos
1774 1.14 christos static bool
1775 1.11 christos ensure_undef_dynamic (struct bfd_link_info *info,
1776 1.11 christos struct elf_link_hash_entry *eh)
1777 1.11 christos {
1778 1.11 christos struct elf_link_hash_table *htab = elf_hash_table (info);
1779 1.1 skrll
1780 1.11 christos if (htab->dynamic_sections_created
1781 1.11 christos && (eh->root.type == bfd_link_hash_undefweak
1782 1.11 christos || eh->root.type == bfd_link_hash_undefined)
1783 1.11 christos && eh->dynindx == -1
1784 1.11 christos && !eh->forced_local
1785 1.11 christos && eh->type != STT_PARISC_MILLI
1786 1.11 christos && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh)
1787 1.11 christos && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
1788 1.11 christos return bfd_elf_link_record_dynamic_symbol (info, eh);
1789 1.14 christos return true;
1790 1.1 skrll }
1791 1.1 skrll
1792 1.1 skrll /* Allocate space in the .plt for entries that won't have relocations.
1793 1.1 skrll ie. plabel entries. */
1794 1.1 skrll
1795 1.14 christos static bool
1796 1.1 skrll allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1797 1.1 skrll {
1798 1.1 skrll struct bfd_link_info *info;
1799 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1800 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1801 1.1 skrll asection *sec;
1802 1.1 skrll
1803 1.1 skrll if (eh->root.type == bfd_link_hash_indirect)
1804 1.14 christos return true;
1805 1.1 skrll
1806 1.1 skrll info = (struct bfd_link_info *) inf;
1807 1.1 skrll hh = hppa_elf_hash_entry (eh);
1808 1.1 skrll htab = hppa_link_hash_table (info);
1809 1.3 christos if (htab == NULL)
1810 1.14 christos return false;
1811 1.3 christos
1812 1.1 skrll if (htab->etab.dynamic_sections_created
1813 1.1 skrll && eh->plt.refcount > 0)
1814 1.1 skrll {
1815 1.11 christos if (!ensure_undef_dynamic (info, eh))
1816 1.14 christos return false;
1817 1.1 skrll
1818 1.7 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
1819 1.1 skrll {
1820 1.1 skrll /* Allocate these later. From this point on, h->plabel
1821 1.1 skrll means that the plt entry is only used by a plabel.
1822 1.1 skrll We'll be using a normal plt entry for this symbol, so
1823 1.1 skrll clear the plabel indicator. */
1824 1.7 christos
1825 1.1 skrll hh->plabel = 0;
1826 1.1 skrll }
1827 1.1 skrll else if (hh->plabel)
1828 1.1 skrll {
1829 1.1 skrll /* Make an entry in the .plt section for plabel references
1830 1.1 skrll that won't have a .plt entry for other reasons. */
1831 1.11 christos sec = htab->etab.splt;
1832 1.1 skrll eh->plt.offset = sec->size;
1833 1.1 skrll sec->size += PLT_ENTRY_SIZE;
1834 1.11 christos if (bfd_link_pic (info))
1835 1.11 christos htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
1836 1.1 skrll }
1837 1.1 skrll else
1838 1.1 skrll {
1839 1.1 skrll /* No .plt entry needed. */
1840 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1841 1.1 skrll eh->needs_plt = 0;
1842 1.1 skrll }
1843 1.1 skrll }
1844 1.1 skrll else
1845 1.1 skrll {
1846 1.1 skrll eh->plt.offset = (bfd_vma) -1;
1847 1.1 skrll eh->needs_plt = 0;
1848 1.1 skrll }
1849 1.1 skrll
1850 1.14 christos return true;
1851 1.1 skrll }
1852 1.1 skrll
1853 1.11 christos /* Calculate size of GOT entries for symbol given its TLS_TYPE. */
1854 1.11 christos
1855 1.11 christos static inline unsigned int
1856 1.11 christos got_entries_needed (int tls_type)
1857 1.11 christos {
1858 1.11 christos unsigned int need = 0;
1859 1.11 christos
1860 1.11 christos if ((tls_type & GOT_NORMAL) != 0)
1861 1.11 christos need += GOT_ENTRY_SIZE;
1862 1.11 christos if ((tls_type & GOT_TLS_GD) != 0)
1863 1.11 christos need += GOT_ENTRY_SIZE * 2;
1864 1.11 christos if ((tls_type & GOT_TLS_IE) != 0)
1865 1.11 christos need += GOT_ENTRY_SIZE;
1866 1.11 christos return need;
1867 1.11 christos }
1868 1.11 christos
1869 1.11 christos /* Calculate size of relocs needed for symbol given its TLS_TYPE and
1870 1.12 christos NEEDed GOT entries. TPREL_KNOWN says a TPREL offset can be
1871 1.12 christos calculated at link time. DTPREL_KNOWN says the same for a DTPREL
1872 1.12 christos offset. */
1873 1.11 christos
1874 1.11 christos static inline unsigned int
1875 1.12 christos got_relocs_needed (int tls_type, unsigned int need,
1876 1.14 christos bool dtprel_known, bool tprel_known)
1877 1.11 christos {
1878 1.11 christos /* All the entries we allocated need relocs.
1879 1.12 christos Except for GD and IE with local symbols. */
1880 1.12 christos if ((tls_type & GOT_TLS_GD) != 0 && dtprel_known)
1881 1.12 christos need -= GOT_ENTRY_SIZE;
1882 1.12 christos if ((tls_type & GOT_TLS_IE) != 0 && tprel_known)
1883 1.11 christos need -= GOT_ENTRY_SIZE;
1884 1.11 christos return need * sizeof (Elf32_External_Rela) / GOT_ENTRY_SIZE;
1885 1.11 christos }
1886 1.11 christos
1887 1.1 skrll /* Allocate space in .plt, .got and associated reloc sections for
1888 1.1 skrll global syms. */
1889 1.1 skrll
1890 1.14 christos static bool
1891 1.1 skrll allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
1892 1.1 skrll {
1893 1.1 skrll struct bfd_link_info *info;
1894 1.1 skrll struct elf32_hppa_link_hash_table *htab;
1895 1.1 skrll asection *sec;
1896 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
1897 1.11 christos struct elf_dyn_relocs *hdh_p;
1898 1.1 skrll
1899 1.1 skrll if (eh->root.type == bfd_link_hash_indirect)
1900 1.14 christos return true;
1901 1.1 skrll
1902 1.1 skrll info = inf;
1903 1.1 skrll htab = hppa_link_hash_table (info);
1904 1.3 christos if (htab == NULL)
1905 1.14 christos return false;
1906 1.3 christos
1907 1.1 skrll hh = hppa_elf_hash_entry (eh);
1908 1.7 christos
1909 1.1 skrll if (htab->etab.dynamic_sections_created
1910 1.1 skrll && eh->plt.offset != (bfd_vma) -1
1911 1.1 skrll && !hh->plabel
1912 1.1 skrll && eh->plt.refcount > 0)
1913 1.1 skrll {
1914 1.1 skrll /* Make an entry in the .plt section. */
1915 1.11 christos sec = htab->etab.splt;
1916 1.1 skrll eh->plt.offset = sec->size;
1917 1.1 skrll sec->size += PLT_ENTRY_SIZE;
1918 1.1 skrll
1919 1.1 skrll /* We also need to make an entry in the .rela.plt section. */
1920 1.11 christos htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
1921 1.1 skrll htab->need_plt_stub = 1;
1922 1.1 skrll }
1923 1.1 skrll
1924 1.1 skrll if (eh->got.refcount > 0)
1925 1.1 skrll {
1926 1.11 christos unsigned int need;
1927 1.11 christos
1928 1.11 christos if (!ensure_undef_dynamic (info, eh))
1929 1.14 christos return false;
1930 1.1 skrll
1931 1.11 christos sec = htab->etab.sgot;
1932 1.1 skrll eh->got.offset = sec->size;
1933 1.11 christos need = got_entries_needed (hh->tls_type);
1934 1.11 christos sec->size += need;
1935 1.1 skrll if (htab->etab.dynamic_sections_created
1936 1.12 christos && (bfd_link_dll (info)
1937 1.12 christos || (bfd_link_pic (info) && (hh->tls_type & GOT_NORMAL) != 0)
1938 1.1 skrll || (eh->dynindx != -1
1939 1.11 christos && !SYMBOL_REFERENCES_LOCAL (info, eh)))
1940 1.11 christos && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
1941 1.1 skrll {
1942 1.14 christos bool local = SYMBOL_REFERENCES_LOCAL (info, eh);
1943 1.11 christos htab->etab.srelgot->size
1944 1.12 christos += got_relocs_needed (hh->tls_type, need, local,
1945 1.12 christos local && bfd_link_executable (info));
1946 1.1 skrll }
1947 1.1 skrll }
1948 1.1 skrll else
1949 1.1 skrll eh->got.offset = (bfd_vma) -1;
1950 1.1 skrll
1951 1.11 christos /* If no dynamic sections we can't have dynamic relocs. */
1952 1.11 christos if (!htab->etab.dynamic_sections_created)
1953 1.14 christos eh->dyn_relocs = NULL;
1954 1.11 christos
1955 1.11 christos /* Discard relocs on undefined syms with non-default visibility. */
1956 1.11 christos else if ((eh->root.type == bfd_link_hash_undefined
1957 1.11 christos && ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
1958 1.11 christos || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
1959 1.14 christos eh->dyn_relocs = NULL;
1960 1.11 christos
1961 1.14 christos if (eh->dyn_relocs == NULL)
1962 1.14 christos return true;
1963 1.1 skrll
1964 1.1 skrll /* If this is a -Bsymbolic shared link, then we need to discard all
1965 1.1 skrll space allocated for dynamic pc-relative relocs against symbols
1966 1.1 skrll defined in a regular object. For the normal shared case, discard
1967 1.1 skrll space for relocs that have become local due to symbol visibility
1968 1.1 skrll changes. */
1969 1.7 christos if (bfd_link_pic (info))
1970 1.1 skrll {
1971 1.1 skrll #if RELATIVE_DYNRELOCS
1972 1.1 skrll if (SYMBOL_CALLS_LOCAL (info, eh))
1973 1.1 skrll {
1974 1.11 christos struct elf_dyn_relocs **hdh_pp;
1975 1.1 skrll
1976 1.14 christos for (hdh_pp = &eh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
1977 1.1 skrll {
1978 1.11 christos hdh_p->count -= hdh_p->pc_count;
1979 1.11 christos hdh_p->pc_count = 0;
1980 1.1 skrll if (hdh_p->count == 0)
1981 1.11 christos *hdh_pp = hdh_p->next;
1982 1.1 skrll else
1983 1.11 christos hdh_pp = &hdh_p->next;
1984 1.1 skrll }
1985 1.1 skrll }
1986 1.1 skrll #endif
1987 1.1 skrll
1988 1.14 christos if (eh->dyn_relocs != NULL)
1989 1.1 skrll {
1990 1.11 christos if (!ensure_undef_dynamic (info, eh))
1991 1.14 christos return false;
1992 1.1 skrll }
1993 1.1 skrll }
1994 1.11 christos else if (ELIMINATE_COPY_RELOCS)
1995 1.1 skrll {
1996 1.1 skrll /* For the non-shared case, discard space for relocs against
1997 1.1 skrll symbols which turn out to need copy relocs or are not
1998 1.1 skrll dynamic. */
1999 1.7 christos
2000 1.11 christos if (eh->dynamic_adjusted
2001 1.11 christos && !eh->def_regular
2002 1.11 christos && !ELF_COMMON_DEF_P (eh))
2003 1.11 christos {
2004 1.11 christos if (!ensure_undef_dynamic (info, eh))
2005 1.14 christos return false;
2006 1.1 skrll
2007 1.11 christos if (eh->dynindx == -1)
2008 1.14 christos eh->dyn_relocs = NULL;
2009 1.1 skrll }
2010 1.11 christos else
2011 1.14 christos eh->dyn_relocs = NULL;
2012 1.1 skrll }
2013 1.1 skrll
2014 1.1 skrll /* Finally, allocate space. */
2015 1.14 christos for (hdh_p = eh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
2016 1.1 skrll {
2017 1.1 skrll asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2018 1.1 skrll sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2019 1.1 skrll }
2020 1.1 skrll
2021 1.14 christos return true;
2022 1.1 skrll }
2023 1.1 skrll
2024 1.1 skrll /* This function is called via elf_link_hash_traverse to force
2025 1.1 skrll millicode symbols local so they do not end up as globals in the
2026 1.1 skrll dynamic symbol table. We ought to be able to do this in
2027 1.1 skrll adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2028 1.1 skrll for all dynamic symbols. Arguably, this is a bug in
2029 1.1 skrll elf_adjust_dynamic_symbol. */
2030 1.1 skrll
2031 1.14 christos static bool
2032 1.1 skrll clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2033 1.14 christos void *info)
2034 1.1 skrll {
2035 1.1 skrll if (eh->type == STT_PARISC_MILLI
2036 1.1 skrll && !eh->forced_local)
2037 1.14 christos elf32_hppa_hide_symbol ((struct bfd_link_info *) info, eh, true);
2038 1.14 christos return true;
2039 1.1 skrll }
2040 1.1 skrll
2041 1.1 skrll /* Set the sizes of the dynamic sections. */
2042 1.1 skrll
2043 1.14 christos static bool
2044 1.16 christos elf32_hppa_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2045 1.16 christos struct bfd_link_info *info)
2046 1.1 skrll {
2047 1.1 skrll struct elf32_hppa_link_hash_table *htab;
2048 1.1 skrll bfd *dynobj;
2049 1.1 skrll bfd *ibfd;
2050 1.1 skrll asection *sec;
2051 1.14 christos bool relocs;
2052 1.1 skrll
2053 1.1 skrll htab = hppa_link_hash_table (info);
2054 1.3 christos if (htab == NULL)
2055 1.14 christos return false;
2056 1.3 christos
2057 1.1 skrll dynobj = htab->etab.dynobj;
2058 1.1 skrll if (dynobj == NULL)
2059 1.16 christos return true;
2060 1.1 skrll
2061 1.1 skrll if (htab->etab.dynamic_sections_created)
2062 1.1 skrll {
2063 1.1 skrll /* Set the contents of the .interp section to the interpreter. */
2064 1.7 christos if (bfd_link_executable (info) && !info->nointerp)
2065 1.1 skrll {
2066 1.17 christos sec = htab->etab.interp;
2067 1.1 skrll if (sec == NULL)
2068 1.1 skrll abort ();
2069 1.1 skrll sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2070 1.1 skrll sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2071 1.16 christos sec->alloced = 1;
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 align = gotalign > 3 ? gotalign : 3;
2220 1.1 skrll bfd_size_type mask;
2221 1.1 skrll
2222 1.16 christos (void) bfd_link_align_section (sec, align);
2223 1.1 skrll mask = ((bfd_size_type) 1 << gotalign) - 1;
2224 1.1 skrll sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2225 1.1 skrll }
2226 1.1 skrll }
2227 1.11 christos else if (sec == htab->etab.sgot
2228 1.11 christos || sec == htab->etab.sdynbss
2229 1.11 christos || sec == htab->etab.sdynrelro)
2230 1.1 skrll ;
2231 1.14 christos else if (startswith (bfd_section_name (sec), ".rela"))
2232 1.1 skrll {
2233 1.1 skrll if (sec->size != 0)
2234 1.1 skrll {
2235 1.1 skrll /* Remember whether there are any reloc sections other
2236 1.1 skrll than .rela.plt. */
2237 1.11 christos if (sec != htab->etab.srelplt)
2238 1.14 christos relocs = true;
2239 1.1 skrll
2240 1.1 skrll /* We use the reloc_count field as a counter if we need
2241 1.1 skrll to copy relocs into the output file. */
2242 1.1 skrll sec->reloc_count = 0;
2243 1.1 skrll }
2244 1.1 skrll }
2245 1.1 skrll else
2246 1.1 skrll {
2247 1.1 skrll /* It's not one of our sections, so don't allocate space. */
2248 1.1 skrll continue;
2249 1.1 skrll }
2250 1.1 skrll
2251 1.1 skrll if (sec->size == 0)
2252 1.1 skrll {
2253 1.1 skrll /* If we don't need this section, strip it from the
2254 1.1 skrll output file. This is mostly to handle .rela.bss and
2255 1.1 skrll .rela.plt. We must create both sections in
2256 1.1 skrll create_dynamic_sections, because they must be created
2257 1.1 skrll before the linker maps input sections to output
2258 1.1 skrll sections. The linker does that before
2259 1.1 skrll adjust_dynamic_symbol is called, and it is that
2260 1.1 skrll function which decides whether anything needs to go
2261 1.1 skrll into these sections. */
2262 1.1 skrll sec->flags |= SEC_EXCLUDE;
2263 1.1 skrll continue;
2264 1.1 skrll }
2265 1.1 skrll
2266 1.1 skrll if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2267 1.1 skrll continue;
2268 1.1 skrll
2269 1.1 skrll /* Allocate memory for the section contents. Zero it, because
2270 1.1 skrll we may not fill in all the reloc sections. */
2271 1.1 skrll sec->contents = bfd_zalloc (dynobj, sec->size);
2272 1.1 skrll if (sec->contents == NULL)
2273 1.14 christos return false;
2274 1.16 christos sec->alloced = 1;
2275 1.1 skrll }
2276 1.1 skrll
2277 1.14 christos return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
2278 1.1 skrll }
2279 1.1 skrll
2280 1.1 skrll /* External entry points for sizing and building linker stubs. */
2281 1.1 skrll
2282 1.1 skrll /* Set up various things so that we can make a list of input sections
2283 1.1 skrll for each output section included in the link. Returns -1 on error,
2284 1.1 skrll 0 when no stubs will be needed, and 1 on success. */
2285 1.1 skrll
2286 1.1 skrll int
2287 1.1 skrll elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2288 1.1 skrll {
2289 1.1 skrll bfd *input_bfd;
2290 1.1 skrll unsigned int bfd_count;
2291 1.7 christos unsigned int top_id, top_index;
2292 1.1 skrll asection *section;
2293 1.1 skrll asection **input_list, **list;
2294 1.14 christos size_t amt;
2295 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2296 1.1 skrll
2297 1.3 christos if (htab == NULL)
2298 1.3 christos return -1;
2299 1.3 christos
2300 1.1 skrll /* Count the number of input BFDs and find the top input section id. */
2301 1.1 skrll for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2302 1.1 skrll input_bfd != NULL;
2303 1.7 christos input_bfd = input_bfd->link.next)
2304 1.1 skrll {
2305 1.1 skrll bfd_count += 1;
2306 1.1 skrll for (section = input_bfd->sections;
2307 1.1 skrll section != NULL;
2308 1.1 skrll section = section->next)
2309 1.1 skrll {
2310 1.1 skrll if (top_id < section->id)
2311 1.1 skrll top_id = section->id;
2312 1.1 skrll }
2313 1.1 skrll }
2314 1.1 skrll htab->bfd_count = bfd_count;
2315 1.1 skrll
2316 1.1 skrll amt = sizeof (struct map_stub) * (top_id + 1);
2317 1.1 skrll htab->stub_group = bfd_zmalloc (amt);
2318 1.1 skrll if (htab->stub_group == NULL)
2319 1.1 skrll return -1;
2320 1.1 skrll
2321 1.1 skrll /* We can't use output_bfd->section_count here to find the top output
2322 1.1 skrll section index as some sections may have been removed, and
2323 1.1 skrll strip_excluded_output_sections doesn't renumber the indices. */
2324 1.1 skrll for (section = output_bfd->sections, top_index = 0;
2325 1.1 skrll section != NULL;
2326 1.1 skrll section = section->next)
2327 1.1 skrll {
2328 1.1 skrll if (top_index < section->index)
2329 1.1 skrll top_index = section->index;
2330 1.1 skrll }
2331 1.1 skrll
2332 1.1 skrll htab->top_index = top_index;
2333 1.1 skrll amt = sizeof (asection *) * (top_index + 1);
2334 1.1 skrll input_list = bfd_malloc (amt);
2335 1.1 skrll htab->input_list = input_list;
2336 1.1 skrll if (input_list == NULL)
2337 1.1 skrll return -1;
2338 1.1 skrll
2339 1.1 skrll /* For sections we aren't interested in, mark their entries with a
2340 1.1 skrll value we can check later. */
2341 1.1 skrll list = input_list + top_index;
2342 1.1 skrll do
2343 1.1 skrll *list = bfd_abs_section_ptr;
2344 1.1 skrll while (list-- != input_list);
2345 1.1 skrll
2346 1.1 skrll for (section = output_bfd->sections;
2347 1.1 skrll section != NULL;
2348 1.1 skrll section = section->next)
2349 1.1 skrll {
2350 1.1 skrll if ((section->flags & SEC_CODE) != 0)
2351 1.1 skrll input_list[section->index] = NULL;
2352 1.1 skrll }
2353 1.1 skrll
2354 1.1 skrll return 1;
2355 1.1 skrll }
2356 1.1 skrll
2357 1.1 skrll /* The linker repeatedly calls this function for each input section,
2358 1.1 skrll in the order that input sections are linked into output sections.
2359 1.1 skrll Build lists of input sections to determine groupings between which
2360 1.1 skrll we may insert linker stubs. */
2361 1.1 skrll
2362 1.1 skrll void
2363 1.1 skrll elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2364 1.1 skrll {
2365 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2366 1.1 skrll
2367 1.3 christos if (htab == NULL)
2368 1.3 christos return;
2369 1.3 christos
2370 1.1 skrll if (isec->output_section->index <= htab->top_index)
2371 1.1 skrll {
2372 1.1 skrll asection **list = htab->input_list + isec->output_section->index;
2373 1.1 skrll if (*list != bfd_abs_section_ptr)
2374 1.1 skrll {
2375 1.1 skrll /* Steal the link_sec pointer for our list. */
2376 1.1 skrll #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2377 1.1 skrll /* This happens to make the list in reverse order,
2378 1.1 skrll which is what we want. */
2379 1.1 skrll PREV_SEC (isec) = *list;
2380 1.1 skrll *list = isec;
2381 1.1 skrll }
2382 1.1 skrll }
2383 1.1 skrll }
2384 1.1 skrll
2385 1.1 skrll /* See whether we can group stub sections together. Grouping stub
2386 1.1 skrll sections may result in fewer stubs. More importantly, we need to
2387 1.1 skrll put all .init* and .fini* stubs at the beginning of the .init or
2388 1.1 skrll .fini output sections respectively, because glibc splits the
2389 1.1 skrll _init and _fini functions into multiple parts. Putting a stub in
2390 1.1 skrll the middle of a function is not a good idea. */
2391 1.1 skrll
2392 1.1 skrll static void
2393 1.1 skrll group_sections (struct elf32_hppa_link_hash_table *htab,
2394 1.1 skrll bfd_size_type stub_group_size,
2395 1.14 christos bool stubs_always_before_branch)
2396 1.1 skrll {
2397 1.1 skrll asection **list = htab->input_list + htab->top_index;
2398 1.1 skrll do
2399 1.1 skrll {
2400 1.1 skrll asection *tail = *list;
2401 1.1 skrll if (tail == bfd_abs_section_ptr)
2402 1.1 skrll continue;
2403 1.1 skrll while (tail != NULL)
2404 1.1 skrll {
2405 1.1 skrll asection *curr;
2406 1.1 skrll asection *prev;
2407 1.1 skrll bfd_size_type total;
2408 1.14 christos bool big_sec;
2409 1.1 skrll
2410 1.1 skrll curr = tail;
2411 1.1 skrll total = tail->size;
2412 1.1 skrll big_sec = total >= stub_group_size;
2413 1.1 skrll
2414 1.1 skrll while ((prev = PREV_SEC (curr)) != NULL
2415 1.1 skrll && ((total += curr->output_offset - prev->output_offset)
2416 1.1 skrll < stub_group_size))
2417 1.1 skrll curr = prev;
2418 1.1 skrll
2419 1.1 skrll /* OK, the size from the start of CURR to the end is less
2420 1.1 skrll than 240000 bytes and thus can be handled by one stub
2421 1.1 skrll section. (or the tail section is itself larger than
2422 1.1 skrll 240000 bytes, in which case we may be toast.)
2423 1.1 skrll We should really be keeping track of the total size of
2424 1.1 skrll stubs added here, as stubs contribute to the final output
2425 1.1 skrll section size. That's a little tricky, and this way will
2426 1.1 skrll only break if stubs added total more than 22144 bytes, or
2427 1.1 skrll 2768 long branch stubs. It seems unlikely for more than
2428 1.1 skrll 2768 different functions to be called, especially from
2429 1.1 skrll code only 240000 bytes long. This limit used to be
2430 1.1 skrll 250000, but c++ code tends to generate lots of little
2431 1.1 skrll functions, and sometimes violated the assumption. */
2432 1.1 skrll do
2433 1.1 skrll {
2434 1.1 skrll prev = PREV_SEC (tail);
2435 1.1 skrll /* Set up this stub group. */
2436 1.1 skrll htab->stub_group[tail->id].link_sec = curr;
2437 1.1 skrll }
2438 1.1 skrll while (tail != curr && (tail = prev) != NULL);
2439 1.1 skrll
2440 1.1 skrll /* But wait, there's more! Input sections up to 240000
2441 1.1 skrll bytes before the stub section can be handled by it too.
2442 1.1 skrll Don't do this if we have a really large section after the
2443 1.1 skrll stubs, as adding more stubs increases the chance that
2444 1.1 skrll branches may not reach into the stub section. */
2445 1.1 skrll if (!stubs_always_before_branch && !big_sec)
2446 1.1 skrll {
2447 1.1 skrll total = 0;
2448 1.1 skrll while (prev != NULL
2449 1.1 skrll && ((total += tail->output_offset - prev->output_offset)
2450 1.1 skrll < stub_group_size))
2451 1.1 skrll {
2452 1.1 skrll tail = prev;
2453 1.1 skrll prev = PREV_SEC (tail);
2454 1.1 skrll htab->stub_group[tail->id].link_sec = curr;
2455 1.1 skrll }
2456 1.1 skrll }
2457 1.1 skrll tail = prev;
2458 1.1 skrll }
2459 1.1 skrll }
2460 1.1 skrll while (list-- != htab->input_list);
2461 1.1 skrll free (htab->input_list);
2462 1.1 skrll #undef PREV_SEC
2463 1.1 skrll }
2464 1.1 skrll
2465 1.1 skrll /* Read in all local syms for all input bfds, and create hash entries
2466 1.1 skrll for export stubs if we are building a multi-subspace shared lib.
2467 1.1 skrll Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2468 1.1 skrll
2469 1.1 skrll static int
2470 1.1 skrll get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2471 1.1 skrll {
2472 1.1 skrll unsigned int bfd_indx;
2473 1.1 skrll Elf_Internal_Sym *local_syms, **all_local_syms;
2474 1.1 skrll int stub_changed = 0;
2475 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2476 1.1 skrll
2477 1.3 christos if (htab == NULL)
2478 1.3 christos return -1;
2479 1.3 christos
2480 1.1 skrll /* We want to read in symbol extension records only once. To do this
2481 1.1 skrll we need to read in the local symbols in parallel and save them for
2482 1.1 skrll later use; so hold pointers to the local symbols in an array. */
2483 1.14 christos size_t amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2484 1.1 skrll all_local_syms = bfd_zmalloc (amt);
2485 1.1 skrll htab->all_local_syms = all_local_syms;
2486 1.1 skrll if (all_local_syms == NULL)
2487 1.1 skrll return -1;
2488 1.1 skrll
2489 1.1 skrll /* Walk over all the input BFDs, swapping in local symbols.
2490 1.1 skrll If we are creating a shared library, create hash entries for the
2491 1.1 skrll export stubs. */
2492 1.1 skrll for (bfd_indx = 0;
2493 1.1 skrll input_bfd != NULL;
2494 1.7 christos input_bfd = input_bfd->link.next, bfd_indx++)
2495 1.1 skrll {
2496 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2497 1.1 skrll
2498 1.1 skrll /* We'll need the symbol table in a second. */
2499 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2500 1.1 skrll if (symtab_hdr->sh_info == 0)
2501 1.1 skrll continue;
2502 1.1 skrll
2503 1.1 skrll /* We need an array of the local symbols attached to the input bfd. */
2504 1.1 skrll local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2505 1.1 skrll if (local_syms == NULL)
2506 1.1 skrll {
2507 1.1 skrll local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2508 1.1 skrll symtab_hdr->sh_info, 0,
2509 1.1 skrll NULL, NULL, NULL);
2510 1.1 skrll /* Cache them for elf_link_input_bfd. */
2511 1.1 skrll symtab_hdr->contents = (unsigned char *) local_syms;
2512 1.1 skrll }
2513 1.1 skrll if (local_syms == NULL)
2514 1.1 skrll return -1;
2515 1.1 skrll
2516 1.1 skrll all_local_syms[bfd_indx] = local_syms;
2517 1.1 skrll
2518 1.7 christos if (bfd_link_pic (info) && htab->multi_subspace)
2519 1.1 skrll {
2520 1.1 skrll struct elf_link_hash_entry **eh_syms;
2521 1.1 skrll struct elf_link_hash_entry **eh_symend;
2522 1.1 skrll unsigned int symcount;
2523 1.1 skrll
2524 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2525 1.1 skrll - symtab_hdr->sh_info);
2526 1.1 skrll eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2527 1.1 skrll eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2528 1.1 skrll
2529 1.1 skrll /* Look through the global syms for functions; We need to
2530 1.1 skrll build export stubs for all globally visible functions. */
2531 1.1 skrll for (; eh_syms < eh_symend; eh_syms++)
2532 1.1 skrll {
2533 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2534 1.1 skrll
2535 1.1 skrll hh = hppa_elf_hash_entry (*eh_syms);
2536 1.1 skrll
2537 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
2538 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
2539 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2540 1.1 skrll
2541 1.1 skrll /* At this point in the link, undefined syms have been
2542 1.1 skrll resolved, so we need to check that the symbol was
2543 1.1 skrll defined in this BFD. */
2544 1.1 skrll if ((hh->eh.root.type == bfd_link_hash_defined
2545 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak)
2546 1.1 skrll && hh->eh.type == STT_FUNC
2547 1.1 skrll && hh->eh.root.u.def.section->output_section != NULL
2548 1.1 skrll && (hh->eh.root.u.def.section->output_section->owner
2549 1.1 skrll == output_bfd)
2550 1.1 skrll && hh->eh.root.u.def.section->owner == input_bfd
2551 1.1 skrll && hh->eh.def_regular
2552 1.1 skrll && !hh->eh.forced_local
2553 1.1 skrll && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2554 1.1 skrll {
2555 1.1 skrll asection *sec;
2556 1.1 skrll const char *stub_name;
2557 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
2558 1.1 skrll
2559 1.1 skrll sec = hh->eh.root.u.def.section;
2560 1.1 skrll stub_name = hh_name (hh);
2561 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab,
2562 1.1 skrll stub_name,
2563 1.14 christos false, false);
2564 1.1 skrll if (hsh == NULL)
2565 1.1 skrll {
2566 1.1 skrll hsh = hppa_add_stub (stub_name, sec, htab);
2567 1.1 skrll if (!hsh)
2568 1.1 skrll return -1;
2569 1.1 skrll
2570 1.1 skrll hsh->target_value = hh->eh.root.u.def.value;
2571 1.1 skrll hsh->target_section = hh->eh.root.u.def.section;
2572 1.1 skrll hsh->stub_type = hppa_stub_export;
2573 1.1 skrll hsh->hh = hh;
2574 1.1 skrll stub_changed = 1;
2575 1.1 skrll }
2576 1.1 skrll else
2577 1.1 skrll {
2578 1.11 christos /* xgettext:c-format */
2579 1.12 christos _bfd_error_handler (_("%pB: duplicate export stub %s"),
2580 1.11 christos input_bfd, stub_name);
2581 1.1 skrll }
2582 1.1 skrll }
2583 1.1 skrll }
2584 1.1 skrll }
2585 1.1 skrll }
2586 1.1 skrll
2587 1.1 skrll return stub_changed;
2588 1.1 skrll }
2589 1.1 skrll
2590 1.1 skrll /* Determine and set the size of the stub section for a final link.
2591 1.1 skrll
2592 1.1 skrll The basic idea here is to examine all the relocations looking for
2593 1.1 skrll PC-relative calls to a target that is unreachable with a "bl"
2594 1.1 skrll instruction. */
2595 1.1 skrll
2596 1.14 christos bool
2597 1.1 skrll elf32_hppa_size_stubs
2598 1.1 skrll (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2599 1.14 christos bool multi_subspace, bfd_signed_vma group_size,
2600 1.1 skrll asection * (*add_stub_section) (const char *, asection *),
2601 1.1 skrll void (*layout_sections_again) (void))
2602 1.1 skrll {
2603 1.1 skrll bfd_size_type stub_group_size;
2604 1.14 christos bool stubs_always_before_branch;
2605 1.14 christos bool stub_changed;
2606 1.1 skrll struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2607 1.1 skrll
2608 1.3 christos if (htab == NULL)
2609 1.14 christos return false;
2610 1.3 christos
2611 1.1 skrll /* Stash our params away. */
2612 1.1 skrll htab->stub_bfd = stub_bfd;
2613 1.1 skrll htab->multi_subspace = multi_subspace;
2614 1.1 skrll htab->add_stub_section = add_stub_section;
2615 1.1 skrll htab->layout_sections_again = layout_sections_again;
2616 1.1 skrll stubs_always_before_branch = group_size < 0;
2617 1.1 skrll if (group_size < 0)
2618 1.1 skrll stub_group_size = -group_size;
2619 1.1 skrll else
2620 1.1 skrll stub_group_size = group_size;
2621 1.1 skrll if (stub_group_size == 1)
2622 1.1 skrll {
2623 1.1 skrll /* Default values. */
2624 1.1 skrll if (stubs_always_before_branch)
2625 1.1 skrll {
2626 1.1 skrll stub_group_size = 7680000;
2627 1.1 skrll if (htab->has_17bit_branch || htab->multi_subspace)
2628 1.1 skrll stub_group_size = 240000;
2629 1.1 skrll if (htab->has_12bit_branch)
2630 1.1 skrll stub_group_size = 7500;
2631 1.1 skrll }
2632 1.1 skrll else
2633 1.1 skrll {
2634 1.1 skrll stub_group_size = 6971392;
2635 1.1 skrll if (htab->has_17bit_branch || htab->multi_subspace)
2636 1.1 skrll stub_group_size = 217856;
2637 1.1 skrll if (htab->has_12bit_branch)
2638 1.1 skrll stub_group_size = 6808;
2639 1.1 skrll }
2640 1.1 skrll }
2641 1.1 skrll
2642 1.1 skrll group_sections (htab, stub_group_size, stubs_always_before_branch);
2643 1.1 skrll
2644 1.1 skrll switch (get_local_syms (output_bfd, info->input_bfds, info))
2645 1.1 skrll {
2646 1.1 skrll default:
2647 1.1 skrll if (htab->all_local_syms)
2648 1.1 skrll goto error_ret_free_local;
2649 1.14 christos return false;
2650 1.1 skrll
2651 1.1 skrll case 0:
2652 1.14 christos stub_changed = false;
2653 1.1 skrll break;
2654 1.1 skrll
2655 1.1 skrll case 1:
2656 1.14 christos stub_changed = true;
2657 1.1 skrll break;
2658 1.1 skrll }
2659 1.1 skrll
2660 1.1 skrll while (1)
2661 1.1 skrll {
2662 1.1 skrll bfd *input_bfd;
2663 1.1 skrll unsigned int bfd_indx;
2664 1.1 skrll asection *stub_sec;
2665 1.1 skrll
2666 1.1 skrll for (input_bfd = info->input_bfds, bfd_indx = 0;
2667 1.1 skrll input_bfd != NULL;
2668 1.7 christos input_bfd = input_bfd->link.next, bfd_indx++)
2669 1.1 skrll {
2670 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2671 1.1 skrll asection *section;
2672 1.1 skrll Elf_Internal_Sym *local_syms;
2673 1.1 skrll
2674 1.1 skrll /* We'll need the symbol table in a second. */
2675 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2676 1.1 skrll if (symtab_hdr->sh_info == 0)
2677 1.1 skrll continue;
2678 1.1 skrll
2679 1.1 skrll local_syms = htab->all_local_syms[bfd_indx];
2680 1.1 skrll
2681 1.1 skrll /* Walk over each section attached to the input bfd. */
2682 1.1 skrll for (section = input_bfd->sections;
2683 1.1 skrll section != NULL;
2684 1.1 skrll section = section->next)
2685 1.1 skrll {
2686 1.1 skrll Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2687 1.1 skrll
2688 1.1 skrll /* If there aren't any relocs, then there's nothing more
2689 1.1 skrll to do. */
2690 1.1 skrll if ((section->flags & SEC_RELOC) == 0
2691 1.12 christos || (section->flags & SEC_ALLOC) == 0
2692 1.12 christos || (section->flags & SEC_LOAD) == 0
2693 1.12 christos || (section->flags & SEC_CODE) == 0
2694 1.1 skrll || section->reloc_count == 0)
2695 1.1 skrll continue;
2696 1.1 skrll
2697 1.1 skrll /* If this section is a link-once section that will be
2698 1.1 skrll discarded, then don't create any stubs. */
2699 1.1 skrll if (section->output_section == NULL
2700 1.1 skrll || section->output_section->owner != output_bfd)
2701 1.1 skrll continue;
2702 1.1 skrll
2703 1.1 skrll /* Get the relocs. */
2704 1.1 skrll internal_relocs
2705 1.1 skrll = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2706 1.1 skrll info->keep_memory);
2707 1.1 skrll if (internal_relocs == NULL)
2708 1.1 skrll goto error_ret_free_local;
2709 1.1 skrll
2710 1.1 skrll /* Now examine each relocation. */
2711 1.1 skrll irela = internal_relocs;
2712 1.1 skrll irelaend = irela + section->reloc_count;
2713 1.1 skrll for (; irela < irelaend; irela++)
2714 1.1 skrll {
2715 1.1 skrll unsigned int r_type, r_indx;
2716 1.1 skrll enum elf32_hppa_stub_type stub_type;
2717 1.1 skrll struct elf32_hppa_stub_hash_entry *hsh;
2718 1.1 skrll asection *sym_sec;
2719 1.1 skrll bfd_vma sym_value;
2720 1.1 skrll bfd_vma destination;
2721 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
2722 1.1 skrll char *stub_name;
2723 1.1 skrll const asection *id_sec;
2724 1.1 skrll
2725 1.1 skrll r_type = ELF32_R_TYPE (irela->r_info);
2726 1.1 skrll r_indx = ELF32_R_SYM (irela->r_info);
2727 1.1 skrll
2728 1.1 skrll if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2729 1.1 skrll {
2730 1.1 skrll bfd_set_error (bfd_error_bad_value);
2731 1.1 skrll error_ret_free_internal:
2732 1.1 skrll if (elf_section_data (section)->relocs == NULL)
2733 1.1 skrll free (internal_relocs);
2734 1.1 skrll goto error_ret_free_local;
2735 1.1 skrll }
2736 1.1 skrll
2737 1.1 skrll /* Only look for stubs on call instructions. */
2738 1.1 skrll if (r_type != (unsigned int) R_PARISC_PCREL12F
2739 1.1 skrll && r_type != (unsigned int) R_PARISC_PCREL17F
2740 1.1 skrll && r_type != (unsigned int) R_PARISC_PCREL22F)
2741 1.1 skrll continue;
2742 1.1 skrll
2743 1.1 skrll /* Now determine the call target, its name, value,
2744 1.1 skrll section. */
2745 1.1 skrll sym_sec = NULL;
2746 1.1 skrll sym_value = 0;
2747 1.12 christos destination = -1;
2748 1.1 skrll hh = NULL;
2749 1.1 skrll if (r_indx < symtab_hdr->sh_info)
2750 1.1 skrll {
2751 1.1 skrll /* It's a local symbol. */
2752 1.1 skrll Elf_Internal_Sym *sym;
2753 1.1 skrll Elf_Internal_Shdr *hdr;
2754 1.1 skrll unsigned int shndx;
2755 1.1 skrll
2756 1.1 skrll sym = local_syms + r_indx;
2757 1.1 skrll if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2758 1.1 skrll sym_value = sym->st_value;
2759 1.1 skrll shndx = sym->st_shndx;
2760 1.1 skrll if (shndx < elf_numsections (input_bfd))
2761 1.1 skrll {
2762 1.1 skrll hdr = elf_elfsections (input_bfd)[shndx];
2763 1.1 skrll sym_sec = hdr->bfd_section;
2764 1.1 skrll destination = (sym_value + irela->r_addend
2765 1.1 skrll + sym_sec->output_offset
2766 1.1 skrll + sym_sec->output_section->vma);
2767 1.1 skrll }
2768 1.1 skrll }
2769 1.1 skrll else
2770 1.1 skrll {
2771 1.1 skrll /* It's an external symbol. */
2772 1.1 skrll int e_indx;
2773 1.1 skrll
2774 1.1 skrll e_indx = r_indx - symtab_hdr->sh_info;
2775 1.1 skrll hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
2776 1.1 skrll
2777 1.1 skrll while (hh->eh.root.type == bfd_link_hash_indirect
2778 1.1 skrll || hh->eh.root.type == bfd_link_hash_warning)
2779 1.1 skrll hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2780 1.1 skrll
2781 1.1 skrll if (hh->eh.root.type == bfd_link_hash_defined
2782 1.1 skrll || hh->eh.root.type == bfd_link_hash_defweak)
2783 1.1 skrll {
2784 1.1 skrll sym_sec = hh->eh.root.u.def.section;
2785 1.1 skrll sym_value = hh->eh.root.u.def.value;
2786 1.1 skrll if (sym_sec->output_section != NULL)
2787 1.1 skrll destination = (sym_value + irela->r_addend
2788 1.1 skrll + sym_sec->output_offset
2789 1.1 skrll + sym_sec->output_section->vma);
2790 1.1 skrll }
2791 1.1 skrll else if (hh->eh.root.type == bfd_link_hash_undefweak)
2792 1.1 skrll {
2793 1.7 christos if (! bfd_link_pic (info))
2794 1.1 skrll continue;
2795 1.1 skrll }
2796 1.1 skrll else if (hh->eh.root.type == bfd_link_hash_undefined)
2797 1.1 skrll {
2798 1.1 skrll if (! (info->unresolved_syms_in_objects == RM_IGNORE
2799 1.1 skrll && (ELF_ST_VISIBILITY (hh->eh.other)
2800 1.1 skrll == STV_DEFAULT)
2801 1.1 skrll && hh->eh.type != STT_PARISC_MILLI))
2802 1.1 skrll continue;
2803 1.1 skrll }
2804 1.1 skrll else
2805 1.1 skrll {
2806 1.1 skrll bfd_set_error (bfd_error_bad_value);
2807 1.1 skrll goto error_ret_free_internal;
2808 1.1 skrll }
2809 1.1 skrll }
2810 1.1 skrll
2811 1.1 skrll /* Determine what (if any) linker stub is needed. */
2812 1.1 skrll stub_type = hppa_type_of_stub (section, irela, hh,
2813 1.1 skrll destination, info);
2814 1.1 skrll if (stub_type == hppa_stub_none)
2815 1.1 skrll continue;
2816 1.1 skrll
2817 1.1 skrll /* Support for grouping stub sections. */
2818 1.1 skrll id_sec = htab->stub_group[section->id].link_sec;
2819 1.1 skrll
2820 1.1 skrll /* Get the name of this stub. */
2821 1.1 skrll stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
2822 1.1 skrll if (!stub_name)
2823 1.1 skrll goto error_ret_free_internal;
2824 1.1 skrll
2825 1.1 skrll hsh = hppa_stub_hash_lookup (&htab->bstab,
2826 1.1 skrll stub_name,
2827 1.14 christos false, false);
2828 1.1 skrll if (hsh != NULL)
2829 1.1 skrll {
2830 1.1 skrll /* The proper stub has already been created. */
2831 1.1 skrll free (stub_name);
2832 1.1 skrll continue;
2833 1.1 skrll }
2834 1.1 skrll
2835 1.1 skrll hsh = hppa_add_stub (stub_name, section, htab);
2836 1.1 skrll if (hsh == NULL)
2837 1.1 skrll {
2838 1.1 skrll free (stub_name);
2839 1.1 skrll goto error_ret_free_internal;
2840 1.1 skrll }
2841 1.1 skrll
2842 1.1 skrll hsh->target_value = sym_value;
2843 1.1 skrll hsh->target_section = sym_sec;
2844 1.1 skrll hsh->stub_type = stub_type;
2845 1.7 christos if (bfd_link_pic (info))
2846 1.1 skrll {
2847 1.1 skrll if (stub_type == hppa_stub_import)
2848 1.1 skrll hsh->stub_type = hppa_stub_import_shared;
2849 1.1 skrll else if (stub_type == hppa_stub_long_branch)
2850 1.1 skrll hsh->stub_type = hppa_stub_long_branch_shared;
2851 1.1 skrll }
2852 1.1 skrll hsh->hh = hh;
2853 1.14 christos stub_changed = true;
2854 1.1 skrll }
2855 1.1 skrll
2856 1.1 skrll /* We're done with the internal relocs, free them. */
2857 1.1 skrll if (elf_section_data (section)->relocs == NULL)
2858 1.1 skrll free (internal_relocs);
2859 1.1 skrll }
2860 1.1 skrll }
2861 1.1 skrll
2862 1.1 skrll if (!stub_changed)
2863 1.1 skrll break;
2864 1.1 skrll
2865 1.1 skrll /* OK, we've added some stubs. Find out the new size of the
2866 1.1 skrll stub sections. */
2867 1.1 skrll for (stub_sec = htab->stub_bfd->sections;
2868 1.1 skrll stub_sec != NULL;
2869 1.1 skrll stub_sec = stub_sec->next)
2870 1.10 christos if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2871 1.10 christos stub_sec->size = 0;
2872 1.1 skrll
2873 1.1 skrll bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
2874 1.1 skrll
2875 1.1 skrll /* Ask the linker to do its stuff. */
2876 1.1 skrll (*htab->layout_sections_again) ();
2877 1.14 christos stub_changed = false;
2878 1.1 skrll }
2879 1.1 skrll
2880 1.1 skrll free (htab->all_local_syms);
2881 1.14 christos return true;
2882 1.1 skrll
2883 1.1 skrll error_ret_free_local:
2884 1.1 skrll free (htab->all_local_syms);
2885 1.14 christos return false;
2886 1.1 skrll }
2887 1.1 skrll
2888 1.1 skrll /* For a final link, this function is called after we have sized the
2889 1.1 skrll stubs to provide a value for __gp. */
2890 1.1 skrll
2891 1.14 christos bool
2892 1.1 skrll elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
2893 1.1 skrll {
2894 1.1 skrll struct bfd_link_hash_entry *h;
2895 1.1 skrll asection *sec = NULL;
2896 1.1 skrll bfd_vma gp_val = 0;
2897 1.1 skrll
2898 1.14 christos h = bfd_link_hash_lookup (info->hash, "$global$", false, false, false);
2899 1.1 skrll
2900 1.1 skrll if (h != NULL
2901 1.1 skrll && (h->type == bfd_link_hash_defined
2902 1.1 skrll || h->type == bfd_link_hash_defweak))
2903 1.1 skrll {
2904 1.1 skrll gp_val = h->u.def.value;
2905 1.1 skrll sec = h->u.def.section;
2906 1.1 skrll }
2907 1.1 skrll else
2908 1.1 skrll {
2909 1.1 skrll asection *splt = bfd_get_section_by_name (abfd, ".plt");
2910 1.1 skrll asection *sgot = bfd_get_section_by_name (abfd, ".got");
2911 1.1 skrll
2912 1.1 skrll /* Choose to point our LTP at, in this order, one of .plt, .got,
2913 1.1 skrll or .data, if these sections exist. In the case of choosing
2914 1.1 skrll .plt try to make the LTP ideal for addressing anywhere in the
2915 1.1 skrll .plt or .got with a 14 bit signed offset. Typically, the end
2916 1.1 skrll of the .plt is the start of the .got, so choose .plt + 0x2000
2917 1.1 skrll if either the .plt or .got is larger than 0x2000. If both
2918 1.1 skrll the .plt and .got are smaller than 0x2000, choose the end of
2919 1.1 skrll the .plt section. */
2920 1.1 skrll sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
2921 1.1 skrll ? NULL : splt;
2922 1.1 skrll if (sec != NULL)
2923 1.1 skrll {
2924 1.1 skrll gp_val = sec->size;
2925 1.1 skrll if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
2926 1.1 skrll {
2927 1.1 skrll gp_val = 0x2000;
2928 1.1 skrll }
2929 1.1 skrll }
2930 1.1 skrll else
2931 1.1 skrll {
2932 1.1 skrll sec = sgot;
2933 1.1 skrll if (sec != NULL)
2934 1.1 skrll {
2935 1.1 skrll if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
2936 1.1 skrll {
2937 1.11 christos /* We know we don't have a .plt. If .got is large,
2938 1.1 skrll offset our LTP. */
2939 1.11 christos if (sec->size > 0x2000)
2940 1.1 skrll gp_val = 0x2000;
2941 1.1 skrll }
2942 1.1 skrll }
2943 1.1 skrll else
2944 1.1 skrll {
2945 1.1 skrll /* No .plt or .got. Who cares what the LTP is? */
2946 1.1 skrll sec = bfd_get_section_by_name (abfd, ".data");
2947 1.1 skrll }
2948 1.1 skrll }
2949 1.1 skrll
2950 1.1 skrll if (h != NULL)
2951 1.1 skrll {
2952 1.1 skrll h->type = bfd_link_hash_defined;
2953 1.1 skrll h->u.def.value = gp_val;
2954 1.1 skrll if (sec != NULL)
2955 1.1 skrll h->u.def.section = sec;
2956 1.1 skrll else
2957 1.1 skrll h->u.def.section = bfd_abs_section_ptr;
2958 1.1 skrll }
2959 1.1 skrll }
2960 1.1 skrll
2961 1.11 christos if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2962 1.11 christos {
2963 1.11 christos if (sec != NULL && sec->output_section != NULL)
2964 1.11 christos gp_val += sec->output_section->vma + sec->output_offset;
2965 1.1 skrll
2966 1.11 christos elf_gp (abfd) = gp_val;
2967 1.11 christos }
2968 1.14 christos return true;
2969 1.1 skrll }
2970 1.1 skrll
2971 1.1 skrll /* Build all the stubs associated with the current output file. The
2972 1.1 skrll stubs are kept in a hash table attached to the main linker hash
2973 1.1 skrll table. We also set up the .plt entries for statically linked PIC
2974 1.1 skrll functions here. This function is called via hppaelf_finish in the
2975 1.1 skrll linker. */
2976 1.1 skrll
2977 1.14 christos bool
2978 1.1 skrll elf32_hppa_build_stubs (struct bfd_link_info *info)
2979 1.1 skrll {
2980 1.1 skrll asection *stub_sec;
2981 1.1 skrll struct bfd_hash_table *table;
2982 1.1 skrll struct elf32_hppa_link_hash_table *htab;
2983 1.1 skrll
2984 1.1 skrll htab = hppa_link_hash_table (info);
2985 1.3 christos if (htab == NULL)
2986 1.14 christos return false;
2987 1.1 skrll
2988 1.1 skrll for (stub_sec = htab->stub_bfd->sections;
2989 1.1 skrll stub_sec != NULL;
2990 1.1 skrll stub_sec = stub_sec->next)
2991 1.10 christos if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
2992 1.10 christos && stub_sec->size != 0)
2993 1.10 christos {
2994 1.10 christos /* Allocate memory to hold the linker stubs. */
2995 1.10 christos stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
2996 1.10 christos if (stub_sec->contents == NULL)
2997 1.14 christos return false;
2998 1.16 christos stub_sec->alloced = 1;
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.17 christos 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.16 christos int r_format;
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.16 christos switch (r_type)
3436 1.16 christos {
3437 1.16 christos case R_PARISC_DIR32:
3438 1.16 christos case R_PARISC_SECREL32:
3439 1.16 christos case R_PARISC_SEGBASE:
3440 1.16 christos case R_PARISC_SEGREL32:
3441 1.16 christos case R_PARISC_PLABEL32:
3442 1.16 christos /* These relocations apply to data. */
3443 1.16 christos r_format = howto->bitsize;
3444 1.16 christos break;
3445 1.16 christos
3446 1.16 christos default:
3447 1.16 christos r_format = bfd_hppa_insn2fmt (input_bfd, insn);
3448 1.16 christos switch (r_format)
3449 1.16 christos {
3450 1.16 christos case 10:
3451 1.16 christos case -10:
3452 1.16 christos if (val & 7)
3453 1.16 christos {
3454 1.16 christos _bfd_error_handler
3455 1.16 christos /* xgettext:c-format */
3456 1.16 christos (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
3457 1.16 christos "is not a multiple of 8 (gp %#x)"),
3458 1.16 christos input_bfd,
3459 1.16 christos input_section,
3460 1.16 christos (uint64_t) offset,
3461 1.16 christos val,
3462 1.16 christos insn,
3463 1.16 christos (unsigned int) elf_gp (input_section->output_section->owner));
3464 1.16 christos bfd_set_error (bfd_error_bad_value);
3465 1.16 christos return bfd_reloc_notsupported;
3466 1.16 christos }
3467 1.16 christos break;
3468 1.16 christos
3469 1.16 christos case -11:
3470 1.16 christos case -16:
3471 1.16 christos if (val & 3)
3472 1.16 christos {
3473 1.16 christos _bfd_error_handler
3474 1.16 christos /* xgettext:c-format */
3475 1.16 christos (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
3476 1.16 christos "is not a multiple of 4 (gp %#x)"),
3477 1.16 christos input_bfd,
3478 1.16 christos input_section,
3479 1.16 christos (uint64_t) offset,
3480 1.16 christos val,
3481 1.16 christos insn,
3482 1.16 christos (unsigned int) elf_gp (input_section->output_section->owner));
3483 1.16 christos bfd_set_error (bfd_error_bad_value);
3484 1.16 christos return bfd_reloc_notsupported;
3485 1.16 christos }
3486 1.16 christos break;
3487 1.16 christos
3488 1.16 christos default:
3489 1.16 christos break;
3490 1.16 christos }
3491 1.16 christos break;
3492 1.16 christos }
3493 1.1 skrll insn = hppa_rebuild_insn (insn, val, r_format);
3494 1.1 skrll
3495 1.1 skrll /* Update the instruction word. */
3496 1.1 skrll bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3497 1.1 skrll return bfd_reloc_ok;
3498 1.1 skrll }
3499 1.1 skrll
3500 1.1 skrll /* Relocate an HPPA ELF section. */
3501 1.1 skrll
3502 1.14 christos static int
3503 1.1 skrll elf32_hppa_relocate_section (bfd *output_bfd,
3504 1.1 skrll struct bfd_link_info *info,
3505 1.1 skrll bfd *input_bfd,
3506 1.1 skrll asection *input_section,
3507 1.1 skrll bfd_byte *contents,
3508 1.1 skrll Elf_Internal_Rela *relocs,
3509 1.1 skrll Elf_Internal_Sym *local_syms,
3510 1.1 skrll asection **local_sections)
3511 1.1 skrll {
3512 1.1 skrll bfd_vma *local_got_offsets;
3513 1.1 skrll struct elf32_hppa_link_hash_table *htab;
3514 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
3515 1.1 skrll Elf_Internal_Rela *rela;
3516 1.1 skrll Elf_Internal_Rela *relend;
3517 1.1 skrll
3518 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3519 1.1 skrll
3520 1.1 skrll htab = hppa_link_hash_table (info);
3521 1.3 christos if (htab == NULL)
3522 1.14 christos return false;
3523 1.3 christos
3524 1.1 skrll local_got_offsets = elf_local_got_offsets (input_bfd);
3525 1.1 skrll
3526 1.1 skrll rela = relocs;
3527 1.1 skrll relend = relocs + input_section->reloc_count;
3528 1.1 skrll for (; rela < relend; rela++)
3529 1.1 skrll {
3530 1.1 skrll unsigned int r_type;
3531 1.1 skrll reloc_howto_type *howto;
3532 1.1 skrll unsigned int r_symndx;
3533 1.1 skrll struct elf32_hppa_link_hash_entry *hh;
3534 1.1 skrll Elf_Internal_Sym *sym;
3535 1.1 skrll asection *sym_sec;
3536 1.1 skrll bfd_vma relocation;
3537 1.1 skrll bfd_reloc_status_type rstatus;
3538 1.1 skrll const char *sym_name;
3539 1.14 christos bool plabel;
3540 1.14 christos bool warned_undef;
3541 1.1 skrll
3542 1.1 skrll r_type = ELF32_R_TYPE (rela->r_info);
3543 1.1 skrll if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3544 1.1 skrll {
3545 1.1 skrll bfd_set_error (bfd_error_bad_value);
3546 1.14 christos return false;
3547 1.1 skrll }
3548 1.1 skrll if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3549 1.1 skrll || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3550 1.1 skrll continue;
3551 1.1 skrll
3552 1.1 skrll r_symndx = ELF32_R_SYM (rela->r_info);
3553 1.1 skrll hh = NULL;
3554 1.1 skrll sym = NULL;
3555 1.1 skrll sym_sec = NULL;
3556 1.14 christos warned_undef = false;
3557 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
3558 1.1 skrll {
3559 1.1 skrll /* This is a local symbol, h defaults to NULL. */
3560 1.1 skrll sym = local_syms + r_symndx;
3561 1.1 skrll sym_sec = local_sections[r_symndx];
3562 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3563 1.1 skrll }
3564 1.1 skrll else
3565 1.1 skrll {
3566 1.1 skrll struct elf_link_hash_entry *eh;
3567 1.14 christos bool unresolved_reloc, ignored;
3568 1.1 skrll struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3569 1.1 skrll
3570 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3571 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
3572 1.1 skrll eh, sym_sec, relocation,
3573 1.7 christos unresolved_reloc, warned_undef,
3574 1.7 christos ignored);
3575 1.1 skrll
3576 1.7 christos if (!bfd_link_relocatable (info)
3577 1.1 skrll && relocation == 0
3578 1.1 skrll && eh->root.type != bfd_link_hash_defined
3579 1.1 skrll && eh->root.type != bfd_link_hash_defweak
3580 1.1 skrll && eh->root.type != bfd_link_hash_undefweak)
3581 1.1 skrll {
3582 1.1 skrll if (info->unresolved_syms_in_objects == RM_IGNORE
3583 1.1 skrll && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3584 1.1 skrll && eh->type == STT_PARISC_MILLI)
3585 1.1 skrll {
3586 1.10 christos (*info->callbacks->undefined_symbol)
3587 1.10 christos (info, eh_name (eh), input_bfd,
3588 1.14 christos input_section, rela->r_offset, false);
3589 1.14 christos warned_undef = true;
3590 1.1 skrll }
3591 1.1 skrll }
3592 1.1 skrll hh = hppa_elf_hash_entry (eh);
3593 1.1 skrll }
3594 1.1 skrll
3595 1.6 christos if (sym_sec != NULL && discarded_section (sym_sec))
3596 1.3 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3597 1.17 christos rela, 1, relend, R_PARISC_NONE,
3598 1.6 christos elf_hppa_howto_table + r_type, 0,
3599 1.3 christos contents);
3600 1.1 skrll
3601 1.7 christos if (bfd_link_relocatable (info))
3602 1.1 skrll continue;
3603 1.1 skrll
3604 1.1 skrll /* Do any required modifications to the relocation value, and
3605 1.1 skrll determine what types of dynamic info we need to output, if
3606 1.1 skrll any. */
3607 1.1 skrll plabel = 0;
3608 1.1 skrll switch (r_type)
3609 1.1 skrll {
3610 1.1 skrll case R_PARISC_DLTIND14F:
3611 1.1 skrll case R_PARISC_DLTIND14R:
3612 1.1 skrll case R_PARISC_DLTIND21L:
3613 1.1 skrll {
3614 1.1 skrll bfd_vma off;
3615 1.14 christos bool do_got = false;
3616 1.14 christos bool reloc = bfd_link_pic (info);
3617 1.1 skrll
3618 1.1 skrll /* Relocation is to the entry for this symbol in the
3619 1.1 skrll global offset table. */
3620 1.1 skrll if (hh != NULL)
3621 1.1 skrll {
3622 1.14 christos bool dyn;
3623 1.1 skrll
3624 1.1 skrll off = hh->eh.got.offset;
3625 1.1 skrll dyn = htab->etab.dynamic_sections_created;
3626 1.11 christos reloc = (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh)
3627 1.11 christos && (reloc
3628 1.11 christos || (hh->eh.dynindx != -1
3629 1.11 christos && !SYMBOL_REFERENCES_LOCAL (info, &hh->eh))));
3630 1.11 christos if (!reloc
3631 1.11 christos || !WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3632 1.11 christos bfd_link_pic (info),
3633 1.11 christos &hh->eh))
3634 1.1 skrll {
3635 1.1 skrll /* If we aren't going to call finish_dynamic_symbol,
3636 1.1 skrll then we need to handle initialisation of the .got
3637 1.1 skrll entry and create needed relocs here. Since the
3638 1.1 skrll offset must always be a multiple of 4, we use the
3639 1.1 skrll least significant bit to record whether we have
3640 1.1 skrll initialised it already. */
3641 1.1 skrll if ((off & 1) != 0)
3642 1.1 skrll off &= ~1;
3643 1.1 skrll else
3644 1.1 skrll {
3645 1.1 skrll hh->eh.got.offset |= 1;
3646 1.14 christos do_got = true;
3647 1.1 skrll }
3648 1.1 skrll }
3649 1.1 skrll }
3650 1.1 skrll else
3651 1.1 skrll {
3652 1.1 skrll /* Local symbol case. */
3653 1.1 skrll if (local_got_offsets == NULL)
3654 1.1 skrll abort ();
3655 1.1 skrll
3656 1.1 skrll off = local_got_offsets[r_symndx];
3657 1.1 skrll
3658 1.1 skrll /* The offset must always be a multiple of 4. We use
3659 1.1 skrll the least significant bit to record whether we have
3660 1.1 skrll already generated the necessary reloc. */
3661 1.1 skrll if ((off & 1) != 0)
3662 1.1 skrll off &= ~1;
3663 1.1 skrll else
3664 1.1 skrll {
3665 1.1 skrll local_got_offsets[r_symndx] |= 1;
3666 1.14 christos do_got = true;
3667 1.1 skrll }
3668 1.1 skrll }
3669 1.1 skrll
3670 1.1 skrll if (do_got)
3671 1.1 skrll {
3672 1.11 christos if (reloc)
3673 1.1 skrll {
3674 1.1 skrll /* Output a dynamic relocation for this GOT entry.
3675 1.1 skrll In this case it is relative to the base of the
3676 1.1 skrll object because the symbol index is zero. */
3677 1.1 skrll Elf_Internal_Rela outrel;
3678 1.1 skrll bfd_byte *loc;
3679 1.11 christos asection *sec = htab->etab.srelgot;
3680 1.1 skrll
3681 1.1 skrll outrel.r_offset = (off
3682 1.11 christos + htab->etab.sgot->output_offset
3683 1.11 christos + htab->etab.sgot->output_section->vma);
3684 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3685 1.1 skrll outrel.r_addend = relocation;
3686 1.1 skrll loc = sec->contents;
3687 1.1 skrll loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3688 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3689 1.1 skrll }
3690 1.1 skrll else
3691 1.1 skrll bfd_put_32 (output_bfd, relocation,
3692 1.11 christos htab->etab.sgot->contents + off);
3693 1.1 skrll }
3694 1.1 skrll
3695 1.1 skrll if (off >= (bfd_vma) -2)
3696 1.1 skrll abort ();
3697 1.1 skrll
3698 1.1 skrll /* Add the base of the GOT to the relocation value. */
3699 1.1 skrll relocation = (off
3700 1.11 christos + htab->etab.sgot->output_offset
3701 1.11 christos + htab->etab.sgot->output_section->vma);
3702 1.1 skrll }
3703 1.1 skrll break;
3704 1.1 skrll
3705 1.1 skrll case R_PARISC_SEGREL32:
3706 1.1 skrll /* If this is the first SEGREL relocation, then initialize
3707 1.1 skrll the segment base values. */
3708 1.1 skrll if (htab->text_segment_base == (bfd_vma) -1)
3709 1.1 skrll bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3710 1.1 skrll break;
3711 1.1 skrll
3712 1.1 skrll case R_PARISC_PLABEL14R:
3713 1.1 skrll case R_PARISC_PLABEL21L:
3714 1.1 skrll case R_PARISC_PLABEL32:
3715 1.1 skrll if (htab->etab.dynamic_sections_created)
3716 1.1 skrll {
3717 1.1 skrll bfd_vma off;
3718 1.14 christos bool do_plt = 0;
3719 1.1 skrll /* If we have a global symbol with a PLT slot, then
3720 1.1 skrll redirect this relocation to it. */
3721 1.1 skrll if (hh != NULL)
3722 1.1 skrll {
3723 1.1 skrll off = hh->eh.plt.offset;
3724 1.7 christos if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1,
3725 1.7 christos bfd_link_pic (info),
3726 1.1 skrll &hh->eh))
3727 1.1 skrll {
3728 1.11 christos /* In a non-shared link, adjust_dynamic_symbol
3729 1.1 skrll isn't called for symbols forced local. We
3730 1.1 skrll need to write out the plt entry here. */
3731 1.1 skrll if ((off & 1) != 0)
3732 1.1 skrll off &= ~1;
3733 1.1 skrll else
3734 1.1 skrll {
3735 1.1 skrll hh->eh.plt.offset |= 1;
3736 1.1 skrll do_plt = 1;
3737 1.1 skrll }
3738 1.1 skrll }
3739 1.1 skrll }
3740 1.1 skrll else
3741 1.1 skrll {
3742 1.1 skrll bfd_vma *local_plt_offsets;
3743 1.1 skrll
3744 1.1 skrll if (local_got_offsets == NULL)
3745 1.1 skrll abort ();
3746 1.1 skrll
3747 1.1 skrll local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3748 1.1 skrll off = local_plt_offsets[r_symndx];
3749 1.1 skrll
3750 1.1 skrll /* As for the local .got entry case, we use the last
3751 1.1 skrll bit to record whether we've already initialised
3752 1.1 skrll this local .plt entry. */
3753 1.1 skrll if ((off & 1) != 0)
3754 1.1 skrll off &= ~1;
3755 1.1 skrll else
3756 1.1 skrll {
3757 1.1 skrll local_plt_offsets[r_symndx] |= 1;
3758 1.1 skrll do_plt = 1;
3759 1.1 skrll }
3760 1.1 skrll }
3761 1.1 skrll
3762 1.1 skrll if (do_plt)
3763 1.1 skrll {
3764 1.7 christos if (bfd_link_pic (info))
3765 1.1 skrll {
3766 1.1 skrll /* Output a dynamic IPLT relocation for this
3767 1.1 skrll PLT entry. */
3768 1.1 skrll Elf_Internal_Rela outrel;
3769 1.1 skrll bfd_byte *loc;
3770 1.11 christos asection *s = htab->etab.srelplt;
3771 1.1 skrll
3772 1.1 skrll outrel.r_offset = (off
3773 1.11 christos + htab->etab.splt->output_offset
3774 1.11 christos + htab->etab.splt->output_section->vma);
3775 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3776 1.1 skrll outrel.r_addend = relocation;
3777 1.1 skrll loc = s->contents;
3778 1.1 skrll loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3779 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3780 1.1 skrll }
3781 1.1 skrll else
3782 1.1 skrll {
3783 1.1 skrll bfd_put_32 (output_bfd,
3784 1.1 skrll relocation,
3785 1.11 christos htab->etab.splt->contents + off);
3786 1.1 skrll bfd_put_32 (output_bfd,
3787 1.11 christos elf_gp (htab->etab.splt->output_section->owner),
3788 1.11 christos htab->etab.splt->contents + off + 4);
3789 1.1 skrll }
3790 1.1 skrll }
3791 1.1 skrll
3792 1.1 skrll if (off >= (bfd_vma) -2)
3793 1.1 skrll abort ();
3794 1.1 skrll
3795 1.1 skrll /* PLABELs contain function pointers. Relocation is to
3796 1.1 skrll the entry for the function in the .plt. The magic +2
3797 1.1 skrll offset signals to $$dyncall that the function pointer
3798 1.1 skrll is in the .plt and thus has a gp pointer too.
3799 1.1 skrll Exception: Undefined PLABELs should have a value of
3800 1.1 skrll zero. */
3801 1.1 skrll if (hh == NULL
3802 1.1 skrll || (hh->eh.root.type != bfd_link_hash_undefweak
3803 1.1 skrll && hh->eh.root.type != bfd_link_hash_undefined))
3804 1.1 skrll {
3805 1.1 skrll relocation = (off
3806 1.11 christos + htab->etab.splt->output_offset
3807 1.11 christos + htab->etab.splt->output_section->vma
3808 1.1 skrll + 2);
3809 1.1 skrll }
3810 1.1 skrll plabel = 1;
3811 1.1 skrll }
3812 1.11 christos /* Fall through. */
3813 1.1 skrll
3814 1.1 skrll case R_PARISC_DIR17F:
3815 1.1 skrll case R_PARISC_DIR17R:
3816 1.1 skrll case R_PARISC_DIR14F:
3817 1.1 skrll case R_PARISC_DIR14R:
3818 1.1 skrll case R_PARISC_DIR21L:
3819 1.1 skrll case R_PARISC_DPREL14F:
3820 1.1 skrll case R_PARISC_DPREL14R:
3821 1.1 skrll case R_PARISC_DPREL21L:
3822 1.1 skrll case R_PARISC_DIR32:
3823 1.1 skrll if ((input_section->flags & SEC_ALLOC) == 0)
3824 1.1 skrll break;
3825 1.1 skrll
3826 1.11 christos if (bfd_link_pic (info)
3827 1.11 christos ? ((hh == NULL
3828 1.14 christos || hh->eh.dyn_relocs != NULL)
3829 1.11 christos && ((hh != NULL && pc_dynrelocs (hh))
3830 1.11 christos || IS_ABSOLUTE_RELOC (r_type)))
3831 1.11 christos : (hh != NULL
3832 1.14 christos && hh->eh.dyn_relocs != NULL))
3833 1.1 skrll {
3834 1.1 skrll Elf_Internal_Rela outrel;
3835 1.14 christos bool skip;
3836 1.1 skrll asection *sreloc;
3837 1.1 skrll bfd_byte *loc;
3838 1.1 skrll
3839 1.1 skrll /* When generating a shared object, these relocations
3840 1.1 skrll are copied into the output file to be resolved at run
3841 1.1 skrll time. */
3842 1.1 skrll
3843 1.1 skrll outrel.r_addend = rela->r_addend;
3844 1.1 skrll outrel.r_offset =
3845 1.1 skrll _bfd_elf_section_offset (output_bfd, info, input_section,
3846 1.1 skrll rela->r_offset);
3847 1.1 skrll skip = (outrel.r_offset == (bfd_vma) -1
3848 1.1 skrll || outrel.r_offset == (bfd_vma) -2);
3849 1.1 skrll outrel.r_offset += (input_section->output_offset
3850 1.1 skrll + input_section->output_section->vma);
3851 1.7 christos
3852 1.1 skrll if (skip)
3853 1.1 skrll {
3854 1.1 skrll memset (&outrel, 0, sizeof (outrel));
3855 1.1 skrll }
3856 1.1 skrll else if (hh != NULL
3857 1.1 skrll && hh->eh.dynindx != -1
3858 1.1 skrll && (plabel
3859 1.1 skrll || !IS_ABSOLUTE_RELOC (r_type)
3860 1.7 christos || !bfd_link_pic (info)
3861 1.7 christos || !SYMBOLIC_BIND (info, &hh->eh)
3862 1.1 skrll || !hh->eh.def_regular))
3863 1.1 skrll {
3864 1.1 skrll outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
3865 1.1 skrll }
3866 1.1 skrll else /* It's a local symbol, or one marked to become local. */
3867 1.1 skrll {
3868 1.1 skrll int indx = 0;
3869 1.1 skrll
3870 1.1 skrll /* Add the absolute offset of the symbol. */
3871 1.1 skrll outrel.r_addend += relocation;
3872 1.1 skrll
3873 1.1 skrll /* Global plabels need to be processed by the
3874 1.1 skrll dynamic linker so that functions have at most one
3875 1.1 skrll fptr. For this reason, we need to differentiate
3876 1.1 skrll between global and local plabels, which we do by
3877 1.1 skrll providing the function symbol for a global plabel
3878 1.1 skrll reloc, and no symbol for local plabels. */
3879 1.1 skrll if (! plabel
3880 1.1 skrll && sym_sec != NULL
3881 1.1 skrll && sym_sec->output_section != NULL
3882 1.1 skrll && ! bfd_is_abs_section (sym_sec))
3883 1.1 skrll {
3884 1.1 skrll asection *osec;
3885 1.1 skrll
3886 1.1 skrll osec = sym_sec->output_section;
3887 1.1 skrll indx = elf_section_data (osec)->dynindx;
3888 1.1 skrll if (indx == 0)
3889 1.1 skrll {
3890 1.1 skrll osec = htab->etab.text_index_section;
3891 1.1 skrll indx = elf_section_data (osec)->dynindx;
3892 1.1 skrll }
3893 1.1 skrll BFD_ASSERT (indx != 0);
3894 1.1 skrll
3895 1.1 skrll /* We are turning this relocation into one
3896 1.1 skrll against a section symbol, so subtract out the
3897 1.1 skrll output section's address but not the offset
3898 1.1 skrll of the input section in the output section. */
3899 1.1 skrll outrel.r_addend -= osec->vma;
3900 1.1 skrll }
3901 1.1 skrll
3902 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, r_type);
3903 1.1 skrll }
3904 1.1 skrll sreloc = elf_section_data (input_section)->sreloc;
3905 1.1 skrll if (sreloc == NULL)
3906 1.1 skrll abort ();
3907 1.1 skrll
3908 1.1 skrll loc = sreloc->contents;
3909 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3910 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3911 1.1 skrll }
3912 1.1 skrll break;
3913 1.7 christos
3914 1.1 skrll case R_PARISC_TLS_LDM21L:
3915 1.1 skrll case R_PARISC_TLS_LDM14R:
3916 1.1 skrll {
3917 1.1 skrll bfd_vma off;
3918 1.7 christos
3919 1.1 skrll off = htab->tls_ldm_got.offset;
3920 1.1 skrll if (off & 1)
3921 1.1 skrll off &= ~1;
3922 1.1 skrll else
3923 1.1 skrll {
3924 1.1 skrll Elf_Internal_Rela outrel;
3925 1.1 skrll bfd_byte *loc;
3926 1.1 skrll
3927 1.7 christos outrel.r_offset = (off
3928 1.11 christos + htab->etab.sgot->output_section->vma
3929 1.11 christos + htab->etab.sgot->output_offset);
3930 1.1 skrll outrel.r_addend = 0;
3931 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
3932 1.11 christos loc = htab->etab.srelgot->contents;
3933 1.11 christos loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
3934 1.1 skrll
3935 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3936 1.1 skrll htab->tls_ldm_got.offset |= 1;
3937 1.1 skrll }
3938 1.1 skrll
3939 1.1 skrll /* Add the base of the GOT to the relocation value. */
3940 1.1 skrll relocation = (off
3941 1.11 christos + htab->etab.sgot->output_offset
3942 1.11 christos + htab->etab.sgot->output_section->vma);
3943 1.1 skrll
3944 1.1 skrll break;
3945 1.1 skrll }
3946 1.1 skrll
3947 1.1 skrll case R_PARISC_TLS_LDO21L:
3948 1.1 skrll case R_PARISC_TLS_LDO14R:
3949 1.1 skrll relocation -= dtpoff_base (info);
3950 1.1 skrll break;
3951 1.1 skrll
3952 1.1 skrll case R_PARISC_TLS_GD21L:
3953 1.1 skrll case R_PARISC_TLS_GD14R:
3954 1.1 skrll case R_PARISC_TLS_IE21L:
3955 1.1 skrll case R_PARISC_TLS_IE14R:
3956 1.1 skrll {
3957 1.1 skrll bfd_vma off;
3958 1.1 skrll int indx;
3959 1.1 skrll char tls_type;
3960 1.1 skrll
3961 1.1 skrll indx = 0;
3962 1.1 skrll if (hh != NULL)
3963 1.1 skrll {
3964 1.11 christos if (!htab->etab.dynamic_sections_created
3965 1.11 christos || hh->eh.dynindx == -1
3966 1.11 christos || SYMBOL_REFERENCES_LOCAL (info, &hh->eh)
3967 1.11 christos || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh))
3968 1.11 christos /* This is actually a static link, or it is a
3969 1.11 christos -Bsymbolic link and the symbol is defined
3970 1.11 christos locally, or the symbol was forced to be local
3971 1.11 christos because of a version file. */
3972 1.11 christos ;
3973 1.11 christos else
3974 1.11 christos indx = hh->eh.dynindx;
3975 1.1 skrll off = hh->eh.got.offset;
3976 1.1 skrll tls_type = hh->tls_type;
3977 1.1 skrll }
3978 1.1 skrll else
3979 1.1 skrll {
3980 1.1 skrll off = local_got_offsets[r_symndx];
3981 1.1 skrll tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
3982 1.1 skrll }
3983 1.1 skrll
3984 1.1 skrll if (tls_type == GOT_UNKNOWN)
3985 1.1 skrll abort ();
3986 1.1 skrll
3987 1.1 skrll if ((off & 1) != 0)
3988 1.1 skrll off &= ~1;
3989 1.1 skrll else
3990 1.1 skrll {
3991 1.14 christos bool need_relocs = false;
3992 1.1 skrll Elf_Internal_Rela outrel;
3993 1.1 skrll bfd_byte *loc = NULL;
3994 1.1 skrll int cur_off = off;
3995 1.1 skrll
3996 1.11 christos /* The GOT entries have not been initialized yet. Do it
3997 1.11 christos now, and emit any relocations. If both an IE GOT and a
3998 1.11 christos GD GOT are necessary, we emit the GD first. */
3999 1.11 christos
4000 1.11 christos if (indx != 0
4001 1.12 christos || (bfd_link_dll (info)
4002 1.11 christos && (hh == NULL
4003 1.11 christos || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh))))
4004 1.1 skrll {
4005 1.14 christos need_relocs = true;
4006 1.11 christos loc = htab->etab.srelgot->contents;
4007 1.11 christos loc += (htab->etab.srelgot->reloc_count
4008 1.11 christos * sizeof (Elf32_External_Rela));
4009 1.1 skrll }
4010 1.1 skrll
4011 1.1 skrll if (tls_type & GOT_TLS_GD)
4012 1.1 skrll {
4013 1.1 skrll if (need_relocs)
4014 1.1 skrll {
4015 1.11 christos outrel.r_offset
4016 1.11 christos = (cur_off
4017 1.11 christos + htab->etab.sgot->output_section->vma
4018 1.11 christos + htab->etab.sgot->output_offset);
4019 1.11 christos outrel.r_info
4020 1.11 christos = ELF32_R_INFO (indx, R_PARISC_TLS_DTPMOD32);
4021 1.1 skrll outrel.r_addend = 0;
4022 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4023 1.11 christos htab->etab.srelgot->reloc_count++;
4024 1.1 skrll loc += sizeof (Elf32_External_Rela);
4025 1.12 christos bfd_put_32 (output_bfd, 0,
4026 1.12 christos htab->etab.sgot->contents + cur_off);
4027 1.12 christos }
4028 1.12 christos else
4029 1.12 christos /* If we are not emitting relocations for a
4030 1.12 christos general dynamic reference, then we must be in a
4031 1.12 christos static link or an executable link with the
4032 1.12 christos symbol binding locally. Mark it as belonging
4033 1.12 christos to module 1, the executable. */
4034 1.12 christos bfd_put_32 (output_bfd, 1,
4035 1.12 christos htab->etab.sgot->contents + cur_off);
4036 1.12 christos
4037 1.12 christos if (indx != 0)
4038 1.12 christos {
4039 1.11 christos outrel.r_info
4040 1.11 christos = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4041 1.11 christos outrel.r_offset += 4;
4042 1.11 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4043 1.11 christos htab->etab.srelgot->reloc_count++;
4044 1.11 christos loc += sizeof (Elf32_External_Rela);
4045 1.11 christos bfd_put_32 (output_bfd, 0,
4046 1.11 christos htab->etab.sgot->contents + cur_off + 4);
4047 1.1 skrll }
4048 1.1 skrll else
4049 1.12 christos bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4050 1.12 christos htab->etab.sgot->contents + cur_off + 4);
4051 1.1 skrll cur_off += 8;
4052 1.1 skrll }
4053 1.1 skrll
4054 1.1 skrll if (tls_type & GOT_TLS_IE)
4055 1.1 skrll {
4056 1.11 christos if (need_relocs
4057 1.11 christos && !(bfd_link_executable (info)
4058 1.11 christos && SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4059 1.1 skrll {
4060 1.11 christos outrel.r_offset
4061 1.11 christos = (cur_off
4062 1.11 christos + htab->etab.sgot->output_section->vma
4063 1.11 christos + htab->etab.sgot->output_offset);
4064 1.11 christos outrel.r_info = ELF32_R_INFO (indx,
4065 1.11 christos R_PARISC_TLS_TPREL32);
4066 1.1 skrll if (indx == 0)
4067 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info);
4068 1.1 skrll else
4069 1.1 skrll outrel.r_addend = 0;
4070 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4071 1.11 christos htab->etab.srelgot->reloc_count++;
4072 1.1 skrll loc += sizeof (Elf32_External_Rela);
4073 1.1 skrll }
4074 1.1 skrll else
4075 1.1 skrll bfd_put_32 (output_bfd, tpoff (info, relocation),
4076 1.11 christos htab->etab.sgot->contents + cur_off);
4077 1.1 skrll cur_off += 4;
4078 1.1 skrll }
4079 1.1 skrll
4080 1.1 skrll if (hh != NULL)
4081 1.1 skrll hh->eh.got.offset |= 1;
4082 1.1 skrll else
4083 1.1 skrll local_got_offsets[r_symndx] |= 1;
4084 1.1 skrll }
4085 1.1 skrll
4086 1.11 christos if ((tls_type & GOT_NORMAL) != 0
4087 1.11 christos && (tls_type & (GOT_TLS_GD | GOT_TLS_LDM | GOT_TLS_IE)) != 0)
4088 1.11 christos {
4089 1.11 christos if (hh != NULL)
4090 1.11 christos _bfd_error_handler (_("%s has both normal and TLS relocs"),
4091 1.11 christos hh_name (hh));
4092 1.11 christos else
4093 1.11 christos {
4094 1.11 christos Elf_Internal_Sym *isym
4095 1.14 christos = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
4096 1.11 christos input_bfd, r_symndx);
4097 1.11 christos if (isym == NULL)
4098 1.14 christos return false;
4099 1.11 christos sym_name
4100 1.11 christos = bfd_elf_string_from_elf_section (input_bfd,
4101 1.11 christos symtab_hdr->sh_link,
4102 1.11 christos isym->st_name);
4103 1.11 christos if (sym_name == NULL)
4104 1.14 christos return false;
4105 1.11 christos if (*sym_name == '\0')
4106 1.13 christos sym_name = bfd_section_name (sym_sec);
4107 1.11 christos _bfd_error_handler
4108 1.12 christos (_("%pB:%s has both normal and TLS relocs"),
4109 1.11 christos input_bfd, sym_name);
4110 1.11 christos }
4111 1.11 christos bfd_set_error (bfd_error_bad_value);
4112 1.14 christos return false;
4113 1.11 christos }
4114 1.11 christos
4115 1.1 skrll if ((tls_type & GOT_TLS_GD)
4116 1.11 christos && r_type != R_PARISC_TLS_GD21L
4117 1.11 christos && r_type != R_PARISC_TLS_GD14R)
4118 1.1 skrll off += 2 * GOT_ENTRY_SIZE;
4119 1.1 skrll
4120 1.1 skrll /* Add the base of the GOT to the relocation value. */
4121 1.1 skrll relocation = (off
4122 1.11 christos + htab->etab.sgot->output_offset
4123 1.11 christos + htab->etab.sgot->output_section->vma);
4124 1.1 skrll
4125 1.1 skrll break;
4126 1.1 skrll }
4127 1.1 skrll
4128 1.1 skrll case R_PARISC_TLS_LE21L:
4129 1.1 skrll case R_PARISC_TLS_LE14R:
4130 1.1 skrll {
4131 1.1 skrll relocation = tpoff (info, relocation);
4132 1.1 skrll break;
4133 1.1 skrll }
4134 1.1 skrll break;
4135 1.1 skrll
4136 1.1 skrll default:
4137 1.1 skrll break;
4138 1.1 skrll }
4139 1.1 skrll
4140 1.1 skrll rstatus = final_link_relocate (input_section, contents, rela, relocation,
4141 1.1 skrll htab, sym_sec, hh, info);
4142 1.1 skrll
4143 1.1 skrll if (rstatus == bfd_reloc_ok)
4144 1.1 skrll continue;
4145 1.1 skrll
4146 1.1 skrll if (hh != NULL)
4147 1.1 skrll sym_name = hh_name (hh);
4148 1.1 skrll else
4149 1.1 skrll {
4150 1.1 skrll sym_name = bfd_elf_string_from_elf_section (input_bfd,
4151 1.1 skrll symtab_hdr->sh_link,
4152 1.1 skrll sym->st_name);
4153 1.1 skrll if (sym_name == NULL)
4154 1.14 christos return false;
4155 1.1 skrll if (*sym_name == '\0')
4156 1.13 christos sym_name = bfd_section_name (sym_sec);
4157 1.1 skrll }
4158 1.1 skrll
4159 1.1 skrll howto = elf_hppa_howto_table + r_type;
4160 1.1 skrll
4161 1.1 skrll if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4162 1.1 skrll {
4163 1.1 skrll if (rstatus == bfd_reloc_notsupported || !warned_undef)
4164 1.1 skrll {
4165 1.11 christos _bfd_error_handler
4166 1.11 christos /* xgettext:c-format */
4167 1.12 christos (_("%pB(%pA+%#" PRIx64 "): cannot handle %s for %s"),
4168 1.1 skrll input_bfd,
4169 1.1 skrll input_section,
4170 1.12 christos (uint64_t) rela->r_offset,
4171 1.1 skrll howto->name,
4172 1.1 skrll sym_name);
4173 1.1 skrll bfd_set_error (bfd_error_bad_value);
4174 1.14 christos return false;
4175 1.1 skrll }
4176 1.1 skrll }
4177 1.1 skrll else
4178 1.10 christos (*info->callbacks->reloc_overflow)
4179 1.10 christos (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4180 1.10 christos (bfd_vma) 0, input_bfd, input_section, rela->r_offset);
4181 1.1 skrll }
4182 1.1 skrll
4183 1.14 christos return true;
4184 1.1 skrll }
4185 1.1 skrll
4186 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
4187 1.1 skrll dynamic sections here. */
4188 1.1 skrll
4189 1.14 christos static bool
4190 1.1 skrll elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4191 1.1 skrll struct bfd_link_info *info,
4192 1.1 skrll struct elf_link_hash_entry *eh,
4193 1.1 skrll Elf_Internal_Sym *sym)
4194 1.1 skrll {
4195 1.1 skrll struct elf32_hppa_link_hash_table *htab;
4196 1.1 skrll Elf_Internal_Rela rela;
4197 1.1 skrll bfd_byte *loc;
4198 1.1 skrll
4199 1.1 skrll htab = hppa_link_hash_table (info);
4200 1.1 skrll
4201 1.1 skrll if (eh->plt.offset != (bfd_vma) -1)
4202 1.1 skrll {
4203 1.1 skrll bfd_vma value;
4204 1.1 skrll
4205 1.1 skrll if (eh->plt.offset & 1)
4206 1.1 skrll abort ();
4207 1.1 skrll
4208 1.1 skrll /* This symbol has an entry in the procedure linkage table. Set
4209 1.1 skrll it up.
4210 1.1 skrll
4211 1.1 skrll The format of a plt entry is
4212 1.1 skrll <funcaddr>
4213 1.1 skrll <__gp>
4214 1.1 skrll */
4215 1.1 skrll value = 0;
4216 1.1 skrll if (eh->root.type == bfd_link_hash_defined
4217 1.1 skrll || eh->root.type == bfd_link_hash_defweak)
4218 1.1 skrll {
4219 1.1 skrll value = eh->root.u.def.value;
4220 1.1 skrll if (eh->root.u.def.section->output_section != NULL)
4221 1.1 skrll value += (eh->root.u.def.section->output_offset
4222 1.1 skrll + eh->root.u.def.section->output_section->vma);
4223 1.1 skrll }
4224 1.1 skrll
4225 1.1 skrll /* Create a dynamic IPLT relocation for this entry. */
4226 1.1 skrll rela.r_offset = (eh->plt.offset
4227 1.11 christos + htab->etab.splt->output_offset
4228 1.11 christos + htab->etab.splt->output_section->vma);
4229 1.1 skrll if (eh->dynindx != -1)
4230 1.1 skrll {
4231 1.1 skrll rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4232 1.1 skrll rela.r_addend = 0;
4233 1.1 skrll }
4234 1.1 skrll else
4235 1.1 skrll {
4236 1.1 skrll /* This symbol has been marked to become local, and is
4237 1.1 skrll used by a plabel so must be kept in the .plt. */
4238 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4239 1.1 skrll rela.r_addend = value;
4240 1.1 skrll }
4241 1.1 skrll
4242 1.11 christos loc = htab->etab.srelplt->contents;
4243 1.11 christos loc += htab->etab.srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4244 1.11 christos bfd_elf32_swap_reloca_out (htab->etab.splt->output_section->owner, &rela, loc);
4245 1.1 skrll
4246 1.1 skrll if (!eh->def_regular)
4247 1.1 skrll {
4248 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
4249 1.1 skrll the .plt section. Leave the value alone. */
4250 1.1 skrll sym->st_shndx = SHN_UNDEF;
4251 1.1 skrll }
4252 1.1 skrll }
4253 1.1 skrll
4254 1.1 skrll if (eh->got.offset != (bfd_vma) -1
4255 1.11 christos && (hppa_elf_hash_entry (eh)->tls_type & GOT_NORMAL) != 0
4256 1.11 christos && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
4257 1.1 skrll {
4258 1.14 christos bool is_dyn = (eh->dynindx != -1
4259 1.14 christos && !SYMBOL_REFERENCES_LOCAL (info, eh));
4260 1.1 skrll
4261 1.11 christos if (is_dyn || bfd_link_pic (info))
4262 1.1 skrll {
4263 1.11 christos /* This symbol has an entry in the global offset table. Set
4264 1.11 christos it up. */
4265 1.11 christos
4266 1.11 christos rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4267 1.11 christos + htab->etab.sgot->output_offset
4268 1.11 christos + htab->etab.sgot->output_section->vma);
4269 1.11 christos
4270 1.11 christos /* If this is a -Bsymbolic link and the symbol is defined
4271 1.11 christos locally or was forced to be local because of a version
4272 1.11 christos file, we just want to emit a RELATIVE reloc. The entry
4273 1.11 christos in the global offset table will already have been
4274 1.11 christos initialized in the relocate_section function. */
4275 1.15 christos if (!is_dyn
4276 1.15 christos && (eh->root.type == bfd_link_hash_defined
4277 1.15 christos || eh->root.type == bfd_link_hash_defweak))
4278 1.11 christos {
4279 1.11 christos rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4280 1.11 christos rela.r_addend = (eh->root.u.def.value
4281 1.11 christos + eh->root.u.def.section->output_offset
4282 1.11 christos + eh->root.u.def.section->output_section->vma);
4283 1.11 christos }
4284 1.11 christos else
4285 1.11 christos {
4286 1.11 christos if ((eh->got.offset & 1) != 0)
4287 1.11 christos abort ();
4288 1.11 christos
4289 1.11 christos bfd_put_32 (output_bfd, 0,
4290 1.11 christos htab->etab.sgot->contents + (eh->got.offset & ~1));
4291 1.11 christos rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4292 1.11 christos rela.r_addend = 0;
4293 1.11 christos }
4294 1.1 skrll
4295 1.11 christos loc = htab->etab.srelgot->contents;
4296 1.11 christos loc += (htab->etab.srelgot->reloc_count++
4297 1.11 christos * sizeof (Elf32_External_Rela));
4298 1.11 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4299 1.1 skrll }
4300 1.1 skrll }
4301 1.1 skrll
4302 1.1 skrll if (eh->needs_copy)
4303 1.1 skrll {
4304 1.1 skrll asection *sec;
4305 1.1 skrll
4306 1.1 skrll /* This symbol needs a copy reloc. Set it up. */
4307 1.1 skrll
4308 1.1 skrll if (! (eh->dynindx != -1
4309 1.1 skrll && (eh->root.type == bfd_link_hash_defined
4310 1.1 skrll || eh->root.type == bfd_link_hash_defweak)))
4311 1.1 skrll abort ();
4312 1.1 skrll
4313 1.1 skrll rela.r_offset = (eh->root.u.def.value
4314 1.1 skrll + eh->root.u.def.section->output_offset
4315 1.1 skrll + eh->root.u.def.section->output_section->vma);
4316 1.1 skrll rela.r_addend = 0;
4317 1.1 skrll rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4318 1.11 christos if (eh->root.u.def.section == htab->etab.sdynrelro)
4319 1.11 christos sec = htab->etab.sreldynrelro;
4320 1.11 christos else
4321 1.11 christos sec = htab->etab.srelbss;
4322 1.1 skrll loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4323 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4324 1.1 skrll }
4325 1.1 skrll
4326 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4327 1.7 christos if (eh == htab->etab.hdynamic || eh == htab->etab.hgot)
4328 1.1 skrll {
4329 1.1 skrll sym->st_shndx = SHN_ABS;
4330 1.1 skrll }
4331 1.1 skrll
4332 1.14 christos return true;
4333 1.1 skrll }
4334 1.1 skrll
4335 1.1 skrll /* Used to decide how to sort relocs in an optimal manner for the
4336 1.1 skrll dynamic linker, before writing them out. */
4337 1.1 skrll
4338 1.1 skrll static enum elf_reloc_type_class
4339 1.7 christos elf32_hppa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4340 1.7 christos const asection *rel_sec ATTRIBUTE_UNUSED,
4341 1.7 christos const Elf_Internal_Rela *rela)
4342 1.1 skrll {
4343 1.1 skrll /* Handle TLS relocs first; we don't want them to be marked
4344 1.3 christos relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
4345 1.1 skrll check below. */
4346 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
4347 1.1 skrll {
4348 1.1 skrll case R_PARISC_TLS_DTPMOD32:
4349 1.1 skrll case R_PARISC_TLS_DTPOFF32:
4350 1.1 skrll case R_PARISC_TLS_TPREL32:
4351 1.11 christos return reloc_class_normal;
4352 1.1 skrll }
4353 1.1 skrll
4354 1.3 christos if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)
4355 1.1 skrll return reloc_class_relative;
4356 1.1 skrll
4357 1.1 skrll switch ((int) ELF32_R_TYPE (rela->r_info))
4358 1.1 skrll {
4359 1.1 skrll case R_PARISC_IPLT:
4360 1.1 skrll return reloc_class_plt;
4361 1.1 skrll case R_PARISC_COPY:
4362 1.1 skrll return reloc_class_copy;
4363 1.1 skrll default:
4364 1.1 skrll return reloc_class_normal;
4365 1.1 skrll }
4366 1.1 skrll }
4367 1.1 skrll
4368 1.1 skrll /* Finish up the dynamic sections. */
4369 1.1 skrll
4370 1.14 christos static bool
4371 1.1 skrll elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4372 1.17 christos struct bfd_link_info *info,
4373 1.17 christos bfd_byte *buf ATTRIBUTE_UNUSED)
4374 1.1 skrll {
4375 1.1 skrll bfd *dynobj;
4376 1.1 skrll struct elf32_hppa_link_hash_table *htab;
4377 1.1 skrll asection *sdyn;
4378 1.6 christos asection * sgot;
4379 1.1 skrll
4380 1.1 skrll htab = hppa_link_hash_table (info);
4381 1.3 christos if (htab == NULL)
4382 1.14 christos return false;
4383 1.3 christos
4384 1.1 skrll dynobj = htab->etab.dynobj;
4385 1.1 skrll
4386 1.11 christos sgot = htab->etab.sgot;
4387 1.6 christos /* A broken linker script might have discarded the dynamic sections.
4388 1.6 christos Catch this here so that we do not seg-fault later on. */
4389 1.6 christos if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
4390 1.14 christos return false;
4391 1.6 christos
4392 1.6 christos sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4393 1.1 skrll
4394 1.1 skrll if (htab->etab.dynamic_sections_created)
4395 1.1 skrll {
4396 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend;
4397 1.1 skrll
4398 1.1 skrll if (sdyn == NULL)
4399 1.1 skrll abort ();
4400 1.1 skrll
4401 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents;
4402 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4403 1.1 skrll for (; dyncon < dynconend; dyncon++)
4404 1.1 skrll {
4405 1.1 skrll Elf_Internal_Dyn dyn;
4406 1.1 skrll asection *s;
4407 1.1 skrll
4408 1.1 skrll bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4409 1.1 skrll
4410 1.1 skrll switch (dyn.d_tag)
4411 1.1 skrll {
4412 1.1 skrll default:
4413 1.1 skrll continue;
4414 1.1 skrll
4415 1.1 skrll case DT_PLTGOT:
4416 1.1 skrll /* Use PLTGOT to set the GOT register. */
4417 1.1 skrll dyn.d_un.d_ptr = elf_gp (output_bfd);
4418 1.1 skrll break;
4419 1.1 skrll
4420 1.1 skrll case DT_JMPREL:
4421 1.11 christos s = htab->etab.srelplt;
4422 1.1 skrll dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4423 1.1 skrll break;
4424 1.1 skrll
4425 1.1 skrll case DT_PLTRELSZ:
4426 1.11 christos s = htab->etab.srelplt;
4427 1.1 skrll dyn.d_un.d_val = s->size;
4428 1.1 skrll break;
4429 1.1 skrll }
4430 1.1 skrll
4431 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4432 1.1 skrll }
4433 1.1 skrll }
4434 1.1 skrll
4435 1.6 christos if (sgot != NULL && sgot->size != 0)
4436 1.1 skrll {
4437 1.1 skrll /* Fill in the first entry in the global offset table.
4438 1.1 skrll We use it to point to our dynamic section, if we have one. */
4439 1.1 skrll bfd_put_32 (output_bfd,
4440 1.1 skrll sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4441 1.6 christos sgot->contents);
4442 1.1 skrll
4443 1.1 skrll /* The second entry is reserved for use by the dynamic linker. */
4444 1.6 christos memset (sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4445 1.1 skrll
4446 1.1 skrll /* Set .got entry size. */
4447 1.6 christos elf_section_data (sgot->output_section)
4448 1.1 skrll ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4449 1.1 skrll }
4450 1.1 skrll
4451 1.11 christos if (htab->etab.splt != NULL && htab->etab.splt->size != 0)
4452 1.1 skrll {
4453 1.7 christos /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the
4454 1.7 christos plt stubs and as such the section does not hold a table of fixed-size
4455 1.7 christos entries. */
4456 1.11 christos elf_section_data (htab->etab.splt->output_section)->this_hdr.sh_entsize = 0;
4457 1.1 skrll
4458 1.1 skrll if (htab->need_plt_stub)
4459 1.1 skrll {
4460 1.1 skrll /* Set up the .plt stub. */
4461 1.11 christos memcpy (htab->etab.splt->contents
4462 1.11 christos + htab->etab.splt->size - sizeof (plt_stub),
4463 1.1 skrll plt_stub, sizeof (plt_stub));
4464 1.1 skrll
4465 1.11 christos if ((htab->etab.splt->output_offset
4466 1.11 christos + htab->etab.splt->output_section->vma
4467 1.11 christos + htab->etab.splt->size)
4468 1.6 christos != (sgot->output_offset
4469 1.6 christos + sgot->output_section->vma))
4470 1.1 skrll {
4471 1.11 christos _bfd_error_handler
4472 1.1 skrll (_(".got section not immediately after .plt section"));
4473 1.14 christos return false;
4474 1.1 skrll }
4475 1.1 skrll }
4476 1.1 skrll }
4477 1.1 skrll
4478 1.14 christos return true;
4479 1.1 skrll }
4480 1.1 skrll
4481 1.1 skrll /* Called when writing out an object file to decide the type of a
4482 1.1 skrll symbol. */
4483 1.1 skrll static int
4484 1.1 skrll elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4485 1.1 skrll {
4486 1.1 skrll if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4487 1.1 skrll return STT_PARISC_MILLI;
4488 1.1 skrll else
4489 1.1 skrll return type;
4490 1.1 skrll }
4491 1.1 skrll
4492 1.1 skrll /* Misc BFD support code. */
4493 1.1 skrll #define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4494 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4495 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4496 1.1 skrll #define elf_info_to_howto elf_hppa_info_to_howto
4497 1.1 skrll #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4498 1.1 skrll
4499 1.1 skrll /* Stuff for the BFD linker. */
4500 1.1 skrll #define bfd_elf32_bfd_final_link elf32_hppa_final_link
4501 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4502 1.1 skrll #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
4503 1.1 skrll #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
4504 1.1 skrll #define elf_backend_check_relocs elf32_hppa_check_relocs
4505 1.11 christos #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
4506 1.1 skrll #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4507 1.1 skrll #define elf_backend_fake_sections elf_hppa_fake_sections
4508 1.1 skrll #define elf_backend_relocate_section elf32_hppa_relocate_section
4509 1.1 skrll #define elf_backend_hide_symbol elf32_hppa_hide_symbol
4510 1.1 skrll #define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4511 1.1 skrll #define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4512 1.16 christos #define elf_backend_late_size_sections elf32_hppa_late_size_sections
4513 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4514 1.1 skrll #define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4515 1.1 skrll #define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4516 1.1 skrll #define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
4517 1.1 skrll #define elf_backend_object_p elf32_hppa_object_p
4518 1.1 skrll #define elf_backend_final_write_processing elf_hppa_final_write_processing
4519 1.1 skrll #define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
4520 1.1 skrll #define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
4521 1.1 skrll #define elf_backend_action_discarded elf_hppa_action_discarded
4522 1.1 skrll
4523 1.1 skrll #define elf_backend_can_gc_sections 1
4524 1.1 skrll #define elf_backend_can_refcount 1
4525 1.1 skrll #define elf_backend_plt_alignment 2
4526 1.1 skrll #define elf_backend_want_got_plt 0
4527 1.1 skrll #define elf_backend_plt_readonly 0
4528 1.1 skrll #define elf_backend_want_plt_sym 0
4529 1.1 skrll #define elf_backend_got_header_size 8
4530 1.11 christos #define elf_backend_want_dynrelro 1
4531 1.1 skrll #define elf_backend_rela_normal 1
4532 1.11 christos #define elf_backend_dtrel_excludes_plt 1
4533 1.11 christos #define elf_backend_no_page_alias 1
4534 1.1 skrll
4535 1.7 christos #define TARGET_BIG_SYM hppa_elf32_vec
4536 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa"
4537 1.1 skrll #define ELF_ARCH bfd_arch_hppa
4538 1.3 christos #define ELF_TARGET_ID HPPA32_ELF_DATA
4539 1.1 skrll #define ELF_MACHINE_CODE EM_PARISC
4540 1.1 skrll #define ELF_MAXPAGESIZE 0x1000
4541 1.1 skrll #define ELF_OSABI ELFOSABI_HPUX
4542 1.17 christos #define ELF_OSABI_EXACT 1
4543 1.1 skrll #define elf32_bed elf32_hppa_hpux_bed
4544 1.1 skrll
4545 1.1 skrll #include "elf32-target.h"
4546 1.1 skrll
4547 1.1 skrll #undef TARGET_BIG_SYM
4548 1.7 christos #define TARGET_BIG_SYM hppa_elf32_linux_vec
4549 1.1 skrll #undef TARGET_BIG_NAME
4550 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa-linux"
4551 1.1 skrll #undef ELF_OSABI
4552 1.6 christos #define ELF_OSABI ELFOSABI_GNU
4553 1.1 skrll #undef elf32_bed
4554 1.1 skrll #define elf32_bed elf32_hppa_linux_bed
4555 1.1 skrll
4556 1.1 skrll #include "elf32-target.h"
4557 1.1 skrll
4558 1.1 skrll #undef TARGET_BIG_SYM
4559 1.7 christos #define TARGET_BIG_SYM hppa_elf32_nbsd_vec
4560 1.1 skrll #undef TARGET_BIG_NAME
4561 1.1 skrll #define TARGET_BIG_NAME "elf32-hppa-netbsd"
4562 1.1 skrll #undef ELF_OSABI
4563 1.1 skrll #define ELF_OSABI ELFOSABI_NETBSD
4564 1.1 skrll #undef elf32_bed
4565 1.1 skrll #define elf32_bed elf32_hppa_netbsd_bed
4566 1.1 skrll
4567 1.1 skrll #include "elf32-target.h"
4568