1 1.1 christos /* IA-64 support for OpenVMS 2 1.1.1.10 christos Copyright (C) 1998-2026 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of BFD, the Binary File Descriptor library. 5 1.1 christos 6 1.1 christos This program is free software; you can redistribute it and/or modify 7 1.1 christos it under the terms of the GNU General Public License as published by 8 1.1 christos the Free Software Foundation; either version 3 of the License, or 9 1.1 christos (at your option) any later version. 10 1.1 christos 11 1.1 christos This program is distributed in the hope that it will be useful, 12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 christos GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with this program; if not, write to the Free Software 18 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 1.1 christos MA 02110-1301, USA. */ 20 1.1 christos 21 1.1 christos #include "sysdep.h" 22 1.1 christos #include "bfd.h" 23 1.1 christos #include "libbfd.h" 24 1.1 christos #include "elf-bfd.h" 25 1.1 christos #include "opcode/ia64.h" 26 1.1 christos #include "elf/ia64.h" 27 1.1 christos #include "objalloc.h" 28 1.1 christos #include "hashtab.h" 29 1.1 christos #include "elfxx-ia64.h" 30 1.1 christos #include "vms.h" 31 1.1 christos #include "bfdver.h" 32 1.1 christos 33 1.1 christos /* THE RULES for all the stuff the linker creates -- 34 1.1 christos 35 1.1 christos GOT Entries created in response to LTOFF or LTOFF_FPTR 36 1.1 christos relocations. Dynamic relocs created for dynamic 37 1.1 christos symbols in an application; REL relocs for locals 38 1.1 christos in a shared library. 39 1.1 christos 40 1.1 christos FPTR The canonical function descriptor. Created for local 41 1.1 christos symbols in applications. Descriptors for dynamic symbols 42 1.1 christos and local symbols in shared libraries are created by 43 1.1 christos ld.so. Thus there are no dynamic relocs against these 44 1.1 christos objects. The FPTR relocs for such _are_ passed through 45 1.1 christos to the dynamic relocation tables. 46 1.1 christos 47 1.1 christos FULL_PLT Created for a PCREL21B relocation against a dynamic symbol. 48 1.1 christos Requires the creation of a PLTOFF entry. This does not 49 1.1 christos require any dynamic relocations. 50 1.1 christos 51 1.1 christos PLTOFF Created by PLTOFF relocations. For local symbols, this 52 1.1 christos is an alternate function descriptor, and in shared libraries 53 1.1 christos requires two REL relocations. Note that this cannot be 54 1.1 christos transformed into an FPTR relocation, since it must be in 55 1.1 christos range of the GP. For dynamic symbols, this is a function 56 1.1 christos descriptor. */ 57 1.1 christos 58 1.1 christos typedef struct bfd_hash_entry *(*new_hash_entry_func) 59 1.1 christos (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); 60 1.1 christos 61 1.1 christos /* In dynamically (linker-) created sections, we generally need to keep track 62 1.1 christos of the place a symbol or expression got allocated to. This is done via hash 63 1.1 christos tables that store entries of the following type. */ 64 1.1 christos 65 1.1 christos struct elf64_ia64_dyn_sym_info 66 1.1 christos { 67 1.1 christos /* The addend for which this entry is relevant. */ 68 1.1 christos bfd_vma addend; 69 1.1 christos 70 1.1 christos bfd_vma got_offset; 71 1.1 christos bfd_vma fptr_offset; 72 1.1 christos bfd_vma pltoff_offset; 73 1.1 christos bfd_vma plt_offset; 74 1.1 christos bfd_vma plt2_offset; 75 1.1 christos 76 1.1 christos /* The symbol table entry, if any, that this was derived from. */ 77 1.1 christos struct elf_link_hash_entry *h; 78 1.1 christos 79 1.1 christos /* Used to count non-got, non-plt relocations for delayed sizing 80 1.1 christos of relocation sections. */ 81 1.1 christos struct elf64_ia64_dyn_reloc_entry 82 1.1 christos { 83 1.1 christos struct elf64_ia64_dyn_reloc_entry *next; 84 1.1 christos asection *srel; 85 1.1 christos int type; 86 1.1 christos int count; 87 1.1 christos } *reloc_entries; 88 1.1 christos 89 1.1 christos /* TRUE when the section contents have been updated. */ 90 1.1 christos unsigned got_done : 1; 91 1.1 christos unsigned fptr_done : 1; 92 1.1 christos unsigned pltoff_done : 1; 93 1.1 christos 94 1.1 christos /* TRUE for the different kinds of linker data we want created. */ 95 1.1 christos unsigned want_got : 1; 96 1.1 christos unsigned want_gotx : 1; 97 1.1 christos unsigned want_fptr : 1; 98 1.1 christos unsigned want_ltoff_fptr : 1; 99 1.1 christos unsigned want_plt : 1; /* A MIN_PLT entry. */ 100 1.1 christos unsigned want_plt2 : 1; /* A FULL_PLT. */ 101 1.1 christos unsigned want_pltoff : 1; 102 1.1 christos }; 103 1.1 christos 104 1.1 christos struct elf64_ia64_local_hash_entry 105 1.1 christos { 106 1.1 christos int id; 107 1.1 christos unsigned int r_sym; 108 1.1 christos /* The number of elements in elf64_ia64_dyn_sym_info array. */ 109 1.1 christos unsigned int count; 110 1.1 christos /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */ 111 1.1 christos unsigned int sorted_count; 112 1.1 christos /* The size of elf64_ia64_dyn_sym_info array. */ 113 1.1 christos unsigned int size; 114 1.1 christos /* The array of elf64_ia64_dyn_sym_info. */ 115 1.1 christos struct elf64_ia64_dyn_sym_info *info; 116 1.1 christos 117 1.1 christos /* TRUE if this hash entry's addends was translated for 118 1.1 christos SHF_MERGE optimization. */ 119 1.1 christos unsigned sec_merge_done : 1; 120 1.1 christos }; 121 1.1 christos 122 1.1 christos struct elf64_ia64_link_hash_entry 123 1.1 christos { 124 1.1 christos struct elf_link_hash_entry root; 125 1.1 christos 126 1.1 christos /* Set if this symbol is defined in a shared library. 127 1.1 christos We can't use root.u.def.section->owner as the symbol is an absolute 128 1.1 christos symbol. */ 129 1.1 christos bfd *shl; 130 1.1 christos 131 1.1 christos /* The number of elements in elf64_ia64_dyn_sym_info array. */ 132 1.1 christos unsigned int count; 133 1.1 christos /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */ 134 1.1 christos unsigned int sorted_count; 135 1.1 christos /* The size of elf64_ia64_dyn_sym_info array. */ 136 1.1 christos unsigned int size; 137 1.1 christos /* The array of elf64_ia64_dyn_sym_info. */ 138 1.1 christos struct elf64_ia64_dyn_sym_info *info; 139 1.1 christos }; 140 1.1 christos 141 1.1 christos struct elf64_ia64_link_hash_table 142 1.1 christos { 143 1.1 christos /* The main hash table. */ 144 1.1 christos struct elf_link_hash_table root; 145 1.1 christos 146 1.1 christos asection *fptr_sec; /* Function descriptor table (or NULL). */ 147 1.1 christos asection *rel_fptr_sec; /* Dynamic relocation section for same. */ 148 1.1 christos asection *pltoff_sec; /* Private descriptors for plt (or NULL). */ 149 1.1 christos asection *fixups_sec; /* Fixups section. */ 150 1.1 christos asection *transfer_sec; /* Transfer vector section. */ 151 1.1 christos asection *note_sec; /* .note section. */ 152 1.1 christos 153 1.1 christos /* There are maybe R_IA64_GPREL22 relocations, including those 154 1.1 christos optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT 155 1.1 christos sections. We need to record those sections so that we can choose 156 1.1 christos a proper GP to cover all R_IA64_GPREL22 relocations. */ 157 1.1 christos asection *max_short_sec; /* Maximum short output section. */ 158 1.1 christos bfd_vma max_short_offset; /* Maximum short offset. */ 159 1.1 christos asection *min_short_sec; /* Minimum short output section. */ 160 1.1 christos bfd_vma min_short_offset; /* Minimum short offset. */ 161 1.1 christos 162 1.1 christos htab_t loc_hash_table; 163 1.1 christos void *loc_hash_memory; 164 1.1 christos }; 165 1.1 christos 166 1.1 christos struct elf64_ia64_allocate_data 167 1.1 christos { 168 1.1 christos struct bfd_link_info *info; 169 1.1 christos bfd_size_type ofs; 170 1.1 christos }; 171 1.1 christos 172 1.1 christos #define elf64_ia64_hash_table(p) \ 173 1.1.1.7 christos ((is_elf_hash_table ((p)->hash) \ 174 1.1.1.7 christos && elf_hash_table_id (elf_hash_table (p)) == IA64_ELF_DATA) \ 175 1.1.1.7 christos ? (struct elf64_ia64_link_hash_table *) (p)->hash : NULL) 176 1.1 christos 177 1.1 christos struct elf64_ia64_vms_obj_tdata 178 1.1 christos { 179 1.1 christos struct elf_obj_tdata root; 180 1.1 christos 181 1.1 christos /* Ident for shared library. */ 182 1.1.1.7 christos uint64_t ident; 183 1.1 christos 184 1.1 christos /* Used only during link: offset in the .fixups section for this bfd. */ 185 1.1 christos bfd_vma fixups_off; 186 1.1 christos 187 1.1 christos /* Max number of shared libraries. */ 188 1.1 christos unsigned int needed_count; 189 1.1 christos }; 190 1.1 christos 191 1.1 christos #define elf_ia64_vms_tdata(abfd) \ 192 1.1 christos ((struct elf64_ia64_vms_obj_tdata *)((abfd)->tdata.any)) 193 1.1 christos #define elf_ia64_vms_ident(abfd) (elf_ia64_vms_tdata(abfd)->ident) 194 1.1 christos 195 1.1 christos struct elf64_vms_transfer 196 1.1 christos { 197 1.1 christos unsigned char size[4]; 198 1.1 christos unsigned char spare[4]; 199 1.1 christos unsigned char tfradr1[8]; 200 1.1 christos unsigned char tfradr2[8]; 201 1.1 christos unsigned char tfradr3[8]; 202 1.1 christos unsigned char tfradr4[8]; 203 1.1 christos unsigned char tfradr5[8]; 204 1.1 christos 205 1.1 christos /* Local function descriptor for tfr3. */ 206 1.1 christos unsigned char tfr3_func[8]; 207 1.1 christos unsigned char tfr3_gp[8]; 208 1.1 christos }; 209 1.1 christos 210 1.1 christos typedef struct 211 1.1 christos { 212 1.1 christos Elf64_External_Ehdr ehdr; 213 1.1 christos unsigned char vms_needed_count[8]; 214 1.1 christos } Elf64_External_VMS_Ehdr; 215 1.1 christos 216 1.1 christos static struct elf64_ia64_dyn_sym_info * get_dyn_sym_info 217 1.1 christos (struct elf64_ia64_link_hash_table *, 218 1.1 christos struct elf_link_hash_entry *, 219 1.1.1.7 christos bfd *, const Elf_Internal_Rela *, bool); 220 1.1.1.7 christos static bool elf64_ia64_dynamic_symbol_p 221 1.1 christos (struct elf_link_hash_entry *); 222 1.1.1.7 christos static bool elf64_ia64_choose_gp 223 1.1.1.7 christos (bfd *, struct bfd_link_info *, bool); 224 1.1 christos static void elf64_ia64_dyn_sym_traverse 225 1.1 christos (struct elf64_ia64_link_hash_table *, 226 1.1.1.7 christos bool (*) (struct elf64_ia64_dyn_sym_info *, void *), 227 1.1 christos void *); 228 1.1.1.7 christos static bool allocate_global_data_got 229 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *); 230 1.1.1.7 christos static bool allocate_global_fptr_got 231 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *); 232 1.1.1.7 christos static bool allocate_local_got 233 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *); 234 1.1.1.7 christos static bool allocate_dynrel_entries 235 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *); 236 1.1 christos static asection *get_pltoff 237 1.1 christos (bfd *, struct elf64_ia64_link_hash_table *); 238 1.1 christos static asection *get_got 239 1.1 christos (bfd *, struct elf64_ia64_link_hash_table *); 240 1.1 christos 241 1.1 christos 242 1.1 christos /* Given a ELF reloc, return the matching HOWTO structure. */ 243 1.1 christos 244 1.1.1.7 christos static bool 245 1.1 christos elf64_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, 246 1.1 christos arelent *bfd_reloc, 247 1.1 christos Elf_Internal_Rela *elf_reloc) 248 1.1 christos { 249 1.1.1.5 christos unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info); 250 1.1.1.5 christos 251 1.1.1.5 christos bfd_reloc->howto = ia64_elf_lookup_howto (r_type); 252 1.1.1.5 christos if (bfd_reloc->howto == NULL) 253 1.1.1.5 christos { 254 1.1.1.5 christos /* xgettext:c-format */ 255 1.1.1.5 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 256 1.1.1.5 christos abfd, r_type); 257 1.1.1.5 christos bfd_set_error (bfd_error_bad_value); 258 1.1.1.7 christos return false; 259 1.1.1.5 christos } 260 1.1.1.5 christos 261 1.1.1.7 christos return true; 262 1.1 christos } 263 1.1 christos 264 1.1 christos 265 1.1 christos #define PLT_FULL_ENTRY_SIZE (2 * 16) 266 1.1 christos 267 1.1 christos static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] = 268 1.1 christos { 269 1.1.1.4 christos 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=0,r1;; */ 270 1.1.1.4 christos 0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0, /* ld8.acq r16=[r15],8*/ 271 1.1.1.4 christos 0x01, 0x08, 0x00, 0x84, /* mov r14=r1;; */ 272 1.1.1.4 christos 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 r1=[r15] */ 273 1.1.1.4 christos 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */ 274 1.1.1.4 christos 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ 275 1.1 christos }; 276 1.1 christos 277 1.1 christos static const bfd_byte oor_brl[16] = 278 1.1 christos { 279 1.1.1.4 christos 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */ 280 1.1.1.4 christos 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* brl.sptk.few tgt;;*/ 281 1.1 christos 0x00, 0x00, 0x00, 0xc0 282 1.1 christos }; 283 1.1 christos 284 1.1 christos 285 1.1 christos /* These functions do relaxation for IA-64 ELF. */ 286 1.1 christos 287 1.1 christos /* Rename some of the generic section flags to better document how they 288 1.1 christos are used here. */ 289 1.1 christos #define skip_relax_pass_0 sec_flg0 290 1.1 christos #define skip_relax_pass_1 sec_flg1 291 1.1 christos 292 1.1 christos static void 293 1.1 christos elf64_ia64_update_short_info (asection *sec, bfd_vma offset, 294 1.1 christos struct elf64_ia64_link_hash_table *ia64_info) 295 1.1 christos { 296 1.1 christos /* Skip ABS and SHF_IA_64_SHORT sections. */ 297 1.1 christos if (sec == bfd_abs_section_ptr 298 1.1 christos || (sec->flags & SEC_SMALL_DATA) != 0) 299 1.1 christos return; 300 1.1 christos 301 1.1 christos if (!ia64_info->min_short_sec) 302 1.1 christos { 303 1.1 christos ia64_info->max_short_sec = sec; 304 1.1 christos ia64_info->max_short_offset = offset; 305 1.1 christos ia64_info->min_short_sec = sec; 306 1.1 christos ia64_info->min_short_offset = offset; 307 1.1 christos } 308 1.1 christos else if (sec == ia64_info->max_short_sec 309 1.1 christos && offset > ia64_info->max_short_offset) 310 1.1 christos ia64_info->max_short_offset = offset; 311 1.1 christos else if (sec == ia64_info->min_short_sec 312 1.1 christos && offset < ia64_info->min_short_offset) 313 1.1 christos ia64_info->min_short_offset = offset; 314 1.1 christos else if (sec->output_section->vma 315 1.1 christos > ia64_info->max_short_sec->vma) 316 1.1 christos { 317 1.1 christos ia64_info->max_short_sec = sec; 318 1.1 christos ia64_info->max_short_offset = offset; 319 1.1 christos } 320 1.1 christos else if (sec->output_section->vma 321 1.1 christos < ia64_info->min_short_sec->vma) 322 1.1 christos { 323 1.1 christos ia64_info->min_short_sec = sec; 324 1.1 christos ia64_info->min_short_offset = offset; 325 1.1 christos } 326 1.1 christos } 327 1.1 christos 328 1.1 christos /* Use a two passes algorithm. In the first pass, branches are relaxed 329 1.1 christos (which may increase the size of the section). In the second pass, 330 1.1 christos the other relaxations are done. 331 1.1 christos */ 332 1.1 christos 333 1.1.1.7 christos static bool 334 1.1 christos elf64_ia64_relax_section (bfd *abfd, asection *sec, 335 1.1 christos struct bfd_link_info *link_info, 336 1.1.1.7 christos bool *again) 337 1.1 christos { 338 1.1 christos struct one_fixup 339 1.1 christos { 340 1.1 christos struct one_fixup *next; 341 1.1 christos asection *tsec; 342 1.1 christos bfd_vma toff; 343 1.1 christos bfd_vma trampoff; 344 1.1 christos }; 345 1.1 christos 346 1.1 christos Elf_Internal_Shdr *symtab_hdr; 347 1.1 christos Elf_Internal_Rela *internal_relocs; 348 1.1 christos Elf_Internal_Rela *irel, *irelend; 349 1.1 christos bfd_byte *contents; 350 1.1 christos Elf_Internal_Sym *isymbuf = NULL; 351 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 352 1.1 christos struct one_fixup *fixups = NULL; 353 1.1.1.7 christos bool changed_contents = false; 354 1.1.1.7 christos bool changed_relocs = false; 355 1.1.1.7 christos bool skip_relax_pass_0 = true; 356 1.1.1.7 christos bool skip_relax_pass_1 = true; 357 1.1 christos bfd_vma gp = 0; 358 1.1 christos 359 1.1 christos /* Assume we're not going to change any sizes, and we'll only need 360 1.1 christos one pass. */ 361 1.1.1.7 christos *again = false; 362 1.1 christos 363 1.1.1.2 christos if (bfd_link_relocatable (link_info)) 364 1.1.1.9 christos link_info->callbacks->fatal 365 1.1.1.9 christos (_("%P: --relax and -r may not be used together\n")); 366 1.1 christos 367 1.1 christos /* Don't even try to relax for non-ELF outputs. */ 368 1.1 christos if (!is_elf_hash_table (link_info->hash)) 369 1.1.1.7 christos return false; 370 1.1 christos 371 1.1 christos /* Nothing to do if there are no relocations or there is no need for 372 1.1 christos the current pass. */ 373 1.1.1.8 christos if (sec->reloc_count == 0 374 1.1.1.8 christos || (sec->flags & SEC_RELOC) == 0 375 1.1.1.8 christos || (sec->flags & SEC_HAS_CONTENTS) == 0 376 1.1 christos || (link_info->relax_pass == 0 && sec->skip_relax_pass_0) 377 1.1 christos || (link_info->relax_pass == 1 && sec->skip_relax_pass_1)) 378 1.1.1.7 christos return true; 379 1.1 christos 380 1.1 christos ia64_info = elf64_ia64_hash_table (link_info); 381 1.1 christos if (ia64_info == NULL) 382 1.1.1.7 christos return false; 383 1.1 christos 384 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 385 1.1 christos 386 1.1 christos /* Load the relocations for this section. */ 387 1.1 christos internal_relocs = (_bfd_elf_link_read_relocs 388 1.1 christos (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, 389 1.1 christos link_info->keep_memory)); 390 1.1 christos if (internal_relocs == NULL) 391 1.1.1.7 christos return false; 392 1.1 christos 393 1.1 christos irelend = internal_relocs + sec->reloc_count; 394 1.1 christos 395 1.1 christos /* Get the section contents. */ 396 1.1 christos if (elf_section_data (sec)->this_hdr.contents != NULL) 397 1.1 christos contents = elf_section_data (sec)->this_hdr.contents; 398 1.1 christos else 399 1.1 christos { 400 1.1 christos if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 401 1.1 christos goto error_return; 402 1.1 christos } 403 1.1 christos 404 1.1 christos for (irel = internal_relocs; irel < irelend; irel++) 405 1.1 christos { 406 1.1 christos unsigned long r_type = ELF64_R_TYPE (irel->r_info); 407 1.1 christos bfd_vma symaddr, reladdr, trampoff, toff, roff; 408 1.1 christos asection *tsec; 409 1.1 christos struct one_fixup *f; 410 1.1 christos bfd_size_type amt; 411 1.1.1.7 christos bool is_branch; 412 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 413 1.1 christos 414 1.1 christos switch (r_type) 415 1.1 christos { 416 1.1 christos case R_IA64_PCREL21B: 417 1.1 christos case R_IA64_PCREL21BI: 418 1.1 christos case R_IA64_PCREL21M: 419 1.1 christos case R_IA64_PCREL21F: 420 1.1 christos /* In pass 1, all br relaxations are done. We can skip it. */ 421 1.1 christos if (link_info->relax_pass == 1) 422 1.1 christos continue; 423 1.1.1.7 christos skip_relax_pass_0 = false; 424 1.1.1.7 christos is_branch = true; 425 1.1 christos break; 426 1.1 christos 427 1.1 christos case R_IA64_PCREL60B: 428 1.1 christos /* We can't optimize brl to br in pass 0 since br relaxations 429 1.1 christos will increase the code size. Defer it to pass 1. */ 430 1.1 christos if (link_info->relax_pass == 0) 431 1.1 christos { 432 1.1.1.7 christos skip_relax_pass_1 = false; 433 1.1 christos continue; 434 1.1 christos } 435 1.1.1.7 christos is_branch = true; 436 1.1 christos break; 437 1.1 christos 438 1.1 christos case R_IA64_GPREL22: 439 1.1 christos /* Update max_short_sec/min_short_sec. */ 440 1.1 christos 441 1.1 christos case R_IA64_LTOFF22X: 442 1.1 christos case R_IA64_LDXMOV: 443 1.1 christos /* We can't relax ldx/mov in pass 0 since br relaxations will 444 1.1 christos increase the code size. Defer it to pass 1. */ 445 1.1 christos if (link_info->relax_pass == 0) 446 1.1 christos { 447 1.1.1.7 christos skip_relax_pass_1 = false; 448 1.1 christos continue; 449 1.1 christos } 450 1.1.1.7 christos is_branch = false; 451 1.1 christos break; 452 1.1 christos 453 1.1 christos default: 454 1.1 christos continue; 455 1.1 christos } 456 1.1 christos 457 1.1 christos /* Get the value of the symbol referred to by the reloc. */ 458 1.1 christos if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info) 459 1.1 christos { 460 1.1 christos /* A local symbol. */ 461 1.1 christos Elf_Internal_Sym *isym; 462 1.1 christos 463 1.1 christos /* Read this BFD's local symbols. */ 464 1.1 christos if (isymbuf == NULL) 465 1.1 christos { 466 1.1 christos isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 467 1.1 christos if (isymbuf == NULL) 468 1.1 christos isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 469 1.1 christos symtab_hdr->sh_info, 0, 470 1.1 christos NULL, NULL, NULL); 471 1.1 christos if (isymbuf == 0) 472 1.1 christos goto error_return; 473 1.1 christos } 474 1.1 christos 475 1.1 christos isym = isymbuf + ELF64_R_SYM (irel->r_info); 476 1.1 christos if (isym->st_shndx == SHN_UNDEF) 477 1.1 christos continue; /* We can't do anything with undefined symbols. */ 478 1.1 christos else if (isym->st_shndx == SHN_ABS) 479 1.1 christos tsec = bfd_abs_section_ptr; 480 1.1 christos else if (isym->st_shndx == SHN_COMMON) 481 1.1 christos tsec = bfd_com_section_ptr; 482 1.1 christos else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON) 483 1.1 christos tsec = bfd_com_section_ptr; 484 1.1 christos else 485 1.1 christos tsec = bfd_section_from_elf_index (abfd, isym->st_shndx); 486 1.1 christos 487 1.1 christos toff = isym->st_value; 488 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, false); 489 1.1 christos } 490 1.1 christos else 491 1.1 christos { 492 1.1 christos unsigned long indx; 493 1.1 christos struct elf_link_hash_entry *h; 494 1.1 christos 495 1.1 christos indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info; 496 1.1 christos h = elf_sym_hashes (abfd)[indx]; 497 1.1 christos BFD_ASSERT (h != NULL); 498 1.1 christos 499 1.1 christos while (h->root.type == bfd_link_hash_indirect 500 1.1 christos || h->root.type == bfd_link_hash_warning) 501 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 502 1.1 christos 503 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, false); 504 1.1 christos 505 1.1 christos /* For branches to dynamic symbols, we're interested instead 506 1.1 christos in a branch to the PLT entry. */ 507 1.1 christos if (is_branch && dyn_i && dyn_i->want_plt2) 508 1.1 christos { 509 1.1 christos /* Internal branches shouldn't be sent to the PLT. 510 1.1 christos Leave this for now and we'll give an error later. */ 511 1.1 christos if (r_type != R_IA64_PCREL21B) 512 1.1 christos continue; 513 1.1 christos 514 1.1 christos tsec = ia64_info->root.splt; 515 1.1 christos toff = dyn_i->plt2_offset; 516 1.1 christos BFD_ASSERT (irel->r_addend == 0); 517 1.1 christos } 518 1.1 christos 519 1.1 christos /* Can't do anything else with dynamic symbols. */ 520 1.1 christos else if (elf64_ia64_dynamic_symbol_p (h)) 521 1.1 christos continue; 522 1.1 christos 523 1.1 christos else 524 1.1 christos { 525 1.1 christos /* We can't do anything with undefined symbols. */ 526 1.1 christos if (h->root.type == bfd_link_hash_undefined 527 1.1 christos || h->root.type == bfd_link_hash_undefweak) 528 1.1 christos continue; 529 1.1 christos 530 1.1 christos tsec = h->root.u.def.section; 531 1.1 christos toff = h->root.u.def.value; 532 1.1 christos } 533 1.1 christos } 534 1.1 christos 535 1.1 christos toff += irel->r_addend; 536 1.1 christos 537 1.1 christos symaddr = tsec->output_section->vma + tsec->output_offset + toff; 538 1.1 christos 539 1.1 christos roff = irel->r_offset; 540 1.1 christos 541 1.1 christos if (is_branch) 542 1.1 christos { 543 1.1 christos bfd_signed_vma offset; 544 1.1 christos 545 1.1 christos reladdr = (sec->output_section->vma 546 1.1 christos + sec->output_offset 547 1.1 christos + roff) & (bfd_vma) -4; 548 1.1 christos 549 1.1 christos /* The .plt section is aligned at 32byte and the .text section 550 1.1 christos is aligned at 64byte. The .text section is right after the 551 1.1 christos .plt section. After the first relaxation pass, linker may 552 1.1 christos increase the gap between the .plt and .text sections up 553 1.1 christos to 32byte. We assume linker will always insert 32byte 554 1.1.1.2 christos between the .plt and .text sections after the first 555 1.1 christos relaxation pass. */ 556 1.1 christos if (tsec == ia64_info->root.splt) 557 1.1 christos offset = -0x1000000 + 32; 558 1.1 christos else 559 1.1 christos offset = -0x1000000; 560 1.1 christos 561 1.1 christos /* If the branch is in range, no need to do anything. */ 562 1.1 christos if ((bfd_signed_vma) (symaddr - reladdr) >= offset 563 1.1 christos && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0) 564 1.1 christos { 565 1.1 christos /* If the 60-bit branch is in 21-bit range, optimize it. */ 566 1.1 christos if (r_type == R_IA64_PCREL60B) 567 1.1 christos { 568 1.1 christos ia64_elf_relax_brl (contents, roff); 569 1.1 christos 570 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), 571 1.1.1.4 christos R_IA64_PCREL21B); 572 1.1 christos 573 1.1 christos /* If the original relocation offset points to slot 574 1.1 christos 1, change it to slot 2. */ 575 1.1 christos if ((irel->r_offset & 3) == 1) 576 1.1 christos irel->r_offset += 1; 577 1.1 christos } 578 1.1 christos 579 1.1 christos continue; 580 1.1 christos } 581 1.1 christos else if (r_type == R_IA64_PCREL60B) 582 1.1 christos continue; 583 1.1 christos else if (ia64_elf_relax_br (contents, roff)) 584 1.1 christos { 585 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), 586 1.1.1.4 christos R_IA64_PCREL60B); 587 1.1 christos 588 1.1 christos /* Make the relocation offset point to slot 1. */ 589 1.1 christos irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1; 590 1.1 christos continue; 591 1.1 christos } 592 1.1 christos 593 1.1 christos /* We can't put a trampoline in a .init/.fini section. Issue 594 1.1 christos an error. */ 595 1.1 christos if (strcmp (sec->output_section->name, ".init") == 0 596 1.1 christos || strcmp (sec->output_section->name, ".fini") == 0) 597 1.1 christos { 598 1.1.1.4 christos _bfd_error_handler 599 1.1.1.4 christos /* xgettext:c-format */ 600 1.1.1.5 christos (_("%pB: can't relax br at %#" PRIx64 " in section `%pA';" 601 1.1.1.5 christos " please use brl or indirect branch"), 602 1.1.1.5 christos sec->owner, (uint64_t) roff, sec); 603 1.1 christos bfd_set_error (bfd_error_bad_value); 604 1.1 christos goto error_return; 605 1.1 christos } 606 1.1 christos 607 1.1 christos /* If the branch and target are in the same section, you've 608 1.1 christos got one honking big section and we can't help you unless 609 1.1 christos you are branching backwards. You'll get an error message 610 1.1 christos later. */ 611 1.1 christos if (tsec == sec && toff > roff) 612 1.1 christos continue; 613 1.1 christos 614 1.1 christos /* Look for an existing fixup to this address. */ 615 1.1 christos for (f = fixups; f ; f = f->next) 616 1.1 christos if (f->tsec == tsec && f->toff == toff) 617 1.1 christos break; 618 1.1 christos 619 1.1 christos if (f == NULL) 620 1.1 christos { 621 1.1 christos /* Two alternatives: If it's a branch to a PLT entry, we can 622 1.1 christos make a copy of the FULL_PLT entry. Otherwise, we'll have 623 1.1 christos to use a `brl' insn to get where we're going. */ 624 1.1 christos 625 1.1 christos size_t size; 626 1.1 christos 627 1.1 christos if (tsec == ia64_info->root.splt) 628 1.1 christos size = sizeof (plt_full_entry); 629 1.1 christos else 630 1.1 christos size = sizeof (oor_brl); 631 1.1 christos 632 1.1 christos /* Resize the current section to make room for the new branch. */ 633 1.1 christos trampoff = (sec->size + 15) & (bfd_vma) -16; 634 1.1 christos 635 1.1 christos /* If trampoline is out of range, there is nothing we 636 1.1 christos can do. */ 637 1.1 christos offset = trampoff - (roff & (bfd_vma) -4); 638 1.1 christos if (offset < -0x1000000 || offset > 0x0FFFFF0) 639 1.1 christos continue; 640 1.1 christos 641 1.1 christos amt = trampoff + size; 642 1.1 christos contents = (bfd_byte *) bfd_realloc (contents, amt); 643 1.1 christos if (contents == NULL) 644 1.1 christos goto error_return; 645 1.1 christos sec->size = amt; 646 1.1 christos 647 1.1 christos if (tsec == ia64_info->root.splt) 648 1.1 christos { 649 1.1 christos memcpy (contents + trampoff, plt_full_entry, size); 650 1.1 christos 651 1.1 christos /* Hijack the old relocation for use as the PLTOFF reloc. */ 652 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), 653 1.1 christos R_IA64_PLTOFF22); 654 1.1 christos irel->r_offset = trampoff; 655 1.1 christos } 656 1.1 christos else 657 1.1 christos { 658 1.1.1.4 christos memcpy (contents + trampoff, oor_brl, size); 659 1.1.1.4 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), 660 1.1.1.4 christos R_IA64_PCREL60B); 661 1.1.1.4 christos irel->r_offset = trampoff + 2; 662 1.1 christos } 663 1.1 christos 664 1.1 christos /* Record the fixup so we don't do it again this section. */ 665 1.1 christos f = (struct one_fixup *) 666 1.1 christos bfd_malloc ((bfd_size_type) sizeof (*f)); 667 1.1 christos f->next = fixups; 668 1.1 christos f->tsec = tsec; 669 1.1 christos f->toff = toff; 670 1.1 christos f->trampoff = trampoff; 671 1.1 christos fixups = f; 672 1.1 christos } 673 1.1 christos else 674 1.1 christos { 675 1.1 christos /* If trampoline is out of range, there is nothing we 676 1.1 christos can do. */ 677 1.1 christos offset = f->trampoff - (roff & (bfd_vma) -4); 678 1.1 christos if (offset < -0x1000000 || offset > 0x0FFFFF0) 679 1.1 christos continue; 680 1.1 christos 681 1.1 christos /* Nop out the reloc, since we're finalizing things here. */ 682 1.1 christos irel->r_info = ELF64_R_INFO (0, R_IA64_NONE); 683 1.1 christos } 684 1.1 christos 685 1.1 christos /* Fix up the existing branch to hit the trampoline. */ 686 1.1 christos if (ia64_elf_install_value (contents + roff, offset, r_type) 687 1.1 christos != bfd_reloc_ok) 688 1.1 christos goto error_return; 689 1.1 christos 690 1.1.1.7 christos changed_contents = true; 691 1.1.1.7 christos changed_relocs = true; 692 1.1 christos } 693 1.1 christos else 694 1.1 christos { 695 1.1 christos /* Fetch the gp. */ 696 1.1 christos if (gp == 0) 697 1.1 christos { 698 1.1 christos bfd *obfd = sec->output_section->owner; 699 1.1 christos gp = _bfd_get_gp_value (obfd); 700 1.1 christos if (gp == 0) 701 1.1 christos { 702 1.1.1.7 christos if (!elf64_ia64_choose_gp (obfd, link_info, false)) 703 1.1 christos goto error_return; 704 1.1 christos gp = _bfd_get_gp_value (obfd); 705 1.1 christos } 706 1.1 christos } 707 1.1 christos 708 1.1 christos /* If the data is out of range, do nothing. */ 709 1.1 christos if ((bfd_signed_vma) (symaddr - gp) >= 0x200000 710 1.1 christos ||(bfd_signed_vma) (symaddr - gp) < -0x200000) 711 1.1 christos continue; 712 1.1 christos 713 1.1 christos if (r_type == R_IA64_GPREL22) 714 1.1 christos elf64_ia64_update_short_info (tsec->output_section, 715 1.1 christos tsec->output_offset + toff, 716 1.1 christos ia64_info); 717 1.1 christos else if (r_type == R_IA64_LTOFF22X) 718 1.1 christos { 719 1.1.1.4 christos /* Can't deal yet correctly with ABS symbols. */ 720 1.1.1.4 christos if (bfd_is_abs_section (tsec)) 721 1.1.1.4 christos continue; 722 1.1 christos 723 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), 724 1.1 christos R_IA64_GPREL22); 725 1.1.1.7 christos changed_relocs = true; 726 1.1 christos 727 1.1 christos elf64_ia64_update_short_info (tsec->output_section, 728 1.1 christos tsec->output_offset + toff, 729 1.1 christos ia64_info); 730 1.1 christos } 731 1.1 christos else 732 1.1 christos { 733 1.1 christos ia64_elf_relax_ldxmov (contents, roff); 734 1.1 christos irel->r_info = ELF64_R_INFO (0, R_IA64_NONE); 735 1.1.1.7 christos changed_contents = true; 736 1.1.1.7 christos changed_relocs = true; 737 1.1 christos } 738 1.1 christos } 739 1.1 christos } 740 1.1 christos 741 1.1 christos /* ??? If we created fixups, this may push the code segment large 742 1.1 christos enough that the data segment moves, which will change the GP. 743 1.1 christos Reset the GP so that we re-calculate next round. We need to 744 1.1 christos do this at the _beginning_ of the next round; now will not do. */ 745 1.1 christos 746 1.1 christos /* Clean up and go home. */ 747 1.1 christos while (fixups) 748 1.1 christos { 749 1.1 christos struct one_fixup *f = fixups; 750 1.1 christos fixups = fixups->next; 751 1.1 christos free (f); 752 1.1 christos } 753 1.1 christos 754 1.1 christos if (isymbuf != NULL 755 1.1 christos && symtab_hdr->contents != (unsigned char *) isymbuf) 756 1.1 christos { 757 1.1 christos if (! link_info->keep_memory) 758 1.1 christos free (isymbuf); 759 1.1 christos else 760 1.1 christos { 761 1.1 christos /* Cache the symbols for elf_link_input_bfd. */ 762 1.1 christos symtab_hdr->contents = (unsigned char *) isymbuf; 763 1.1 christos } 764 1.1 christos } 765 1.1 christos 766 1.1 christos if (contents != NULL 767 1.1 christos && elf_section_data (sec)->this_hdr.contents != contents) 768 1.1 christos { 769 1.1 christos if (!changed_contents && !link_info->keep_memory) 770 1.1 christos free (contents); 771 1.1 christos else 772 1.1 christos { 773 1.1 christos /* Cache the section contents for elf_link_input_bfd. */ 774 1.1 christos elf_section_data (sec)->this_hdr.contents = contents; 775 1.1 christos } 776 1.1 christos } 777 1.1 christos 778 1.1 christos if (elf_section_data (sec)->relocs != internal_relocs) 779 1.1 christos { 780 1.1 christos if (!changed_relocs) 781 1.1 christos free (internal_relocs); 782 1.1 christos else 783 1.1 christos elf_section_data (sec)->relocs = internal_relocs; 784 1.1 christos } 785 1.1 christos 786 1.1 christos if (link_info->relax_pass == 0) 787 1.1 christos { 788 1.1 christos /* Pass 0 is only needed to relax br. */ 789 1.1 christos sec->skip_relax_pass_0 = skip_relax_pass_0; 790 1.1 christos sec->skip_relax_pass_1 = skip_relax_pass_1; 791 1.1 christos } 792 1.1 christos 793 1.1 christos *again = changed_contents || changed_relocs; 794 1.1.1.7 christos return true; 795 1.1 christos 796 1.1 christos error_return: 797 1.1.1.7 christos if ((unsigned char *) isymbuf != symtab_hdr->contents) 798 1.1 christos free (isymbuf); 799 1.1.1.7 christos if (elf_section_data (sec)->this_hdr.contents != contents) 800 1.1 christos free (contents); 801 1.1.1.7 christos if (elf_section_data (sec)->relocs != internal_relocs) 802 1.1 christos free (internal_relocs); 803 1.1.1.7 christos return false; 804 1.1 christos } 805 1.1 christos #undef skip_relax_pass_0 806 1.1 christos #undef skip_relax_pass_1 807 1.1 christos 808 1.1 christos /* Return TRUE if NAME is an unwind table section name. */ 809 1.1 christos 810 1.1.1.7 christos static inline bool 811 1.1 christos is_unwind_section_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name) 812 1.1 christos { 813 1.1.1.7 christos return ((startswith (name, ELF_STRING_ia64_unwind) 814 1.1.1.7 christos && ! startswith (name, ELF_STRING_ia64_unwind_info)) 815 1.1.1.7 christos || startswith (name, ELF_STRING_ia64_unwind_once)); 816 1.1 christos } 817 1.1 christos 818 1.1 christos 819 1.1 christos /* Convert IA-64 specific section flags to bfd internal section flags. */ 820 1.1 christos 821 1.1 christos /* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV 822 1.1 christos flag. */ 823 1.1 christos 824 1.1.1.7 christos static bool 825 1.1.1.7 christos elf64_ia64_section_flags (const Elf_Internal_Shdr *hdr) 826 1.1 christos { 827 1.1 christos if (hdr->sh_flags & SHF_IA_64_SHORT) 828 1.1.1.7 christos hdr->bfd_section->flags |= SEC_SMALL_DATA; 829 1.1 christos 830 1.1.1.7 christos return true; 831 1.1 christos } 832 1.1 christos 833 1.1 christos /* Set the correct type for an IA-64 ELF section. We do this by the 834 1.1 christos section name, which is a hack, but ought to work. */ 835 1.1 christos 836 1.1.1.7 christos static bool 837 1.1 christos elf64_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, 838 1.1 christos asection *sec) 839 1.1 christos { 840 1.1 christos const char *name; 841 1.1 christos 842 1.1.1.6 christos name = bfd_section_name (sec); 843 1.1 christos 844 1.1 christos if (is_unwind_section_name (abfd, name)) 845 1.1 christos { 846 1.1 christos /* We don't have the sections numbered at this point, so sh_info 847 1.1 christos is set later, in elf64_ia64_final_write_processing. */ 848 1.1 christos hdr->sh_type = SHT_IA_64_UNWIND; 849 1.1 christos hdr->sh_flags |= SHF_LINK_ORDER; 850 1.1 christos } 851 1.1 christos else if (strcmp (name, ELF_STRING_ia64_archext) == 0) 852 1.1 christos hdr->sh_type = SHT_IA_64_EXT; 853 1.1 christos 854 1.1 christos if (sec->flags & SEC_SMALL_DATA) 855 1.1 christos hdr->sh_flags |= SHF_IA_64_SHORT; 856 1.1 christos 857 1.1.1.7 christos return true; 858 1.1 christos } 859 1.1 christos 860 1.1 christos /* Hook called by the linker routine which adds symbols from an object 861 1.1 christos file. We use it to put .comm items in .sbss, and not .bss. */ 862 1.1 christos 863 1.1.1.7 christos static bool 864 1.1 christos elf64_ia64_add_symbol_hook (bfd *abfd, 865 1.1 christos struct bfd_link_info *info, 866 1.1 christos Elf_Internal_Sym *sym, 867 1.1 christos const char **namep ATTRIBUTE_UNUSED, 868 1.1 christos flagword *flagsp ATTRIBUTE_UNUSED, 869 1.1 christos asection **secp, 870 1.1 christos bfd_vma *valp) 871 1.1 christos { 872 1.1 christos if (sym->st_shndx == SHN_COMMON 873 1.1.1.2 christos && !bfd_link_relocatable (info) 874 1.1 christos && sym->st_size <= elf_gp_size (abfd)) 875 1.1 christos { 876 1.1 christos /* Common symbols less than or equal to -G nn bytes are 877 1.1 christos automatically put into .sbss. */ 878 1.1 christos 879 1.1 christos asection *scomm = bfd_get_section_by_name (abfd, ".scommon"); 880 1.1 christos 881 1.1 christos if (scomm == NULL) 882 1.1 christos { 883 1.1 christos scomm = bfd_make_section_with_flags (abfd, ".scommon", 884 1.1 christos (SEC_ALLOC 885 1.1 christos | SEC_IS_COMMON 886 1.1.1.7 christos | SEC_SMALL_DATA 887 1.1 christos | SEC_LINKER_CREATED)); 888 1.1 christos if (scomm == NULL) 889 1.1.1.7 christos return false; 890 1.1 christos } 891 1.1 christos 892 1.1 christos *secp = scomm; 893 1.1 christos *valp = sym->st_size; 894 1.1 christos } 895 1.1 christos 896 1.1.1.7 christos return true; 897 1.1 christos } 898 1.1 christos 899 1.1 christos /* According to the Tahoe assembler spec, all labels starting with a 900 1.1 christos '.' are local. */ 901 1.1 christos 902 1.1.1.7 christos static bool 903 1.1 christos elf64_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, 904 1.1 christos const char *name) 905 1.1 christos { 906 1.1 christos return name[0] == '.'; 907 1.1 christos } 908 1.1 christos 909 1.1 christos /* Should we do dynamic things to this symbol? */ 910 1.1 christos 911 1.1.1.7 christos static bool 912 1.1 christos elf64_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h) 913 1.1 christos { 914 1.1 christos return h != NULL && h->def_dynamic; 915 1.1 christos } 916 1.1 christos 917 1.1 christos static struct bfd_hash_entry* 918 1.1 christos elf64_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry, 919 1.1 christos struct bfd_hash_table *table, 920 1.1 christos const char *string) 921 1.1 christos { 922 1.1 christos struct elf64_ia64_link_hash_entry *ret; 923 1.1 christos ret = (struct elf64_ia64_link_hash_entry *) entry; 924 1.1 christos 925 1.1 christos /* Allocate the structure if it has not already been allocated by a 926 1.1 christos subclass. */ 927 1.1 christos if (!ret) 928 1.1 christos ret = bfd_hash_allocate (table, sizeof (*ret)); 929 1.1 christos 930 1.1 christos if (!ret) 931 1.1 christos return 0; 932 1.1 christos 933 1.1 christos /* Call the allocation method of the superclass. */ 934 1.1 christos ret = ((struct elf64_ia64_link_hash_entry *) 935 1.1 christos _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, 936 1.1 christos table, string)); 937 1.1 christos 938 1.1 christos ret->info = NULL; 939 1.1 christos ret->count = 0; 940 1.1 christos ret->sorted_count = 0; 941 1.1 christos ret->size = 0; 942 1.1 christos return (struct bfd_hash_entry *) ret; 943 1.1 christos } 944 1.1 christos 945 1.1 christos static void 946 1.1 christos elf64_ia64_hash_hide_symbol (struct bfd_link_info *info, 947 1.1 christos struct elf_link_hash_entry *xh, 948 1.1.1.7 christos bool force_local) 949 1.1 christos { 950 1.1 christos struct elf64_ia64_link_hash_entry *h; 951 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 952 1.1 christos unsigned int count; 953 1.1 christos 954 1.1 christos h = (struct elf64_ia64_link_hash_entry *)xh; 955 1.1 christos 956 1.1 christos _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local); 957 1.1 christos 958 1.1 christos for (count = h->count, dyn_i = h->info; 959 1.1 christos count != 0; 960 1.1 christos count--, dyn_i++) 961 1.1 christos { 962 1.1 christos dyn_i->want_plt2 = 0; 963 1.1 christos dyn_i->want_plt = 0; 964 1.1 christos } 965 1.1 christos } 966 1.1 christos 967 1.1 christos /* Compute a hash of a local hash entry. */ 968 1.1 christos 969 1.1 christos static hashval_t 970 1.1 christos elf64_ia64_local_htab_hash (const void *ptr) 971 1.1 christos { 972 1.1 christos struct elf64_ia64_local_hash_entry *entry 973 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr; 974 1.1 christos 975 1.1 christos return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym); 976 1.1 christos } 977 1.1 christos 978 1.1 christos /* Compare local hash entries. */ 979 1.1 christos 980 1.1 christos static int 981 1.1 christos elf64_ia64_local_htab_eq (const void *ptr1, const void *ptr2) 982 1.1 christos { 983 1.1 christos struct elf64_ia64_local_hash_entry *entry1 984 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr1; 985 1.1 christos struct elf64_ia64_local_hash_entry *entry2 986 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr2; 987 1.1 christos 988 1.1 christos return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym; 989 1.1 christos } 990 1.1 christos 991 1.1 christos /* Free the global elf64_ia64_dyn_sym_info array. */ 992 1.1 christos 993 1.1.1.7 christos static bool 994 1.1.1.7 christos elf64_ia64_global_dyn_info_free (struct elf_link_hash_entry *xentry, 995 1.1 christos void * unused ATTRIBUTE_UNUSED) 996 1.1 christos { 997 1.1 christos struct elf64_ia64_link_hash_entry *entry 998 1.1 christos = (struct elf64_ia64_link_hash_entry *) xentry; 999 1.1 christos 1000 1.1 christos if (entry->root.root.type == bfd_link_hash_warning) 1001 1.1 christos entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link; 1002 1.1 christos 1003 1.1.1.7 christos free (entry->info); 1004 1.1.1.7 christos entry->info = NULL; 1005 1.1.1.7 christos entry->count = 0; 1006 1.1.1.7 christos entry->sorted_count = 0; 1007 1.1.1.7 christos entry->size = 0; 1008 1.1 christos 1009 1.1.1.7 christos return true; 1010 1.1 christos } 1011 1.1 christos 1012 1.1 christos /* Free the local elf64_ia64_dyn_sym_info array. */ 1013 1.1 christos 1014 1.1.1.7 christos static int 1015 1.1 christos elf64_ia64_local_dyn_info_free (void **slot, 1016 1.1 christos void * unused ATTRIBUTE_UNUSED) 1017 1.1 christos { 1018 1.1 christos struct elf64_ia64_local_hash_entry *entry 1019 1.1 christos = (struct elf64_ia64_local_hash_entry *) *slot; 1020 1.1 christos 1021 1.1.1.7 christos free (entry->info); 1022 1.1.1.7 christos entry->info = NULL; 1023 1.1.1.7 christos entry->count = 0; 1024 1.1.1.7 christos entry->sorted_count = 0; 1025 1.1.1.7 christos entry->size = 0; 1026 1.1 christos 1027 1.1.1.7 christos return true; 1028 1.1 christos } 1029 1.1 christos 1030 1.1 christos /* Destroy IA-64 linker hash table. */ 1031 1.1 christos 1032 1.1 christos static void 1033 1.1.1.2 christos elf64_ia64_link_hash_table_free (bfd *obfd) 1034 1.1 christos { 1035 1.1 christos struct elf64_ia64_link_hash_table *ia64_info 1036 1.1.1.2 christos = (struct elf64_ia64_link_hash_table *) obfd->link.hash; 1037 1.1 christos if (ia64_info->loc_hash_table) 1038 1.1 christos { 1039 1.1 christos htab_traverse (ia64_info->loc_hash_table, 1040 1.1 christos elf64_ia64_local_dyn_info_free, NULL); 1041 1.1 christos htab_delete (ia64_info->loc_hash_table); 1042 1.1 christos } 1043 1.1 christos if (ia64_info->loc_hash_memory) 1044 1.1 christos objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory); 1045 1.1 christos elf_link_hash_traverse (&ia64_info->root, 1046 1.1 christos elf64_ia64_global_dyn_info_free, NULL); 1047 1.1.1.2 christos _bfd_elf_link_hash_table_free (obfd); 1048 1.1.1.2 christos } 1049 1.1.1.2 christos 1050 1.1.1.2 christos /* Create the derived linker hash table. The IA-64 ELF port uses this 1051 1.1.1.2 christos derived hash table to keep information specific to the IA-64 ElF 1052 1.1.1.2 christos linker (without using static variables). */ 1053 1.1.1.2 christos 1054 1.1.1.2 christos static struct bfd_link_hash_table * 1055 1.1.1.2 christos elf64_ia64_hash_table_create (bfd *abfd) 1056 1.1.1.2 christos { 1057 1.1.1.2 christos struct elf64_ia64_link_hash_table *ret; 1058 1.1.1.2 christos 1059 1.1.1.2 christos ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret)); 1060 1.1.1.2 christos if (!ret) 1061 1.1.1.2 christos return NULL; 1062 1.1.1.2 christos 1063 1.1.1.2 christos if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 1064 1.1.1.2 christos elf64_ia64_new_elf_hash_entry, 1065 1.1.1.9 christos sizeof (struct elf64_ia64_link_hash_entry))) 1066 1.1.1.2 christos { 1067 1.1.1.2 christos free (ret); 1068 1.1.1.2 christos return NULL; 1069 1.1.1.2 christos } 1070 1.1.1.2 christos 1071 1.1.1.2 christos ret->loc_hash_table = htab_try_create (1024, elf64_ia64_local_htab_hash, 1072 1.1.1.2 christos elf64_ia64_local_htab_eq, NULL); 1073 1.1.1.2 christos ret->loc_hash_memory = objalloc_create (); 1074 1.1.1.2 christos if (!ret->loc_hash_table || !ret->loc_hash_memory) 1075 1.1.1.2 christos { 1076 1.1.1.2 christos elf64_ia64_link_hash_table_free (abfd); 1077 1.1.1.2 christos return NULL; 1078 1.1.1.2 christos } 1079 1.1.1.2 christos ret->root.root.hash_table_free = elf64_ia64_link_hash_table_free; 1080 1.1.1.2 christos 1081 1.1.1.2 christos return &ret->root.root; 1082 1.1 christos } 1083 1.1 christos 1084 1.1 christos /* Traverse both local and global hash tables. */ 1085 1.1 christos 1086 1.1 christos struct elf64_ia64_dyn_sym_traverse_data 1087 1.1 christos { 1088 1.1.1.7 christos bool (*func) (struct elf64_ia64_dyn_sym_info *, void *); 1089 1.1 christos void * data; 1090 1.1 christos }; 1091 1.1 christos 1092 1.1.1.7 christos static bool 1093 1.1.1.7 christos elf64_ia64_global_dyn_sym_thunk (struct elf_link_hash_entry *xentry, 1094 1.1 christos void * xdata) 1095 1.1 christos { 1096 1.1 christos struct elf64_ia64_link_hash_entry *entry 1097 1.1 christos = (struct elf64_ia64_link_hash_entry *) xentry; 1098 1.1 christos struct elf64_ia64_dyn_sym_traverse_data *data 1099 1.1 christos = (struct elf64_ia64_dyn_sym_traverse_data *) xdata; 1100 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 1101 1.1 christos unsigned int count; 1102 1.1 christos 1103 1.1 christos if (entry->root.root.type == bfd_link_hash_warning) 1104 1.1 christos entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link; 1105 1.1 christos 1106 1.1 christos for (count = entry->count, dyn_i = entry->info; 1107 1.1 christos count != 0; 1108 1.1 christos count--, dyn_i++) 1109 1.1 christos if (! (*data->func) (dyn_i, data->data)) 1110 1.1.1.7 christos return false; 1111 1.1.1.7 christos return true; 1112 1.1 christos } 1113 1.1 christos 1114 1.1.1.7 christos static int 1115 1.1 christos elf64_ia64_local_dyn_sym_thunk (void **slot, void * xdata) 1116 1.1 christos { 1117 1.1 christos struct elf64_ia64_local_hash_entry *entry 1118 1.1 christos = (struct elf64_ia64_local_hash_entry *) *slot; 1119 1.1 christos struct elf64_ia64_dyn_sym_traverse_data *data 1120 1.1 christos = (struct elf64_ia64_dyn_sym_traverse_data *) xdata; 1121 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 1122 1.1 christos unsigned int count; 1123 1.1 christos 1124 1.1 christos for (count = entry->count, dyn_i = entry->info; 1125 1.1 christos count != 0; 1126 1.1 christos count--, dyn_i++) 1127 1.1 christos if (! (*data->func) (dyn_i, data->data)) 1128 1.1.1.7 christos return false; 1129 1.1.1.7 christos return true; 1130 1.1 christos } 1131 1.1 christos 1132 1.1 christos static void 1133 1.1 christos elf64_ia64_dyn_sym_traverse (struct elf64_ia64_link_hash_table *ia64_info, 1134 1.1.1.7 christos bool (*func) (struct elf64_ia64_dyn_sym_info *, void *), 1135 1.1 christos void * data) 1136 1.1 christos { 1137 1.1 christos struct elf64_ia64_dyn_sym_traverse_data xdata; 1138 1.1 christos 1139 1.1 christos xdata.func = func; 1140 1.1 christos xdata.data = data; 1141 1.1 christos 1142 1.1 christos elf_link_hash_traverse (&ia64_info->root, 1143 1.1 christos elf64_ia64_global_dyn_sym_thunk, &xdata); 1144 1.1 christos htab_traverse (ia64_info->loc_hash_table, 1145 1.1 christos elf64_ia64_local_dyn_sym_thunk, &xdata); 1146 1.1 christos } 1147 1.1 christos 1148 1.1 christos #define NOTE_NAME "IPF/VMS" 1149 1.1 christos 1150 1.1.1.7 christos static bool 1151 1.1 christos create_ia64_vms_notes (bfd *abfd, struct bfd_link_info *info, 1152 1.1.1.4 christos unsigned int time_hi, unsigned int time_lo) 1153 1.1 christos { 1154 1.1 christos #define NBR_NOTES 7 1155 1.1 christos Elf_Internal_Note notes[NBR_NOTES]; 1156 1.1 christos char *module_name; 1157 1.1 christos int module_name_len; 1158 1.1 christos unsigned char cur_time[8]; 1159 1.1 christos Elf64_External_VMS_ORIG_DYN_Note *orig_dyn; 1160 1.1 christos unsigned int orig_dyn_size; 1161 1.1 christos unsigned int note_size; 1162 1.1 christos int i; 1163 1.1 christos unsigned char *noteptr; 1164 1.1 christos unsigned char *note_contents; 1165 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 1166 1.1 christos 1167 1.1 christos ia64_info = elf64_ia64_hash_table (info); 1168 1.1 christos 1169 1.1.1.7 christos module_name = vms_get_module_name (bfd_get_filename (abfd), true); 1170 1.1 christos module_name_len = strlen (module_name) + 1; 1171 1.1 christos 1172 1.1 christos bfd_putl32 (time_lo, cur_time + 0); 1173 1.1 christos bfd_putl32 (time_hi, cur_time + 4); 1174 1.1 christos 1175 1.1 christos /* Note 0: IMGNAM. */ 1176 1.1 christos notes[0].type = NT_VMS_IMGNAM; 1177 1.1 christos notes[0].descdata = module_name; 1178 1.1 christos notes[0].descsz = module_name_len; 1179 1.1 christos 1180 1.1 christos /* Note 1: GSTNAM. */ 1181 1.1 christos notes[1].type = NT_VMS_GSTNAM; 1182 1.1 christos notes[1].descdata = module_name; 1183 1.1 christos notes[1].descsz = module_name_len; 1184 1.1 christos 1185 1.1 christos /* Note 2: IMGID. */ 1186 1.1 christos #define IMG_ID "V1.0" 1187 1.1 christos notes[2].type = NT_VMS_IMGID; 1188 1.1 christos notes[2].descdata = IMG_ID; 1189 1.1 christos notes[2].descsz = sizeof (IMG_ID); 1190 1.1 christos 1191 1.1 christos /* Note 3: Linktime. */ 1192 1.1 christos notes[3].type = NT_VMS_LINKTIME; 1193 1.1 christos notes[3].descdata = (char *)cur_time; 1194 1.1 christos notes[3].descsz = sizeof (cur_time); 1195 1.1 christos 1196 1.1 christos /* Note 4: Linker id. */ 1197 1.1 christos notes[4].type = NT_VMS_LINKID; 1198 1.1 christos notes[4].descdata = "GNU ld " BFD_VERSION_STRING; 1199 1.1 christos notes[4].descsz = strlen (notes[4].descdata) + 1; 1200 1.1 christos 1201 1.1 christos /* Note 5: Original dyn. */ 1202 1.1 christos orig_dyn_size = (sizeof (*orig_dyn) + sizeof (IMG_ID) - 1 + 7) & ~7; 1203 1.1 christos orig_dyn = bfd_zalloc (abfd, orig_dyn_size); 1204 1.1 christos if (orig_dyn == NULL) 1205 1.1.1.7 christos return false; 1206 1.1 christos bfd_putl32 (1, orig_dyn->major_id); 1207 1.1 christos bfd_putl32 (3, orig_dyn->minor_id); 1208 1.1 christos memcpy (orig_dyn->manipulation_date, cur_time, sizeof (cur_time)); 1209 1.1 christos bfd_putl64 (VMS_LF_IMGSTA | VMS_LF_MAIN, orig_dyn->link_flags); 1210 1.1 christos bfd_putl32 (EF_IA_64_ABI64, orig_dyn->elf_flags); 1211 1.1 christos memcpy (orig_dyn->imgid, IMG_ID, sizeof (IMG_ID)); 1212 1.1 christos notes[5].type = NT_VMS_ORIG_DYN; 1213 1.1 christos notes[5].descdata = (char *)orig_dyn; 1214 1.1 christos notes[5].descsz = orig_dyn_size; 1215 1.1 christos 1216 1.1 christos /* Note 3: Patchtime. */ 1217 1.1 christos notes[6].type = NT_VMS_PATCHTIME; 1218 1.1 christos notes[6].descdata = (char *)cur_time; 1219 1.1 christos notes[6].descsz = sizeof (cur_time); 1220 1.1 christos 1221 1.1 christos /* Compute notes size. */ 1222 1.1 christos note_size = 0; 1223 1.1 christos for (i = 0; i < NBR_NOTES; i++) 1224 1.1 christos note_size += sizeof (Elf64_External_VMS_Note) - 1 1225 1.1 christos + ((sizeof (NOTE_NAME) - 1 + 7) & ~7) 1226 1.1 christos + ((notes[i].descsz + 7) & ~7); 1227 1.1 christos 1228 1.1 christos /* Malloc a temporary buffer large enough for most notes */ 1229 1.1 christos note_contents = (unsigned char *) bfd_zalloc (abfd, note_size); 1230 1.1 christos if (note_contents == NULL) 1231 1.1.1.7 christos return false; 1232 1.1 christos noteptr = note_contents; 1233 1.1 christos 1234 1.1 christos /* Fill notes. */ 1235 1.1 christos for (i = 0; i < NBR_NOTES; i++) 1236 1.1 christos { 1237 1.1 christos Elf64_External_VMS_Note *enote = (Elf64_External_VMS_Note *) noteptr; 1238 1.1 christos 1239 1.1 christos bfd_putl64 (sizeof (NOTE_NAME) - 1, enote->namesz); 1240 1.1 christos bfd_putl64 (notes[i].descsz, enote->descsz); 1241 1.1 christos bfd_putl64 (notes[i].type, enote->type); 1242 1.1 christos 1243 1.1 christos noteptr = (unsigned char *)enote->name; 1244 1.1 christos memcpy (noteptr, NOTE_NAME, sizeof (NOTE_NAME) - 1); 1245 1.1 christos noteptr += (sizeof (NOTE_NAME) - 1 + 7) & ~7; 1246 1.1 christos memcpy (noteptr, notes[i].descdata, notes[i].descsz); 1247 1.1 christos noteptr += (notes[i].descsz + 7) & ~7; 1248 1.1 christos } 1249 1.1 christos 1250 1.1 christos ia64_info->note_sec->contents = note_contents; 1251 1.1.1.9 christos ia64_info->note_sec->alloced = 1; 1252 1.1 christos ia64_info->note_sec->size = note_size; 1253 1.1 christos 1254 1.1 christos free (module_name); 1255 1.1 christos 1256 1.1.1.7 christos return true; 1257 1.1 christos } 1258 1.1 christos 1259 1.1.1.7 christos static bool 1260 1.1 christos elf64_ia64_create_dynamic_sections (bfd *abfd, 1261 1.1 christos struct bfd_link_info *info) 1262 1.1 christos { 1263 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 1264 1.1 christos asection *s; 1265 1.1 christos flagword flags; 1266 1.1.1.10 christos elf_backend_data *bed; 1267 1.1 christos 1268 1.1 christos ia64_info = elf64_ia64_hash_table (info); 1269 1.1 christos if (ia64_info == NULL) 1270 1.1.1.7 christos return false; 1271 1.1 christos 1272 1.1 christos if (elf_hash_table (info)->dynamic_sections_created) 1273 1.1.1.7 christos return true; 1274 1.1 christos 1275 1.1 christos abfd = elf_hash_table (info)->dynobj; 1276 1.1 christos bed = get_elf_backend_data (abfd); 1277 1.1 christos 1278 1.1 christos flags = bed->dynamic_sec_flags; 1279 1.1 christos 1280 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".dynamic", 1281 1.1 christos flags | SEC_READONLY); 1282 1.1 christos if (s == NULL 1283 1.1.1.6 christos || !bfd_set_section_alignment (s, bed->s->log_file_align)) 1284 1.1.1.7 christos return false; 1285 1.1 christos 1286 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_READONLY); 1287 1.1 christos if (s == NULL 1288 1.1.1.6 christos || !bfd_set_section_alignment (s, bed->plt_alignment)) 1289 1.1.1.7 christos return false; 1290 1.1 christos ia64_info->root.splt = s; 1291 1.1 christos 1292 1.1 christos if (!get_got (abfd, ia64_info)) 1293 1.1.1.7 christos return false; 1294 1.1 christos 1295 1.1 christos if (!get_pltoff (abfd, ia64_info)) 1296 1.1.1.7 christos return false; 1297 1.1 christos 1298 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".vmsdynstr", 1299 1.1 christos (SEC_ALLOC 1300 1.1 christos | SEC_HAS_CONTENTS 1301 1.1 christos | SEC_IN_MEMORY 1302 1.1 christos | SEC_LINKER_CREATED)); 1303 1.1 christos if (s == NULL 1304 1.1.1.6 christos || !bfd_set_section_alignment (s, 0)) 1305 1.1.1.7 christos return false; 1306 1.1 christos 1307 1.1 christos /* Create a fixup section. */ 1308 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".fixups", 1309 1.1 christos (SEC_ALLOC 1310 1.1 christos | SEC_HAS_CONTENTS 1311 1.1 christos | SEC_IN_MEMORY 1312 1.1 christos | SEC_LINKER_CREATED)); 1313 1.1 christos if (s == NULL 1314 1.1.1.6 christos || !bfd_set_section_alignment (s, 3)) 1315 1.1.1.7 christos return false; 1316 1.1 christos ia64_info->fixups_sec = s; 1317 1.1 christos 1318 1.1 christos /* Create the transfer fixup section. */ 1319 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".transfer", 1320 1.1 christos (SEC_ALLOC 1321 1.1 christos | SEC_HAS_CONTENTS 1322 1.1 christos | SEC_IN_MEMORY 1323 1.1 christos | SEC_LINKER_CREATED)); 1324 1.1 christos if (s == NULL 1325 1.1.1.6 christos || !bfd_set_section_alignment (s, 3)) 1326 1.1.1.7 christos return false; 1327 1.1 christos s->size = sizeof (struct elf64_vms_transfer); 1328 1.1 christos ia64_info->transfer_sec = s; 1329 1.1 christos 1330 1.1 christos /* Create note section. */ 1331 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".vms.note", 1332 1.1.1.4 christos (SEC_LINKER_CREATED 1333 1.1.1.4 christos | SEC_HAS_CONTENTS 1334 1.1.1.4 christos | SEC_IN_MEMORY 1335 1.1.1.4 christos | SEC_READONLY)); 1336 1.1 christos if (s == NULL 1337 1.1.1.6 christos || !bfd_set_section_alignment (s, 3)) 1338 1.1.1.7 christos return false; 1339 1.1 christos ia64_info->note_sec = s; 1340 1.1 christos 1341 1.1.1.7 christos elf_hash_table (info)->dynamic_sections_created = true; 1342 1.1.1.7 christos return true; 1343 1.1 christos } 1344 1.1 christos 1345 1.1 christos /* Find and/or create a hash entry for local symbol. */ 1346 1.1 christos static struct elf64_ia64_local_hash_entry * 1347 1.1 christos get_local_sym_hash (struct elf64_ia64_link_hash_table *ia64_info, 1348 1.1 christos bfd *abfd, const Elf_Internal_Rela *rel, 1349 1.1.1.7 christos bool create) 1350 1.1 christos { 1351 1.1 christos struct elf64_ia64_local_hash_entry e, *ret; 1352 1.1 christos asection *sec = abfd->sections; 1353 1.1 christos hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id, 1354 1.1 christos ELF64_R_SYM (rel->r_info)); 1355 1.1 christos void **slot; 1356 1.1 christos 1357 1.1 christos e.id = sec->id; 1358 1.1 christos e.r_sym = ELF64_R_SYM (rel->r_info); 1359 1.1 christos slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h, 1360 1.1 christos create ? INSERT : NO_INSERT); 1361 1.1 christos 1362 1.1 christos if (!slot) 1363 1.1 christos return NULL; 1364 1.1 christos 1365 1.1 christos if (*slot) 1366 1.1 christos return (struct elf64_ia64_local_hash_entry *) *slot; 1367 1.1 christos 1368 1.1 christos ret = (struct elf64_ia64_local_hash_entry *) 1369 1.1 christos objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory, 1370 1.1 christos sizeof (struct elf64_ia64_local_hash_entry)); 1371 1.1 christos if (ret) 1372 1.1 christos { 1373 1.1 christos memset (ret, 0, sizeof (*ret)); 1374 1.1 christos ret->id = sec->id; 1375 1.1 christos ret->r_sym = ELF64_R_SYM (rel->r_info); 1376 1.1 christos *slot = ret; 1377 1.1 christos } 1378 1.1 christos return ret; 1379 1.1 christos } 1380 1.1 christos 1381 1.1 christos /* Used to sort elf64_ia64_dyn_sym_info array. */ 1382 1.1 christos 1383 1.1 christos static int 1384 1.1 christos addend_compare (const void *xp, const void *yp) 1385 1.1 christos { 1386 1.1 christos const struct elf64_ia64_dyn_sym_info *x 1387 1.1 christos = (const struct elf64_ia64_dyn_sym_info *) xp; 1388 1.1 christos const struct elf64_ia64_dyn_sym_info *y 1389 1.1 christos = (const struct elf64_ia64_dyn_sym_info *) yp; 1390 1.1 christos 1391 1.1 christos return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0; 1392 1.1 christos } 1393 1.1 christos 1394 1.1 christos /* Sort elf64_ia64_dyn_sym_info array and remove duplicates. */ 1395 1.1 christos 1396 1.1 christos static unsigned int 1397 1.1 christos sort_dyn_sym_info (struct elf64_ia64_dyn_sym_info *info, 1398 1.1 christos unsigned int count) 1399 1.1 christos { 1400 1.1 christos bfd_vma curr, prev, got_offset; 1401 1.1 christos unsigned int i, kept, dupes, diff, dest, src, len; 1402 1.1 christos 1403 1.1 christos qsort (info, count, sizeof (*info), addend_compare); 1404 1.1 christos 1405 1.1 christos /* Find the first duplicate. */ 1406 1.1 christos prev = info [0].addend; 1407 1.1 christos got_offset = info [0].got_offset; 1408 1.1 christos for (i = 1; i < count; i++) 1409 1.1 christos { 1410 1.1 christos curr = info [i].addend; 1411 1.1 christos if (curr == prev) 1412 1.1 christos { 1413 1.1 christos /* For duplicates, make sure that GOT_OFFSET is valid. */ 1414 1.1 christos if (got_offset == (bfd_vma) -1) 1415 1.1 christos got_offset = info [i].got_offset; 1416 1.1 christos break; 1417 1.1 christos } 1418 1.1 christos got_offset = info [i].got_offset; 1419 1.1 christos prev = curr; 1420 1.1 christos } 1421 1.1 christos 1422 1.1 christos /* We may move a block of elements to here. */ 1423 1.1 christos dest = i++; 1424 1.1 christos 1425 1.1 christos /* Remove duplicates. */ 1426 1.1 christos if (i < count) 1427 1.1 christos { 1428 1.1 christos while (i < count) 1429 1.1 christos { 1430 1.1 christos /* For duplicates, make sure that the kept one has a valid 1431 1.1 christos got_offset. */ 1432 1.1 christos kept = dest - 1; 1433 1.1 christos if (got_offset != (bfd_vma) -1) 1434 1.1 christos info [kept].got_offset = got_offset; 1435 1.1 christos 1436 1.1 christos curr = info [i].addend; 1437 1.1 christos got_offset = info [i].got_offset; 1438 1.1 christos 1439 1.1 christos /* Move a block of elements whose first one is different from 1440 1.1 christos the previous. */ 1441 1.1 christos if (curr == prev) 1442 1.1 christos { 1443 1.1 christos for (src = i + 1; src < count; src++) 1444 1.1 christos { 1445 1.1 christos if (info [src].addend != curr) 1446 1.1 christos break; 1447 1.1 christos /* For duplicates, make sure that GOT_OFFSET is 1448 1.1 christos valid. */ 1449 1.1 christos if (got_offset == (bfd_vma) -1) 1450 1.1 christos got_offset = info [src].got_offset; 1451 1.1 christos } 1452 1.1 christos 1453 1.1 christos /* Make sure that the kept one has a valid got_offset. */ 1454 1.1 christos if (got_offset != (bfd_vma) -1) 1455 1.1 christos info [kept].got_offset = got_offset; 1456 1.1 christos } 1457 1.1 christos else 1458 1.1 christos src = i; 1459 1.1 christos 1460 1.1 christos if (src >= count) 1461 1.1 christos break; 1462 1.1 christos 1463 1.1 christos /* Find the next duplicate. SRC will be kept. */ 1464 1.1 christos prev = info [src].addend; 1465 1.1 christos got_offset = info [src].got_offset; 1466 1.1 christos for (dupes = src + 1; dupes < count; dupes ++) 1467 1.1 christos { 1468 1.1 christos curr = info [dupes].addend; 1469 1.1 christos if (curr == prev) 1470 1.1 christos { 1471 1.1 christos /* Make sure that got_offset is valid. */ 1472 1.1 christos if (got_offset == (bfd_vma) -1) 1473 1.1 christos got_offset = info [dupes].got_offset; 1474 1.1 christos 1475 1.1 christos /* For duplicates, make sure that the kept one has 1476 1.1 christos a valid got_offset. */ 1477 1.1 christos if (got_offset != (bfd_vma) -1) 1478 1.1 christos info [dupes - 1].got_offset = got_offset; 1479 1.1 christos break; 1480 1.1 christos } 1481 1.1 christos got_offset = info [dupes].got_offset; 1482 1.1 christos prev = curr; 1483 1.1 christos } 1484 1.1 christos 1485 1.1 christos /* How much to move. */ 1486 1.1 christos len = dupes - src; 1487 1.1 christos i = dupes + 1; 1488 1.1 christos 1489 1.1 christos if (len == 1 && dupes < count) 1490 1.1 christos { 1491 1.1 christos /* If we only move 1 element, we combine it with the next 1492 1.1 christos one. There must be at least a duplicate. Find the 1493 1.1 christos next different one. */ 1494 1.1 christos for (diff = dupes + 1, src++; diff < count; diff++, src++) 1495 1.1 christos { 1496 1.1 christos if (info [diff].addend != curr) 1497 1.1 christos break; 1498 1.1 christos /* Make sure that got_offset is valid. */ 1499 1.1 christos if (got_offset == (bfd_vma) -1) 1500 1.1 christos got_offset = info [diff].got_offset; 1501 1.1 christos } 1502 1.1 christos 1503 1.1 christos /* Makre sure that the last duplicated one has an valid 1504 1.1 christos offset. */ 1505 1.1 christos BFD_ASSERT (curr == prev); 1506 1.1 christos if (got_offset != (bfd_vma) -1) 1507 1.1 christos info [diff - 1].got_offset = got_offset; 1508 1.1 christos 1509 1.1 christos if (diff < count) 1510 1.1 christos { 1511 1.1 christos /* Find the next duplicate. Track the current valid 1512 1.1 christos offset. */ 1513 1.1 christos prev = info [diff].addend; 1514 1.1 christos got_offset = info [diff].got_offset; 1515 1.1 christos for (dupes = diff + 1; dupes < count; dupes ++) 1516 1.1 christos { 1517 1.1 christos curr = info [dupes].addend; 1518 1.1 christos if (curr == prev) 1519 1.1 christos { 1520 1.1 christos /* For duplicates, make sure that GOT_OFFSET 1521 1.1 christos is valid. */ 1522 1.1 christos if (got_offset == (bfd_vma) -1) 1523 1.1 christos got_offset = info [dupes].got_offset; 1524 1.1 christos break; 1525 1.1 christos } 1526 1.1 christos got_offset = info [dupes].got_offset; 1527 1.1 christos prev = curr; 1528 1.1 christos diff++; 1529 1.1 christos } 1530 1.1 christos 1531 1.1 christos len = diff - src + 1; 1532 1.1 christos i = diff + 1; 1533 1.1 christos } 1534 1.1 christos } 1535 1.1 christos 1536 1.1 christos memmove (&info [dest], &info [src], len * sizeof (*info)); 1537 1.1 christos 1538 1.1 christos dest += len; 1539 1.1 christos } 1540 1.1 christos 1541 1.1 christos count = dest; 1542 1.1 christos } 1543 1.1 christos else 1544 1.1 christos { 1545 1.1 christos /* When we get here, either there is no duplicate at all or 1546 1.1 christos the only duplicate is the last element. */ 1547 1.1 christos if (dest < count) 1548 1.1 christos { 1549 1.1 christos /* If the last element is a duplicate, make sure that the 1550 1.1 christos kept one has a valid got_offset. We also update count. */ 1551 1.1 christos if (got_offset != (bfd_vma) -1) 1552 1.1 christos info [dest - 1].got_offset = got_offset; 1553 1.1 christos count = dest; 1554 1.1 christos } 1555 1.1 christos } 1556 1.1 christos 1557 1.1 christos return count; 1558 1.1 christos } 1559 1.1 christos 1560 1.1 christos /* Find and/or create a descriptor for dynamic symbol info. This will 1561 1.1 christos vary based on global or local symbol, and the addend to the reloc. 1562 1.1 christos 1563 1.1 christos We don't sort when inserting. Also, we sort and eliminate 1564 1.1 christos duplicates if there is an unsorted section. Typically, this will 1565 1.1 christos only happen once, because we do all insertions before lookups. We 1566 1.1 christos then use bsearch to do a lookup. This also allows lookups to be 1567 1.1 christos fast. So we have fast insertion (O(log N) due to duplicate check), 1568 1.1 christos fast lookup (O(log N)) and one sort (O(N log N) expected time). 1569 1.1 christos Previously, all lookups were O(N) because of the use of the linked 1570 1.1 christos list and also all insertions were O(N) because of the check for 1571 1.1 christos duplicates. There are some complications here because the array 1572 1.1 christos size grows occasionally, which may add an O(N) factor, but this 1573 1.1 christos should be rare. Also, we free the excess array allocation, which 1574 1.1 christos requires a copy which is O(N), but this only happens once. */ 1575 1.1 christos 1576 1.1 christos static struct elf64_ia64_dyn_sym_info * 1577 1.1 christos get_dyn_sym_info (struct elf64_ia64_link_hash_table *ia64_info, 1578 1.1 christos struct elf_link_hash_entry *h, bfd *abfd, 1579 1.1.1.7 christos const Elf_Internal_Rela *rel, bool create) 1580 1.1 christos { 1581 1.1 christos struct elf64_ia64_dyn_sym_info **info_p, *info, *dyn_i, key; 1582 1.1 christos unsigned int *count_p, *sorted_count_p, *size_p; 1583 1.1 christos unsigned int count, sorted_count, size; 1584 1.1 christos bfd_vma addend = rel ? rel->r_addend : 0; 1585 1.1 christos bfd_size_type amt; 1586 1.1 christos 1587 1.1 christos if (h) 1588 1.1 christos { 1589 1.1 christos struct elf64_ia64_link_hash_entry *global_h; 1590 1.1 christos 1591 1.1 christos global_h = (struct elf64_ia64_link_hash_entry *) h; 1592 1.1 christos info_p = &global_h->info; 1593 1.1 christos count_p = &global_h->count; 1594 1.1 christos sorted_count_p = &global_h->sorted_count; 1595 1.1 christos size_p = &global_h->size; 1596 1.1 christos } 1597 1.1 christos else 1598 1.1 christos { 1599 1.1 christos struct elf64_ia64_local_hash_entry *loc_h; 1600 1.1 christos 1601 1.1 christos loc_h = get_local_sym_hash (ia64_info, abfd, rel, create); 1602 1.1 christos if (!loc_h) 1603 1.1 christos { 1604 1.1 christos BFD_ASSERT (!create); 1605 1.1 christos return NULL; 1606 1.1 christos } 1607 1.1 christos 1608 1.1 christos info_p = &loc_h->info; 1609 1.1 christos count_p = &loc_h->count; 1610 1.1 christos sorted_count_p = &loc_h->sorted_count; 1611 1.1 christos size_p = &loc_h->size; 1612 1.1 christos } 1613 1.1 christos 1614 1.1 christos count = *count_p; 1615 1.1 christos sorted_count = *sorted_count_p; 1616 1.1 christos size = *size_p; 1617 1.1 christos info = *info_p; 1618 1.1 christos if (create) 1619 1.1 christos { 1620 1.1 christos /* When we create the array, we don't check for duplicates, 1621 1.1.1.4 christos except in the previously sorted section if one exists, and 1622 1.1 christos against the last inserted entry. This allows insertions to 1623 1.1 christos be fast. */ 1624 1.1 christos if (info) 1625 1.1 christos { 1626 1.1 christos if (sorted_count) 1627 1.1 christos { 1628 1.1 christos /* Try bsearch first on the sorted section. */ 1629 1.1 christos key.addend = addend; 1630 1.1 christos dyn_i = bsearch (&key, info, sorted_count, 1631 1.1 christos sizeof (*info), addend_compare); 1632 1.1 christos 1633 1.1 christos if (dyn_i) 1634 1.1 christos { 1635 1.1 christos return dyn_i; 1636 1.1 christos } 1637 1.1 christos } 1638 1.1 christos 1639 1.1 christos /* Do a quick check for the last inserted entry. */ 1640 1.1 christos dyn_i = info + count - 1; 1641 1.1 christos if (dyn_i->addend == addend) 1642 1.1 christos { 1643 1.1 christos return dyn_i; 1644 1.1 christos } 1645 1.1 christos } 1646 1.1 christos 1647 1.1 christos if (size == 0) 1648 1.1 christos { 1649 1.1 christos /* It is the very first element. We create the array of size 1650 1.1 christos 1. */ 1651 1.1 christos size = 1; 1652 1.1 christos amt = size * sizeof (*info); 1653 1.1 christos info = bfd_malloc (amt); 1654 1.1 christos } 1655 1.1 christos else if (size <= count) 1656 1.1 christos { 1657 1.1 christos /* We double the array size every time when we reach the 1658 1.1 christos size limit. */ 1659 1.1 christos size += size; 1660 1.1 christos amt = size * sizeof (*info); 1661 1.1 christos info = bfd_realloc (info, amt); 1662 1.1 christos } 1663 1.1 christos else 1664 1.1 christos goto has_space; 1665 1.1 christos 1666 1.1 christos if (info == NULL) 1667 1.1 christos return NULL; 1668 1.1 christos *size_p = size; 1669 1.1 christos *info_p = info; 1670 1.1 christos 1671 1.1.1.7 christos has_space: 1672 1.1 christos /* Append the new one to the array. */ 1673 1.1 christos dyn_i = info + count; 1674 1.1 christos memset (dyn_i, 0, sizeof (*dyn_i)); 1675 1.1 christos dyn_i->got_offset = (bfd_vma) -1; 1676 1.1 christos dyn_i->addend = addend; 1677 1.1 christos 1678 1.1 christos /* We increment count only since the new ones are unsorted and 1679 1.1 christos may have duplicate. */ 1680 1.1 christos (*count_p)++; 1681 1.1 christos } 1682 1.1 christos else 1683 1.1 christos { 1684 1.1 christos /* It is a lookup without insertion. Sort array if part of the 1685 1.1 christos array isn't sorted. */ 1686 1.1 christos if (count != sorted_count) 1687 1.1 christos { 1688 1.1 christos count = sort_dyn_sym_info (info, count); 1689 1.1 christos *count_p = count; 1690 1.1 christos *sorted_count_p = count; 1691 1.1 christos } 1692 1.1 christos 1693 1.1 christos /* Free unused memory. */ 1694 1.1 christos if (size != count) 1695 1.1 christos { 1696 1.1 christos amt = count * sizeof (*info); 1697 1.1 christos info = bfd_malloc (amt); 1698 1.1 christos if (info != NULL) 1699 1.1 christos { 1700 1.1 christos memcpy (info, *info_p, amt); 1701 1.1 christos free (*info_p); 1702 1.1 christos *size_p = count; 1703 1.1 christos *info_p = info; 1704 1.1 christos } 1705 1.1 christos } 1706 1.1 christos 1707 1.1 christos key.addend = addend; 1708 1.1 christos dyn_i = bsearch (&key, info, count, 1709 1.1 christos sizeof (*info), addend_compare); 1710 1.1 christos } 1711 1.1 christos 1712 1.1 christos return dyn_i; 1713 1.1 christos } 1714 1.1 christos 1715 1.1 christos static asection * 1716 1.1 christos get_got (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info) 1717 1.1 christos { 1718 1.1 christos asection *got; 1719 1.1 christos bfd *dynobj; 1720 1.1 christos 1721 1.1 christos got = ia64_info->root.sgot; 1722 1.1 christos if (!got) 1723 1.1 christos { 1724 1.1 christos flagword flags; 1725 1.1 christos 1726 1.1 christos dynobj = ia64_info->root.dynobj; 1727 1.1 christos if (!dynobj) 1728 1.1 christos ia64_info->root.dynobj = dynobj = abfd; 1729 1.1 christos 1730 1.1 christos /* The .got section is always aligned at 8 bytes. */ 1731 1.1 christos flags = get_elf_backend_data (dynobj)->dynamic_sec_flags; 1732 1.1 christos got = bfd_make_section_anyway_with_flags (dynobj, ".got", 1733 1.1 christos flags | SEC_SMALL_DATA); 1734 1.1 christos if (got == NULL 1735 1.1.1.6 christos || !bfd_set_section_alignment (got, 3)) 1736 1.1.1.4 christos return NULL; 1737 1.1 christos ia64_info->root.sgot = got; 1738 1.1 christos } 1739 1.1 christos 1740 1.1 christos return got; 1741 1.1 christos } 1742 1.1 christos 1743 1.1 christos /* Create function descriptor section (.opd). This section is called .opd 1744 1.1 christos because it contains "official procedure descriptors". The "official" 1745 1.1 christos refers to the fact that these descriptors are used when taking the address 1746 1.1 christos of a procedure, thus ensuring a unique address for each procedure. */ 1747 1.1 christos 1748 1.1 christos static asection * 1749 1.1 christos get_fptr (bfd *abfd, struct bfd_link_info *info, 1750 1.1 christos struct elf64_ia64_link_hash_table *ia64_info) 1751 1.1 christos { 1752 1.1 christos asection *fptr; 1753 1.1 christos bfd *dynobj; 1754 1.1 christos 1755 1.1 christos fptr = ia64_info->fptr_sec; 1756 1.1 christos if (!fptr) 1757 1.1 christos { 1758 1.1 christos dynobj = ia64_info->root.dynobj; 1759 1.1 christos if (!dynobj) 1760 1.1 christos ia64_info->root.dynobj = dynobj = abfd; 1761 1.1 christos 1762 1.1 christos fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd", 1763 1.1 christos (SEC_ALLOC 1764 1.1 christos | SEC_LOAD 1765 1.1 christos | SEC_HAS_CONTENTS 1766 1.1 christos | SEC_IN_MEMORY 1767 1.1.1.2 christos | (bfd_link_pie (info) ? 0 1768 1.1 christos : SEC_READONLY) 1769 1.1 christos | SEC_LINKER_CREATED)); 1770 1.1 christos if (!fptr 1771 1.1.1.6 christos || !bfd_set_section_alignment (fptr, 4)) 1772 1.1 christos { 1773 1.1 christos BFD_ASSERT (0); 1774 1.1 christos return NULL; 1775 1.1 christos } 1776 1.1 christos 1777 1.1 christos ia64_info->fptr_sec = fptr; 1778 1.1 christos 1779 1.1.1.2 christos if (bfd_link_pie (info)) 1780 1.1 christos { 1781 1.1 christos asection *fptr_rel; 1782 1.1 christos fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd", 1783 1.1 christos (SEC_ALLOC | SEC_LOAD 1784 1.1 christos | SEC_HAS_CONTENTS 1785 1.1 christos | SEC_IN_MEMORY 1786 1.1 christos | SEC_LINKER_CREATED 1787 1.1 christos | SEC_READONLY)); 1788 1.1 christos if (fptr_rel == NULL 1789 1.1.1.6 christos || !bfd_set_section_alignment (fptr_rel, 3)) 1790 1.1 christos { 1791 1.1 christos BFD_ASSERT (0); 1792 1.1 christos return NULL; 1793 1.1 christos } 1794 1.1 christos 1795 1.1 christos ia64_info->rel_fptr_sec = fptr_rel; 1796 1.1 christos } 1797 1.1 christos } 1798 1.1 christos 1799 1.1 christos return fptr; 1800 1.1 christos } 1801 1.1 christos 1802 1.1 christos static asection * 1803 1.1 christos get_pltoff (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info) 1804 1.1 christos { 1805 1.1 christos asection *pltoff; 1806 1.1 christos bfd *dynobj; 1807 1.1 christos 1808 1.1 christos pltoff = ia64_info->pltoff_sec; 1809 1.1 christos if (!pltoff) 1810 1.1 christos { 1811 1.1 christos dynobj = ia64_info->root.dynobj; 1812 1.1 christos if (!dynobj) 1813 1.1 christos ia64_info->root.dynobj = dynobj = abfd; 1814 1.1 christos 1815 1.1 christos pltoff = bfd_make_section_anyway_with_flags (dynobj, 1816 1.1 christos ELF_STRING_ia64_pltoff, 1817 1.1 christos (SEC_ALLOC 1818 1.1 christos | SEC_LOAD 1819 1.1 christos | SEC_HAS_CONTENTS 1820 1.1 christos | SEC_IN_MEMORY 1821 1.1 christos | SEC_SMALL_DATA 1822 1.1 christos | SEC_LINKER_CREATED)); 1823 1.1 christos if (!pltoff 1824 1.1.1.6 christos || !bfd_set_section_alignment (pltoff, 4)) 1825 1.1 christos { 1826 1.1 christos BFD_ASSERT (0); 1827 1.1 christos return NULL; 1828 1.1 christos } 1829 1.1 christos 1830 1.1 christos ia64_info->pltoff_sec = pltoff; 1831 1.1 christos } 1832 1.1 christos 1833 1.1 christos return pltoff; 1834 1.1 christos } 1835 1.1 christos 1836 1.1 christos static asection * 1837 1.1 christos get_reloc_section (bfd *abfd, 1838 1.1 christos struct elf64_ia64_link_hash_table *ia64_info, 1839 1.1.1.7 christos asection *sec, bool create) 1840 1.1 christos { 1841 1.1 christos const char *srel_name; 1842 1.1 christos asection *srel; 1843 1.1 christos bfd *dynobj; 1844 1.1 christos 1845 1.1 christos srel_name = (bfd_elf_string_from_elf_section 1846 1.1 christos (abfd, elf_elfheader(abfd)->e_shstrndx, 1847 1.1 christos _bfd_elf_single_rel_hdr (sec)->sh_name)); 1848 1.1 christos if (srel_name == NULL) 1849 1.1 christos return NULL; 1850 1.1 christos 1851 1.1.1.7 christos BFD_ASSERT ((startswith (srel_name, ".rela") 1852 1.1.1.6 christos && strcmp (bfd_section_name (sec), srel_name+5) == 0) 1853 1.1.1.7 christos || (startswith (srel_name, ".rel") 1854 1.1.1.6 christos && strcmp (bfd_section_name (sec), srel_name+4) == 0)); 1855 1.1 christos 1856 1.1 christos dynobj = ia64_info->root.dynobj; 1857 1.1 christos if (!dynobj) 1858 1.1 christos ia64_info->root.dynobj = dynobj = abfd; 1859 1.1 christos 1860 1.1 christos srel = bfd_get_linker_section (dynobj, srel_name); 1861 1.1 christos if (srel == NULL && create) 1862 1.1 christos { 1863 1.1 christos srel = bfd_make_section_anyway_with_flags (dynobj, srel_name, 1864 1.1 christos (SEC_ALLOC | SEC_LOAD 1865 1.1 christos | SEC_HAS_CONTENTS 1866 1.1 christos | SEC_IN_MEMORY 1867 1.1 christos | SEC_LINKER_CREATED 1868 1.1 christos | SEC_READONLY)); 1869 1.1 christos if (srel == NULL 1870 1.1.1.6 christos || !bfd_set_section_alignment (srel, 3)) 1871 1.1 christos return NULL; 1872 1.1 christos } 1873 1.1 christos 1874 1.1 christos return srel; 1875 1.1 christos } 1876 1.1 christos 1877 1.1.1.7 christos static bool 1878 1.1 christos count_dyn_reloc (bfd *abfd, struct elf64_ia64_dyn_sym_info *dyn_i, 1879 1.1 christos asection *srel, int type) 1880 1.1 christos { 1881 1.1 christos struct elf64_ia64_dyn_reloc_entry *rent; 1882 1.1 christos 1883 1.1 christos for (rent = dyn_i->reloc_entries; rent; rent = rent->next) 1884 1.1 christos if (rent->srel == srel && rent->type == type) 1885 1.1 christos break; 1886 1.1 christos 1887 1.1 christos if (!rent) 1888 1.1 christos { 1889 1.1 christos rent = ((struct elf64_ia64_dyn_reloc_entry *) 1890 1.1 christos bfd_alloc (abfd, (bfd_size_type) sizeof (*rent))); 1891 1.1 christos if (!rent) 1892 1.1.1.7 christos return false; 1893 1.1 christos 1894 1.1 christos rent->next = dyn_i->reloc_entries; 1895 1.1 christos rent->srel = srel; 1896 1.1 christos rent->type = type; 1897 1.1 christos rent->count = 0; 1898 1.1 christos dyn_i->reloc_entries = rent; 1899 1.1 christos } 1900 1.1 christos rent->count++; 1901 1.1 christos 1902 1.1.1.7 christos return true; 1903 1.1 christos } 1904 1.1 christos 1905 1.1.1.7 christos static bool 1906 1.1 christos elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info, 1907 1.1 christos asection *sec, 1908 1.1 christos const Elf_Internal_Rela *relocs) 1909 1.1 christos { 1910 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 1911 1.1 christos const Elf_Internal_Rela *relend; 1912 1.1 christos Elf_Internal_Shdr *symtab_hdr; 1913 1.1 christos const Elf_Internal_Rela *rel; 1914 1.1 christos asection *got, *fptr, *srel, *pltoff; 1915 1.1 christos enum { 1916 1.1 christos NEED_GOT = 1, 1917 1.1 christos NEED_GOTX = 2, 1918 1.1 christos NEED_FPTR = 4, 1919 1.1 christos NEED_PLTOFF = 8, 1920 1.1 christos NEED_MIN_PLT = 16, 1921 1.1 christos NEED_FULL_PLT = 32, 1922 1.1 christos NEED_DYNREL = 64, 1923 1.1 christos NEED_LTOFF_FPTR = 128 1924 1.1 christos }; 1925 1.1 christos int need_entry; 1926 1.1 christos struct elf_link_hash_entry *h; 1927 1.1 christos unsigned long r_symndx; 1928 1.1.1.7 christos bool maybe_dynamic; 1929 1.1 christos 1930 1.1.1.2 christos if (bfd_link_relocatable (info)) 1931 1.1.1.7 christos return true; 1932 1.1 christos 1933 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1934 1.1 christos ia64_info = elf64_ia64_hash_table (info); 1935 1.1 christos if (ia64_info == NULL) 1936 1.1.1.7 christos return false; 1937 1.1 christos 1938 1.1 christos got = fptr = srel = pltoff = NULL; 1939 1.1 christos 1940 1.1 christos relend = relocs + sec->reloc_count; 1941 1.1 christos 1942 1.1 christos /* We scan relocations first to create dynamic relocation arrays. We 1943 1.1 christos modified get_dyn_sym_info to allow fast insertion and support fast 1944 1.1 christos lookup in the next loop. */ 1945 1.1 christos for (rel = relocs; rel < relend; ++rel) 1946 1.1 christos { 1947 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info); 1948 1.1 christos if (r_symndx >= symtab_hdr->sh_info) 1949 1.1 christos { 1950 1.1 christos long indx = r_symndx - symtab_hdr->sh_info; 1951 1.1 christos h = elf_sym_hashes (abfd)[indx]; 1952 1.1 christos while (h->root.type == bfd_link_hash_indirect 1953 1.1 christos || h->root.type == bfd_link_hash_warning) 1954 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 1955 1.1 christos } 1956 1.1 christos else 1957 1.1 christos h = NULL; 1958 1.1 christos 1959 1.1 christos /* We can only get preliminary data on whether a symbol is 1960 1.1 christos locally or externally defined, as not all of the input files 1961 1.1 christos have yet been processed. Do something with what we know, as 1962 1.1 christos this may help reduce memory usage and processing time later. */ 1963 1.1.1.2 christos maybe_dynamic = (h && ((!bfd_link_executable (info) 1964 1.1 christos && (!SYMBOLIC_BIND (info, h) 1965 1.1 christos || info->unresolved_syms_in_shared_libs == RM_IGNORE)) 1966 1.1 christos || !h->def_regular 1967 1.1 christos || h->root.type == bfd_link_hash_defweak)); 1968 1.1 christos 1969 1.1 christos need_entry = 0; 1970 1.1 christos switch (ELF64_R_TYPE (rel->r_info)) 1971 1.1 christos { 1972 1.1 christos case R_IA64_TPREL64MSB: 1973 1.1 christos case R_IA64_TPREL64LSB: 1974 1.1 christos case R_IA64_LTOFF_TPREL22: 1975 1.1 christos case R_IA64_DTPREL32MSB: 1976 1.1 christos case R_IA64_DTPREL32LSB: 1977 1.1 christos case R_IA64_DTPREL64MSB: 1978 1.1 christos case R_IA64_DTPREL64LSB: 1979 1.1 christos case R_IA64_LTOFF_DTPREL22: 1980 1.1 christos case R_IA64_DTPMOD64MSB: 1981 1.1 christos case R_IA64_DTPMOD64LSB: 1982 1.1 christos case R_IA64_LTOFF_DTPMOD22: 1983 1.1.1.4 christos abort (); 1984 1.1 christos break; 1985 1.1 christos 1986 1.1 christos case R_IA64_IPLTMSB: 1987 1.1 christos case R_IA64_IPLTLSB: 1988 1.1.1.4 christos break; 1989 1.1 christos 1990 1.1 christos case R_IA64_LTOFF_FPTR22: 1991 1.1 christos case R_IA64_LTOFF_FPTR64I: 1992 1.1 christos case R_IA64_LTOFF_FPTR32MSB: 1993 1.1 christos case R_IA64_LTOFF_FPTR32LSB: 1994 1.1 christos case R_IA64_LTOFF_FPTR64MSB: 1995 1.1 christos case R_IA64_LTOFF_FPTR64LSB: 1996 1.1 christos need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR; 1997 1.1 christos break; 1998 1.1 christos 1999 1.1 christos case R_IA64_FPTR64I: 2000 1.1 christos case R_IA64_FPTR32MSB: 2001 1.1 christos case R_IA64_FPTR32LSB: 2002 1.1 christos case R_IA64_FPTR64MSB: 2003 1.1 christos case R_IA64_FPTR64LSB: 2004 1.1.1.2 christos if (bfd_link_pic (info) || h) 2005 1.1 christos need_entry = NEED_FPTR | NEED_DYNREL; 2006 1.1 christos else 2007 1.1 christos need_entry = NEED_FPTR; 2008 1.1 christos break; 2009 1.1 christos 2010 1.1 christos case R_IA64_LTOFF22: 2011 1.1 christos case R_IA64_LTOFF64I: 2012 1.1 christos need_entry = NEED_GOT; 2013 1.1 christos break; 2014 1.1 christos 2015 1.1 christos case R_IA64_LTOFF22X: 2016 1.1 christos need_entry = NEED_GOTX; 2017 1.1 christos break; 2018 1.1 christos 2019 1.1 christos case R_IA64_PLTOFF22: 2020 1.1 christos case R_IA64_PLTOFF64I: 2021 1.1 christos case R_IA64_PLTOFF64MSB: 2022 1.1 christos case R_IA64_PLTOFF64LSB: 2023 1.1 christos need_entry = NEED_PLTOFF; 2024 1.1 christos if (h) 2025 1.1 christos { 2026 1.1 christos if (maybe_dynamic) 2027 1.1 christos need_entry |= NEED_MIN_PLT; 2028 1.1 christos } 2029 1.1 christos else 2030 1.1 christos { 2031 1.1 christos (*info->callbacks->warning) 2032 1.1 christos (info, _("@pltoff reloc against local symbol"), 0, 2033 1.1 christos abfd, 0, (bfd_vma) 0); 2034 1.1 christos } 2035 1.1 christos break; 2036 1.1 christos 2037 1.1 christos case R_IA64_PCREL21B: 2038 1.1.1.4 christos case R_IA64_PCREL60B: 2039 1.1 christos /* Depending on where this symbol is defined, we may or may not 2040 1.1 christos need a full plt entry. Only skip if we know we'll not need 2041 1.1 christos the entry -- static or symbolic, and the symbol definition 2042 1.1 christos has already been seen. */ 2043 1.1 christos if (maybe_dynamic && rel->r_addend == 0) 2044 1.1 christos need_entry = NEED_FULL_PLT; 2045 1.1 christos break; 2046 1.1 christos 2047 1.1 christos case R_IA64_IMM14: 2048 1.1 christos case R_IA64_IMM22: 2049 1.1 christos case R_IA64_IMM64: 2050 1.1 christos case R_IA64_DIR32MSB: 2051 1.1 christos case R_IA64_DIR32LSB: 2052 1.1 christos case R_IA64_DIR64MSB: 2053 1.1 christos case R_IA64_DIR64LSB: 2054 1.1 christos /* Shared objects will always need at least a REL relocation. */ 2055 1.1.1.2 christos if (bfd_link_pic (info) || maybe_dynamic) 2056 1.1 christos need_entry = NEED_DYNREL; 2057 1.1 christos break; 2058 1.1 christos 2059 1.1 christos case R_IA64_PCREL22: 2060 1.1 christos case R_IA64_PCREL64I: 2061 1.1 christos case R_IA64_PCREL32MSB: 2062 1.1 christos case R_IA64_PCREL32LSB: 2063 1.1 christos case R_IA64_PCREL64MSB: 2064 1.1 christos case R_IA64_PCREL64LSB: 2065 1.1 christos if (maybe_dynamic) 2066 1.1 christos need_entry = NEED_DYNREL; 2067 1.1 christos break; 2068 1.1 christos } 2069 1.1 christos 2070 1.1 christos if (!need_entry) 2071 1.1 christos continue; 2072 1.1 christos 2073 1.1 christos if ((need_entry & NEED_FPTR) != 0 2074 1.1 christos && rel->r_addend) 2075 1.1 christos { 2076 1.1 christos (*info->callbacks->warning) 2077 1.1 christos (info, _("non-zero addend in @fptr reloc"), 0, 2078 1.1 christos abfd, 0, (bfd_vma) 0); 2079 1.1 christos } 2080 1.1 christos 2081 1.1.1.7 christos if (get_dyn_sym_info (ia64_info, h, abfd, rel, true) == NULL) 2082 1.1.1.7 christos return false; 2083 1.1 christos } 2084 1.1 christos 2085 1.1 christos /* Now, we only do lookup without insertion, which is very fast 2086 1.1 christos with the modified get_dyn_sym_info. */ 2087 1.1 christos for (rel = relocs; rel < relend; ++rel) 2088 1.1 christos { 2089 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 2090 1.1 christos int dynrel_type = R_IA64_NONE; 2091 1.1 christos 2092 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info); 2093 1.1 christos if (r_symndx >= symtab_hdr->sh_info) 2094 1.1 christos { 2095 1.1 christos /* We're dealing with a global symbol -- find its hash entry 2096 1.1 christos and mark it as being referenced. */ 2097 1.1 christos long indx = r_symndx - symtab_hdr->sh_info; 2098 1.1 christos h = elf_sym_hashes (abfd)[indx]; 2099 1.1 christos while (h->root.type == bfd_link_hash_indirect 2100 1.1 christos || h->root.type == bfd_link_hash_warning) 2101 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 2102 1.1 christos 2103 1.1.1.2 christos /* PR15323, ref flags aren't set for references in the same 2104 1.1.1.2 christos object. */ 2105 1.1 christos h->ref_regular = 1; 2106 1.1 christos } 2107 1.1 christos else 2108 1.1 christos h = NULL; 2109 1.1 christos 2110 1.1 christos /* We can only get preliminary data on whether a symbol is 2111 1.1 christos locally or externally defined, as not all of the input files 2112 1.1 christos have yet been processed. Do something with what we know, as 2113 1.1 christos this may help reduce memory usage and processing time later. */ 2114 1.1.1.2 christos maybe_dynamic = (h && ((!bfd_link_executable (info) 2115 1.1 christos && (!SYMBOLIC_BIND (info, h) 2116 1.1 christos || info->unresolved_syms_in_shared_libs == RM_IGNORE)) 2117 1.1 christos || !h->def_regular 2118 1.1 christos || h->root.type == bfd_link_hash_defweak)); 2119 1.1 christos 2120 1.1 christos need_entry = 0; 2121 1.1 christos switch (ELF64_R_TYPE (rel->r_info)) 2122 1.1 christos { 2123 1.1 christos case R_IA64_TPREL64MSB: 2124 1.1 christos case R_IA64_TPREL64LSB: 2125 1.1 christos case R_IA64_LTOFF_TPREL22: 2126 1.1 christos case R_IA64_DTPREL32MSB: 2127 1.1 christos case R_IA64_DTPREL32LSB: 2128 1.1 christos case R_IA64_DTPREL64MSB: 2129 1.1 christos case R_IA64_DTPREL64LSB: 2130 1.1 christos case R_IA64_LTOFF_DTPREL22: 2131 1.1 christos case R_IA64_DTPMOD64MSB: 2132 1.1 christos case R_IA64_DTPMOD64LSB: 2133 1.1 christos case R_IA64_LTOFF_DTPMOD22: 2134 1.1.1.4 christos abort (); 2135 1.1 christos break; 2136 1.1 christos 2137 1.1 christos case R_IA64_LTOFF_FPTR22: 2138 1.1 christos case R_IA64_LTOFF_FPTR64I: 2139 1.1 christos case R_IA64_LTOFF_FPTR32MSB: 2140 1.1 christos case R_IA64_LTOFF_FPTR32LSB: 2141 1.1 christos case R_IA64_LTOFF_FPTR64MSB: 2142 1.1 christos case R_IA64_LTOFF_FPTR64LSB: 2143 1.1 christos need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR; 2144 1.1 christos break; 2145 1.1 christos 2146 1.1 christos case R_IA64_FPTR64I: 2147 1.1 christos case R_IA64_FPTR32MSB: 2148 1.1 christos case R_IA64_FPTR32LSB: 2149 1.1 christos case R_IA64_FPTR64MSB: 2150 1.1 christos case R_IA64_FPTR64LSB: 2151 1.1.1.2 christos if (bfd_link_pic (info) || h) 2152 1.1 christos need_entry = NEED_FPTR | NEED_DYNREL; 2153 1.1 christos else 2154 1.1 christos need_entry = NEED_FPTR; 2155 1.1 christos dynrel_type = R_IA64_FPTR64LSB; 2156 1.1 christos break; 2157 1.1 christos 2158 1.1 christos case R_IA64_LTOFF22: 2159 1.1 christos case R_IA64_LTOFF64I: 2160 1.1 christos need_entry = NEED_GOT; 2161 1.1 christos break; 2162 1.1 christos 2163 1.1 christos case R_IA64_LTOFF22X: 2164 1.1 christos need_entry = NEED_GOTX; 2165 1.1 christos break; 2166 1.1 christos 2167 1.1 christos case R_IA64_PLTOFF22: 2168 1.1 christos case R_IA64_PLTOFF64I: 2169 1.1 christos case R_IA64_PLTOFF64MSB: 2170 1.1 christos case R_IA64_PLTOFF64LSB: 2171 1.1 christos need_entry = NEED_PLTOFF; 2172 1.1 christos if (h) 2173 1.1 christos { 2174 1.1 christos if (maybe_dynamic) 2175 1.1 christos need_entry |= NEED_MIN_PLT; 2176 1.1 christos } 2177 1.1 christos break; 2178 1.1 christos 2179 1.1 christos case R_IA64_PCREL21B: 2180 1.1.1.4 christos case R_IA64_PCREL60B: 2181 1.1 christos /* Depending on where this symbol is defined, we may or may not 2182 1.1 christos need a full plt entry. Only skip if we know we'll not need 2183 1.1 christos the entry -- static or symbolic, and the symbol definition 2184 1.1 christos has already been seen. */ 2185 1.1 christos if (maybe_dynamic && rel->r_addend == 0) 2186 1.1 christos need_entry = NEED_FULL_PLT; 2187 1.1 christos break; 2188 1.1 christos 2189 1.1 christos case R_IA64_IMM14: 2190 1.1 christos case R_IA64_IMM22: 2191 1.1 christos case R_IA64_IMM64: 2192 1.1 christos case R_IA64_DIR32MSB: 2193 1.1 christos case R_IA64_DIR32LSB: 2194 1.1 christos case R_IA64_DIR64MSB: 2195 1.1 christos case R_IA64_DIR64LSB: 2196 1.1 christos /* Shared objects will always need at least a REL relocation. */ 2197 1.1.1.2 christos if (bfd_link_pic (info) || maybe_dynamic) 2198 1.1 christos need_entry = NEED_DYNREL; 2199 1.1 christos dynrel_type = R_IA64_DIR64LSB; 2200 1.1 christos break; 2201 1.1 christos 2202 1.1 christos case R_IA64_IPLTMSB: 2203 1.1 christos case R_IA64_IPLTLSB: 2204 1.1 christos break; 2205 1.1 christos 2206 1.1 christos case R_IA64_PCREL22: 2207 1.1 christos case R_IA64_PCREL64I: 2208 1.1 christos case R_IA64_PCREL32MSB: 2209 1.1 christos case R_IA64_PCREL32LSB: 2210 1.1 christos case R_IA64_PCREL64MSB: 2211 1.1 christos case R_IA64_PCREL64LSB: 2212 1.1 christos if (maybe_dynamic) 2213 1.1 christos need_entry = NEED_DYNREL; 2214 1.1 christos dynrel_type = R_IA64_PCREL64LSB; 2215 1.1 christos break; 2216 1.1 christos } 2217 1.1 christos 2218 1.1 christos if (!need_entry) 2219 1.1 christos continue; 2220 1.1 christos 2221 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, false); 2222 1.1 christos 2223 1.1 christos /* Record whether or not this is a local symbol. */ 2224 1.1 christos dyn_i->h = h; 2225 1.1 christos 2226 1.1 christos /* Create what's needed. */ 2227 1.1 christos if (need_entry & (NEED_GOT | NEED_GOTX)) 2228 1.1 christos { 2229 1.1 christos if (!got) 2230 1.1 christos { 2231 1.1 christos got = get_got (abfd, ia64_info); 2232 1.1 christos if (!got) 2233 1.1.1.7 christos return false; 2234 1.1 christos } 2235 1.1 christos if (need_entry & NEED_GOT) 2236 1.1 christos dyn_i->want_got = 1; 2237 1.1 christos if (need_entry & NEED_GOTX) 2238 1.1 christos dyn_i->want_gotx = 1; 2239 1.1 christos } 2240 1.1 christos if (need_entry & NEED_FPTR) 2241 1.1 christos { 2242 1.1.1.4 christos /* Create the .opd section. */ 2243 1.1 christos if (!fptr) 2244 1.1 christos { 2245 1.1 christos fptr = get_fptr (abfd, info, ia64_info); 2246 1.1 christos if (!fptr) 2247 1.1.1.7 christos return false; 2248 1.1 christos } 2249 1.1 christos dyn_i->want_fptr = 1; 2250 1.1 christos } 2251 1.1 christos if (need_entry & NEED_LTOFF_FPTR) 2252 1.1 christos dyn_i->want_ltoff_fptr = 1; 2253 1.1 christos if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT)) 2254 1.1 christos { 2255 1.1.1.4 christos if (!ia64_info->root.dynobj) 2256 1.1 christos ia64_info->root.dynobj = abfd; 2257 1.1 christos h->needs_plt = 1; 2258 1.1 christos dyn_i->want_plt = 1; 2259 1.1 christos } 2260 1.1 christos if (need_entry & NEED_FULL_PLT) 2261 1.1 christos dyn_i->want_plt2 = 1; 2262 1.1 christos if (need_entry & NEED_PLTOFF) 2263 1.1 christos { 2264 1.1 christos /* This is needed here, in case @pltoff is used in a non-shared 2265 1.1 christos link. */ 2266 1.1 christos if (!pltoff) 2267 1.1 christos { 2268 1.1 christos pltoff = get_pltoff (abfd, ia64_info); 2269 1.1 christos if (!pltoff) 2270 1.1.1.7 christos return false; 2271 1.1 christos } 2272 1.1 christos 2273 1.1 christos dyn_i->want_pltoff = 1; 2274 1.1 christos } 2275 1.1 christos if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC)) 2276 1.1 christos { 2277 1.1 christos if (!srel) 2278 1.1 christos { 2279 1.1.1.7 christos srel = get_reloc_section (abfd, ia64_info, sec, true); 2280 1.1 christos if (!srel) 2281 1.1.1.7 christos return false; 2282 1.1 christos } 2283 1.1 christos if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type)) 2284 1.1.1.7 christos return false; 2285 1.1 christos } 2286 1.1 christos } 2287 1.1 christos 2288 1.1.1.7 christos return true; 2289 1.1 christos } 2290 1.1 christos 2291 1.1 christos /* For cleanliness, and potentially faster dynamic loading, allocate 2292 1.1 christos external GOT entries first. */ 2293 1.1 christos 2294 1.1.1.7 christos static bool 2295 1.1 christos allocate_global_data_got (struct elf64_ia64_dyn_sym_info *dyn_i, 2296 1.1 christos void * data) 2297 1.1 christos { 2298 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data; 2299 1.1 christos 2300 1.1 christos if ((dyn_i->want_got || dyn_i->want_gotx) 2301 1.1 christos && ! dyn_i->want_fptr 2302 1.1 christos && elf64_ia64_dynamic_symbol_p (dyn_i->h)) 2303 1.1 christos { 2304 1.1 christos /* GOT entry with FPTR is done by allocate_global_fptr_got. */ 2305 1.1 christos dyn_i->got_offset = x->ofs; 2306 1.1 christos x->ofs += 8; 2307 1.1 christos } 2308 1.1.1.7 christos return true; 2309 1.1 christos } 2310 1.1 christos 2311 1.1 christos /* Next, allocate all the GOT entries used by LTOFF_FPTR relocs. */ 2312 1.1 christos 2313 1.1.1.7 christos static bool 2314 1.1 christos allocate_global_fptr_got (struct elf64_ia64_dyn_sym_info *dyn_i, 2315 1.1 christos void * data) 2316 1.1 christos { 2317 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data; 2318 1.1 christos 2319 1.1 christos if (dyn_i->want_got 2320 1.1 christos && dyn_i->want_fptr 2321 1.1 christos && elf64_ia64_dynamic_symbol_p (dyn_i->h)) 2322 1.1 christos { 2323 1.1 christos dyn_i->got_offset = x->ofs; 2324 1.1 christos x->ofs += 8; 2325 1.1 christos } 2326 1.1.1.7 christos return true; 2327 1.1 christos } 2328 1.1 christos 2329 1.1 christos /* Lastly, allocate all the GOT entries for local data. */ 2330 1.1 christos 2331 1.1.1.7 christos static bool 2332 1.1 christos allocate_local_got (struct elf64_ia64_dyn_sym_info *dyn_i, 2333 1.1 christos void * data) 2334 1.1 christos { 2335 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data; 2336 1.1 christos 2337 1.1 christos if ((dyn_i->want_got || dyn_i->want_gotx) 2338 1.1 christos && !elf64_ia64_dynamic_symbol_p (dyn_i->h)) 2339 1.1 christos { 2340 1.1 christos dyn_i->got_offset = x->ofs; 2341 1.1 christos x->ofs += 8; 2342 1.1 christos } 2343 1.1.1.7 christos return true; 2344 1.1 christos } 2345 1.1 christos 2346 1.1 christos /* Allocate function descriptors. We can do these for every function 2347 1.1 christos in a main executable that is not exported. */ 2348 1.1 christos 2349 1.1.1.7 christos static bool 2350 1.1 christos allocate_fptr (struct elf64_ia64_dyn_sym_info *dyn_i, void * data) 2351 1.1 christos { 2352 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data; 2353 1.1 christos 2354 1.1 christos if (dyn_i->want_fptr) 2355 1.1 christos { 2356 1.1 christos struct elf_link_hash_entry *h = dyn_i->h; 2357 1.1 christos 2358 1.1 christos if (h) 2359 1.1 christos while (h->root.type == bfd_link_hash_indirect 2360 1.1 christos || h->root.type == bfd_link_hash_warning) 2361 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 2362 1.1 christos 2363 1.1 christos if (h == NULL || !h->def_dynamic) 2364 1.1 christos { 2365 1.1.1.4 christos /* A non dynamic symbol. */ 2366 1.1 christos dyn_i->fptr_offset = x->ofs; 2367 1.1 christos x->ofs += 16; 2368 1.1 christos } 2369 1.1 christos else 2370 1.1 christos dyn_i->want_fptr = 0; 2371 1.1 christos } 2372 1.1.1.7 christos return true; 2373 1.1 christos } 2374 1.1 christos 2375 1.1 christos /* Allocate all the minimal PLT entries. */ 2376 1.1 christos 2377 1.1.1.7 christos static bool 2378 1.1 christos allocate_plt_entries (struct elf64_ia64_dyn_sym_info *dyn_i, 2379 1.1 christos void * data ATTRIBUTE_UNUSED) 2380 1.1 christos { 2381 1.1 christos if (dyn_i->want_plt) 2382 1.1 christos { 2383 1.1 christos struct elf_link_hash_entry *h = dyn_i->h; 2384 1.1 christos 2385 1.1 christos if (h) 2386 1.1 christos while (h->root.type == bfd_link_hash_indirect 2387 1.1 christos || h->root.type == bfd_link_hash_warning) 2388 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 2389 1.1 christos 2390 1.1 christos /* ??? Versioned symbols seem to lose NEEDS_PLT. */ 2391 1.1 christos if (elf64_ia64_dynamic_symbol_p (h)) 2392 1.1 christos { 2393 1.1 christos dyn_i->want_pltoff = 1; 2394 1.1 christos } 2395 1.1 christos else 2396 1.1 christos { 2397 1.1 christos dyn_i->want_plt = 0; 2398 1.1 christos dyn_i->want_plt2 = 0; 2399 1.1 christos } 2400 1.1 christos } 2401 1.1.1.7 christos return true; 2402 1.1 christos } 2403 1.1 christos 2404 1.1 christos /* Allocate all the full PLT entries. */ 2405 1.1 christos 2406 1.1.1.7 christos static bool 2407 1.1 christos allocate_plt2_entries (struct elf64_ia64_dyn_sym_info *dyn_i, 2408 1.1 christos void * data) 2409 1.1 christos { 2410 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data; 2411 1.1 christos 2412 1.1 christos if (dyn_i->want_plt2) 2413 1.1 christos { 2414 1.1 christos struct elf_link_hash_entry *h = dyn_i->h; 2415 1.1 christos bfd_size_type ofs = x->ofs; 2416 1.1 christos 2417 1.1 christos dyn_i->plt2_offset = ofs; 2418 1.1 christos x->ofs = ofs + PLT_FULL_ENTRY_SIZE; 2419 1.1 christos 2420 1.1 christos while (h->root.type == bfd_link_hash_indirect 2421 1.1 christos || h->root.type == bfd_link_hash_warning) 2422 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 2423 1.1 christos dyn_i->h->plt.offset = ofs; 2424 1.1 christos } 2425 1.1.1.7 christos return true; 2426 1.1 christos } 2427 1.1 christos 2428 1.1 christos /* Allocate all the PLTOFF entries requested by relocations and 2429 1.1 christos plt entries. We can't share space with allocated FPTR entries, 2430 1.1 christos because the latter are not necessarily addressable by the GP. 2431 1.1 christos ??? Relaxation might be able to determine that they are. */ 2432 1.1 christos 2433 1.1.1.7 christos static bool 2434 1.1 christos allocate_pltoff_entries (struct elf64_ia64_dyn_sym_info *dyn_i, 2435 1.1 christos void * data) 2436 1.1 christos { 2437 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data; 2438 1.1 christos 2439 1.1 christos if (dyn_i->want_pltoff) 2440 1.1 christos { 2441 1.1 christos dyn_i->pltoff_offset = x->ofs; 2442 1.1 christos x->ofs += 16; 2443 1.1 christos } 2444 1.1.1.7 christos return true; 2445 1.1 christos } 2446 1.1 christos 2447 1.1 christos /* Allocate dynamic relocations for those symbols that turned out 2448 1.1 christos to be dynamic. */ 2449 1.1 christos 2450 1.1.1.7 christos static bool 2451 1.1 christos allocate_dynrel_entries (struct elf64_ia64_dyn_sym_info *dyn_i, 2452 1.1 christos void * data) 2453 1.1 christos { 2454 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data; 2455 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 2456 1.1 christos struct elf64_ia64_dyn_reloc_entry *rent; 2457 1.1.1.7 christos bool dynamic_symbol, shared, resolved_zero; 2458 1.1 christos struct elf64_ia64_link_hash_entry *h_ia64; 2459 1.1 christos 2460 1.1 christos ia64_info = elf64_ia64_hash_table (x->info); 2461 1.1 christos if (ia64_info == NULL) 2462 1.1.1.7 christos return false; 2463 1.1 christos 2464 1.1 christos /* Note that this can't be used in relation to FPTR relocs below. */ 2465 1.1 christos dynamic_symbol = elf64_ia64_dynamic_symbol_p (dyn_i->h); 2466 1.1 christos 2467 1.1.1.2 christos shared = bfd_link_pic (x->info); 2468 1.1 christos resolved_zero = (dyn_i->h 2469 1.1 christos && ELF_ST_VISIBILITY (dyn_i->h->other) 2470 1.1 christos && dyn_i->h->root.type == bfd_link_hash_undefweak); 2471 1.1 christos 2472 1.1 christos /* Take care of the GOT and PLT relocations. */ 2473 1.1 christos 2474 1.1 christos if ((!resolved_zero 2475 1.1 christos && (dynamic_symbol || shared) 2476 1.1 christos && (dyn_i->want_got || dyn_i->want_gotx)) 2477 1.1 christos || (dyn_i->want_ltoff_fptr 2478 1.1 christos && dyn_i->h 2479 1.1 christos && dyn_i->h->def_dynamic)) 2480 1.1 christos { 2481 1.1 christos /* VMS: FIX64. */ 2482 1.1 christos if (dyn_i->h != NULL && dyn_i->h->def_dynamic) 2483 1.1.1.4 christos { 2484 1.1.1.4 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h; 2485 1.1.1.4 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off += 2486 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2487 1.1.1.4 christos ia64_info->fixups_sec->size += 2488 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2489 1.1.1.4 christos } 2490 1.1 christos } 2491 1.1 christos 2492 1.1 christos if (ia64_info->rel_fptr_sec && dyn_i->want_fptr) 2493 1.1 christos { 2494 1.1 christos /* VMS: only image reloc. */ 2495 1.1 christos if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak) 2496 1.1 christos ia64_info->rel_fptr_sec->size += sizeof (Elf64_External_Rela); 2497 1.1 christos } 2498 1.1 christos 2499 1.1 christos if (!resolved_zero && dyn_i->want_pltoff) 2500 1.1 christos { 2501 1.1 christos /* VMS: FIXFD. */ 2502 1.1 christos if (dyn_i->h != NULL && dyn_i->h->def_dynamic) 2503 1.1.1.4 christos { 2504 1.1.1.4 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h; 2505 1.1.1.4 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off += 2506 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2507 1.1.1.4 christos ia64_info->fixups_sec->size += 2508 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2509 1.1.1.4 christos } 2510 1.1 christos } 2511 1.1 christos 2512 1.1 christos /* Take care of the normal data relocations. */ 2513 1.1 christos 2514 1.1 christos for (rent = dyn_i->reloc_entries; rent; rent = rent->next) 2515 1.1 christos { 2516 1.1 christos switch (rent->type) 2517 1.1 christos { 2518 1.1 christos case R_IA64_FPTR32LSB: 2519 1.1 christos case R_IA64_FPTR64LSB: 2520 1.1 christos /* Allocate one iff !want_fptr and not PIE, which by this point 2521 1.1 christos will be true only if we're actually allocating one statically 2522 1.1 christos in the main executable. Position independent executables 2523 1.1 christos need a relative reloc. */ 2524 1.1.1.2 christos if (dyn_i->want_fptr && !bfd_link_pie (x->info)) 2525 1.1 christos continue; 2526 1.1 christos break; 2527 1.1 christos case R_IA64_PCREL32LSB: 2528 1.1 christos case R_IA64_PCREL64LSB: 2529 1.1 christos if (!dynamic_symbol) 2530 1.1 christos continue; 2531 1.1 christos break; 2532 1.1 christos case R_IA64_DIR32LSB: 2533 1.1 christos case R_IA64_DIR64LSB: 2534 1.1 christos if (!dynamic_symbol && !shared) 2535 1.1 christos continue; 2536 1.1 christos break; 2537 1.1 christos case R_IA64_IPLTLSB: 2538 1.1 christos if (!dynamic_symbol && !shared) 2539 1.1 christos continue; 2540 1.1 christos break; 2541 1.1 christos case R_IA64_DTPREL32LSB: 2542 1.1 christos case R_IA64_TPREL64LSB: 2543 1.1 christos case R_IA64_DTPREL64LSB: 2544 1.1 christos case R_IA64_DTPMOD64LSB: 2545 1.1 christos break; 2546 1.1 christos default: 2547 1.1 christos abort (); 2548 1.1 christos } 2549 1.1 christos 2550 1.1 christos /* Add a fixup. */ 2551 1.1 christos if (!dynamic_symbol) 2552 1.1.1.4 christos abort (); 2553 1.1 christos 2554 1.1 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h; 2555 1.1 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off += 2556 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2557 1.1 christos ia64_info->fixups_sec->size += 2558 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2559 1.1 christos } 2560 1.1 christos 2561 1.1.1.7 christos return true; 2562 1.1 christos } 2563 1.1 christos 2564 1.1.1.7 christos static bool 2565 1.1 christos elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED, 2566 1.1 christos struct elf_link_hash_entry *h) 2567 1.1 christos { 2568 1.1 christos /* ??? Undefined symbols with PLT entries should be re-defined 2569 1.1 christos to be the PLT entry. */ 2570 1.1 christos 2571 1.1 christos /* If this is a weak symbol, and there is a real definition, the 2572 1.1 christos processor independent code will have arranged for us to see the 2573 1.1 christos real definition first, and we can just use the same value. */ 2574 1.1.1.4 christos if (h->is_weakalias) 2575 1.1 christos { 2576 1.1.1.4 christos struct elf_link_hash_entry *def = weakdef (h); 2577 1.1.1.4 christos BFD_ASSERT (def->root.type == bfd_link_hash_defined); 2578 1.1.1.4 christos h->root.u.def.section = def->root.u.def.section; 2579 1.1.1.4 christos h->root.u.def.value = def->root.u.def.value; 2580 1.1.1.7 christos return true; 2581 1.1 christos } 2582 1.1 christos 2583 1.1 christos /* If this is a reference to a symbol defined by a dynamic object which 2584 1.1 christos is not a function, we might allocate the symbol in our .dynbss section 2585 1.1 christos and allocate a COPY dynamic relocation. 2586 1.1 christos 2587 1.1 christos But IA-64 code is canonically PIC, so as a rule we can avoid this sort 2588 1.1 christos of hackery. */ 2589 1.1 christos 2590 1.1.1.7 christos return true; 2591 1.1 christos } 2592 1.1 christos 2593 1.1.1.7 christos static bool 2594 1.1.1.9 christos elf64_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 2595 1.1.1.9 christos struct bfd_link_info *info) 2596 1.1 christos { 2597 1.1 christos struct elf64_ia64_allocate_data data; 2598 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 2599 1.1 christos asection *sec; 2600 1.1 christos bfd *dynobj; 2601 1.1 christos struct elf_link_hash_table *hash_table; 2602 1.1 christos 2603 1.1 christos hash_table = elf_hash_table (info); 2604 1.1 christos ia64_info = elf64_ia64_hash_table (info); 2605 1.1 christos if (ia64_info == NULL) 2606 1.1.1.7 christos return false; 2607 1.1.1.9 christos dynobj = hash_table->dynobj; 2608 1.1.1.9 christos if (dynobj == NULL) 2609 1.1.1.9 christos return true; 2610 1.1 christos data.info = info; 2611 1.1 christos 2612 1.1 christos /* Allocate the GOT entries. */ 2613 1.1 christos 2614 1.1 christos if (ia64_info->root.sgot) 2615 1.1 christos { 2616 1.1 christos data.ofs = 0; 2617 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data); 2618 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data); 2619 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data); 2620 1.1 christos ia64_info->root.sgot->size = data.ofs; 2621 1.1 christos } 2622 1.1 christos 2623 1.1 christos /* Allocate the FPTR entries. */ 2624 1.1 christos 2625 1.1 christos if (ia64_info->fptr_sec) 2626 1.1 christos { 2627 1.1 christos data.ofs = 0; 2628 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data); 2629 1.1 christos ia64_info->fptr_sec->size = data.ofs; 2630 1.1 christos } 2631 1.1 christos 2632 1.1 christos /* Now that we've seen all of the input files, we can decide which 2633 1.1 christos symbols need plt entries. Allocate the minimal PLT entries first. 2634 1.1 christos We do this even though dynamic_sections_created may be FALSE, because 2635 1.1 christos this has the side-effect of clearing want_plt and want_plt2. */ 2636 1.1 christos 2637 1.1 christos data.ofs = 0; 2638 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data); 2639 1.1 christos 2640 1.1 christos /* Align the pointer for the plt2 entries. */ 2641 1.1 christos data.ofs = (data.ofs + 31) & (bfd_vma) -32; 2642 1.1 christos 2643 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data); 2644 1.1 christos if (data.ofs != 0 || ia64_info->root.dynamic_sections_created) 2645 1.1 christos { 2646 1.1 christos /* FIXME: we always reserve the memory for dynamic linker even if 2647 1.1 christos there are no PLT entries since dynamic linker may assume the 2648 1.1 christos reserved memory always exists. */ 2649 1.1 christos 2650 1.1 christos BFD_ASSERT (ia64_info->root.dynamic_sections_created); 2651 1.1 christos 2652 1.1 christos ia64_info->root.splt->size = data.ofs; 2653 1.1 christos } 2654 1.1 christos 2655 1.1 christos /* Allocate the PLTOFF entries. */ 2656 1.1 christos 2657 1.1 christos if (ia64_info->pltoff_sec) 2658 1.1 christos { 2659 1.1 christos data.ofs = 0; 2660 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data); 2661 1.1 christos ia64_info->pltoff_sec->size = data.ofs; 2662 1.1 christos } 2663 1.1 christos 2664 1.1 christos if (ia64_info->root.dynamic_sections_created) 2665 1.1 christos { 2666 1.1 christos /* Allocate space for the dynamic relocations that turned out to be 2667 1.1 christos required. */ 2668 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data); 2669 1.1 christos } 2670 1.1 christos 2671 1.1 christos /* We have now determined the sizes of the various dynamic sections. 2672 1.1 christos Allocate memory for them. */ 2673 1.1 christos for (sec = dynobj->sections; sec != NULL; sec = sec->next) 2674 1.1 christos { 2675 1.1.1.7 christos bool strip; 2676 1.1 christos 2677 1.1 christos if (!(sec->flags & SEC_LINKER_CREATED)) 2678 1.1 christos continue; 2679 1.1 christos 2680 1.1 christos /* If we don't need this section, strip it from the output file. 2681 1.1 christos There were several sections primarily related to dynamic 2682 1.1 christos linking that must be create before the linker maps input 2683 1.1 christos sections to output sections. The linker does that before 2684 1.1 christos bfd_elf_size_dynamic_sections is called, and it is that 2685 1.1 christos function which decides whether anything needs to go into 2686 1.1 christos these sections. */ 2687 1.1 christos 2688 1.1 christos strip = (sec->size == 0); 2689 1.1 christos 2690 1.1 christos if (sec == ia64_info->root.sgot) 2691 1.1.1.7 christos strip = false; 2692 1.1 christos else if (sec == ia64_info->root.srelgot) 2693 1.1 christos { 2694 1.1 christos if (strip) 2695 1.1 christos ia64_info->root.srelgot = NULL; 2696 1.1 christos else 2697 1.1 christos /* We use the reloc_count field as a counter if we need to 2698 1.1 christos copy relocs into the output file. */ 2699 1.1 christos sec->reloc_count = 0; 2700 1.1 christos } 2701 1.1 christos else if (sec == ia64_info->fptr_sec) 2702 1.1 christos { 2703 1.1 christos if (strip) 2704 1.1 christos ia64_info->fptr_sec = NULL; 2705 1.1 christos } 2706 1.1 christos else if (sec == ia64_info->rel_fptr_sec) 2707 1.1 christos { 2708 1.1 christos if (strip) 2709 1.1 christos ia64_info->rel_fptr_sec = NULL; 2710 1.1 christos else 2711 1.1 christos /* We use the reloc_count field as a counter if we need to 2712 1.1 christos copy relocs into the output file. */ 2713 1.1 christos sec->reloc_count = 0; 2714 1.1 christos } 2715 1.1 christos else if (sec == ia64_info->root.splt) 2716 1.1 christos { 2717 1.1 christos if (strip) 2718 1.1 christos ia64_info->root.splt = NULL; 2719 1.1 christos } 2720 1.1 christos else if (sec == ia64_info->pltoff_sec) 2721 1.1 christos { 2722 1.1 christos if (strip) 2723 1.1 christos ia64_info->pltoff_sec = NULL; 2724 1.1 christos } 2725 1.1 christos else if (sec == ia64_info->fixups_sec) 2726 1.1 christos { 2727 1.1.1.4 christos if (strip) 2728 1.1.1.4 christos ia64_info->fixups_sec = NULL; 2729 1.1 christos } 2730 1.1 christos else if (sec == ia64_info->transfer_sec) 2731 1.1.1.4 christos { 2732 1.1.1.4 christos ; 2733 1.1.1.4 christos } 2734 1.1 christos else 2735 1.1 christos { 2736 1.1 christos const char *name; 2737 1.1 christos 2738 1.1 christos /* It's OK to base decisions on the section name, because none 2739 1.1 christos of the dynobj section names depend upon the input files. */ 2740 1.1.1.6 christos name = bfd_section_name (sec); 2741 1.1 christos 2742 1.1 christos if (strcmp (name, ".got.plt") == 0) 2743 1.1.1.7 christos strip = false; 2744 1.1.1.7 christos else if (startswith (name, ".rel")) 2745 1.1 christos { 2746 1.1 christos if (!strip) 2747 1.1 christos { 2748 1.1 christos /* We use the reloc_count field as a counter if we need to 2749 1.1 christos copy relocs into the output file. */ 2750 1.1 christos sec->reloc_count = 0; 2751 1.1 christos } 2752 1.1 christos } 2753 1.1 christos else 2754 1.1 christos continue; 2755 1.1 christos } 2756 1.1 christos 2757 1.1 christos if (strip) 2758 1.1 christos sec->flags |= SEC_EXCLUDE; 2759 1.1 christos else 2760 1.1 christos { 2761 1.1 christos /* Allocate memory for the section contents. */ 2762 1.1 christos sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size); 2763 1.1 christos if (sec->contents == NULL && sec->size != 0) 2764 1.1.1.7 christos return false; 2765 1.1.1.9 christos sec->alloced = 1; 2766 1.1 christos } 2767 1.1 christos } 2768 1.1 christos 2769 1.1 christos if (elf_hash_table (info)->dynamic_sections_created) 2770 1.1 christos { 2771 1.1 christos bfd *abfd; 2772 1.1 christos asection *dynsec; 2773 1.1 christos asection *dynstrsec; 2774 1.1 christos Elf_Internal_Dyn dyn; 2775 1.1.1.10 christos elf_backend_data *bed; 2776 1.1 christos unsigned int shl_num = 0; 2777 1.1 christos bfd_vma fixups_off = 0; 2778 1.1 christos bfd_vma strdyn_off; 2779 1.1 christos unsigned int time_hi, time_lo; 2780 1.1 christos 2781 1.1 christos /* The .dynamic section must exist and be empty. */ 2782 1.1 christos dynsec = bfd_get_linker_section (hash_table->dynobj, ".dynamic"); 2783 1.1 christos BFD_ASSERT (dynsec != NULL); 2784 1.1 christos BFD_ASSERT (dynsec->size == 0); 2785 1.1 christos 2786 1.1 christos dynstrsec = bfd_get_linker_section (hash_table->dynobj, ".vmsdynstr"); 2787 1.1 christos BFD_ASSERT (dynstrsec != NULL); 2788 1.1 christos BFD_ASSERT (dynstrsec->size == 0); 2789 1.1 christos dynstrsec->size = 1; /* Initial blank. */ 2790 1.1 christos 2791 1.1 christos /* Ident + link time. */ 2792 1.1 christos vms_get_time (&time_hi, &time_lo); 2793 1.1 christos 2794 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_IDENT, 0)) 2795 1.1.1.7 christos return false; 2796 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LINKTIME, 2797 1.1.1.7 christos ((uint64_t) time_hi << 32) 2798 1.1.1.4 christos + time_lo)) 2799 1.1.1.7 christos return false; 2800 1.1 christos 2801 1.1 christos /* Strtab. */ 2802 1.1 christos strdyn_off = dynsec->size; 2803 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_STRTAB_OFFSET, 0)) 2804 1.1.1.7 christos return false; 2805 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_STRSZ, 0)) 2806 1.1.1.7 christos return false; 2807 1.1 christos 2808 1.1 christos /* PLTGOT */ 2809 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_SEG, 0)) 2810 1.1.1.7 christos return false; 2811 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_OFFSET, 0)) 2812 1.1.1.7 christos return false; 2813 1.1 christos 2814 1.1 christos /* Misc. */ 2815 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FPMODE, 0x9800000)) 2816 1.1.1.7 christos return false; 2817 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LNKFLAGS, 2818 1.1.1.4 christos VMS_LF_IMGSTA | VMS_LF_MAIN)) 2819 1.1.1.7 christos return false; 2820 1.1 christos 2821 1.1 christos /* Add entries for shared libraries. */ 2822 1.1.1.2 christos for (abfd = info->input_bfds; abfd; abfd = abfd->link.next) 2823 1.1.1.4 christos { 2824 1.1.1.4 christos char *soname; 2825 1.1.1.4 christos size_t soname_len; 2826 1.1.1.4 christos bfd_size_type strindex; 2827 1.1.1.4 christos bfd_byte *newcontents; 2828 1.1.1.4 christos bfd_vma fixups_shl_off; 2829 1.1.1.4 christos 2830 1.1.1.4 christos if (!(abfd->flags & DYNAMIC)) 2831 1.1.1.4 christos continue; 2832 1.1.1.4 christos BFD_ASSERT (abfd->xvec == output_bfd->xvec); 2833 1.1.1.4 christos 2834 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_NEEDED_IDENT, 2835 1.1.1.4 christos elf_ia64_vms_ident (abfd))) 2836 1.1.1.7 christos return false; 2837 1.1.1.4 christos 2838 1.1.1.7 christos soname = vms_get_module_name (bfd_get_filename (abfd), true); 2839 1.1.1.4 christos if (soname == NULL) 2840 1.1.1.7 christos return false; 2841 1.1.1.4 christos strindex = dynstrsec->size; 2842 1.1.1.4 christos soname_len = strlen (soname) + 1; 2843 1.1.1.4 christos newcontents = (bfd_byte *) bfd_realloc (dynstrsec->contents, 2844 1.1.1.4 christos strindex + soname_len); 2845 1.1.1.4 christos if (newcontents == NULL) 2846 1.1.1.7 christos return false; 2847 1.1.1.4 christos memcpy (newcontents + strindex, soname, soname_len); 2848 1.1.1.4 christos dynstrsec->size += soname_len; 2849 1.1.1.4 christos dynstrsec->contents = newcontents; 2850 1.1.1.4 christos 2851 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex)) 2852 1.1.1.7 christos return false; 2853 1.1.1.4 christos 2854 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_NEEDED, 2855 1.1.1.4 christos shl_num)) 2856 1.1.1.7 christos return false; 2857 1.1.1.4 christos shl_num++; 2858 1.1.1.4 christos 2859 1.1.1.4 christos /* The fixups_off was in fact containing the size of the fixup 2860 1.1.1.4 christos section. Remap into the offset. */ 2861 1.1.1.4 christos fixups_shl_off = elf_ia64_vms_tdata (abfd)->fixups_off; 2862 1.1.1.4 christos elf_ia64_vms_tdata (abfd)->fixups_off = fixups_off; 2863 1.1.1.4 christos 2864 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry 2865 1.1.1.4 christos (info, DT_IA_64_VMS_FIXUP_RELA_CNT, 2866 1.1.1.4 christos fixups_shl_off / sizeof (Elf64_External_VMS_IMAGE_FIXUP))) 2867 1.1.1.7 christos return false; 2868 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_RELA_OFF, 2869 1.1.1.4 christos fixups_off)) 2870 1.1.1.7 christos return false; 2871 1.1.1.4 christos fixups_off += fixups_shl_off; 2872 1.1.1.4 christos } 2873 1.1 christos 2874 1.1 christos /* Unwind. */ 2875 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWINDSZ, 0)) 2876 1.1.1.7 christos return false; 2877 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_CODSEG, 0)) 2878 1.1.1.7 christos return false; 2879 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_INFOSEG, 0)) 2880 1.1.1.7 christos return false; 2881 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_OFFSET, 0)) 2882 1.1.1.7 christos return false; 2883 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_SEG, 0)) 2884 1.1.1.7 christos return false; 2885 1.1 christos 2886 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_NULL, 0xdead)) 2887 1.1.1.7 christos return false; 2888 1.1 christos 2889 1.1 christos /* Fix the strtab entries. */ 2890 1.1 christos bed = get_elf_backend_data (hash_table->dynobj); 2891 1.1 christos 2892 1.1 christos if (dynstrsec->size > 1) 2893 1.1.1.4 christos dynstrsec->contents[0] = 0; 2894 1.1 christos else 2895 1.1.1.4 christos dynstrsec->size = 0; 2896 1.1 christos 2897 1.1 christos /* Note: one 'spare' (ie DT_NULL) entry is added by 2898 1.1.1.4 christos bfd_elf_size_dynsym_hash_dynstr. */ 2899 1.1 christos dyn.d_tag = DT_IA_64_VMS_STRTAB_OFFSET; 2900 1.1 christos dyn.d_un.d_val = dynsec->size /* + sizeof (Elf64_External_Dyn) */; 2901 1.1 christos bed->s->swap_dyn_out (hash_table->dynobj, &dyn, 2902 1.1.1.4 christos dynsec->contents + strdyn_off); 2903 1.1 christos 2904 1.1 christos dyn.d_tag = DT_STRSZ; 2905 1.1 christos dyn.d_un.d_val = dynstrsec->size; 2906 1.1 christos bed->s->swap_dyn_out (hash_table->dynobj, &dyn, 2907 1.1.1.4 christos dynsec->contents + strdyn_off + bed->s->sizeof_dyn); 2908 1.1 christos 2909 1.1 christos elf_ia64_vms_tdata (output_bfd)->needed_count = shl_num; 2910 1.1 christos 2911 1.1 christos /* Note section. */ 2912 1.1 christos if (!create_ia64_vms_notes (output_bfd, info, time_hi, time_lo)) 2913 1.1.1.7 christos return false; 2914 1.1 christos } 2915 1.1 christos 2916 1.1 christos /* ??? Perhaps force __gp local. */ 2917 1.1 christos 2918 1.1.1.7 christos return true; 2919 1.1 christos } 2920 1.1 christos 2921 1.1 christos static void 2922 1.1 christos elf64_ia64_install_fixup (bfd *output_bfd, 2923 1.1.1.4 christos struct elf64_ia64_link_hash_table *ia64_info, 2924 1.1.1.4 christos struct elf_link_hash_entry *h, 2925 1.1.1.4 christos unsigned int type, asection *sec, bfd_vma offset, 2926 1.1.1.4 christos bfd_vma addend) 2927 1.1 christos { 2928 1.1 christos asection *relsec; 2929 1.1 christos Elf64_External_VMS_IMAGE_FIXUP *fixup; 2930 1.1 christos struct elf64_ia64_link_hash_entry *h_ia64; 2931 1.1 christos bfd_vma fixoff; 2932 1.1 christos Elf_Internal_Phdr *phdr; 2933 1.1 christos 2934 1.1 christos if (h == NULL || !h->def_dynamic) 2935 1.1 christos abort (); 2936 1.1 christos 2937 1.1 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) h; 2938 1.1 christos fixoff = elf_ia64_vms_tdata (h_ia64->shl)->fixups_off; 2939 1.1 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off += 2940 1.1 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP); 2941 1.1 christos relsec = ia64_info->fixups_sec; 2942 1.1 christos 2943 1.1 christos fixup = (Elf64_External_VMS_IMAGE_FIXUP *)(relsec->contents + fixoff); 2944 1.1 christos offset += sec->output_section->vma + sec->output_offset; 2945 1.1 christos 2946 1.1 christos /* FIXME: this is slow. We should cache the last one used, or create a 2947 1.1 christos map. */ 2948 1.1 christos phdr = _bfd_elf_find_segment_containing_section 2949 1.1 christos (output_bfd, sec->output_section); 2950 1.1 christos BFD_ASSERT (phdr != NULL); 2951 1.1 christos 2952 1.1 christos bfd_putl64 (offset - phdr->p_vaddr, fixup->fixup_offset); 2953 1.1 christos bfd_putl32 (type, fixup->type); 2954 1.1 christos bfd_putl32 (phdr - elf_tdata (output_bfd)->phdr, fixup->fixup_seg); 2955 1.1 christos bfd_putl64 (addend, fixup->addend); 2956 1.1 christos bfd_putl32 (h->root.u.def.value, fixup->symvec_index); 2957 1.1 christos bfd_putl32 (2, fixup->data_type); 2958 1.1 christos } 2959 1.1 christos 2960 1.1 christos /* Store an entry for target address TARGET_ADDR in the linkage table 2961 1.1 christos and return the gp-relative address of the linkage table entry. */ 2962 1.1 christos 2963 1.1 christos static bfd_vma 2964 1.1 christos set_got_entry (bfd *abfd, struct bfd_link_info *info, 2965 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i, 2966 1.1 christos bfd_vma addend, bfd_vma value, unsigned int dyn_r_type) 2967 1.1 christos { 2968 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 2969 1.1 christos asection *got_sec; 2970 1.1.1.7 christos bool done; 2971 1.1 christos bfd_vma got_offset; 2972 1.1 christos 2973 1.1 christos ia64_info = elf64_ia64_hash_table (info); 2974 1.1 christos if (ia64_info == NULL) 2975 1.1 christos return 0; 2976 1.1 christos 2977 1.1 christos got_sec = ia64_info->root.sgot; 2978 1.1 christos 2979 1.1 christos switch (dyn_r_type) 2980 1.1 christos { 2981 1.1 christos case R_IA64_TPREL64LSB: 2982 1.1 christos case R_IA64_DTPMOD64LSB: 2983 1.1 christos case R_IA64_DTPREL32LSB: 2984 1.1 christos case R_IA64_DTPREL64LSB: 2985 1.1 christos abort (); 2986 1.1 christos break; 2987 1.1 christos default: 2988 1.1 christos done = dyn_i->got_done; 2989 1.1.1.7 christos dyn_i->got_done = true; 2990 1.1 christos got_offset = dyn_i->got_offset; 2991 1.1 christos break; 2992 1.1 christos } 2993 1.1 christos 2994 1.1 christos BFD_ASSERT ((got_offset & 7) == 0); 2995 1.1 christos 2996 1.1 christos if (! done) 2997 1.1 christos { 2998 1.1 christos /* Store the target address in the linkage table entry. */ 2999 1.1 christos bfd_put_64 (abfd, value, got_sec->contents + got_offset); 3000 1.1 christos 3001 1.1 christos /* Install a dynamic relocation if needed. */ 3002 1.1.1.2 christos if (((bfd_link_pic (info) 3003 1.1 christos && (!dyn_i->h 3004 1.1 christos || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT 3005 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak)) 3006 1.1.1.4 christos || elf64_ia64_dynamic_symbol_p (dyn_i->h)) 3007 1.1 christos && (!dyn_i->want_ltoff_fptr 3008 1.1.1.2 christos || !bfd_link_pie (info) 3009 1.1 christos || !dyn_i->h 3010 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak)) 3011 1.1 christos { 3012 1.1 christos if (!dyn_i->h || !dyn_i->h->def_dynamic) 3013 1.1 christos { 3014 1.1 christos dyn_r_type = R_IA64_REL64LSB; 3015 1.1 christos addend = value; 3016 1.1 christos } 3017 1.1 christos 3018 1.1.1.4 christos /* VMS: install a FIX32 or FIX64. */ 3019 1.1.1.4 christos switch (dyn_r_type) 3020 1.1.1.4 christos { 3021 1.1.1.4 christos case R_IA64_DIR32LSB: 3022 1.1.1.4 christos case R_IA64_FPTR32LSB: 3023 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX32; 3024 1.1.1.4 christos break; 3025 1.1.1.4 christos case R_IA64_DIR64LSB: 3026 1.1.1.4 christos case R_IA64_FPTR64LSB: 3027 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX64; 3028 1.1.1.4 christos break; 3029 1.1.1.4 christos default: 3030 1.1.1.7 christos BFD_ASSERT (false); 3031 1.1.1.4 christos break; 3032 1.1.1.4 christos } 3033 1.1.1.4 christos elf64_ia64_install_fixup 3034 1.1.1.4 christos (info->output_bfd, ia64_info, dyn_i->h, 3035 1.1.1.4 christos dyn_r_type, got_sec, got_offset, addend); 3036 1.1.1.4 christos } 3037 1.1 christos } 3038 1.1 christos 3039 1.1 christos /* Return the address of the linkage table entry. */ 3040 1.1 christos value = (got_sec->output_section->vma 3041 1.1 christos + got_sec->output_offset 3042 1.1 christos + got_offset); 3043 1.1 christos 3044 1.1 christos return value; 3045 1.1 christos } 3046 1.1 christos 3047 1.1 christos /* Fill in a function descriptor consisting of the function's code 3048 1.1 christos address and its global pointer. Return the descriptor's address. */ 3049 1.1 christos 3050 1.1 christos static bfd_vma 3051 1.1 christos set_fptr_entry (bfd *abfd, struct bfd_link_info *info, 3052 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i, 3053 1.1 christos bfd_vma value) 3054 1.1 christos { 3055 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 3056 1.1 christos asection *fptr_sec; 3057 1.1 christos 3058 1.1 christos ia64_info = elf64_ia64_hash_table (info); 3059 1.1 christos if (ia64_info == NULL) 3060 1.1 christos return 0; 3061 1.1 christos 3062 1.1 christos fptr_sec = ia64_info->fptr_sec; 3063 1.1 christos 3064 1.1 christos if (!dyn_i->fptr_done) 3065 1.1 christos { 3066 1.1 christos dyn_i->fptr_done = 1; 3067 1.1 christos 3068 1.1 christos /* Fill in the function descriptor. */ 3069 1.1 christos bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset); 3070 1.1 christos bfd_put_64 (abfd, _bfd_get_gp_value (abfd), 3071 1.1 christos fptr_sec->contents + dyn_i->fptr_offset + 8); 3072 1.1 christos } 3073 1.1 christos 3074 1.1 christos /* Return the descriptor's address. */ 3075 1.1 christos value = (fptr_sec->output_section->vma 3076 1.1 christos + fptr_sec->output_offset 3077 1.1 christos + dyn_i->fptr_offset); 3078 1.1 christos 3079 1.1 christos return value; 3080 1.1 christos } 3081 1.1 christos 3082 1.1 christos /* Fill in a PLTOFF entry consisting of the function's code address 3083 1.1 christos and its global pointer. Return the descriptor's address. */ 3084 1.1 christos 3085 1.1 christos static bfd_vma 3086 1.1 christos set_pltoff_entry (bfd *abfd, struct bfd_link_info *info, 3087 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i, 3088 1.1.1.7 christos bfd_vma value, bool is_plt) 3089 1.1 christos { 3090 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 3091 1.1 christos asection *pltoff_sec; 3092 1.1 christos 3093 1.1 christos ia64_info = elf64_ia64_hash_table (info); 3094 1.1 christos if (ia64_info == NULL) 3095 1.1 christos return 0; 3096 1.1 christos 3097 1.1 christos pltoff_sec = ia64_info->pltoff_sec; 3098 1.1 christos 3099 1.1 christos /* Don't do anything if this symbol uses a real PLT entry. In 3100 1.1 christos that case, we'll fill this in during finish_dynamic_symbol. */ 3101 1.1 christos if ((! dyn_i->want_plt || is_plt) 3102 1.1 christos && !dyn_i->pltoff_done) 3103 1.1 christos { 3104 1.1 christos bfd_vma gp = _bfd_get_gp_value (abfd); 3105 1.1 christos 3106 1.1 christos /* Fill in the function descriptor. */ 3107 1.1 christos bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset); 3108 1.1 christos bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8); 3109 1.1 christos 3110 1.1 christos /* Install dynamic relocations if needed. */ 3111 1.1 christos if (!is_plt 3112 1.1.1.2 christos && bfd_link_pic (info) 3113 1.1 christos && (!dyn_i->h 3114 1.1 christos || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT 3115 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak)) 3116 1.1 christos { 3117 1.1.1.4 christos /* VMS: */ 3118 1.1.1.4 christos abort (); 3119 1.1 christos } 3120 1.1 christos 3121 1.1 christos dyn_i->pltoff_done = 1; 3122 1.1 christos } 3123 1.1 christos 3124 1.1 christos /* Return the descriptor's address. */ 3125 1.1 christos value = (pltoff_sec->output_section->vma 3126 1.1 christos + pltoff_sec->output_offset 3127 1.1 christos + dyn_i->pltoff_offset); 3128 1.1 christos 3129 1.1 christos return value; 3130 1.1 christos } 3131 1.1 christos 3132 1.1 christos /* Called through qsort to sort the .IA_64.unwind section during a 3133 1.1 christos non-relocatable link. Set elf64_ia64_unwind_entry_compare_bfd 3134 1.1 christos to the output bfd so we can do proper endianness frobbing. */ 3135 1.1 christos 3136 1.1 christos static bfd *elf64_ia64_unwind_entry_compare_bfd; 3137 1.1 christos 3138 1.1 christos static int 3139 1.1 christos elf64_ia64_unwind_entry_compare (const void * a, const void * b) 3140 1.1 christos { 3141 1.1 christos bfd_vma av, bv; 3142 1.1 christos 3143 1.1 christos av = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, a); 3144 1.1 christos bv = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, b); 3145 1.1 christos 3146 1.1 christos return (av < bv ? -1 : av > bv ? 1 : 0); 3147 1.1 christos } 3148 1.1 christos 3149 1.1 christos /* Make sure we've got ourselves a nice fat __gp value. */ 3150 1.1.1.7 christos static bool 3151 1.1.1.7 christos elf64_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final) 3152 1.1 christos { 3153 1.1 christos bfd_vma min_vma = (bfd_vma) -1, max_vma = 0; 3154 1.1 christos bfd_vma min_short_vma = min_vma, max_short_vma = 0; 3155 1.1 christos struct elf_link_hash_entry *gp; 3156 1.1 christos bfd_vma gp_val; 3157 1.1 christos asection *os; 3158 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 3159 1.1 christos 3160 1.1 christos ia64_info = elf64_ia64_hash_table (info); 3161 1.1 christos if (ia64_info == NULL) 3162 1.1.1.7 christos return false; 3163 1.1 christos 3164 1.1 christos /* Find the min and max vma of all sections marked short. Also collect 3165 1.1 christos min and max vma of any type, for use in selecting a nice gp. */ 3166 1.1 christos for (os = abfd->sections; os ; os = os->next) 3167 1.1 christos { 3168 1.1 christos bfd_vma lo, hi; 3169 1.1 christos 3170 1.1 christos if ((os->flags & SEC_ALLOC) == 0) 3171 1.1 christos continue; 3172 1.1 christos 3173 1.1 christos lo = os->vma; 3174 1.1 christos /* When this function is called from elfNN_ia64_final_link 3175 1.1 christos the correct value to use is os->size. When called from 3176 1.1 christos elfNN_ia64_relax_section we are in the middle of section 3177 1.1 christos sizing; some sections will already have os->size set, others 3178 1.1 christos will have os->size zero and os->rawsize the previous size. */ 3179 1.1 christos hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size); 3180 1.1 christos if (hi < lo) 3181 1.1 christos hi = (bfd_vma) -1; 3182 1.1 christos 3183 1.1 christos if (min_vma > lo) 3184 1.1 christos min_vma = lo; 3185 1.1 christos if (max_vma < hi) 3186 1.1 christos max_vma = hi; 3187 1.1 christos if (os->flags & SEC_SMALL_DATA) 3188 1.1 christos { 3189 1.1 christos if (min_short_vma > lo) 3190 1.1 christos min_short_vma = lo; 3191 1.1 christos if (max_short_vma < hi) 3192 1.1 christos max_short_vma = hi; 3193 1.1 christos } 3194 1.1 christos } 3195 1.1 christos 3196 1.1 christos if (ia64_info->min_short_sec) 3197 1.1 christos { 3198 1.1 christos if (min_short_vma 3199 1.1 christos > (ia64_info->min_short_sec->vma 3200 1.1 christos + ia64_info->min_short_offset)) 3201 1.1 christos min_short_vma = (ia64_info->min_short_sec->vma 3202 1.1 christos + ia64_info->min_short_offset); 3203 1.1 christos if (max_short_vma 3204 1.1 christos < (ia64_info->max_short_sec->vma 3205 1.1 christos + ia64_info->max_short_offset)) 3206 1.1 christos max_short_vma = (ia64_info->max_short_sec->vma 3207 1.1 christos + ia64_info->max_short_offset); 3208 1.1 christos } 3209 1.1 christos 3210 1.1 christos /* See if the user wants to force a value. */ 3211 1.1.1.7 christos gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false, 3212 1.1.1.7 christos false, false); 3213 1.1 christos 3214 1.1 christos if (gp 3215 1.1 christos && (gp->root.type == bfd_link_hash_defined 3216 1.1 christos || gp->root.type == bfd_link_hash_defweak)) 3217 1.1 christos { 3218 1.1 christos asection *gp_sec = gp->root.u.def.section; 3219 1.1 christos gp_val = (gp->root.u.def.value 3220 1.1 christos + gp_sec->output_section->vma 3221 1.1 christos + gp_sec->output_offset); 3222 1.1 christos } 3223 1.1 christos else 3224 1.1 christos { 3225 1.1 christos /* Pick a sensible value. */ 3226 1.1 christos 3227 1.1 christos if (ia64_info->min_short_sec) 3228 1.1 christos { 3229 1.1 christos bfd_vma short_range = max_short_vma - min_short_vma; 3230 1.1 christos 3231 1.1 christos /* If min_short_sec is set, pick one in the middle bewteen 3232 1.1 christos min_short_vma and max_short_vma. */ 3233 1.1 christos if (short_range >= 0x400000) 3234 1.1 christos goto overflow; 3235 1.1 christos gp_val = min_short_vma + short_range / 2; 3236 1.1 christos } 3237 1.1 christos else 3238 1.1 christos { 3239 1.1 christos asection *got_sec = ia64_info->root.sgot; 3240 1.1 christos 3241 1.1 christos /* Start with just the address of the .got. */ 3242 1.1 christos if (got_sec) 3243 1.1 christos gp_val = got_sec->output_section->vma; 3244 1.1 christos else if (max_short_vma != 0) 3245 1.1 christos gp_val = min_short_vma; 3246 1.1 christos else if (max_vma - min_vma < 0x200000) 3247 1.1 christos gp_val = min_vma; 3248 1.1 christos else 3249 1.1 christos gp_val = max_vma - 0x200000 + 8; 3250 1.1 christos } 3251 1.1 christos 3252 1.1 christos /* If it is possible to address the entire image, but we 3253 1.1 christos don't with the choice above, adjust. */ 3254 1.1 christos if (max_vma - min_vma < 0x400000 3255 1.1 christos && (max_vma - gp_val >= 0x200000 3256 1.1 christos || gp_val - min_vma > 0x200000)) 3257 1.1 christos gp_val = min_vma + 0x200000; 3258 1.1 christos else if (max_short_vma != 0) 3259 1.1 christos { 3260 1.1 christos /* If we don't cover all the short data, adjust. */ 3261 1.1 christos if (max_short_vma - gp_val >= 0x200000) 3262 1.1 christos gp_val = min_short_vma + 0x200000; 3263 1.1 christos 3264 1.1 christos /* If we're addressing stuff past the end, adjust back. */ 3265 1.1 christos if (gp_val > max_vma) 3266 1.1 christos gp_val = max_vma - 0x200000 + 8; 3267 1.1 christos } 3268 1.1 christos } 3269 1.1 christos 3270 1.1 christos /* Validate whether all SHF_IA_64_SHORT sections are within 3271 1.1 christos range of the chosen GP. */ 3272 1.1 christos 3273 1.1 christos if (max_short_vma != 0) 3274 1.1 christos { 3275 1.1 christos if (max_short_vma - min_short_vma >= 0x400000) 3276 1.1 christos { 3277 1.1.1.7 christos overflow: 3278 1.1.1.4 christos _bfd_error_handler 3279 1.1.1.4 christos /* xgettext:c-format */ 3280 1.1.1.5 christos (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"), 3281 1.1.1.5 christos abfd, (uint64_t) (max_short_vma - min_short_vma)); 3282 1.1.1.7 christos return false; 3283 1.1 christos } 3284 1.1 christos else if ((gp_val > min_short_vma 3285 1.1 christos && gp_val - min_short_vma > 0x200000) 3286 1.1 christos || (gp_val < max_short_vma 3287 1.1 christos && max_short_vma - gp_val >= 0x200000)) 3288 1.1 christos { 3289 1.1.1.4 christos _bfd_error_handler 3290 1.1.1.5 christos (_("%pB: __gp does not cover short data segment"), abfd); 3291 1.1.1.7 christos return false; 3292 1.1 christos } 3293 1.1 christos } 3294 1.1 christos 3295 1.1 christos _bfd_set_gp_value (abfd, gp_val); 3296 1.1 christos 3297 1.1.1.7 christos return true; 3298 1.1 christos } 3299 1.1 christos 3300 1.1.1.7 christos static bool 3301 1.1 christos elf64_ia64_final_link (bfd *abfd, struct bfd_link_info *info) 3302 1.1 christos { 3303 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 3304 1.1 christos asection *unwind_output_sec; 3305 1.1 christos 3306 1.1 christos ia64_info = elf64_ia64_hash_table (info); 3307 1.1 christos if (ia64_info == NULL) 3308 1.1.1.7 christos return false; 3309 1.1 christos 3310 1.1 christos /* Make sure we've got ourselves a nice fat __gp value. */ 3311 1.1.1.2 christos if (!bfd_link_relocatable (info)) 3312 1.1 christos { 3313 1.1 christos bfd_vma gp_val; 3314 1.1 christos struct elf_link_hash_entry *gp; 3315 1.1 christos 3316 1.1 christos /* We assume after gp is set, section size will only decrease. We 3317 1.1 christos need to adjust gp for it. */ 3318 1.1 christos _bfd_set_gp_value (abfd, 0); 3319 1.1.1.7 christos if (! elf64_ia64_choose_gp (abfd, info, true)) 3320 1.1.1.7 christos return false; 3321 1.1 christos gp_val = _bfd_get_gp_value (abfd); 3322 1.1 christos 3323 1.1.1.7 christos gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false, 3324 1.1.1.7 christos false, false); 3325 1.1 christos if (gp) 3326 1.1 christos { 3327 1.1 christos gp->root.type = bfd_link_hash_defined; 3328 1.1 christos gp->root.u.def.value = gp_val; 3329 1.1 christos gp->root.u.def.section = bfd_abs_section_ptr; 3330 1.1 christos } 3331 1.1 christos } 3332 1.1 christos 3333 1.1 christos /* If we're producing a final executable, we need to sort the contents 3334 1.1 christos of the .IA_64.unwind section. Force this section to be relocated 3335 1.1 christos into memory rather than written immediately to the output file. */ 3336 1.1 christos unwind_output_sec = NULL; 3337 1.1.1.2 christos if (!bfd_link_relocatable (info)) 3338 1.1 christos { 3339 1.1 christos asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind); 3340 1.1 christos if (s) 3341 1.1 christos { 3342 1.1 christos unwind_output_sec = s->output_section; 3343 1.1 christos unwind_output_sec->contents 3344 1.1 christos = bfd_malloc (unwind_output_sec->size); 3345 1.1 christos if (unwind_output_sec->contents == NULL) 3346 1.1.1.7 christos return false; 3347 1.1 christos } 3348 1.1 christos } 3349 1.1 christos 3350 1.1 christos /* Invoke the regular ELF backend linker to do all the work. */ 3351 1.1.1.10 christos if (!_bfd_elf_final_link (abfd, info)) 3352 1.1.1.7 christos return false; 3353 1.1 christos 3354 1.1 christos if (unwind_output_sec) 3355 1.1 christos { 3356 1.1 christos elf64_ia64_unwind_entry_compare_bfd = abfd; 3357 1.1 christos qsort (unwind_output_sec->contents, 3358 1.1 christos (size_t) (unwind_output_sec->size / 24), 3359 1.1 christos 24, 3360 1.1 christos elf64_ia64_unwind_entry_compare); 3361 1.1 christos 3362 1.1 christos if (! bfd_set_section_contents (abfd, unwind_output_sec, 3363 1.1 christos unwind_output_sec->contents, (bfd_vma) 0, 3364 1.1 christos unwind_output_sec->size)) 3365 1.1.1.7 christos return false; 3366 1.1 christos } 3367 1.1 christos 3368 1.1.1.7 christos return true; 3369 1.1 christos } 3370 1.1 christos 3371 1.1.1.7 christos static int 3372 1.1 christos elf64_ia64_relocate_section (bfd *output_bfd, 3373 1.1 christos struct bfd_link_info *info, 3374 1.1 christos bfd *input_bfd, 3375 1.1 christos asection *input_section, 3376 1.1 christos bfd_byte *contents, 3377 1.1 christos Elf_Internal_Rela *relocs, 3378 1.1 christos Elf_Internal_Sym *local_syms, 3379 1.1 christos asection **local_sections) 3380 1.1 christos { 3381 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 3382 1.1 christos Elf_Internal_Shdr *symtab_hdr; 3383 1.1 christos Elf_Internal_Rela *rel; 3384 1.1 christos Elf_Internal_Rela *relend; 3385 1.1.1.7 christos bool ret_val = true; /* for non-fatal errors */ 3386 1.1 christos bfd_vma gp_val; 3387 1.1 christos 3388 1.1 christos symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 3389 1.1 christos ia64_info = elf64_ia64_hash_table (info); 3390 1.1 christos if (ia64_info == NULL) 3391 1.1.1.7 christos return false; 3392 1.1 christos 3393 1.1 christos /* Infect various flags from the input section to the output section. */ 3394 1.1.1.2 christos if (bfd_link_relocatable (info)) 3395 1.1 christos { 3396 1.1 christos bfd_vma flags; 3397 1.1 christos 3398 1.1 christos flags = elf_section_data(input_section)->this_hdr.sh_flags; 3399 1.1 christos flags &= SHF_IA_64_NORECOV; 3400 1.1 christos 3401 1.1 christos elf_section_data(input_section->output_section) 3402 1.1 christos ->this_hdr.sh_flags |= flags; 3403 1.1 christos } 3404 1.1 christos 3405 1.1 christos gp_val = _bfd_get_gp_value (output_bfd); 3406 1.1 christos 3407 1.1 christos rel = relocs; 3408 1.1 christos relend = relocs + input_section->reloc_count; 3409 1.1 christos for (; rel < relend; ++rel) 3410 1.1 christos { 3411 1.1 christos struct elf_link_hash_entry *h; 3412 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 3413 1.1 christos bfd_reloc_status_type r; 3414 1.1 christos reloc_howto_type *howto; 3415 1.1 christos unsigned long r_symndx; 3416 1.1 christos Elf_Internal_Sym *sym; 3417 1.1 christos unsigned int r_type; 3418 1.1 christos bfd_vma value; 3419 1.1 christos asection *sym_sec; 3420 1.1 christos bfd_byte *hit_addr; 3421 1.1.1.7 christos bool dynamic_symbol_p; 3422 1.1.1.7 christos bool undef_weak_ref; 3423 1.1 christos 3424 1.1 christos r_type = ELF64_R_TYPE (rel->r_info); 3425 1.1 christos if (r_type > R_IA64_MAX_RELOC_CODE) 3426 1.1 christos { 3427 1.1.1.5 christos /* xgettext:c-format */ 3428 1.1.1.5 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 3429 1.1.1.5 christos input_bfd, (int) r_type); 3430 1.1 christos bfd_set_error (bfd_error_bad_value); 3431 1.1.1.7 christos ret_val = false; 3432 1.1 christos continue; 3433 1.1 christos } 3434 1.1 christos 3435 1.1 christos howto = ia64_elf_lookup_howto (r_type); 3436 1.1.1.5 christos if (howto == NULL) 3437 1.1.1.5 christos { 3438 1.1.1.7 christos ret_val = false; 3439 1.1.1.5 christos continue; 3440 1.1.1.5 christos } 3441 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info); 3442 1.1 christos h = NULL; 3443 1.1 christos sym = NULL; 3444 1.1 christos sym_sec = NULL; 3445 1.1.1.7 christos undef_weak_ref = false; 3446 1.1 christos 3447 1.1 christos if (r_symndx < symtab_hdr->sh_info) 3448 1.1 christos { 3449 1.1 christos /* Reloc against local symbol. */ 3450 1.1 christos asection *msec; 3451 1.1 christos sym = local_syms + r_symndx; 3452 1.1 christos sym_sec = local_sections[r_symndx]; 3453 1.1 christos msec = sym_sec; 3454 1.1 christos value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); 3455 1.1.1.2 christos if (!bfd_link_relocatable (info) 3456 1.1 christos && (sym_sec->flags & SEC_MERGE) != 0 3457 1.1 christos && ELF_ST_TYPE (sym->st_info) == STT_SECTION 3458 1.1 christos && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE) 3459 1.1 christos { 3460 1.1 christos struct elf64_ia64_local_hash_entry *loc_h; 3461 1.1 christos 3462 1.1.1.7 christos loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false); 3463 1.1 christos if (loc_h && ! loc_h->sec_merge_done) 3464 1.1 christos { 3465 1.1 christos struct elf64_ia64_dyn_sym_info *dynent; 3466 1.1 christos unsigned int count; 3467 1.1 christos 3468 1.1 christos for (count = loc_h->count, dynent = loc_h->info; 3469 1.1 christos count != 0; 3470 1.1 christos count--, dynent++) 3471 1.1 christos { 3472 1.1 christos msec = sym_sec; 3473 1.1 christos dynent->addend = 3474 1.1 christos _bfd_merged_section_offset (output_bfd, &msec, 3475 1.1 christos sym->st_value 3476 1.1 christos + dynent->addend); 3477 1.1 christos dynent->addend -= sym->st_value; 3478 1.1 christos dynent->addend += msec->output_section->vma 3479 1.1 christos + msec->output_offset 3480 1.1 christos - sym_sec->output_section->vma 3481 1.1 christos - sym_sec->output_offset; 3482 1.1 christos } 3483 1.1 christos 3484 1.1 christos /* We may have introduced duplicated entries. We need 3485 1.1 christos to remove them properly. */ 3486 1.1 christos count = sort_dyn_sym_info (loc_h->info, loc_h->count); 3487 1.1 christos if (count != loc_h->count) 3488 1.1 christos { 3489 1.1 christos loc_h->count = count; 3490 1.1 christos loc_h->sorted_count = count; 3491 1.1 christos } 3492 1.1 christos 3493 1.1 christos loc_h->sec_merge_done = 1; 3494 1.1 christos } 3495 1.1 christos } 3496 1.1 christos } 3497 1.1 christos else 3498 1.1 christos { 3499 1.1.1.7 christos bool unresolved_reloc; 3500 1.1.1.7 christos bool warned, ignored; 3501 1.1 christos struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd); 3502 1.1 christos 3503 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 3504 1.1 christos r_symndx, symtab_hdr, sym_hashes, 3505 1.1 christos h, sym_sec, value, 3506 1.1.1.2 christos unresolved_reloc, warned, ignored); 3507 1.1 christos 3508 1.1 christos if (h->root.type == bfd_link_hash_undefweak) 3509 1.1.1.7 christos undef_weak_ref = true; 3510 1.1 christos else if (warned) 3511 1.1 christos continue; 3512 1.1 christos } 3513 1.1 christos 3514 1.1 christos /* For relocs against symbols from removed linkonce sections, 3515 1.1 christos or sections discarded by a linker script, we just want the 3516 1.1 christos section contents zeroed. Avoid any special processing. */ 3517 1.1 christos if (sym_sec != NULL && discarded_section (sym_sec)) 3518 1.1 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 3519 1.1.1.10 christos rel, 1, relend, R_IA64_NONE, 3520 1.1.1.10 christos howto, 0, contents); 3521 1.1 christos 3522 1.1.1.2 christos if (bfd_link_relocatable (info)) 3523 1.1 christos continue; 3524 1.1 christos 3525 1.1 christos hit_addr = contents + rel->r_offset; 3526 1.1 christos value += rel->r_addend; 3527 1.1 christos dynamic_symbol_p = elf64_ia64_dynamic_symbol_p (h); 3528 1.1 christos 3529 1.1 christos switch (r_type) 3530 1.1 christos { 3531 1.1 christos case R_IA64_NONE: 3532 1.1 christos case R_IA64_LDXMOV: 3533 1.1 christos continue; 3534 1.1 christos 3535 1.1 christos case R_IA64_IMM14: 3536 1.1 christos case R_IA64_IMM22: 3537 1.1 christos case R_IA64_IMM64: 3538 1.1 christos case R_IA64_DIR32MSB: 3539 1.1 christos case R_IA64_DIR32LSB: 3540 1.1 christos case R_IA64_DIR64MSB: 3541 1.1 christos case R_IA64_DIR64LSB: 3542 1.1 christos /* Install a dynamic relocation for this reloc. */ 3543 1.1.1.2 christos if ((dynamic_symbol_p || bfd_link_pic (info)) 3544 1.1 christos && r_symndx != 0 3545 1.1 christos && (input_section->flags & SEC_ALLOC) != 0) 3546 1.1 christos { 3547 1.1 christos unsigned int dyn_r_type; 3548 1.1 christos bfd_vma addend; 3549 1.1 christos 3550 1.1 christos switch (r_type) 3551 1.1 christos { 3552 1.1 christos case R_IA64_IMM14: 3553 1.1 christos case R_IA64_IMM22: 3554 1.1 christos case R_IA64_IMM64: 3555 1.1 christos /* ??? People shouldn't be doing non-pic code in 3556 1.1 christos shared libraries nor dynamic executables. */ 3557 1.1.1.4 christos _bfd_error_handler 3558 1.1.1.4 christos /* xgettext:c-format */ 3559 1.1.1.5 christos (_("%pB: non-pic code with imm relocation against" 3560 1.1.1.4 christos " dynamic symbol `%s'"), 3561 1.1 christos input_bfd, 3562 1.1 christos h ? h->root.root.string 3563 1.1 christos : bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 3564 1.1 christos sym_sec)); 3565 1.1.1.7 christos ret_val = false; 3566 1.1 christos continue; 3567 1.1 christos 3568 1.1 christos default: 3569 1.1 christos break; 3570 1.1 christos } 3571 1.1 christos 3572 1.1 christos /* If we don't need dynamic symbol lookup, find a 3573 1.1 christos matching RELATIVE relocation. */ 3574 1.1 christos dyn_r_type = r_type; 3575 1.1 christos if (dynamic_symbol_p) 3576 1.1 christos { 3577 1.1 christos addend = rel->r_addend; 3578 1.1 christos value = 0; 3579 1.1 christos } 3580 1.1 christos else 3581 1.1 christos { 3582 1.1 christos addend = value; 3583 1.1 christos } 3584 1.1 christos 3585 1.1.1.4 christos /* VMS: install a FIX64. */ 3586 1.1.1.4 christos switch (dyn_r_type) 3587 1.1.1.4 christos { 3588 1.1.1.4 christos case R_IA64_DIR32LSB: 3589 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX32; 3590 1.1.1.4 christos break; 3591 1.1.1.4 christos case R_IA64_DIR64LSB: 3592 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX64; 3593 1.1.1.4 christos break; 3594 1.1.1.4 christos default: 3595 1.1.1.7 christos BFD_ASSERT (false); 3596 1.1.1.4 christos break; 3597 1.1.1.4 christos } 3598 1.1.1.4 christos elf64_ia64_install_fixup 3599 1.1.1.4 christos (output_bfd, ia64_info, h, 3600 1.1.1.4 christos dyn_r_type, input_section, rel->r_offset, addend); 3601 1.1.1.4 christos r = bfd_reloc_ok; 3602 1.1.1.4 christos break; 3603 1.1 christos } 3604 1.1 christos /* Fall through. */ 3605 1.1 christos 3606 1.1 christos case R_IA64_LTV32MSB: 3607 1.1 christos case R_IA64_LTV32LSB: 3608 1.1 christos case R_IA64_LTV64MSB: 3609 1.1 christos case R_IA64_LTV64LSB: 3610 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3611 1.1 christos break; 3612 1.1 christos 3613 1.1 christos case R_IA64_GPREL22: 3614 1.1 christos case R_IA64_GPREL64I: 3615 1.1 christos case R_IA64_GPREL32MSB: 3616 1.1 christos case R_IA64_GPREL32LSB: 3617 1.1 christos case R_IA64_GPREL64MSB: 3618 1.1 christos case R_IA64_GPREL64LSB: 3619 1.1 christos if (dynamic_symbol_p) 3620 1.1 christos { 3621 1.1.1.4 christos _bfd_error_handler 3622 1.1.1.4 christos /* xgettext:c-format */ 3623 1.1.1.5 christos (_("%pB: @gprel relocation against dynamic symbol %s"), 3624 1.1 christos input_bfd, 3625 1.1 christos h ? h->root.root.string 3626 1.1 christos : bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 3627 1.1 christos sym_sec)); 3628 1.1.1.7 christos ret_val = false; 3629 1.1 christos continue; 3630 1.1 christos } 3631 1.1 christos value -= gp_val; 3632 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3633 1.1 christos break; 3634 1.1 christos 3635 1.1 christos case R_IA64_LTOFF22: 3636 1.1 christos case R_IA64_LTOFF22X: 3637 1.1 christos case R_IA64_LTOFF64I: 3638 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false); 3639 1.1 christos value = set_got_entry (input_bfd, info, dyn_i, 3640 1.1 christos rel->r_addend, value, R_IA64_DIR64LSB); 3641 1.1 christos value -= gp_val; 3642 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3643 1.1 christos break; 3644 1.1 christos 3645 1.1 christos case R_IA64_PLTOFF22: 3646 1.1 christos case R_IA64_PLTOFF64I: 3647 1.1 christos case R_IA64_PLTOFF64MSB: 3648 1.1 christos case R_IA64_PLTOFF64LSB: 3649 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false); 3650 1.1.1.7 christos value = set_pltoff_entry (output_bfd, info, dyn_i, value, false); 3651 1.1 christos value -= gp_val; 3652 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3653 1.1 christos break; 3654 1.1 christos 3655 1.1 christos case R_IA64_FPTR64I: 3656 1.1 christos case R_IA64_FPTR32MSB: 3657 1.1 christos case R_IA64_FPTR32LSB: 3658 1.1 christos case R_IA64_FPTR64MSB: 3659 1.1 christos case R_IA64_FPTR64LSB: 3660 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false); 3661 1.1 christos if (dyn_i->want_fptr) 3662 1.1 christos { 3663 1.1 christos if (!undef_weak_ref) 3664 1.1 christos value = set_fptr_entry (output_bfd, info, dyn_i, value); 3665 1.1 christos } 3666 1.1.1.2 christos if (!dyn_i->want_fptr || bfd_link_pie (info)) 3667 1.1 christos { 3668 1.1 christos /* Otherwise, we expect the dynamic linker to create 3669 1.1 christos the entry. */ 3670 1.1 christos 3671 1.1 christos if (dyn_i->want_fptr) 3672 1.1 christos { 3673 1.1 christos if (r_type == R_IA64_FPTR64I) 3674 1.1 christos { 3675 1.1 christos /* We can't represent this without a dynamic symbol. 3676 1.1 christos Adjust the relocation to be against an output 3677 1.1 christos section symbol, which are always present in the 3678 1.1 christos dynamic symbol table. */ 3679 1.1 christos /* ??? People shouldn't be doing non-pic code in 3680 1.1 christos shared libraries. Hork. */ 3681 1.1.1.4 christos _bfd_error_handler 3682 1.1.1.5 christos (_("%pB: linking non-pic code in a position independent executable"), 3683 1.1 christos input_bfd); 3684 1.1.1.7 christos ret_val = false; 3685 1.1 christos continue; 3686 1.1 christos } 3687 1.1 christos } 3688 1.1 christos else 3689 1.1 christos { 3690 1.1 christos value = 0; 3691 1.1 christos } 3692 1.1 christos 3693 1.1.1.4 christos /* VMS: FIXFD. */ 3694 1.1.1.4 christos elf64_ia64_install_fixup 3695 1.1.1.4 christos (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, 3696 1.1.1.4 christos input_section, rel->r_offset, 0); 3697 1.1.1.4 christos r = bfd_reloc_ok; 3698 1.1.1.4 christos break; 3699 1.1 christos } 3700 1.1 christos 3701 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3702 1.1 christos break; 3703 1.1 christos 3704 1.1 christos case R_IA64_LTOFF_FPTR22: 3705 1.1 christos case R_IA64_LTOFF_FPTR64I: 3706 1.1 christos case R_IA64_LTOFF_FPTR32MSB: 3707 1.1 christos case R_IA64_LTOFF_FPTR32LSB: 3708 1.1 christos case R_IA64_LTOFF_FPTR64MSB: 3709 1.1 christos case R_IA64_LTOFF_FPTR64LSB: 3710 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false); 3711 1.1.1.4 christos if (dyn_i->want_fptr) 3712 1.1.1.4 christos { 3713 1.1.1.4 christos BFD_ASSERT (h == NULL || !h->def_dynamic); 3714 1.1.1.4 christos if (!undef_weak_ref) 3715 1.1.1.4 christos value = set_fptr_entry (output_bfd, info, dyn_i, value); 3716 1.1.1.4 christos } 3717 1.1.1.4 christos else 3718 1.1.1.4 christos value = 0; 3719 1.1.1.4 christos 3720 1.1.1.4 christos value = set_got_entry (output_bfd, info, dyn_i, 3721 1.1.1.4 christos rel->r_addend, value, R_IA64_FPTR64LSB); 3722 1.1.1.4 christos value -= gp_val; 3723 1.1.1.4 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3724 1.1 christos break; 3725 1.1 christos 3726 1.1 christos case R_IA64_PCREL32MSB: 3727 1.1 christos case R_IA64_PCREL32LSB: 3728 1.1 christos case R_IA64_PCREL64MSB: 3729 1.1 christos case R_IA64_PCREL64LSB: 3730 1.1 christos /* Install a dynamic relocation for this reloc. */ 3731 1.1 christos if (dynamic_symbol_p && r_symndx != 0) 3732 1.1 christos { 3733 1.1.1.4 christos /* VMS: doesn't exist ??? */ 3734 1.1.1.4 christos abort (); 3735 1.1 christos } 3736 1.1 christos goto finish_pcrel; 3737 1.1 christos 3738 1.1 christos case R_IA64_PCREL21B: 3739 1.1 christos case R_IA64_PCREL60B: 3740 1.1 christos /* We should have created a PLT entry for any dynamic symbol. */ 3741 1.1 christos dyn_i = NULL; 3742 1.1 christos if (h) 3743 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false); 3744 1.1 christos 3745 1.1 christos if (dyn_i && dyn_i->want_plt2) 3746 1.1 christos { 3747 1.1 christos /* Should have caught this earlier. */ 3748 1.1 christos BFD_ASSERT (rel->r_addend == 0); 3749 1.1 christos 3750 1.1 christos value = (ia64_info->root.splt->output_section->vma 3751 1.1 christos + ia64_info->root.splt->output_offset 3752 1.1 christos + dyn_i->plt2_offset); 3753 1.1 christos } 3754 1.1 christos else 3755 1.1 christos { 3756 1.1 christos /* Since there's no PLT entry, Validate that this is 3757 1.1 christos locally defined. */ 3758 1.1 christos BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL); 3759 1.1 christos 3760 1.1 christos /* If the symbol is undef_weak, we shouldn't be trying 3761 1.1 christos to call it. There's every chance that we'd wind up 3762 1.1 christos with an out-of-range fixup here. Don't bother setting 3763 1.1 christos any value at all. */ 3764 1.1 christos if (undef_weak_ref) 3765 1.1 christos continue; 3766 1.1 christos } 3767 1.1 christos goto finish_pcrel; 3768 1.1 christos 3769 1.1 christos case R_IA64_PCREL21BI: 3770 1.1 christos case R_IA64_PCREL21F: 3771 1.1 christos case R_IA64_PCREL21M: 3772 1.1 christos case R_IA64_PCREL22: 3773 1.1 christos case R_IA64_PCREL64I: 3774 1.1 christos /* The PCREL21BI reloc is specifically not intended for use with 3775 1.1 christos dynamic relocs. PCREL21F and PCREL21M are used for speculation 3776 1.1 christos fixup code, and thus probably ought not be dynamic. The 3777 1.1 christos PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs. */ 3778 1.1 christos if (dynamic_symbol_p) 3779 1.1 christos { 3780 1.1 christos const char *msg; 3781 1.1 christos 3782 1.1 christos if (r_type == R_IA64_PCREL21BI) 3783 1.1.1.4 christos /* xgettext:c-format */ 3784 1.1.1.5 christos msg = _("%pB: @internal branch to dynamic symbol %s"); 3785 1.1 christos else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M) 3786 1.1.1.4 christos /* xgettext:c-format */ 3787 1.1.1.5 christos msg = _("%pB: speculation fixup to dynamic symbol %s"); 3788 1.1 christos else 3789 1.1.1.4 christos /* xgettext:c-format */ 3790 1.1.1.5 christos msg = _("%pB: @pcrel relocation against dynamic symbol %s"); 3791 1.1.1.4 christos _bfd_error_handler (msg, input_bfd, 3792 1.1.1.4 christos h ? h->root.root.string 3793 1.1.1.4 christos : bfd_elf_sym_name (input_bfd, 3794 1.1.1.4 christos symtab_hdr, 3795 1.1.1.4 christos sym, 3796 1.1.1.4 christos sym_sec)); 3797 1.1.1.7 christos ret_val = false; 3798 1.1 christos continue; 3799 1.1 christos } 3800 1.1 christos goto finish_pcrel; 3801 1.1 christos 3802 1.1 christos finish_pcrel: 3803 1.1 christos /* Make pc-relative. */ 3804 1.1 christos value -= (input_section->output_section->vma 3805 1.1 christos + input_section->output_offset 3806 1.1 christos + rel->r_offset) & ~ (bfd_vma) 0x3; 3807 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3808 1.1 christos break; 3809 1.1 christos 3810 1.1 christos case R_IA64_SEGREL32MSB: 3811 1.1 christos case R_IA64_SEGREL32LSB: 3812 1.1 christos case R_IA64_SEGREL64MSB: 3813 1.1 christos case R_IA64_SEGREL64LSB: 3814 1.1 christos { 3815 1.1 christos /* Find the segment that contains the output_section. */ 3816 1.1 christos Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section 3817 1.1 christos (output_bfd, sym_sec->output_section); 3818 1.1 christos 3819 1.1 christos if (p == NULL) 3820 1.1 christos { 3821 1.1 christos r = bfd_reloc_notsupported; 3822 1.1 christos } 3823 1.1 christos else 3824 1.1 christos { 3825 1.1 christos /* The VMA of the segment is the vaddr of the associated 3826 1.1 christos program header. */ 3827 1.1 christos if (value > p->p_vaddr) 3828 1.1 christos value -= p->p_vaddr; 3829 1.1 christos else 3830 1.1 christos value = 0; 3831 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3832 1.1 christos } 3833 1.1 christos break; 3834 1.1 christos } 3835 1.1 christos 3836 1.1 christos case R_IA64_SECREL32MSB: 3837 1.1 christos case R_IA64_SECREL32LSB: 3838 1.1 christos case R_IA64_SECREL64MSB: 3839 1.1 christos case R_IA64_SECREL64LSB: 3840 1.1 christos /* Make output-section relative to section where the symbol 3841 1.1 christos is defined. PR 475 */ 3842 1.1 christos if (sym_sec) 3843 1.1 christos value -= sym_sec->output_section->vma; 3844 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type); 3845 1.1 christos break; 3846 1.1 christos 3847 1.1 christos case R_IA64_IPLTMSB: 3848 1.1 christos case R_IA64_IPLTLSB: 3849 1.1 christos /* Install a dynamic relocation for this reloc. */ 3850 1.1.1.2 christos if ((dynamic_symbol_p || bfd_link_pic (info)) 3851 1.1 christos && (input_section->flags & SEC_ALLOC) != 0) 3852 1.1 christos { 3853 1.1.1.4 christos /* VMS: FIXFD ?? */ 3854 1.1.1.4 christos abort (); 3855 1.1 christos } 3856 1.1 christos 3857 1.1 christos if (r_type == R_IA64_IPLTMSB) 3858 1.1 christos r_type = R_IA64_DIR64MSB; 3859 1.1 christos else 3860 1.1 christos r_type = R_IA64_DIR64LSB; 3861 1.1 christos ia64_elf_install_value (hit_addr, value, r_type); 3862 1.1 christos r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type); 3863 1.1 christos break; 3864 1.1 christos 3865 1.1 christos case R_IA64_TPREL14: 3866 1.1 christos case R_IA64_TPREL22: 3867 1.1 christos case R_IA64_TPREL64I: 3868 1.1 christos r = bfd_reloc_notsupported; 3869 1.1 christos break; 3870 1.1 christos 3871 1.1 christos case R_IA64_DTPREL14: 3872 1.1 christos case R_IA64_DTPREL22: 3873 1.1 christos case R_IA64_DTPREL64I: 3874 1.1 christos case R_IA64_DTPREL32LSB: 3875 1.1 christos case R_IA64_DTPREL32MSB: 3876 1.1 christos case R_IA64_DTPREL64LSB: 3877 1.1 christos case R_IA64_DTPREL64MSB: 3878 1.1 christos r = bfd_reloc_notsupported; 3879 1.1 christos break; 3880 1.1 christos 3881 1.1 christos case R_IA64_LTOFF_TPREL22: 3882 1.1 christos case R_IA64_LTOFF_DTPMOD22: 3883 1.1 christos case R_IA64_LTOFF_DTPREL22: 3884 1.1 christos r = bfd_reloc_notsupported; 3885 1.1 christos break; 3886 1.1 christos 3887 1.1 christos default: 3888 1.1 christos r = bfd_reloc_notsupported; 3889 1.1 christos break; 3890 1.1 christos } 3891 1.1 christos 3892 1.1 christos switch (r) 3893 1.1 christos { 3894 1.1 christos case bfd_reloc_ok: 3895 1.1 christos break; 3896 1.1 christos 3897 1.1 christos case bfd_reloc_undefined: 3898 1.1 christos /* This can happen for global table relative relocs if 3899 1.1 christos __gp is undefined. This is a panic situation so we 3900 1.1 christos don't try to continue. */ 3901 1.1 christos (*info->callbacks->undefined_symbol) 3902 1.1 christos (info, "__gp", input_bfd, input_section, rel->r_offset, 1); 3903 1.1.1.7 christos return false; 3904 1.1 christos 3905 1.1 christos case bfd_reloc_notsupported: 3906 1.1 christos { 3907 1.1 christos const char *name; 3908 1.1 christos 3909 1.1 christos if (h) 3910 1.1 christos name = h->root.root.string; 3911 1.1 christos else 3912 1.1 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 3913 1.1 christos sym_sec); 3914 1.1.1.3 christos (*info->callbacks->warning) (info, _("unsupported reloc"), 3915 1.1.1.3 christos name, input_bfd, 3916 1.1.1.3 christos input_section, rel->r_offset); 3917 1.1.1.7 christos ret_val = false; 3918 1.1 christos } 3919 1.1 christos break; 3920 1.1 christos 3921 1.1 christos case bfd_reloc_dangerous: 3922 1.1 christos case bfd_reloc_outofrange: 3923 1.1 christos case bfd_reloc_overflow: 3924 1.1 christos default: 3925 1.1 christos { 3926 1.1 christos const char *name; 3927 1.1 christos 3928 1.1 christos if (h) 3929 1.1 christos name = h->root.root.string; 3930 1.1 christos else 3931 1.1 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 3932 1.1 christos sym_sec); 3933 1.1 christos 3934 1.1 christos switch (r_type) 3935 1.1 christos { 3936 1.1 christos case R_IA64_TPREL14: 3937 1.1 christos case R_IA64_TPREL22: 3938 1.1 christos case R_IA64_TPREL64I: 3939 1.1 christos case R_IA64_DTPREL14: 3940 1.1 christos case R_IA64_DTPREL22: 3941 1.1 christos case R_IA64_DTPREL64I: 3942 1.1 christos case R_IA64_DTPREL32LSB: 3943 1.1 christos case R_IA64_DTPREL32MSB: 3944 1.1 christos case R_IA64_DTPREL64LSB: 3945 1.1 christos case R_IA64_DTPREL64MSB: 3946 1.1 christos case R_IA64_LTOFF_TPREL22: 3947 1.1 christos case R_IA64_LTOFF_DTPMOD22: 3948 1.1 christos case R_IA64_LTOFF_DTPREL22: 3949 1.1.1.4 christos _bfd_error_handler 3950 1.1.1.4 christos /* xgettext:c-format */ 3951 1.1.1.5 christos (_("%pB: missing TLS section for relocation %s against `%s'" 3952 1.1.1.5 christos " at %#" PRIx64 " in section `%pA'."), 3953 1.1.1.4 christos input_bfd, howto->name, name, 3954 1.1.1.5 christos (uint64_t) rel->r_offset, input_section); 3955 1.1 christos break; 3956 1.1 christos 3957 1.1 christos case R_IA64_PCREL21B: 3958 1.1 christos case R_IA64_PCREL21BI: 3959 1.1 christos case R_IA64_PCREL21M: 3960 1.1 christos case R_IA64_PCREL21F: 3961 1.1 christos if (is_elf_hash_table (info->hash)) 3962 1.1 christos { 3963 1.1 christos /* Relaxtion is always performed for ELF output. 3964 1.1 christos Overflow failures for those relocations mean 3965 1.1 christos that the section is too big to relax. */ 3966 1.1.1.4 christos _bfd_error_handler 3967 1.1.1.4 christos /* xgettext:c-format */ 3968 1.1.1.5 christos (_("%pB: Can't relax br (%s) to `%s' " 3969 1.1.1.5 christos "at %#" PRIx64 " in section `%pA' " 3970 1.1.1.5 christos "with size %#" PRIx64 " (> 0x1000000)."), 3971 1.1.1.5 christos input_bfd, howto->name, name, (uint64_t) rel->r_offset, 3972 1.1.1.5 christos input_section, (uint64_t) input_section->size); 3973 1.1 christos break; 3974 1.1 christos } 3975 1.1.1.4 christos /* Fall through. */ 3976 1.1 christos default: 3977 1.1.1.3 christos (*info->callbacks->reloc_overflow) (info, 3978 1.1.1.3 christos &h->root, 3979 1.1.1.3 christos name, 3980 1.1.1.3 christos howto->name, 3981 1.1.1.3 christos (bfd_vma) 0, 3982 1.1.1.3 christos input_bfd, 3983 1.1.1.3 christos input_section, 3984 1.1.1.3 christos rel->r_offset); 3985 1.1 christos break; 3986 1.1 christos } 3987 1.1 christos 3988 1.1.1.7 christos ret_val = false; 3989 1.1 christos } 3990 1.1 christos break; 3991 1.1 christos } 3992 1.1 christos } 3993 1.1 christos 3994 1.1 christos return ret_val; 3995 1.1 christos } 3996 1.1 christos 3997 1.1.1.7 christos static bool 3998 1.1 christos elf64_ia64_finish_dynamic_symbol (bfd *output_bfd, 3999 1.1 christos struct bfd_link_info *info, 4000 1.1 christos struct elf_link_hash_entry *h, 4001 1.1 christos Elf_Internal_Sym *sym) 4002 1.1 christos { 4003 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 4004 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i; 4005 1.1 christos 4006 1.1 christos ia64_info = elf64_ia64_hash_table (info); 4007 1.1 christos 4008 1.1.1.7 christos dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false); 4009 1.1 christos 4010 1.1 christos /* Fill in the PLT data, if required. */ 4011 1.1 christos if (dyn_i && dyn_i->want_plt) 4012 1.1 christos { 4013 1.1 christos bfd_byte *loc; 4014 1.1 christos asection *plt_sec; 4015 1.1 christos bfd_vma plt_addr, pltoff_addr, gp_val; 4016 1.1 christos 4017 1.1 christos gp_val = _bfd_get_gp_value (output_bfd); 4018 1.1 christos 4019 1.1 christos plt_sec = ia64_info->root.splt; 4020 1.1 christos plt_addr = 0; /* Not used as overriden by FIXUPs. */ 4021 1.1.1.7 christos pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true); 4022 1.1 christos 4023 1.1 christos /* Initialize the FULL PLT entry, if needed. */ 4024 1.1 christos if (dyn_i->want_plt2) 4025 1.1 christos { 4026 1.1 christos loc = plt_sec->contents + dyn_i->plt2_offset; 4027 1.1 christos 4028 1.1 christos memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE); 4029 1.1 christos ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22); 4030 1.1 christos 4031 1.1 christos /* Mark the symbol as undefined, rather than as defined in the 4032 1.1 christos plt section. Leave the value alone. */ 4033 1.1 christos /* ??? We didn't redefine it in adjust_dynamic_symbol in the 4034 1.1 christos first place. But perhaps elflink.c did some for us. */ 4035 1.1 christos if (!h->def_regular) 4036 1.1 christos sym->st_shndx = SHN_UNDEF; 4037 1.1 christos } 4038 1.1 christos 4039 1.1 christos /* VMS: FIXFD. */ 4040 1.1 christos elf64_ia64_install_fixup 4041 1.1.1.4 christos (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, ia64_info->pltoff_sec, 4042 1.1.1.4 christos pltoff_addr - (ia64_info->pltoff_sec->output_section->vma 4043 1.1.1.4 christos + ia64_info->pltoff_sec->output_offset), 0); 4044 1.1 christos } 4045 1.1 christos 4046 1.1 christos /* Mark some specially defined symbols as absolute. */ 4047 1.1.1.2 christos if (h == ia64_info->root.hdynamic 4048 1.1 christos || h == ia64_info->root.hgot 4049 1.1 christos || h == ia64_info->root.hplt) 4050 1.1 christos sym->st_shndx = SHN_ABS; 4051 1.1 christos 4052 1.1.1.7 christos return true; 4053 1.1 christos } 4054 1.1 christos 4055 1.1.1.7 christos static bool 4056 1.1 christos elf64_ia64_finish_dynamic_sections (bfd *abfd, 4057 1.1.1.10 christos struct bfd_link_info *info, 4058 1.1.1.10 christos bfd_byte *buf ATTRIBUTE_UNUSED) 4059 1.1 christos { 4060 1.1 christos struct elf64_ia64_link_hash_table *ia64_info; 4061 1.1 christos bfd *dynobj; 4062 1.1 christos 4063 1.1 christos ia64_info = elf64_ia64_hash_table (info); 4064 1.1 christos if (ia64_info == NULL) 4065 1.1.1.7 christos return false; 4066 1.1 christos 4067 1.1 christos dynobj = ia64_info->root.dynobj; 4068 1.1 christos 4069 1.1 christos if (elf_hash_table (info)->dynamic_sections_created) 4070 1.1 christos { 4071 1.1 christos Elf64_External_Dyn *dyncon, *dynconend; 4072 1.1 christos asection *sdyn; 4073 1.1 christos asection *unwind_sec; 4074 1.1 christos bfd_vma gp_val; 4075 1.1 christos unsigned int gp_seg; 4076 1.1 christos bfd_vma gp_off; 4077 1.1 christos Elf_Internal_Phdr *phdr; 4078 1.1 christos Elf_Internal_Phdr *base_phdr; 4079 1.1 christos unsigned int unwind_seg = 0; 4080 1.1 christos unsigned int code_seg = 0; 4081 1.1 christos 4082 1.1 christos sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 4083 1.1 christos BFD_ASSERT (sdyn != NULL); 4084 1.1 christos dyncon = (Elf64_External_Dyn *) sdyn->contents; 4085 1.1 christos dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); 4086 1.1 christos 4087 1.1 christos gp_val = _bfd_get_gp_value (abfd); 4088 1.1 christos phdr = _bfd_elf_find_segment_containing_section 4089 1.1.1.4 christos (info->output_bfd, ia64_info->pltoff_sec->output_section); 4090 1.1 christos BFD_ASSERT (phdr != NULL); 4091 1.1 christos base_phdr = elf_tdata (info->output_bfd)->phdr; 4092 1.1 christos gp_seg = phdr - base_phdr; 4093 1.1 christos gp_off = gp_val - phdr->p_vaddr; 4094 1.1 christos 4095 1.1 christos unwind_sec = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind); 4096 1.1 christos if (unwind_sec != NULL) 4097 1.1.1.4 christos { 4098 1.1.1.4 christos asection *code_sec; 4099 1.1 christos 4100 1.1.1.4 christos phdr = _bfd_elf_find_segment_containing_section (abfd, unwind_sec); 4101 1.1.1.4 christos BFD_ASSERT (phdr != NULL); 4102 1.1.1.4 christos unwind_seg = phdr - base_phdr; 4103 1.1.1.4 christos 4104 1.1.1.4 christos code_sec = bfd_get_section_by_name (abfd, "$CODE$"); 4105 1.1.1.4 christos phdr = _bfd_elf_find_segment_containing_section (abfd, code_sec); 4106 1.1.1.4 christos BFD_ASSERT (phdr != NULL); 4107 1.1.1.4 christos code_seg = phdr - base_phdr; 4108 1.1.1.4 christos } 4109 1.1 christos 4110 1.1 christos for (; dyncon < dynconend; dyncon++) 4111 1.1 christos { 4112 1.1 christos Elf_Internal_Dyn dyn; 4113 1.1 christos 4114 1.1 christos bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); 4115 1.1 christos 4116 1.1 christos switch (dyn.d_tag) 4117 1.1 christos { 4118 1.1.1.4 christos case DT_IA_64_VMS_FIXUP_RELA_OFF: 4119 1.1.1.4 christos dyn.d_un.d_val += 4120 1.1.1.4 christos (ia64_info->fixups_sec->output_section->vma 4121 1.1.1.4 christos + ia64_info->fixups_sec->output_offset) 4122 1.1.1.4 christos - (sdyn->output_section->vma + sdyn->output_offset); 4123 1.1.1.4 christos break; 4124 1.1.1.4 christos 4125 1.1.1.4 christos case DT_IA_64_VMS_PLTGOT_OFFSET: 4126 1.1.1.4 christos dyn.d_un.d_val = gp_off; 4127 1.1.1.4 christos break; 4128 1.1.1.4 christos 4129 1.1.1.4 christos case DT_IA_64_VMS_PLTGOT_SEG: 4130 1.1.1.4 christos dyn.d_un.d_val = gp_seg; 4131 1.1.1.4 christos break; 4132 1.1.1.4 christos 4133 1.1.1.4 christos case DT_IA_64_VMS_UNWINDSZ: 4134 1.1.1.4 christos if (unwind_sec == NULL) 4135 1.1.1.4 christos { 4136 1.1.1.4 christos dyn.d_tag = DT_NULL; 4137 1.1.1.4 christos dyn.d_un.d_val = 0xdead; 4138 1.1.1.4 christos } 4139 1.1.1.4 christos else 4140 1.1.1.4 christos dyn.d_un.d_val = unwind_sec->size; 4141 1.1.1.4 christos break; 4142 1.1.1.4 christos 4143 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_CODSEG: 4144 1.1.1.4 christos dyn.d_un.d_val = code_seg; 4145 1.1.1.4 christos break; 4146 1.1.1.4 christos 4147 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_INFOSEG: 4148 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_SEG: 4149 1.1.1.4 christos dyn.d_un.d_val = unwind_seg; 4150 1.1.1.4 christos break; 4151 1.1.1.4 christos 4152 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_OFFSET: 4153 1.1.1.4 christos break; 4154 1.1.1.4 christos 4155 1.1.1.4 christos default: 4156 1.1.1.4 christos /* No need to rewrite the entry. */ 4157 1.1.1.4 christos continue; 4158 1.1 christos } 4159 1.1 christos 4160 1.1 christos bfd_elf64_swap_dyn_out (abfd, &dyn, dyncon); 4161 1.1 christos } 4162 1.1 christos } 4163 1.1 christos 4164 1.1 christos /* Handle transfer addresses. */ 4165 1.1 christos { 4166 1.1 christos asection *tfr_sec = ia64_info->transfer_sec; 4167 1.1 christos struct elf64_vms_transfer *tfr; 4168 1.1 christos struct elf_link_hash_entry *tfr3; 4169 1.1 christos 4170 1.1 christos tfr = (struct elf64_vms_transfer *)tfr_sec->contents; 4171 1.1 christos bfd_putl32 (6 * 8, tfr->size); 4172 1.1 christos bfd_putl64 (tfr_sec->output_section->vma 4173 1.1.1.4 christos + tfr_sec->output_offset 4174 1.1.1.4 christos + 6 * 8, tfr->tfradr3); 4175 1.1 christos 4176 1.1.1.7 christos tfr3 = elf_link_hash_lookup (elf_hash_table (info), "ELF$TFRADR", false, 4177 1.1.1.7 christos false, false); 4178 1.1 christos 4179 1.1 christos if (tfr3 4180 1.1.1.4 christos && (tfr3->root.type == bfd_link_hash_defined 4181 1.1.1.4 christos || tfr3->root.type == bfd_link_hash_defweak)) 4182 1.1 christos { 4183 1.1.1.4 christos asection *tfr3_sec = tfr3->root.u.def.section; 4184 1.1.1.4 christos bfd_vma tfr3_val; 4185 1.1 christos 4186 1.1.1.4 christos tfr3_val = (tfr3->root.u.def.value 4187 1.1.1.4 christos + tfr3_sec->output_section->vma 4188 1.1.1.4 christos + tfr3_sec->output_offset); 4189 1.1 christos 4190 1.1.1.4 christos bfd_putl64 (tfr3_val, tfr->tfr3_func); 4191 1.1.1.4 christos bfd_putl64 (_bfd_get_gp_value (info->output_bfd), tfr->tfr3_gp); 4192 1.1 christos } 4193 1.1 christos 4194 1.1 christos /* FIXME: set linker flags, 4195 1.1 christos handle lib$initialize. */ 4196 1.1 christos } 4197 1.1 christos 4198 1.1.1.7 christos return true; 4199 1.1 christos } 4200 1.1 christos 4201 1.1 christos /* ELF file flag handling: */ 4202 1.1 christos 4203 1.1 christos /* Function to keep IA-64 specific file flags. */ 4204 1.1.1.7 christos static bool 4205 1.1 christos elf64_ia64_set_private_flags (bfd *abfd, flagword flags) 4206 1.1 christos { 4207 1.1 christos BFD_ASSERT (!elf_flags_init (abfd) 4208 1.1 christos || elf_elfheader (abfd)->e_flags == flags); 4209 1.1 christos 4210 1.1 christos elf_elfheader (abfd)->e_flags = flags; 4211 1.1.1.7 christos elf_flags_init (abfd) = true; 4212 1.1.1.7 christos return true; 4213 1.1 christos } 4214 1.1 christos 4215 1.1 christos /* Merge backend specific data from an object file to the output 4216 1.1 christos object file when linking. */ 4217 1.1.1.7 christos static bool 4218 1.1.1.4 christos elf64_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 4219 1.1 christos { 4220 1.1.1.4 christos bfd *obfd = info->output_bfd; 4221 1.1 christos flagword out_flags; 4222 1.1 christos flagword in_flags; 4223 1.1.1.7 christos bool ok = true; 4224 1.1.1.7 christos 4225 1.1.1.7 christos /* FIXME: What should be checked when linking shared libraries? */ 4226 1.1.1.7 christos if ((ibfd->flags & DYNAMIC) != 0) 4227 1.1.1.7 christos return true; 4228 1.1 christos 4229 1.1 christos /* Don't even pretend to support mixed-format linking. */ 4230 1.1.1.10 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 4231 1.1.1.7 christos return false; 4232 1.1 christos 4233 1.1 christos in_flags = elf_elfheader (ibfd)->e_flags; 4234 1.1 christos out_flags = elf_elfheader (obfd)->e_flags; 4235 1.1 christos 4236 1.1 christos if (! elf_flags_init (obfd)) 4237 1.1 christos { 4238 1.1.1.7 christos elf_flags_init (obfd) = true; 4239 1.1 christos elf_elfheader (obfd)->e_flags = in_flags; 4240 1.1 christos 4241 1.1 christos if (bfd_get_arch (obfd) == bfd_get_arch (ibfd) 4242 1.1 christos && bfd_get_arch_info (obfd)->the_default) 4243 1.1 christos { 4244 1.1 christos return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), 4245 1.1 christos bfd_get_mach (ibfd)); 4246 1.1 christos } 4247 1.1 christos 4248 1.1.1.7 christos return true; 4249 1.1 christos } 4250 1.1 christos 4251 1.1 christos /* Check flag compatibility. */ 4252 1.1 christos if (in_flags == out_flags) 4253 1.1.1.7 christos return true; 4254 1.1 christos 4255 1.1 christos /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set. */ 4256 1.1 christos if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP)) 4257 1.1 christos elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP; 4258 1.1 christos 4259 1.1 christos if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL)) 4260 1.1 christos { 4261 1.1.1.4 christos _bfd_error_handler 4262 1.1.1.5 christos (_("%pB: linking trap-on-NULL-dereference with non-trapping files"), 4263 1.1 christos ibfd); 4264 1.1 christos 4265 1.1 christos bfd_set_error (bfd_error_bad_value); 4266 1.1.1.7 christos ok = false; 4267 1.1 christos } 4268 1.1 christos if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE)) 4269 1.1 christos { 4270 1.1.1.4 christos _bfd_error_handler 4271 1.1.1.5 christos (_("%pB: linking big-endian files with little-endian files"), 4272 1.1 christos ibfd); 4273 1.1 christos 4274 1.1 christos bfd_set_error (bfd_error_bad_value); 4275 1.1.1.7 christos ok = false; 4276 1.1 christos } 4277 1.1 christos if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64)) 4278 1.1 christos { 4279 1.1.1.4 christos _bfd_error_handler 4280 1.1.1.5 christos (_("%pB: linking 64-bit files with 32-bit files"), 4281 1.1 christos ibfd); 4282 1.1 christos 4283 1.1 christos bfd_set_error (bfd_error_bad_value); 4284 1.1.1.7 christos ok = false; 4285 1.1 christos } 4286 1.1 christos if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP)) 4287 1.1 christos { 4288 1.1.1.4 christos _bfd_error_handler 4289 1.1.1.5 christos (_("%pB: linking constant-gp files with non-constant-gp files"), 4290 1.1 christos ibfd); 4291 1.1 christos 4292 1.1 christos bfd_set_error (bfd_error_bad_value); 4293 1.1.1.7 christos ok = false; 4294 1.1 christos } 4295 1.1 christos if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP) 4296 1.1 christos != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP)) 4297 1.1 christos { 4298 1.1.1.4 christos _bfd_error_handler 4299 1.1.1.5 christos (_("%pB: linking auto-pic files with non-auto-pic files"), 4300 1.1 christos ibfd); 4301 1.1 christos 4302 1.1 christos bfd_set_error (bfd_error_bad_value); 4303 1.1.1.7 christos ok = false; 4304 1.1 christos } 4305 1.1 christos 4306 1.1 christos return ok; 4307 1.1 christos } 4308 1.1 christos 4309 1.1.1.7 christos static bool 4310 1.1 christos elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr) 4311 1.1 christos { 4312 1.1 christos FILE *file = (FILE *) ptr; 4313 1.1 christos flagword flags = elf_elfheader (abfd)->e_flags; 4314 1.1 christos 4315 1.1 christos BFD_ASSERT (abfd != NULL && ptr != NULL); 4316 1.1 christos 4317 1.1 christos fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n", 4318 1.1 christos (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "", 4319 1.1 christos (flags & EF_IA_64_EXT) ? "EXT, " : "", 4320 1.1 christos (flags & EF_IA_64_BE) ? "BE, " : "LE, ", 4321 1.1 christos (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "", 4322 1.1 christos (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "", 4323 1.1 christos (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "", 4324 1.1 christos (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "", 4325 1.1 christos (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32"); 4326 1.1 christos 4327 1.1 christos _bfd_elf_print_private_bfd_data (abfd, ptr); 4328 1.1.1.7 christos return true; 4329 1.1 christos } 4330 1.1 christos 4331 1.1 christos static enum elf_reloc_type_class 4332 1.1.1.2 christos elf64_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 4333 1.1.1.2 christos const asection *rel_sec ATTRIBUTE_UNUSED, 4334 1.1.1.2 christos const Elf_Internal_Rela *rela) 4335 1.1 christos { 4336 1.1 christos switch ((int) ELF64_R_TYPE (rela->r_info)) 4337 1.1 christos { 4338 1.1 christos case R_IA64_REL32MSB: 4339 1.1 christos case R_IA64_REL32LSB: 4340 1.1 christos case R_IA64_REL64MSB: 4341 1.1 christos case R_IA64_REL64LSB: 4342 1.1 christos return reloc_class_relative; 4343 1.1 christos case R_IA64_IPLTMSB: 4344 1.1 christos case R_IA64_IPLTLSB: 4345 1.1 christos return reloc_class_plt; 4346 1.1 christos case R_IA64_COPY: 4347 1.1 christos return reloc_class_copy; 4348 1.1 christos default: 4349 1.1 christos return reloc_class_normal; 4350 1.1 christos } 4351 1.1 christos } 4352 1.1 christos 4353 1.1 christos static const struct bfd_elf_special_section elf64_ia64_special_sections[] = 4354 1.1 christos { 4355 1.1.1.4 christos { STRING_COMMA_LEN (".sbss"), -1, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, 4356 1.1 christos { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, 4357 1.1.1.4 christos { NULL, 0, 0, 0, 0 } 4358 1.1 christos }; 4359 1.1 christos 4360 1.1.1.7 christos static bool 4361 1.1 christos elf64_ia64_object_p (bfd *abfd) 4362 1.1 christos { 4363 1.1 christos asection *sec; 4364 1.1 christos asection *group, *unwi, *unw; 4365 1.1 christos flagword flags; 4366 1.1 christos const char *name; 4367 1.1 christos char *unwi_name, *unw_name; 4368 1.1.1.7 christos size_t amt; 4369 1.1 christos 4370 1.1 christos if (abfd->flags & DYNAMIC) 4371 1.1.1.7 christos return true; 4372 1.1 christos 4373 1.1 christos /* Flags for fake group section. */ 4374 1.1 christos flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE 4375 1.1 christos | SEC_EXCLUDE); 4376 1.1 christos 4377 1.1 christos /* We add a fake section group for each .gnu.linkonce.t.* section, 4378 1.1 christos which isn't in a section group, and its unwind sections. */ 4379 1.1 christos for (sec = abfd->sections; sec != NULL; sec = sec->next) 4380 1.1 christos { 4381 1.1 christos if (elf_sec_group (sec) == NULL 4382 1.1 christos && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP)) 4383 1.1 christos == (SEC_LINK_ONCE | SEC_CODE)) 4384 1.1.1.7 christos && startswith (sec->name, ".gnu.linkonce.t.")) 4385 1.1 christos { 4386 1.1 christos name = sec->name + 16; 4387 1.1 christos 4388 1.1 christos amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi."); 4389 1.1 christos unwi_name = bfd_alloc (abfd, amt); 4390 1.1 christos if (!unwi_name) 4391 1.1.1.7 christos return false; 4392 1.1 christos 4393 1.1 christos strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name); 4394 1.1 christos unwi = bfd_get_section_by_name (abfd, unwi_name); 4395 1.1 christos 4396 1.1 christos amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw."); 4397 1.1 christos unw_name = bfd_alloc (abfd, amt); 4398 1.1 christos if (!unw_name) 4399 1.1.1.7 christos return false; 4400 1.1 christos 4401 1.1 christos strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name); 4402 1.1 christos unw = bfd_get_section_by_name (abfd, unw_name); 4403 1.1 christos 4404 1.1 christos /* We need to create a fake group section for it and its 4405 1.1 christos unwind sections. */ 4406 1.1 christos group = bfd_make_section_anyway_with_flags (abfd, name, 4407 1.1 christos flags); 4408 1.1 christos if (group == NULL) 4409 1.1.1.7 christos return false; 4410 1.1 christos 4411 1.1 christos /* Move the fake group section to the beginning. */ 4412 1.1 christos bfd_section_list_remove (abfd, group); 4413 1.1 christos bfd_section_list_prepend (abfd, group); 4414 1.1 christos 4415 1.1 christos elf_next_in_group (group) = sec; 4416 1.1 christos 4417 1.1 christos elf_group_name (sec) = name; 4418 1.1 christos elf_next_in_group (sec) = sec; 4419 1.1 christos elf_sec_group (sec) = group; 4420 1.1 christos 4421 1.1 christos if (unwi) 4422 1.1 christos { 4423 1.1 christos elf_group_name (unwi) = name; 4424 1.1 christos elf_next_in_group (unwi) = sec; 4425 1.1 christos elf_next_in_group (sec) = unwi; 4426 1.1 christos elf_sec_group (unwi) = group; 4427 1.1 christos } 4428 1.1 christos 4429 1.1 christos if (unw) 4430 1.1 christos { 4431 1.1 christos elf_group_name (unw) = name; 4432 1.1 christos if (unwi) 4433 1.1 christos { 4434 1.1 christos elf_next_in_group (unw) = elf_next_in_group (unwi); 4435 1.1 christos elf_next_in_group (unwi) = unw; 4436 1.1 christos } 4437 1.1 christos else 4438 1.1 christos { 4439 1.1 christos elf_next_in_group (unw) = sec; 4440 1.1 christos elf_next_in_group (sec) = unw; 4441 1.1 christos } 4442 1.1 christos elf_sec_group (unw) = group; 4443 1.1 christos } 4444 1.1 christos 4445 1.1 christos /* Fake SHT_GROUP section header. */ 4446 1.1 christos elf_section_data (group)->this_hdr.bfd_section = group; 4447 1.1 christos elf_section_data (group)->this_hdr.sh_type = SHT_GROUP; 4448 1.1 christos } 4449 1.1 christos } 4450 1.1.1.7 christos return true; 4451 1.1 christos } 4452 1.1 christos 4453 1.1 christos /* Handle an IA-64 specific section when reading an object file. This 4454 1.1 christos is called when bfd_section_from_shdr finds a section with an unknown 4455 1.1 christos type. */ 4456 1.1 christos 4457 1.1.1.7 christos static bool 4458 1.1 christos elf64_vms_section_from_shdr (bfd *abfd, 4459 1.1 christos Elf_Internal_Shdr *hdr, 4460 1.1 christos const char *name, 4461 1.1 christos int shindex) 4462 1.1 christos { 4463 1.1 christos flagword secflags = 0; 4464 1.1 christos 4465 1.1 christos switch (hdr->sh_type) 4466 1.1 christos { 4467 1.1 christos case SHT_IA_64_VMS_TRACE: 4468 1.1 christos case SHT_IA_64_VMS_DEBUG: 4469 1.1 christos case SHT_IA_64_VMS_DEBUG_STR: 4470 1.1 christos secflags = SEC_DEBUGGING; 4471 1.1 christos break; 4472 1.1 christos 4473 1.1 christos case SHT_IA_64_UNWIND: 4474 1.1 christos case SHT_IA_64_HP_OPT_ANOT: 4475 1.1 christos break; 4476 1.1 christos 4477 1.1 christos case SHT_IA_64_EXT: 4478 1.1 christos if (strcmp (name, ELF_STRING_ia64_archext) != 0) 4479 1.1.1.7 christos return false; 4480 1.1 christos break; 4481 1.1 christos 4482 1.1 christos default: 4483 1.1.1.7 christos return false; 4484 1.1 christos } 4485 1.1 christos 4486 1.1 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex)) 4487 1.1.1.7 christos return false; 4488 1.1 christos 4489 1.1 christos if (secflags != 0) 4490 1.1 christos { 4491 1.1 christos asection *newsect = hdr->bfd_section; 4492 1.1 christos 4493 1.1.1.6 christos if (!bfd_set_section_flags (newsect, 4494 1.1.1.6 christos bfd_section_flags (newsect) | secflags)) 4495 1.1.1.7 christos return false; 4496 1.1 christos } 4497 1.1 christos 4498 1.1.1.7 christos return true; 4499 1.1 christos } 4500 1.1 christos 4501 1.1.1.7 christos static bool 4502 1.1 christos elf64_vms_object_p (bfd *abfd) 4503 1.1 christos { 4504 1.1 christos Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd); 4505 1.1 christos Elf_Internal_Phdr *i_phdr = elf_tdata (abfd)->phdr; 4506 1.1 christos unsigned int i; 4507 1.1 christos unsigned int num_text = 0; 4508 1.1 christos unsigned int num_data = 0; 4509 1.1 christos unsigned int num_rodata = 0; 4510 1.1 christos char name[16]; 4511 1.1 christos 4512 1.1 christos if (!elf64_ia64_object_p (abfd)) 4513 1.1.1.7 christos return false; 4514 1.1 christos 4515 1.1 christos /* Many VMS compilers do not generate sections for the corresponding 4516 1.1 christos segment. This is boring as binutils tools won't be able to disassemble 4517 1.1 christos the code. So we simply create all the missing sections. */ 4518 1.1 christos for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++) 4519 1.1 christos { 4520 1.1 christos /* Is there a section for this segment? */ 4521 1.1 christos bfd_vma base_vma = i_phdr->p_vaddr; 4522 1.1 christos bfd_vma limit_vma = base_vma + i_phdr->p_filesz; 4523 1.1 christos 4524 1.1 christos if (i_phdr->p_type != PT_LOAD) 4525 1.1 christos continue; 4526 1.1 christos 4527 1.1 christos /* We need to cover from base_vms to limit_vma. */ 4528 1.1 christos again: 4529 1.1 christos while (base_vma < limit_vma) 4530 1.1 christos { 4531 1.1 christos bfd_vma next_vma = limit_vma; 4532 1.1 christos asection *nsec; 4533 1.1 christos asection *sec; 4534 1.1 christos flagword flags; 4535 1.1 christos char *nname = NULL; 4536 1.1 christos 4537 1.1 christos /* Find a section covering [base_vma;limit_vma) */ 4538 1.1 christos for (sec = abfd->sections; sec != NULL; sec = sec->next) 4539 1.1 christos { 4540 1.1 christos /* Skip uninteresting sections (either not in memory or 4541 1.1 christos below base_vma. */ 4542 1.1 christos if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0 4543 1.1 christos || sec->vma + sec->size <= base_vma) 4544 1.1 christos continue; 4545 1.1 christos if (sec->vma <= base_vma) 4546 1.1 christos { 4547 1.1 christos /* This section covers (maybe partially) the beginning 4548 1.1 christos of the range. */ 4549 1.1 christos base_vma = sec->vma + sec->size; 4550 1.1 christos goto again; 4551 1.1 christos } 4552 1.1 christos if (sec->vma < next_vma) 4553 1.1 christos { 4554 1.1 christos /* This section partially covers the end of the range. 4555 1.1 christos Used to compute the size of the hole. */ 4556 1.1 christos next_vma = sec->vma; 4557 1.1 christos } 4558 1.1 christos } 4559 1.1 christos 4560 1.1 christos /* No section covering [base_vma; next_vma). Create a fake one. */ 4561 1.1 christos flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; 4562 1.1 christos if (i_phdr->p_flags & PF_X) 4563 1.1 christos { 4564 1.1 christos flags |= SEC_CODE; 4565 1.1 christos if (num_text++ == 0) 4566 1.1 christos nname = ".text"; 4567 1.1 christos else 4568 1.1 christos sprintf (name, ".text$%u", num_text); 4569 1.1 christos } 4570 1.1 christos else if ((i_phdr->p_flags & (PF_R | PF_W)) == PF_R) 4571 1.1 christos { 4572 1.1 christos flags |= SEC_READONLY; 4573 1.1 christos sprintf (name, ".rodata$%u", num_rodata++); 4574 1.1 christos } 4575 1.1 christos else 4576 1.1 christos { 4577 1.1 christos flags |= SEC_DATA; 4578 1.1 christos sprintf (name, ".data$%u", num_data++); 4579 1.1 christos } 4580 1.1 christos 4581 1.1 christos /* Allocate name. */ 4582 1.1 christos if (nname == NULL) 4583 1.1 christos { 4584 1.1 christos size_t name_len = strlen (name) + 1; 4585 1.1 christos nname = bfd_alloc (abfd, name_len); 4586 1.1 christos if (nname == NULL) 4587 1.1.1.7 christos return false; 4588 1.1 christos memcpy (nname, name, name_len); 4589 1.1 christos } 4590 1.1 christos 4591 1.1 christos /* Create and fill new section. */ 4592 1.1 christos nsec = bfd_make_section_anyway_with_flags (abfd, nname, flags); 4593 1.1 christos if (nsec == NULL) 4594 1.1.1.7 christos return false; 4595 1.1 christos nsec->vma = base_vma; 4596 1.1 christos nsec->size = next_vma - base_vma; 4597 1.1 christos nsec->filepos = i_phdr->p_offset + (base_vma - i_phdr->p_vaddr); 4598 1.1 christos 4599 1.1 christos base_vma = next_vma; 4600 1.1 christos } 4601 1.1 christos } 4602 1.1.1.7 christos return true; 4603 1.1 christos } 4604 1.1 christos 4605 1.1.1.7 christos static bool 4606 1.1.1.6 christos elf64_vms_init_file_header (bfd *abfd, struct bfd_link_info *info) 4607 1.1 christos { 4608 1.1.1.6 christos Elf_Internal_Ehdr *i_ehdrp; 4609 1.1.1.6 christos 4610 1.1.1.6 christos if (!_bfd_elf_init_file_header (abfd, info)) 4611 1.1.1.7 christos return false; 4612 1.1 christos 4613 1.1.1.6 christos i_ehdrp = elf_elfheader (abfd); 4614 1.1 christos i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_OPENVMS; 4615 1.1 christos i_ehdrp->e_ident[EI_ABIVERSION] = 2; 4616 1.1.1.7 christos return true; 4617 1.1 christos } 4618 1.1 christos 4619 1.1.1.7 christos static bool 4620 1.1 christos elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED, 4621 1.1 christos Elf_Internal_Shdr *hdr) 4622 1.1 christos { 4623 1.1 christos if (hdr->bfd_section != NULL) 4624 1.1 christos { 4625 1.1.1.6 christos const char *name = bfd_section_name (hdr->bfd_section); 4626 1.1 christos 4627 1.1 christos if (strcmp (name, ".text") == 0) 4628 1.1 christos hdr->sh_flags |= SHF_IA_64_VMS_SHARED; 4629 1.1 christos else if ((strcmp (name, ".debug") == 0) 4630 1.1 christos || (strcmp (name, ".debug_abbrev") == 0) 4631 1.1 christos || (strcmp (name, ".debug_aranges") == 0) 4632 1.1 christos || (strcmp (name, ".debug_frame") == 0) 4633 1.1 christos || (strcmp (name, ".debug_info") == 0) 4634 1.1 christos || (strcmp (name, ".debug_loc") == 0) 4635 1.1 christos || (strcmp (name, ".debug_macinfo") == 0) 4636 1.1 christos || (strcmp (name, ".debug_pubnames") == 0) 4637 1.1 christos || (strcmp (name, ".debug_pubtypes") == 0)) 4638 1.1 christos hdr->sh_type = SHT_IA_64_VMS_DEBUG; 4639 1.1 christos else if ((strcmp (name, ".debug_line") == 0) 4640 1.1 christos || (strcmp (name, ".debug_ranges") == 0) 4641 1.1 christos || (strcmp (name, ".trace_info") == 0) 4642 1.1 christos || (strcmp (name, ".trace_abbrev") == 0) 4643 1.1 christos || (strcmp (name, ".trace_aranges") == 0)) 4644 1.1 christos hdr->sh_type = SHT_IA_64_VMS_TRACE; 4645 1.1 christos else if (strcmp (name, ".debug_str") == 0) 4646 1.1 christos hdr->sh_type = SHT_IA_64_VMS_DEBUG_STR; 4647 1.1 christos } 4648 1.1 christos 4649 1.1.1.7 christos return true; 4650 1.1 christos } 4651 1.1 christos 4652 1.1 christos /* The final processing done just before writing out a VMS IA-64 ELF 4653 1.1 christos object file. */ 4654 1.1 christos 4655 1.1.1.7 christos static bool 4656 1.1.1.6 christos elf64_vms_final_write_processing (bfd *abfd) 4657 1.1 christos { 4658 1.1 christos Elf_Internal_Shdr *hdr; 4659 1.1 christos asection *s; 4660 1.1 christos int unwind_info_sect_idx = 0; 4661 1.1 christos 4662 1.1 christos for (s = abfd->sections; s; s = s->next) 4663 1.1 christos { 4664 1.1 christos hdr = &elf_section_data (s)->this_hdr; 4665 1.1 christos 4666 1.1.1.6 christos if (strcmp (bfd_section_name (hdr->bfd_section), 4667 1.1 christos ".IA_64.unwind_info") == 0) 4668 1.1 christos unwind_info_sect_idx = elf_section_data (s)->this_idx; 4669 1.1 christos 4670 1.1 christos switch (hdr->sh_type) 4671 1.1 christos { 4672 1.1 christos case SHT_IA_64_UNWIND: 4673 1.1 christos /* VMS requires sh_info to point to the unwind info section. */ 4674 1.1.1.4 christos hdr->sh_info = unwind_info_sect_idx; 4675 1.1 christos break; 4676 1.1 christos } 4677 1.1 christos } 4678 1.1 christos 4679 1.1 christos if (! elf_flags_init (abfd)) 4680 1.1 christos { 4681 1.1 christos unsigned long flags = 0; 4682 1.1 christos 4683 1.1 christos if (abfd->xvec->byteorder == BFD_ENDIAN_BIG) 4684 1.1 christos flags |= EF_IA_64_BE; 4685 1.1 christos if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64) 4686 1.1 christos flags |= EF_IA_64_ABI64; 4687 1.1 christos 4688 1.1 christos elf_elfheader (abfd)->e_flags = flags; 4689 1.1.1.7 christos elf_flags_init (abfd) = true; 4690 1.1 christos } 4691 1.1.1.6 christos return _bfd_elf_final_write_processing (abfd); 4692 1.1 christos } 4693 1.1 christos 4694 1.1.1.7 christos static bool 4695 1.1 christos elf64_vms_write_shdrs_and_ehdr (bfd *abfd) 4696 1.1 christos { 4697 1.1 christos unsigned char needed_count[8]; 4698 1.1 christos 4699 1.1 christos if (!bfd_elf64_write_shdrs_and_ehdr (abfd)) 4700 1.1.1.7 christos return false; 4701 1.1 christos 4702 1.1 christos bfd_putl64 (elf_ia64_vms_tdata (abfd)->needed_count, needed_count); 4703 1.1 christos 4704 1.1 christos if (bfd_seek (abfd, sizeof (Elf64_External_Ehdr), SEEK_SET) != 0 4705 1.1.1.8 christos || bfd_write (needed_count, 8, abfd) != 8) 4706 1.1.1.7 christos return false; 4707 1.1 christos 4708 1.1.1.7 christos return true; 4709 1.1 christos } 4710 1.1 christos 4711 1.1.1.7 christos static bool 4712 1.1 christos elf64_vms_close_and_cleanup (bfd *abfd) 4713 1.1 christos { 4714 1.1.1.8 christos bool ret = true; 4715 1.1.1.8 christos if (bfd_get_format (abfd) == bfd_object 4716 1.1.1.8 christos && bfd_write_p (abfd)) 4717 1.1 christos { 4718 1.1 christos long isize; 4719 1.1 christos 4720 1.1 christos /* Pad to 8 byte boundary for IPF/VMS. */ 4721 1.1 christos isize = bfd_get_size (abfd); 4722 1.1 christos if ((isize & 7) != 0) 4723 1.1 christos { 4724 1.1.1.8 christos unsigned int ishort = 8 - (isize & 7); 4725 1.1.1.7 christos uint64_t pad = 0; 4726 1.1 christos 4727 1.1.1.8 christos if (bfd_seek (abfd, isize, SEEK_SET) != 0 4728 1.1.1.8 christos || bfd_write (&pad, ishort, abfd) != ishort) 4729 1.1.1.8 christos ret = false; 4730 1.1 christos } 4731 1.1 christos } 4732 1.1 christos 4733 1.1.1.8 christos return _bfd_generic_close_and_cleanup (abfd) && ret; 4734 1.1 christos } 4735 1.1 christos 4736 1.1 christos /* Add symbols from an ELF object file to the linker hash table. */ 4737 1.1 christos 4738 1.1.1.7 christos static bool 4739 1.1 christos elf64_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) 4740 1.1 christos { 4741 1.1 christos Elf_Internal_Shdr *hdr; 4742 1.1 christos bfd_size_type symcount; 4743 1.1 christos bfd_size_type extsymcount; 4744 1.1 christos bfd_size_type extsymoff; 4745 1.1 christos struct elf_link_hash_entry **sym_hash; 4746 1.1.1.7 christos bool dynamic; 4747 1.1 christos Elf_Internal_Sym *isymbuf = NULL; 4748 1.1 christos Elf_Internal_Sym *isym; 4749 1.1 christos Elf_Internal_Sym *isymend; 4750 1.1.1.10 christos elf_backend_data *bed; 4751 1.1 christos struct elf_link_hash_table *htab; 4752 1.1 christos bfd_size_type amt; 4753 1.1 christos 4754 1.1 christos htab = elf_hash_table (info); 4755 1.1 christos bed = get_elf_backend_data (abfd); 4756 1.1 christos 4757 1.1 christos if ((abfd->flags & DYNAMIC) == 0) 4758 1.1.1.7 christos dynamic = false; 4759 1.1 christos else 4760 1.1 christos { 4761 1.1.1.7 christos dynamic = true; 4762 1.1 christos 4763 1.1 christos /* You can't use -r against a dynamic object. Also, there's no 4764 1.1 christos hope of using a dynamic object which does not exactly match 4765 1.1 christos the format of the output file. */ 4766 1.1.1.2 christos if (bfd_link_relocatable (info) 4767 1.1.1.7 christos || !is_elf_hash_table (&htab->root) 4768 1.1 christos || info->output_bfd->xvec != abfd->xvec) 4769 1.1 christos { 4770 1.1.1.2 christos if (bfd_link_relocatable (info)) 4771 1.1 christos bfd_set_error (bfd_error_invalid_operation); 4772 1.1 christos else 4773 1.1 christos bfd_set_error (bfd_error_wrong_format); 4774 1.1 christos goto error_return; 4775 1.1 christos } 4776 1.1 christos } 4777 1.1 christos 4778 1.1 christos if (! dynamic) 4779 1.1 christos { 4780 1.1 christos /* If we are creating a shared library, create all the dynamic 4781 1.1 christos sections immediately. We need to attach them to something, 4782 1.1 christos so we attach them to this BFD, provided it is the right 4783 1.1 christos format. FIXME: If there are no input BFD's of the same 4784 1.1 christos format as the output, we can't make a shared library. */ 4785 1.1.1.2 christos if (bfd_link_pic (info) 4786 1.1.1.7 christos && is_elf_hash_table (&htab->root) 4787 1.1 christos && info->output_bfd->xvec == abfd->xvec 4788 1.1 christos && !htab->dynamic_sections_created) 4789 1.1 christos { 4790 1.1 christos if (! elf64_ia64_create_dynamic_sections (abfd, info)) 4791 1.1 christos goto error_return; 4792 1.1 christos } 4793 1.1 christos } 4794 1.1.1.7 christos else if (!is_elf_hash_table (&htab->root)) 4795 1.1 christos goto error_return; 4796 1.1 christos else 4797 1.1 christos { 4798 1.1 christos asection *s; 4799 1.1 christos bfd_byte *dynbuf; 4800 1.1 christos bfd_byte *extdyn; 4801 1.1 christos 4802 1.1 christos /* ld --just-symbols and dynamic objects don't mix very well. 4803 1.1 christos ld shouldn't allow it. */ 4804 1.1 christos if ((s = abfd->sections) != NULL 4805 1.1 christos && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS) 4806 1.1 christos abort (); 4807 1.1 christos 4808 1.1 christos /* Be sure there are dynamic sections. */ 4809 1.1 christos if (! elf64_ia64_create_dynamic_sections (htab->dynobj, info)) 4810 1.1.1.4 christos goto error_return; 4811 1.1 christos 4812 1.1 christos s = bfd_get_section_by_name (abfd, ".dynamic"); 4813 1.1 christos if (s == NULL) 4814 1.1.1.4 christos { 4815 1.1.1.4 christos /* VMS libraries do not have dynamic sections. Create one from 4816 1.1.1.4 christos the segment. */ 4817 1.1.1.4 christos Elf_Internal_Phdr *phdr; 4818 1.1.1.4 christos unsigned int i, phnum; 4819 1.1.1.4 christos 4820 1.1.1.4 christos phdr = elf_tdata (abfd)->phdr; 4821 1.1.1.4 christos if (phdr == NULL) 4822 1.1.1.4 christos goto error_return; 4823 1.1.1.4 christos phnum = elf_elfheader (abfd)->e_phnum; 4824 1.1.1.4 christos for (i = 0; i < phnum; phdr++) 4825 1.1.1.4 christos if (phdr->p_type == PT_DYNAMIC) 4826 1.1.1.4 christos { 4827 1.1.1.4 christos s = bfd_make_section (abfd, ".dynamic"); 4828 1.1.1.4 christos if (s == NULL) 4829 1.1.1.4 christos goto error_return; 4830 1.1.1.4 christos s->vma = phdr->p_vaddr; 4831 1.1.1.4 christos s->lma = phdr->p_paddr; 4832 1.1.1.4 christos s->size = phdr->p_filesz; 4833 1.1.1.4 christos s->filepos = phdr->p_offset; 4834 1.1.1.4 christos s->flags |= SEC_HAS_CONTENTS; 4835 1.1.1.4 christos s->alignment_power = bfd_log2 (phdr->p_align); 4836 1.1.1.4 christos break; 4837 1.1.1.4 christos } 4838 1.1.1.4 christos if (s == NULL) 4839 1.1.1.4 christos goto error_return; 4840 1.1.1.4 christos } 4841 1.1 christos 4842 1.1 christos /* Extract IDENT. */ 4843 1.1 christos if (!bfd_malloc_and_get_section (abfd, s, &dynbuf)) 4844 1.1.1.4 christos { 4845 1.1.1.7 christos error_free_dyn: 4846 1.1.1.4 christos free (dynbuf); 4847 1.1.1.4 christos goto error_return; 4848 1.1.1.4 christos } 4849 1.1 christos 4850 1.1 christos for (extdyn = dynbuf; 4851 1.1.1.8 christos (size_t) (dynbuf + s->size - extdyn) >= bed->s->sizeof_dyn; 4852 1.1.1.4 christos extdyn += bed->s->sizeof_dyn) 4853 1.1.1.4 christos { 4854 1.1.1.4 christos Elf_Internal_Dyn dyn; 4855 1.1.1.4 christos 4856 1.1.1.4 christos bed->s->swap_dyn_in (abfd, extdyn, &dyn); 4857 1.1.1.4 christos if (dyn.d_tag == DT_IA_64_VMS_IDENT) 4858 1.1.1.4 christos { 4859 1.1.1.7 christos uint64_t tagv = dyn.d_un.d_val; 4860 1.1.1.4 christos elf_ia64_vms_ident (abfd) = tagv; 4861 1.1.1.4 christos break; 4862 1.1.1.4 christos } 4863 1.1.1.4 christos } 4864 1.1 christos if (extdyn >= dynbuf + s->size) 4865 1.1.1.4 christos { 4866 1.1.1.4 christos /* Ident not found. */ 4867 1.1.1.4 christos goto error_free_dyn; 4868 1.1.1.4 christos } 4869 1.1 christos free (dynbuf); 4870 1.1 christos 4871 1.1 christos /* We do not want to include any of the sections in a dynamic 4872 1.1 christos object in the output file. We hack by simply clobbering the 4873 1.1 christos list of sections in the BFD. This could be handled more 4874 1.1 christos cleanly by, say, a new section flag; the existing 4875 1.1 christos SEC_NEVER_LOAD flag is not the one we want, because that one 4876 1.1 christos still implies that the section takes up space in the output 4877 1.1 christos file. */ 4878 1.1 christos bfd_section_list_clear (abfd); 4879 1.1 christos 4880 1.1 christos /* FIXME: should we detect if this library is already included ? 4881 1.1.1.4 christos This should be harmless and shouldn't happen in practice. */ 4882 1.1 christos } 4883 1.1 christos 4884 1.1 christos hdr = &elf_tdata (abfd)->symtab_hdr; 4885 1.1 christos symcount = hdr->sh_size / bed->s->sizeof_sym; 4886 1.1 christos 4887 1.1 christos /* The sh_info field of the symtab header tells us where the 4888 1.1 christos external symbols start. We don't care about the local symbols at 4889 1.1 christos this point. */ 4890 1.1 christos extsymcount = symcount - hdr->sh_info; 4891 1.1 christos extsymoff = hdr->sh_info; 4892 1.1 christos 4893 1.1 christos sym_hash = NULL; 4894 1.1 christos if (extsymcount != 0) 4895 1.1 christos { 4896 1.1 christos isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff, 4897 1.1 christos NULL, NULL, NULL); 4898 1.1 christos if (isymbuf == NULL) 4899 1.1 christos goto error_return; 4900 1.1 christos 4901 1.1 christos /* We store a pointer to the hash table entry for each external 4902 1.1 christos symbol. */ 4903 1.1 christos amt = extsymcount * sizeof (struct elf_link_hash_entry *); 4904 1.1 christos sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt); 4905 1.1 christos if (sym_hash == NULL) 4906 1.1 christos goto error_free_sym; 4907 1.1 christos elf_sym_hashes (abfd) = sym_hash; 4908 1.1 christos } 4909 1.1 christos 4910 1.1 christos for (isym = isymbuf, isymend = isymbuf + extsymcount; 4911 1.1 christos isym < isymend; 4912 1.1 christos isym++, sym_hash++) 4913 1.1 christos { 4914 1.1 christos int bind; 4915 1.1 christos bfd_vma value; 4916 1.1 christos asection *sec, *new_sec; 4917 1.1 christos flagword flags; 4918 1.1 christos const char *name; 4919 1.1 christos struct elf_link_hash_entry *h; 4920 1.1.1.7 christos bool definition; 4921 1.1.1.7 christos bool size_change_ok; 4922 1.1.1.7 christos bool type_change_ok; 4923 1.1.1.7 christos bool common; 4924 1.1 christos unsigned int old_alignment; 4925 1.1 christos bfd *old_bfd; 4926 1.1 christos 4927 1.1 christos flags = BSF_NO_FLAGS; 4928 1.1 christos sec = NULL; 4929 1.1 christos value = isym->st_value; 4930 1.1 christos *sym_hash = NULL; 4931 1.1 christos common = bed->common_definition (isym); 4932 1.1 christos 4933 1.1 christos bind = ELF_ST_BIND (isym->st_info); 4934 1.1 christos switch (bind) 4935 1.1 christos { 4936 1.1 christos case STB_LOCAL: 4937 1.1 christos /* This should be impossible, since ELF requires that all 4938 1.1 christos global symbols follow all local symbols, and that sh_info 4939 1.1 christos point to the first global symbol. Unfortunately, Irix 5 4940 1.1 christos screws this up. */ 4941 1.1 christos continue; 4942 1.1 christos 4943 1.1 christos case STB_GLOBAL: 4944 1.1 christos if (isym->st_shndx != SHN_UNDEF && !common) 4945 1.1 christos flags = BSF_GLOBAL; 4946 1.1 christos break; 4947 1.1 christos 4948 1.1 christos case STB_WEAK: 4949 1.1 christos flags = BSF_WEAK; 4950 1.1 christos break; 4951 1.1 christos 4952 1.1 christos case STB_GNU_UNIQUE: 4953 1.1 christos flags = BSF_GNU_UNIQUE; 4954 1.1 christos break; 4955 1.1 christos 4956 1.1 christos default: 4957 1.1 christos /* Leave it up to the processor backend. */ 4958 1.1 christos break; 4959 1.1 christos } 4960 1.1 christos 4961 1.1 christos if (isym->st_shndx == SHN_UNDEF) 4962 1.1 christos sec = bfd_und_section_ptr; 4963 1.1 christos else if (isym->st_shndx == SHN_ABS) 4964 1.1 christos sec = bfd_abs_section_ptr; 4965 1.1 christos else if (isym->st_shndx == SHN_COMMON) 4966 1.1 christos { 4967 1.1 christos sec = bfd_com_section_ptr; 4968 1.1 christos /* What ELF calls the size we call the value. What ELF 4969 1.1 christos calls the value we call the alignment. */ 4970 1.1 christos value = isym->st_size; 4971 1.1 christos } 4972 1.1 christos else 4973 1.1 christos { 4974 1.1 christos sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 4975 1.1 christos if (sec == NULL) 4976 1.1 christos sec = bfd_abs_section_ptr; 4977 1.1 christos else if (sec->kept_section) 4978 1.1 christos { 4979 1.1 christos /* Symbols from discarded section are undefined. We keep 4980 1.1 christos its visibility. */ 4981 1.1 christos sec = bfd_und_section_ptr; 4982 1.1 christos isym->st_shndx = SHN_UNDEF; 4983 1.1 christos } 4984 1.1 christos else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) 4985 1.1 christos value -= sec->vma; 4986 1.1 christos } 4987 1.1 christos 4988 1.1 christos name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, 4989 1.1 christos isym->st_name); 4990 1.1 christos if (name == NULL) 4991 1.1 christos goto error_free_vers; 4992 1.1 christos 4993 1.1 christos if (bed->elf_add_symbol_hook) 4994 1.1 christos { 4995 1.1 christos if (! (*bed->elf_add_symbol_hook) (abfd, info, isym, &name, &flags, 4996 1.1 christos &sec, &value)) 4997 1.1 christos goto error_free_vers; 4998 1.1 christos 4999 1.1 christos /* The hook function sets the name to NULL if this symbol 5000 1.1 christos should be skipped for some reason. */ 5001 1.1 christos if (name == NULL) 5002 1.1 christos continue; 5003 1.1 christos } 5004 1.1 christos 5005 1.1 christos /* Sanity check that all possibilities were handled. */ 5006 1.1 christos if (sec == NULL) 5007 1.1 christos { 5008 1.1 christos bfd_set_error (bfd_error_bad_value); 5009 1.1 christos goto error_free_vers; 5010 1.1 christos } 5011 1.1 christos 5012 1.1 christos if (bfd_is_und_section (sec) 5013 1.1 christos || bfd_is_com_section (sec)) 5014 1.1.1.7 christos definition = false; 5015 1.1 christos else 5016 1.1.1.7 christos definition = true; 5017 1.1 christos 5018 1.1.1.7 christos size_change_ok = false; 5019 1.1 christos type_change_ok = bed->type_change_ok; 5020 1.1 christos old_alignment = 0; 5021 1.1 christos old_bfd = NULL; 5022 1.1 christos new_sec = sec; 5023 1.1 christos 5024 1.1 christos if (! bfd_is_und_section (sec)) 5025 1.1.1.7 christos h = elf_link_hash_lookup (htab, name, true, false, false); 5026 1.1 christos else 5027 1.1.1.4 christos h = ((struct elf_link_hash_entry *) bfd_wrapped_link_hash_lookup 5028 1.1.1.7 christos (abfd, info, name, true, false, false)); 5029 1.1 christos if (h == NULL) 5030 1.1.1.4 christos goto error_free_sym; 5031 1.1 christos 5032 1.1 christos *sym_hash = h; 5033 1.1 christos 5034 1.1.1.7 christos if (is_elf_hash_table (&htab->root)) 5035 1.1 christos { 5036 1.1 christos while (h->root.type == bfd_link_hash_indirect 5037 1.1 christos || h->root.type == bfd_link_hash_warning) 5038 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 5039 1.1 christos 5040 1.1 christos /* Remember the old alignment if this is a common symbol, so 5041 1.1 christos that we don't reduce the alignment later on. We can't 5042 1.1 christos check later, because _bfd_generic_link_add_one_symbol 5043 1.1 christos will set a default for the alignment which we want to 5044 1.1 christos override. We also remember the old bfd where the existing 5045 1.1 christos definition comes from. */ 5046 1.1 christos switch (h->root.type) 5047 1.1 christos { 5048 1.1 christos default: 5049 1.1 christos break; 5050 1.1 christos 5051 1.1 christos case bfd_link_hash_defined: 5052 1.1.1.4 christos if (abfd->selective_search) 5053 1.1.1.4 christos continue; 5054 1.1.1.4 christos /* Fall-through. */ 5055 1.1 christos case bfd_link_hash_defweak: 5056 1.1 christos old_bfd = h->root.u.def.section->owner; 5057 1.1 christos break; 5058 1.1 christos 5059 1.1 christos case bfd_link_hash_common: 5060 1.1 christos old_bfd = h->root.u.c.p->section->owner; 5061 1.1 christos old_alignment = h->root.u.c.p->alignment_power; 5062 1.1 christos break; 5063 1.1 christos } 5064 1.1 christos } 5065 1.1 christos 5066 1.1 christos if (! (_bfd_generic_link_add_one_symbol 5067 1.1.1.7 christos (info, abfd, name, flags, sec, value, NULL, false, bed->collect, 5068 1.1 christos (struct bfd_link_hash_entry **) sym_hash))) 5069 1.1 christos goto error_free_vers; 5070 1.1 christos 5071 1.1 christos h = *sym_hash; 5072 1.1 christos while (h->root.type == bfd_link_hash_indirect 5073 1.1 christos || h->root.type == bfd_link_hash_warning) 5074 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 5075 1.1 christos 5076 1.1 christos *sym_hash = h; 5077 1.1.1.2 christos if (definition) 5078 1.1.1.2 christos h->unique_global = (flags & BSF_GNU_UNIQUE) != 0; 5079 1.1 christos 5080 1.1 christos /* Set the alignment of a common symbol. */ 5081 1.1 christos if ((common || bfd_is_com_section (sec)) 5082 1.1 christos && h->root.type == bfd_link_hash_common) 5083 1.1 christos { 5084 1.1 christos unsigned int align; 5085 1.1 christos 5086 1.1 christos if (common) 5087 1.1 christos align = bfd_log2 (isym->st_value); 5088 1.1 christos else 5089 1.1 christos { 5090 1.1 christos /* The new symbol is a common symbol in a shared object. 5091 1.1 christos We need to get the alignment from the section. */ 5092 1.1 christos align = new_sec->alignment_power; 5093 1.1 christos } 5094 1.1 christos if (align > old_alignment 5095 1.1 christos /* Permit an alignment power of zero if an alignment of one 5096 1.1 christos is specified and no other alignments have been specified. */ 5097 1.1 christos || (isym->st_value == 1 && old_alignment == 0)) 5098 1.1 christos h->root.u.c.p->alignment_power = align; 5099 1.1 christos else 5100 1.1 christos h->root.u.c.p->alignment_power = old_alignment; 5101 1.1 christos } 5102 1.1 christos 5103 1.1.1.7 christos if (is_elf_hash_table (&htab->root)) 5104 1.1 christos { 5105 1.1 christos /* Check the alignment when a common symbol is involved. This 5106 1.1 christos can change when a common symbol is overridden by a normal 5107 1.1 christos definition or a common symbol is ignored due to the old 5108 1.1 christos normal definition. We need to make sure the maximum 5109 1.1 christos alignment is maintained. */ 5110 1.1 christos if ((old_alignment || common) 5111 1.1 christos && h->root.type != bfd_link_hash_common) 5112 1.1 christos { 5113 1.1 christos unsigned int common_align; 5114 1.1 christos unsigned int normal_align; 5115 1.1 christos unsigned int symbol_align; 5116 1.1 christos bfd *normal_bfd; 5117 1.1 christos bfd *common_bfd; 5118 1.1 christos 5119 1.1 christos symbol_align = ffs (h->root.u.def.value) - 1; 5120 1.1 christos if (h->root.u.def.section->owner != NULL 5121 1.1 christos && (h->root.u.def.section->owner->flags & DYNAMIC) == 0) 5122 1.1 christos { 5123 1.1 christos normal_align = h->root.u.def.section->alignment_power; 5124 1.1 christos if (normal_align > symbol_align) 5125 1.1 christos normal_align = symbol_align; 5126 1.1 christos } 5127 1.1 christos else 5128 1.1 christos normal_align = symbol_align; 5129 1.1 christos 5130 1.1 christos if (old_alignment) 5131 1.1 christos { 5132 1.1 christos common_align = old_alignment; 5133 1.1 christos common_bfd = old_bfd; 5134 1.1 christos normal_bfd = abfd; 5135 1.1 christos } 5136 1.1 christos else 5137 1.1 christos { 5138 1.1 christos common_align = bfd_log2 (isym->st_value); 5139 1.1 christos common_bfd = abfd; 5140 1.1 christos normal_bfd = old_bfd; 5141 1.1 christos } 5142 1.1 christos 5143 1.1 christos if (normal_align < common_align) 5144 1.1 christos { 5145 1.1 christos /* PR binutils/2735 */ 5146 1.1 christos if (normal_bfd == NULL) 5147 1.1.1.4 christos _bfd_error_handler 5148 1.1.1.4 christos /* xgettext:c-format */ 5149 1.1.1.5 christos (_("warning: alignment %u of common symbol `%s' in %pB" 5150 1.1.1.5 christos " is greater than the alignment (%u) of its section %pA"), 5151 1.1.1.4 christos 1 << common_align, name, common_bfd, 5152 1.1.1.4 christos 1 << normal_align, h->root.u.def.section); 5153 1.1 christos else 5154 1.1.1.4 christos _bfd_error_handler 5155 1.1.1.4 christos /* xgettext:c-format */ 5156 1.1.1.5 christos (_("warning: alignment %u of symbol `%s' in %pB" 5157 1.1.1.5 christos " is smaller than %u in %pB"), 5158 1.1.1.4 christos 1 << normal_align, name, normal_bfd, 5159 1.1.1.4 christos 1 << common_align, common_bfd); 5160 1.1 christos } 5161 1.1 christos } 5162 1.1 christos 5163 1.1 christos /* Remember the symbol size if it isn't undefined. */ 5164 1.1 christos if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF) 5165 1.1 christos && (definition || h->size == 0)) 5166 1.1 christos { 5167 1.1 christos if (h->size != 0 5168 1.1 christos && h->size != isym->st_size 5169 1.1 christos && ! size_change_ok) 5170 1.1.1.4 christos _bfd_error_handler 5171 1.1.1.4 christos /* xgettext:c-format */ 5172 1.1.1.5 christos (_("warning: size of symbol `%s' changed" 5173 1.1.1.5 christos " from %" PRIu64 " in %pB to %" PRIu64 " in %pB"), 5174 1.1.1.5 christos name, (uint64_t) h->size, old_bfd, 5175 1.1.1.5 christos (uint64_t) isym->st_size, abfd); 5176 1.1 christos 5177 1.1 christos h->size = isym->st_size; 5178 1.1 christos } 5179 1.1 christos 5180 1.1 christos /* If this is a common symbol, then we always want H->SIZE 5181 1.1 christos to be the size of the common symbol. The code just above 5182 1.1 christos won't fix the size if a common symbol becomes larger. We 5183 1.1 christos don't warn about a size change here, because that is 5184 1.1 christos covered by --warn-common. Allow changed between different 5185 1.1 christos function types. */ 5186 1.1 christos if (h->root.type == bfd_link_hash_common) 5187 1.1 christos h->size = h->root.u.c.size; 5188 1.1 christos 5189 1.1 christos if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE 5190 1.1 christos && (definition || h->type == STT_NOTYPE)) 5191 1.1 christos { 5192 1.1 christos unsigned int type = ELF_ST_TYPE (isym->st_info); 5193 1.1 christos 5194 1.1 christos if (h->type != type) 5195 1.1 christos { 5196 1.1 christos if (h->type != STT_NOTYPE && ! type_change_ok) 5197 1.1.1.4 christos _bfd_error_handler 5198 1.1.1.4 christos /* xgettext:c-format */ 5199 1.1.1.5 christos (_("warning: type of symbol `%s' changed" 5200 1.1.1.5 christos " from %d to %d in %pB"), 5201 1.1.1.4 christos name, h->type, type, abfd); 5202 1.1 christos 5203 1.1 christos h->type = type; 5204 1.1 christos } 5205 1.1 christos } 5206 1.1 christos 5207 1.1 christos /* Set a flag in the hash table entry indicating the type of 5208 1.1 christos reference or definition we just found. Keep a count of 5209 1.1 christos the number of dynamic symbols we find. A dynamic symbol 5210 1.1 christos is one which is referenced or defined by both a regular 5211 1.1 christos object and a shared object. */ 5212 1.1 christos if (! dynamic) 5213 1.1 christos { 5214 1.1 christos if (! definition) 5215 1.1 christos { 5216 1.1 christos h->ref_regular = 1; 5217 1.1 christos if (bind != STB_WEAK) 5218 1.1 christos h->ref_regular_nonweak = 1; 5219 1.1 christos } 5220 1.1 christos else 5221 1.1 christos { 5222 1.1.1.4 christos BFD_ASSERT (!h->def_dynamic); 5223 1.1 christos h->def_regular = 1; 5224 1.1 christos } 5225 1.1 christos } 5226 1.1 christos else 5227 1.1 christos { 5228 1.1 christos BFD_ASSERT (definition); 5229 1.1.1.4 christos h->def_dynamic = 1; 5230 1.1.1.4 christos h->dynindx = -2; 5231 1.1.1.4 christos ((struct elf64_ia64_link_hash_entry *)h)->shl = abfd; 5232 1.1 christos } 5233 1.1 christos } 5234 1.1 christos } 5235 1.1 christos 5236 1.1.1.7 christos free (isymbuf); 5237 1.1.1.7 christos isymbuf = NULL; 5238 1.1 christos 5239 1.1 christos /* If this object is the same format as the output object, and it is 5240 1.1 christos not a shared library, then let the backend look through the 5241 1.1 christos relocs. 5242 1.1 christos 5243 1.1 christos This is required to build global offset table entries and to 5244 1.1 christos arrange for dynamic relocs. It is not required for the 5245 1.1 christos particular common case of linking non PIC code, even when linking 5246 1.1 christos against shared libraries, but unfortunately there is no way of 5247 1.1 christos knowing whether an object file has been compiled PIC or not. 5248 1.1 christos Looking through the relocs is not particularly time consuming. 5249 1.1 christos The problem is that we must either (1) keep the relocs in memory, 5250 1.1 christos which causes the linker to require additional runtime memory or 5251 1.1 christos (2) read the relocs twice from the input file, which wastes time. 5252 1.1 christos This would be a good case for using mmap. 5253 1.1 christos 5254 1.1 christos I have no idea how to handle linking PIC code into a file of a 5255 1.1 christos different format. It probably can't be done. */ 5256 1.1 christos if (! dynamic 5257 1.1.1.7 christos && is_elf_hash_table (&htab->root) 5258 1.1 christos && bed->check_relocs != NULL 5259 1.1 christos && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec)) 5260 1.1 christos { 5261 1.1 christos asection *o; 5262 1.1 christos 5263 1.1 christos for (o = abfd->sections; o != NULL; o = o->next) 5264 1.1 christos { 5265 1.1 christos Elf_Internal_Rela *internal_relocs; 5266 1.1.1.7 christos bool ok; 5267 1.1 christos 5268 1.1 christos if ((o->flags & SEC_RELOC) == 0 5269 1.1 christos || o->reloc_count == 0 5270 1.1 christos || ((info->strip == strip_all || info->strip == strip_debugger) 5271 1.1 christos && (o->flags & SEC_DEBUGGING) != 0) 5272 1.1 christos || bfd_is_abs_section (o->output_section)) 5273 1.1 christos continue; 5274 1.1 christos 5275 1.1 christos internal_relocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, 5276 1.1 christos info->keep_memory); 5277 1.1 christos if (internal_relocs == NULL) 5278 1.1 christos goto error_return; 5279 1.1 christos 5280 1.1 christos ok = (*bed->check_relocs) (abfd, info, o, internal_relocs); 5281 1.1 christos 5282 1.1 christos if (elf_section_data (o)->relocs != internal_relocs) 5283 1.1 christos free (internal_relocs); 5284 1.1 christos 5285 1.1 christos if (! ok) 5286 1.1 christos goto error_return; 5287 1.1 christos } 5288 1.1 christos } 5289 1.1 christos 5290 1.1.1.7 christos return true; 5291 1.1 christos 5292 1.1 christos error_free_vers: 5293 1.1 christos error_free_sym: 5294 1.1.1.7 christos free (isymbuf); 5295 1.1 christos error_return: 5296 1.1.1.7 christos return false; 5297 1.1 christos } 5298 1.1 christos 5299 1.1.1.7 christos static bool 5300 1.1 christos elf64_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) 5301 1.1 christos { 5302 1.1 christos int pass; 5303 1.1 christos struct bfd_link_hash_entry **pundef; 5304 1.1 christos struct bfd_link_hash_entry **next_pundef; 5305 1.1 christos 5306 1.1 christos /* We only accept VMS libraries. */ 5307 1.1 christos if (info->output_bfd->xvec != abfd->xvec) 5308 1.1 christos { 5309 1.1 christos bfd_set_error (bfd_error_wrong_format); 5310 1.1.1.7 christos return false; 5311 1.1 christos } 5312 1.1 christos 5313 1.1 christos /* The archive_pass field in the archive itself is used to 5314 1.1 christos initialize PASS, since we may search the same archive multiple 5315 1.1 christos times. */ 5316 1.1 christos pass = ++abfd->archive_pass; 5317 1.1 christos 5318 1.1 christos /* Look through the list of undefined symbols. */ 5319 1.1 christos for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef) 5320 1.1 christos { 5321 1.1 christos struct bfd_link_hash_entry *h; 5322 1.1 christos symindex symidx; 5323 1.1 christos bfd *element; 5324 1.1 christos bfd *orig_element; 5325 1.1 christos 5326 1.1 christos h = *pundef; 5327 1.1 christos next_pundef = &(*pundef)->u.undef.next; 5328 1.1 christos 5329 1.1 christos /* When a symbol is defined, it is not necessarily removed from 5330 1.1 christos the list. */ 5331 1.1 christos if (h->type != bfd_link_hash_undefined 5332 1.1 christos && h->type != bfd_link_hash_common) 5333 1.1 christos { 5334 1.1 christos /* Remove this entry from the list, for general cleanliness 5335 1.1 christos and because we are going to look through the list again 5336 1.1 christos if we search any more libraries. We can't remove the 5337 1.1 christos entry if it is the tail, because that would lose any 5338 1.1 christos entries we add to the list later on. */ 5339 1.1 christos if (*pundef != info->hash->undefs_tail) 5340 1.1.1.4 christos { 5341 1.1.1.4 christos *pundef = *next_pundef; 5342 1.1.1.4 christos next_pundef = pundef; 5343 1.1.1.4 christos } 5344 1.1 christos continue; 5345 1.1 christos } 5346 1.1 christos 5347 1.1 christos /* Look for this symbol in the archive hash table. */ 5348 1.1 christos symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string); 5349 1.1 christos if (symidx == BFD_NO_MORE_SYMBOLS) 5350 1.1 christos { 5351 1.1 christos /* Nothing in this slot. */ 5352 1.1 christos continue; 5353 1.1 christos } 5354 1.1 christos 5355 1.1 christos element = bfd_get_elt_at_index (abfd, symidx); 5356 1.1 christos if (element == NULL) 5357 1.1.1.7 christos return false; 5358 1.1 christos 5359 1.1 christos if (element->archive_pass == -1 || element->archive_pass == pass) 5360 1.1.1.4 christos { 5361 1.1.1.4 christos /* Next symbol if this archive is wrong or already handled. */ 5362 1.1.1.4 christos continue; 5363 1.1.1.4 christos } 5364 1.1 christos 5365 1.1 christos orig_element = element; 5366 1.1 christos if (bfd_is_thin_archive (abfd)) 5367 1.1.1.4 christos { 5368 1.1.1.4 christos element = _bfd_vms_lib_get_imagelib_file (element); 5369 1.1.1.4 christos if (element == NULL || !bfd_check_format (element, bfd_object)) 5370 1.1.1.4 christos { 5371 1.1.1.4 christos orig_element->archive_pass = -1; 5372 1.1.1.7 christos return false; 5373 1.1.1.4 christos } 5374 1.1.1.4 christos } 5375 1.1 christos else if (! bfd_check_format (element, bfd_object)) 5376 1.1.1.4 christos { 5377 1.1.1.4 christos element->archive_pass = -1; 5378 1.1.1.7 christos return false; 5379 1.1.1.4 christos } 5380 1.1 christos 5381 1.1 christos /* Unlike the generic linker, we know that this element provides 5382 1.1 christos a definition for an undefined symbol and we know that we want 5383 1.1 christos to include it. We don't need to check anything. */ 5384 1.1 christos if (! (*info->callbacks->add_archive_element) (info, element, 5385 1.1.1.4 christos h->root.string, &element)) 5386 1.1.1.3 christos continue; 5387 1.1 christos if (! elf64_vms_link_add_object_symbols (element, info)) 5388 1.1.1.7 christos return false; 5389 1.1 christos 5390 1.1 christos orig_element->archive_pass = pass; 5391 1.1 christos } 5392 1.1 christos 5393 1.1.1.7 christos return true; 5394 1.1 christos } 5395 1.1 christos 5396 1.1.1.7 christos static bool 5397 1.1 christos elf64_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info) 5398 1.1 christos { 5399 1.1 christos switch (bfd_get_format (abfd)) 5400 1.1 christos { 5401 1.1 christos case bfd_object: 5402 1.1 christos return elf64_vms_link_add_object_symbols (abfd, info); 5403 1.1 christos break; 5404 1.1 christos case bfd_archive: 5405 1.1 christos return elf64_vms_link_add_archive_symbols (abfd, info); 5406 1.1 christos break; 5407 1.1 christos default: 5408 1.1 christos bfd_set_error (bfd_error_wrong_format); 5409 1.1.1.7 christos return false; 5410 1.1 christos } 5411 1.1 christos } 5412 1.1 christos 5413 1.1.1.7 christos static bool 5414 1.1 christos elf64_ia64_vms_mkobject (bfd *abfd) 5415 1.1 christos { 5416 1.1.1.9 christos return bfd_elf_allocate_object (abfd, 5417 1.1.1.9 christos sizeof (struct elf64_ia64_vms_obj_tdata)); 5418 1.1 christos } 5419 1.1 christos 5420 1.1 christos 5421 1.1 christos /* Size-dependent data and functions. */ 5422 1.1 christos static const struct elf_size_info elf64_ia64_vms_size_info = { 5423 1.1 christos sizeof (Elf64_External_VMS_Ehdr), 5424 1.1 christos sizeof (Elf64_External_Phdr), 5425 1.1 christos sizeof (Elf64_External_Shdr), 5426 1.1 christos sizeof (Elf64_External_Rel), 5427 1.1 christos sizeof (Elf64_External_Rela), 5428 1.1 christos sizeof (Elf64_External_Sym), 5429 1.1 christos sizeof (Elf64_External_Dyn), 5430 1.1 christos sizeof (Elf_External_Note), 5431 1.1 christos 4, 5432 1.1 christos 1, 5433 1.1 christos 64, 3, /* ARCH_SIZE, LOG_FILE_ALIGN */ 5434 1.1 christos ELFCLASS64, EV_CURRENT, 5435 1.1 christos bfd_elf64_write_out_phdrs, 5436 1.1 christos elf64_vms_write_shdrs_and_ehdr, 5437 1.1 christos bfd_elf64_checksum_contents, 5438 1.1 christos bfd_elf64_write_relocs, 5439 1.1 christos bfd_elf64_swap_symbol_in, 5440 1.1 christos bfd_elf64_swap_symbol_out, 5441 1.1 christos bfd_elf64_slurp_reloc_table, 5442 1.1 christos bfd_elf64_slurp_symbol_table, 5443 1.1 christos bfd_elf64_swap_dyn_in, 5444 1.1 christos bfd_elf64_swap_dyn_out, 5445 1.1 christos bfd_elf64_swap_reloc_in, 5446 1.1 christos bfd_elf64_swap_reloc_out, 5447 1.1 christos bfd_elf64_swap_reloca_in, 5448 1.1 christos bfd_elf64_swap_reloca_out 5449 1.1 christos }; 5450 1.1 christos 5451 1.1 christos #define ELF_ARCH bfd_arch_ia64 5452 1.1.1.9 christos #define ELF_TARGET_ID IA64_ELF_DATA 5453 1.1 christos #define ELF_MACHINE_CODE EM_IA_64 5454 1.1 christos #define ELF_MAXPAGESIZE 0x10000 /* 64KB */ 5455 1.1 christos #define ELF_COMMONPAGESIZE 0x200 /* 16KB */ 5456 1.1 christos 5457 1.1 christos #define elf_backend_section_from_shdr \ 5458 1.1 christos elf64_ia64_section_from_shdr 5459 1.1 christos #define elf_backend_section_flags \ 5460 1.1 christos elf64_ia64_section_flags 5461 1.1 christos #define elf_backend_fake_sections \ 5462 1.1 christos elf64_ia64_fake_sections 5463 1.1 christos #define elf_backend_final_write_processing \ 5464 1.1 christos elf64_ia64_final_write_processing 5465 1.1 christos #define elf_backend_add_symbol_hook \ 5466 1.1 christos elf64_ia64_add_symbol_hook 5467 1.1 christos #define elf_info_to_howto \ 5468 1.1 christos elf64_ia64_info_to_howto 5469 1.1 christos 5470 1.1 christos #define bfd_elf64_bfd_reloc_type_lookup \ 5471 1.1 christos ia64_elf_reloc_type_lookup 5472 1.1 christos #define bfd_elf64_bfd_reloc_name_lookup \ 5473 1.1 christos ia64_elf_reloc_name_lookup 5474 1.1 christos #define bfd_elf64_bfd_is_local_label_name \ 5475 1.1 christos elf64_ia64_is_local_label_name 5476 1.1 christos #define bfd_elf64_bfd_relax_section \ 5477 1.1 christos elf64_ia64_relax_section 5478 1.1 christos 5479 1.1 christos #define elf_backend_object_p \ 5480 1.1 christos elf64_ia64_object_p 5481 1.1 christos 5482 1.1 christos /* Stuff for the BFD linker: */ 5483 1.1 christos #define bfd_elf64_bfd_link_hash_table_create \ 5484 1.1 christos elf64_ia64_hash_table_create 5485 1.1 christos #define elf_backend_create_dynamic_sections \ 5486 1.1 christos elf64_ia64_create_dynamic_sections 5487 1.1 christos #define elf_backend_check_relocs \ 5488 1.1 christos elf64_ia64_check_relocs 5489 1.1 christos #define elf_backend_adjust_dynamic_symbol \ 5490 1.1 christos elf64_ia64_adjust_dynamic_symbol 5491 1.1.1.9 christos #define elf_backend_late_size_sections \ 5492 1.1.1.9 christos elf64_ia64_late_size_sections 5493 1.1 christos #define elf_backend_omit_section_dynsym \ 5494 1.1.1.5 christos _bfd_elf_omit_section_dynsym_all 5495 1.1 christos #define elf_backend_relocate_section \ 5496 1.1 christos elf64_ia64_relocate_section 5497 1.1 christos #define elf_backend_finish_dynamic_symbol \ 5498 1.1 christos elf64_ia64_finish_dynamic_symbol 5499 1.1 christos #define elf_backend_finish_dynamic_sections \ 5500 1.1 christos elf64_ia64_finish_dynamic_sections 5501 1.1 christos #define bfd_elf64_bfd_final_link \ 5502 1.1 christos elf64_ia64_final_link 5503 1.1 christos 5504 1.1 christos #define bfd_elf64_bfd_merge_private_bfd_data \ 5505 1.1 christos elf64_ia64_merge_private_bfd_data 5506 1.1 christos #define bfd_elf64_bfd_set_private_flags \ 5507 1.1 christos elf64_ia64_set_private_flags 5508 1.1 christos #define bfd_elf64_bfd_print_private_bfd_data \ 5509 1.1 christos elf64_ia64_print_private_bfd_data 5510 1.1 christos 5511 1.1 christos #define elf_backend_plt_readonly 1 5512 1.1 christos #define elf_backend_want_plt_sym 0 5513 1.1 christos #define elf_backend_plt_alignment 5 5514 1.1 christos #define elf_backend_got_header_size 0 5515 1.1 christos #define elf_backend_want_got_plt 1 5516 1.1 christos #define elf_backend_may_use_rel_p 1 5517 1.1 christos #define elf_backend_may_use_rela_p 1 5518 1.1 christos #define elf_backend_default_use_rela_p 1 5519 1.1 christos #define elf_backend_want_dynbss 0 5520 1.1 christos #define elf_backend_hide_symbol elf64_ia64_hash_hide_symbol 5521 1.1 christos #define elf_backend_fixup_symbol _bfd_elf_link_hash_fixup_symbol 5522 1.1 christos #define elf_backend_reloc_type_class elf64_ia64_reloc_type_class 5523 1.1 christos #define elf_backend_rela_normal 1 5524 1.1 christos #define elf_backend_special_sections elf64_ia64_special_sections 5525 1.1 christos #define elf_backend_default_execstack 0 5526 1.1 christos 5527 1.1 christos /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with 5528 1.1 christos SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields. 5529 1.1 christos We don't want to flood users with so many error messages. We turn 5530 1.1 christos off the warning for now. It will be turned on later when the Intel 5531 1.1 christos compiler is fixed. */ 5532 1.1 christos #define elf_backend_link_order_error_handler NULL 5533 1.1 christos 5534 1.1 christos /* VMS-specific vectors. */ 5535 1.1 christos 5536 1.1 christos #undef TARGET_LITTLE_SYM 5537 1.1.1.2 christos #define TARGET_LITTLE_SYM ia64_elf64_vms_vec 5538 1.1 christos #undef TARGET_LITTLE_NAME 5539 1.1 christos #define TARGET_LITTLE_NAME "elf64-ia64-vms" 5540 1.1 christos #undef TARGET_BIG_SYM 5541 1.1 christos #undef TARGET_BIG_NAME 5542 1.1 christos 5543 1.1 christos /* These are VMS specific functions. */ 5544 1.1 christos 5545 1.1 christos #undef elf_backend_object_p 5546 1.1 christos #define elf_backend_object_p elf64_vms_object_p 5547 1.1 christos 5548 1.1 christos #undef elf_backend_section_from_shdr 5549 1.1 christos #define elf_backend_section_from_shdr elf64_vms_section_from_shdr 5550 1.1 christos 5551 1.1.1.6 christos #undef elf_backend_init_file_header 5552 1.1.1.6 christos #define elf_backend_init_file_header elf64_vms_init_file_header 5553 1.1 christos 5554 1.1 christos #undef elf_backend_section_processing 5555 1.1 christos #define elf_backend_section_processing elf64_vms_section_processing 5556 1.1 christos 5557 1.1 christos #undef elf_backend_final_write_processing 5558 1.1 christos #define elf_backend_final_write_processing elf64_vms_final_write_processing 5559 1.1 christos 5560 1.1 christos #undef bfd_elf64_close_and_cleanup 5561 1.1 christos #define bfd_elf64_close_and_cleanup elf64_vms_close_and_cleanup 5562 1.1 christos 5563 1.1 christos #undef elf_backend_section_from_bfd_section 5564 1.1 christos 5565 1.1 christos #undef elf_backend_symbol_processing 5566 1.1 christos 5567 1.1 christos #undef elf_backend_want_p_paddr_set_to_zero 5568 1.1 christos 5569 1.1 christos #undef ELF_OSABI 5570 1.1 christos #define ELF_OSABI ELFOSABI_OPENVMS 5571 1.1.1.10 christos #undef ELF_OSABI_EXACT 5572 1.1.1.10 christos #define ELF_OSABI_EXACT 1 5573 1.1 christos 5574 1.1 christos #undef ELF_MAXPAGESIZE 5575 1.1 christos #define ELF_MAXPAGESIZE 0x10000 /* 64KB */ 5576 1.1 christos 5577 1.1 christos #undef elf64_bed 5578 1.1 christos #define elf64_bed elf64_ia64_vms_bed 5579 1.1 christos 5580 1.1 christos #define elf_backend_size_info elf64_ia64_vms_size_info 5581 1.1 christos 5582 1.1 christos /* Use VMS-style archives (in particular, don't use the standard coff 5583 1.1 christos archive format). */ 5584 1.1 christos #define bfd_elf64_archive_functions 5585 1.1 christos 5586 1.1 christos #undef bfd_elf64_archive_p 5587 1.1 christos #define bfd_elf64_archive_p _bfd_vms_lib_ia64_archive_p 5588 1.1 christos #undef bfd_elf64_write_archive_contents 5589 1.1 christos #define bfd_elf64_write_archive_contents _bfd_vms_lib_write_archive_contents 5590 1.1 christos #undef bfd_elf64_mkarchive 5591 1.1 christos #define bfd_elf64_mkarchive _bfd_vms_lib_ia64_mkarchive 5592 1.1 christos 5593 1.1 christos #define bfd_elf64_archive_slurp_armap \ 5594 1.1 christos _bfd_vms_lib_slurp_armap 5595 1.1 christos #define bfd_elf64_archive_slurp_extended_name_table \ 5596 1.1 christos _bfd_vms_lib_slurp_extended_name_table 5597 1.1 christos #define bfd_elf64_archive_construct_extended_name_table \ 5598 1.1 christos _bfd_vms_lib_construct_extended_name_table 5599 1.1 christos #define bfd_elf64_archive_truncate_arname \ 5600 1.1 christos _bfd_vms_lib_truncate_arname 5601 1.1 christos #define bfd_elf64_archive_write_armap \ 5602 1.1 christos _bfd_vms_lib_write_armap 5603 1.1 christos #define bfd_elf64_archive_read_ar_hdr \ 5604 1.1 christos _bfd_vms_lib_read_ar_hdr 5605 1.1 christos #define bfd_elf64_archive_write_ar_hdr \ 5606 1.1 christos _bfd_vms_lib_write_ar_hdr 5607 1.1 christos #define bfd_elf64_archive_openr_next_archived_file \ 5608 1.1 christos _bfd_vms_lib_openr_next_archived_file 5609 1.1 christos #define bfd_elf64_archive_get_elt_at_index \ 5610 1.1 christos _bfd_vms_lib_get_elt_at_index 5611 1.1 christos #define bfd_elf64_archive_generic_stat_arch_elt \ 5612 1.1 christos _bfd_vms_lib_generic_stat_arch_elt 5613 1.1 christos #define bfd_elf64_archive_update_armap_timestamp \ 5614 1.1 christos _bfd_vms_lib_update_armap_timestamp 5615 1.1 christos 5616 1.1 christos /* VMS link methods. */ 5617 1.1 christos #undef bfd_elf64_bfd_link_add_symbols 5618 1.1.1.4 christos #define bfd_elf64_bfd_link_add_symbols elf64_vms_bfd_link_add_symbols 5619 1.1 christos 5620 1.1 christos #undef elf_backend_want_got_sym 5621 1.1.1.4 christos #define elf_backend_want_got_sym 0 5622 1.1 christos 5623 1.1 christos #undef bfd_elf64_mkobject 5624 1.1 christos #define bfd_elf64_mkobject elf64_ia64_vms_mkobject 5625 1.1 christos 5626 1.1 christos /* Redefine to align segments on block size. */ 5627 1.1 christos #undef ELF_MAXPAGESIZE 5628 1.1 christos #define ELF_MAXPAGESIZE 0x200 /* 512B */ 5629 1.1 christos 5630 1.1 christos #undef elf_backend_want_got_plt 5631 1.1 christos #define elf_backend_want_got_plt 0 5632 1.1 christos 5633 1.1 christos #include "elf64-target.h" 5634