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