Changeset 609 for branches/GNU/src/binutils/bfd/elf32-i386.c
- Timestamp:
- Aug 16, 2003, 6:59:22 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GNU/src/binutils/bfd/elf32-i386.c
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r608 r609 1 1 /* Intel 80386/80486-specific support for 32-bit ELF 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 3 3 Free Software Foundation, Inc. 4 4 5 This file is part of BFD, the Binary File Descriptor library.6 7 This program is free software; you can redistribute it and/or modify8 it under the terms of the GNU General Public License as published by9 the Free Software Foundation; either version 2 of the License, or10 (at your option) any later version.11 12 This program is distributed in the hope that it will be useful,13 but WITHOUT ANY WARRANTY; without even the implied warranty of14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15 GNU General Public License for more details.16 17 You should have received a copy of the GNU General Public License18 along with this program; if not, write to the Free Software19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20 20 21 21 #include "bfd.h" … … 27 27 static reloc_howto_type *elf_i386_reloc_type_lookup 28 28 PARAMS ((bfd *, bfd_reloc_code_real_type)); 29 static void elf_i386_info_to_howto30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));31 29 static void elf_i386_info_to_howto_rel 32 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); 33 static boolean elf_i386_is_local_label_name PARAMS ((bfd *, const char *)); 34 static struct bfd_hash_entry *elf_i386_link_hash_newfunc 30 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); 31 static bfd_boolean elf_i386_is_local_label_name 32 PARAMS ((bfd *, const char *)); 33 static bfd_boolean elf_i386_grok_prstatus 34 PARAMS ((bfd *abfd, Elf_Internal_Note *note)); 35 static bfd_boolean elf_i386_grok_psinfo 36 PARAMS ((bfd *abfd, Elf_Internal_Note *note)); 37 static struct bfd_hash_entry *link_hash_newfunc 35 38 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); 36 39 static struct bfd_link_hash_table *elf_i386_link_hash_table_create 37 40 PARAMS ((bfd *)); 38 static boolean elf_i386_check_relocs 41 static bfd_boolean create_got_section 42 PARAMS ((bfd *, struct bfd_link_info *)); 43 static bfd_boolean elf_i386_create_dynamic_sections 44 PARAMS ((bfd *, struct bfd_link_info *)); 45 static void elf_i386_copy_indirect_symbol 46 PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *, 47 struct elf_link_hash_entry *)); 48 static int elf_i386_tls_transition 49 PARAMS ((struct bfd_link_info *, int, int)); 50 51 static bfd_boolean elf_i386_mkobject 52 PARAMS ((bfd *)); 53 static bfd_boolean elf_i386_object_p 54 PARAMS ((bfd *)); 55 static bfd_boolean elf_i386_check_relocs 39 56 PARAMS ((bfd *, struct bfd_link_info *, asection *, 40 57 const Elf_Internal_Rela *)); 41 static boolean elf_i386_adjust_dynamic_symbol 58 static asection *elf_i386_gc_mark_hook 59 PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, 60 struct elf_link_hash_entry *, Elf_Internal_Sym *)); 61 static bfd_boolean elf_i386_gc_sweep_hook 62 PARAMS ((bfd *, struct bfd_link_info *, asection *, 63 const Elf_Internal_Rela *)); 64 static bfd_boolean elf_i386_adjust_dynamic_symbol 42 65 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); 43 static boolean elf_i386_size_dynamic_sections 66 static bfd_boolean allocate_dynrelocs 67 PARAMS ((struct elf_link_hash_entry *, PTR)); 68 static bfd_boolean readonly_dynrelocs 69 PARAMS ((struct elf_link_hash_entry *, PTR)); 70 static bfd_boolean elf_i386_fake_sections 71 PARAMS ((bfd *, Elf_Internal_Shdr *, asection *)); 72 static bfd_boolean elf_i386_size_dynamic_sections 44 73 PARAMS ((bfd *, struct bfd_link_info *)); 45 static boolean elf_i386_relocate_section 74 static bfd_vma dtpoff_base 75 PARAMS ((struct bfd_link_info *)); 76 static bfd_vma tpoff 77 PARAMS ((struct bfd_link_info *, bfd_vma)); 78 static bfd_boolean elf_i386_relocate_section 46 79 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 47 80 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); 48 static b oolean elf_i386_finish_dynamic_symbol81 static bfd_boolean elf_i386_finish_dynamic_symbol 49 82 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, 50 83 Elf_Internal_Sym *)); 51 static boolean elf_i386_finish_dynamic_sections 84 static enum elf_reloc_type_class elf_i386_reloc_type_class 85 PARAMS ((const Elf_Internal_Rela *)); 86 static bfd_boolean elf_i386_finish_dynamic_sections 52 87 PARAMS ((bfd *, struct bfd_link_info *)); 53 88 54 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */89 #define USE_REL 1 /* 386 uses REL relocations instead of RELA. */ 55 90 56 91 #include "elf/i386.h" … … 58 93 static reloc_howto_type elf_howto_table[]= 59 94 { 60 HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,95 HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield, 61 96 bfd_elf_generic_reloc, "R_386_NONE", 62 true, 0x00000000, 0x00000000, false),63 HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,97 TRUE, 0x00000000, 0x00000000, FALSE), 98 HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 64 99 bfd_elf_generic_reloc, "R_386_32", 65 true, 0xffffffff, 0xffffffff, false),66 HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,100 TRUE, 0xffffffff, 0xffffffff, FALSE), 101 HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 67 102 bfd_elf_generic_reloc, "R_386_PC32", 68 true, 0xffffffff, 0xffffffff, true),69 HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,103 TRUE, 0xffffffff, 0xffffffff, TRUE), 104 HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 70 105 bfd_elf_generic_reloc, "R_386_GOT32", 71 true, 0xffffffff, 0xffffffff, false),72 HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,106 TRUE, 0xffffffff, 0xffffffff, FALSE), 107 HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 73 108 bfd_elf_generic_reloc, "R_386_PLT32", 74 true, 0xffffffff, 0xffffffff, true),75 HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,109 TRUE, 0xffffffff, 0xffffffff, TRUE), 110 HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 76 111 bfd_elf_generic_reloc, "R_386_COPY", 77 true, 0xffffffff, 0xffffffff, false),78 HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,112 TRUE, 0xffffffff, 0xffffffff, FALSE), 113 HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 79 114 bfd_elf_generic_reloc, "R_386_GLOB_DAT", 80 true, 0xffffffff, 0xffffffff, false),81 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,115 TRUE, 0xffffffff, 0xffffffff, FALSE), 116 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 82 117 bfd_elf_generic_reloc, "R_386_JUMP_SLOT", 83 true, 0xffffffff, 0xffffffff, false),84 HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,118 TRUE, 0xffffffff, 0xffffffff, FALSE), 119 HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 85 120 bfd_elf_generic_reloc, "R_386_RELATIVE", 86 true, 0xffffffff, 0xffffffff, false),87 HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,121 TRUE, 0xffffffff, 0xffffffff, FALSE), 122 HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 88 123 bfd_elf_generic_reloc, "R_386_GOTOFF", 89 true, 0xffffffff, 0xffffffff, false),90 HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,124 TRUE, 0xffffffff, 0xffffffff, FALSE), 125 HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 91 126 bfd_elf_generic_reloc, "R_386_GOTPC", 92 true, 0xffffffff, 0xffffffff, true),127 TRUE, 0xffffffff, 0xffffffff, TRUE), 93 128 94 129 /* We have a gap in the reloc numbers here. … … 97 132 R_386_16 thru R_386_PC8 to form an index into this table. */ 98 133 #define R_386_standard ((unsigned int) R_386_GOTPC + 1) 99 #define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard) 100 101 /* The remaining relocs are a GNU extension. */ 102 HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield, 134 #define R_386_ext_offset ((unsigned int) R_386_TLS_TPOFF - R_386_standard) 135 136 /* These relocs are a GNU extension. */ 137 HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 138 bfd_elf_generic_reloc, "R_386_TLS_TPOFF", 139 TRUE, 0xffffffff, 0xffffffff, FALSE), 140 HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 141 bfd_elf_generic_reloc, "R_386_TLS_IE", 142 TRUE, 0xffffffff, 0xffffffff, FALSE), 143 HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 144 bfd_elf_generic_reloc, "R_386_TLS_GOTIE", 145 TRUE, 0xffffffff, 0xffffffff, FALSE), 146 HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 147 bfd_elf_generic_reloc, "R_386_TLS_LE", 148 TRUE, 0xffffffff, 0xffffffff, FALSE), 149 HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 150 bfd_elf_generic_reloc, "R_386_TLS_GD", 151 TRUE, 0xffffffff, 0xffffffff, FALSE), 152 HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 153 bfd_elf_generic_reloc, "R_386_TLS_LDM", 154 TRUE, 0xffffffff, 0xffffffff, FALSE), 155 HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, 103 156 bfd_elf_generic_reloc, "R_386_16", 104 true, 0xffff, 0xffff, false),105 HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,157 TRUE, 0xffff, 0xffff, FALSE), 158 HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield, 106 159 bfd_elf_generic_reloc, "R_386_PC16", 107 true, 0xffff, 0xffff, true),108 HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,160 TRUE, 0xffff, 0xffff, TRUE), 161 HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, 109 162 bfd_elf_generic_reloc, "R_386_8", 110 true, 0xff, 0xff, false),111 HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,163 TRUE, 0xff, 0xff, FALSE), 164 HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed, 112 165 bfd_elf_generic_reloc, "R_386_PC8", 113 true, 0xff, 0xff, true), 166 TRUE, 0xff, 0xff, TRUE), 167 168 #define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset) 169 #define R_386_tls_offset ((unsigned int) R_386_TLS_LDO_32 - R_386_ext) 170 /* These are common with Solaris TLS implementation. */ 171 HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 172 bfd_elf_generic_reloc, "R_386_TLS_LDO_32", 173 TRUE, 0xffffffff, 0xffffffff, FALSE), 174 HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 175 bfd_elf_generic_reloc, "R_386_TLS_IE_32", 176 TRUE, 0xffffffff, 0xffffffff, FALSE), 177 HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 178 bfd_elf_generic_reloc, "R_386_TLS_LE_32", 179 TRUE, 0xffffffff, 0xffffffff, FALSE), 180 HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 181 bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32", 182 TRUE, 0xffffffff, 0xffffffff, FALSE), 183 HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 184 bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32", 185 TRUE, 0xffffffff, 0xffffffff, FALSE), 186 HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 187 bfd_elf_generic_reloc, "R_386_TLS_TPOFF32", 188 TRUE, 0xffffffff, 0xffffffff, FALSE), 114 189 115 190 /* Another gap. */ 116 #define R_386_ ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)117 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ ext)191 #define R_386_tls ((unsigned int) R_386_TLS_TPOFF32 + 1 - R_386_tls_offset) 192 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_tls) 118 193 119 194 /* GNU extension to record C++ vtable hierarchy. */ … … 122 197 2, /* size (0 = byte, 1 = short, 2 = long) */ 123 198 0, /* bitsize */ 124 false, /* pc_relative */199 FALSE, /* pc_relative */ 125 200 0, /* bitpos */ 126 201 complain_overflow_dont, /* complain_on_overflow */ 127 202 NULL, /* special_function */ 128 203 "R_386_GNU_VTINHERIT", /* name */ 129 false, /* partial_inplace */204 FALSE, /* partial_inplace */ 130 205 0, /* src_mask */ 131 206 0, /* dst_mask */ 132 false),207 FALSE), /* pcrel_offset */ 133 208 134 209 /* GNU extension to record C++ vtable member usage. */ … … 137 212 2, /* size (0 = byte, 1 = short, 2 = long) */ 138 213 0, /* bitsize */ 139 false, /* pc_relative */214 FALSE, /* pc_relative */ 140 215 0, /* bitpos */ 141 216 complain_overflow_dont, /* complain_on_overflow */ 142 217 _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 143 218 "R_386_GNU_VTENTRY", /* name */ 144 false, /* partial_inplace */219 FALSE, /* partial_inplace */ 145 220 0, /* src_mask */ 146 221 0, /* dst_mask */ 147 false)222 FALSE) /* pcrel_offset */ 148 223 149 224 #define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset) … … 212 287 return &elf_howto_table[(unsigned int) R_386_GOTPC ]; 213 288 214 /* The remaining relocs are a GNU extension. */ 289 /* These relocs are a GNU extension. */ 290 case BFD_RELOC_386_TLS_TPOFF: 291 TRACE ("BFD_RELOC_386_TLS_TPOFF"); 292 return &elf_howto_table[(unsigned int) R_386_TLS_TPOFF - R_386_ext_offset]; 293 294 case BFD_RELOC_386_TLS_IE: 295 TRACE ("BFD_RELOC_386_TLS_IE"); 296 return &elf_howto_table[(unsigned int) R_386_TLS_IE - R_386_ext_offset]; 297 298 case BFD_RELOC_386_TLS_GOTIE: 299 TRACE ("BFD_RELOC_386_TLS_GOTIE"); 300 return &elf_howto_table[(unsigned int) R_386_TLS_GOTIE - R_386_ext_offset]; 301 302 case BFD_RELOC_386_TLS_LE: 303 TRACE ("BFD_RELOC_386_TLS_LE"); 304 return &elf_howto_table[(unsigned int) R_386_TLS_LE - R_386_ext_offset]; 305 306 case BFD_RELOC_386_TLS_GD: 307 TRACE ("BFD_RELOC_386_TLS_GD"); 308 return &elf_howto_table[(unsigned int) R_386_TLS_GD - R_386_ext_offset]; 309 310 case BFD_RELOC_386_TLS_LDM: 311 TRACE ("BFD_RELOC_386_TLS_LDM"); 312 return &elf_howto_table[(unsigned int) R_386_TLS_LDM - R_386_ext_offset]; 313 215 314 case BFD_RELOC_16: 216 315 TRACE ("BFD_RELOC_16"); … … 228 327 TRACE ("BFD_RELOC_8_PCREL"); 229 328 return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset]; 329 330 /* Common with Sun TLS implementation. */ 331 case BFD_RELOC_386_TLS_LDO_32: 332 TRACE ("BFD_RELOC_386_TLS_LDO_32"); 333 return &elf_howto_table[(unsigned int) R_386_TLS_LDO_32 - R_386_tls_offset]; 334 335 case BFD_RELOC_386_TLS_IE_32: 336 TRACE ("BFD_RELOC_386_TLS_IE_32"); 337 return &elf_howto_table[(unsigned int) R_386_TLS_IE_32 - R_386_tls_offset]; 338 339 case BFD_RELOC_386_TLS_LE_32: 340 TRACE ("BFD_RELOC_386_TLS_LE_32"); 341 return &elf_howto_table[(unsigned int) R_386_TLS_LE_32 - R_386_tls_offset]; 342 343 case BFD_RELOC_386_TLS_DTPMOD32: 344 TRACE ("BFD_RELOC_386_TLS_DTPMOD32"); 345 return &elf_howto_table[(unsigned int) R_386_TLS_DTPMOD32 - R_386_tls_offset]; 346 347 case BFD_RELOC_386_TLS_DTPOFF32: 348 TRACE ("BFD_RELOC_386_TLS_DTPOFF32"); 349 return &elf_howto_table[(unsigned int) R_386_TLS_DTPOFF32 - R_386_tls_offset]; 350 351 case BFD_RELOC_386_TLS_TPOFF32: 352 TRACE ("BFD_RELOC_386_TLS_TPOFF32"); 353 return &elf_howto_table[(unsigned int) R_386_TLS_TPOFF32 - R_386_tls_offset]; 230 354 231 355 case BFD_RELOC_VTABLE_INHERIT: … … 248 372 249 373 static void 250 elf_i386_info_to_howto (abfd, cache_ptr, dst)251 bfd *abfd ATTRIBUTE_UNUSED;252 arelent *cache_ptr ATTRIBUTE_UNUSED;253 Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;254 {255 abort ();256 }257 258 static void259 374 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst) 260 375 bfd *abfd ATTRIBUTE_UNUSED; 261 376 arelent *cache_ptr; 262 Elf 32_Internal_Rel*dst;377 Elf_Internal_Rela *dst; 263 378 { 264 379 unsigned int r_type = ELF32_R_TYPE (dst->r_info); … … 268 383 && ((indx = r_type - R_386_ext_offset) - R_386_standard 269 384 >= R_386_ext - R_386_standard) 270 && ((indx = r_type - R_386_vt_offset) - R_386_ext 271 >= R_386_vt - R_386_ext)) 385 && ((indx = r_type - R_386_tls_offset) - R_386_ext 386 >= R_386_tls - R_386_ext) 387 && ((indx = r_type - R_386_vt_offset) - R_386_tls 388 >= R_386_vt - R_386_tls)) 272 389 { 273 390 (*_bfd_error_handler) (_("%s: invalid relocation type %d"), 274 bfd_ get_filename (abfd), (int) r_type);391 bfd_archive_filename (abfd), (int) r_type); 275 392 indx = (unsigned int) R_386_NONE; 276 393 } … … 284 401 _bfd_elf_is_local_label_name. */ 285 402 286 static b oolean403 static bfd_boolean 287 404 elf_i386_is_local_label_name (abfd, name) 288 405 bfd *abfd; … … 290 407 { 291 408 if (name[0] == '.' && name[1] == 'X') 292 return true;409 return TRUE; 293 410 294 411 return _bfd_elf_is_local_label_name (abfd, name); … … 296 413 297 414 298 /* Functions for the i386 ELF linker. */ 415 /* Support for core dump NOTE sections. */ 416 static bfd_boolean 417 elf_i386_grok_prstatus (abfd, note) 418 bfd *abfd; 419 Elf_Internal_Note *note; 420 { 421 int offset; 422 size_t raw_size; 423 424 switch (note->descsz) 425 { 426 default: 427 return FALSE; 428 429 case 144: /* Linux/i386 */ 430 /* pr_cursig */ 431 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 432 433 /* pr_pid */ 434 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); 435 436 /* pr_reg */ 437 offset = 72; 438 raw_size = 68; 439 440 break; 441 } 442 443 /* Make a ".reg/999" section. */ 444 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 445 raw_size, note->descpos + offset); 446 } 447 448 static bfd_boolean 449 elf_i386_grok_psinfo (abfd, note) 450 bfd *abfd; 451 Elf_Internal_Note *note; 452 { 453 switch (note->descsz) 454 { 455 default: 456 return FALSE; 457 458 case 124: /* Linux/i386 elf_prpsinfo */ 459 elf_tdata (abfd)->core_program 460 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 461 elf_tdata (abfd)->core_command 462 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 463 } 464 465 /* Note that for some reason, a spurious space is tacked 466 onto the end of the args in some (at least one anyway) 467 implementations, so strip it off if it exists. */ 468 469 { 470 char *command = elf_tdata (abfd)->core_command; 471 int n = strlen (command); 472 473 if (0 < n && command[n - 1] == ' ') 474 command[n - 1] = '\0'; 475 } 476 477 return TRUE; 478 } 479 480 481 /* Functions for the i386 ELF linker. 482 483 In order to gain some understanding of code in this file without 484 knowing all the intricate details of the linker, note the 485 following: 486 487 Functions named elf_i386_* are called by external routines, other 488 functions are only called locally. elf_i386_* functions appear 489 in this file more or less in the order in which they are called 490 from external routines. eg. elf_i386_check_relocs is called 491 early in the link process, elf_i386_finish_dynamic_sections is 492 one of the last functions. */ 493 299 494 300 495 /* The name of the dynamic interpreter. This is put in the .interp … … 302 497 303 498 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" 499 500 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid 501 copying dynamic variables from a shared lib into an app's dynbss 502 section, and instead use a dynamic relocation to point into the 503 shared lib. */ 504 #define ELIMINATE_COPY_RELOCS 1 304 505 305 506 /* The size in bytes of an entry in the procedure linkage table. */ … … 354 555 355 556 /* The i386 linker needs to keep track of the number of relocs that it 356 decides to copy in check_relocs for each symbol. This is so that 357 it can discard PC relative relocs if it doesn't need them when 358 linking with -Bsymbolic. We store the information in a field 359 extending the regular ELF linker hash table. */ 360 361 /* This structure keeps track of the number of PC relative relocs we 362 have copied for a given symbol. */ 363 364 struct elf_i386_pcrel_relocs_copied 365 { 366 /* Next section. */ 367 struct elf_i386_pcrel_relocs_copied *next; 368 /* A section in dynobj. */ 369 asection *section; 370 /* Number of relocs copied in this section. */ 557 decides to copy as dynamic relocs in check_relocs for each symbol. 558 This is so that it can later discard them if they are found to be 559 unnecessary. We store the information in a field extending the 560 regular ELF linker hash table. */ 561 562 struct elf_i386_dyn_relocs 563 { 564 struct elf_i386_dyn_relocs *next; 565 566 /* The input section of the reloc. */ 567 asection *sec; 568 569 /* Total number of relocs copied for the input section. */ 371 570 bfd_size_type count; 571 572 /* Number of pc-relative relocs copied for the input section. */ 573 bfd_size_type pc_count; 372 574 }; 373 575 … … 376 578 struct elf_i386_link_hash_entry 377 579 { 378 struct elf_link_hash_entry root; 379 380 /* Number of PC relative relocs copied for this symbol. */ 381 struct elf_i386_pcrel_relocs_copied *pcrel_relocs_copied; 580 struct elf_link_hash_entry elf; 581 582 /* Track dynamic relocs copied for this symbol. */ 583 struct elf_i386_dyn_relocs *dyn_relocs; 584 585 #define GOT_UNKNOWN 0 586 #define GOT_NORMAL 1 587 #define GOT_TLS_GD 2 588 #define GOT_TLS_IE 4 589 #define GOT_TLS_IE_POS 5 590 #define GOT_TLS_IE_NEG 6 591 #define GOT_TLS_IE_BOTH 7 592 unsigned char tls_type; 382 593 }; 383 594 595 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent)) 596 597 struct elf_i386_obj_tdata 598 { 599 struct elf_obj_tdata root; 600 601 /* tls_type for each local got entry. */ 602 char *local_got_tls_type; 603 }; 604 605 #define elf_i386_tdata(abfd) \ 606 ((struct elf_i386_obj_tdata *) (abfd)->tdata.any) 607 608 #define elf_i386_local_got_tls_type(abfd) \ 609 (elf_i386_tdata (abfd)->local_got_tls_type) 610 611 static bfd_boolean 612 elf_i386_mkobject (abfd) 613 bfd *abfd; 614 { 615 bfd_size_type amt = sizeof (struct elf_i386_obj_tdata); 616 abfd->tdata.any = bfd_zalloc (abfd, amt); 617 if (abfd->tdata.any == NULL) 618 return FALSE; 619 return TRUE; 620 } 621 622 static bfd_boolean 623 elf_i386_object_p (abfd) 624 bfd *abfd; 625 { 626 /* Allocate our special target data. */ 627 struct elf_i386_obj_tdata *new_tdata; 628 bfd_size_type amt = sizeof (struct elf_i386_obj_tdata); 629 new_tdata = bfd_zalloc (abfd, amt); 630 if (new_tdata == NULL) 631 return FALSE; 632 new_tdata->root = *abfd->tdata.elf_obj_data; 633 abfd->tdata.any = new_tdata; 634 return TRUE; 635 } 636 384 637 /* i386 ELF linker hash table. */ 385 638 386 639 struct elf_i386_link_hash_table 387 640 { 388 struct elf_link_hash_table root; 641 struct elf_link_hash_table elf; 642 643 /* Short-cuts to get to dynamic linker sections. */ 644 asection *sgot; 645 asection *sgotplt; 646 asection *srelgot; 647 asection *splt; 648 asection *srelplt; 649 asection *sdynbss; 650 asection *srelbss; 651 652 union { 653 bfd_signed_vma refcount; 654 bfd_vma offset; 655 } tls_ldm_got; 656 657 /* Small local sym to section mapping cache. */ 658 struct sym_sec_cache sym_sec; 389 659 }; 390 391 /* Declare this now that the above structures are defined. */392 393 static boolean elf_i386_discard_copies394 PARAMS ((struct elf_i386_link_hash_entry *, PTR));395 396 /* Traverse an i386 ELF linker hash table. */397 398 #define elf_i386_link_hash_traverse(table, func, info) \399 (elf_link_hash_traverse \400 (&(table)->root, \401 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \402 (info)))403 660 404 661 /* Get the i386 ELF linker hash table from a link_info structure. */ … … 410 667 411 668 static struct bfd_hash_entry * 412 elf_i386_link_hash_newfunc (entry, table, string)669 link_hash_newfunc (entry, table, string) 413 670 struct bfd_hash_entry *entry; 414 671 struct bfd_hash_table *table; 415 672 const char *string; 416 673 { 417 struct elf_i386_link_hash_entry *ret =418 (struct elf_i386_link_hash_entry *) entry;419 420 674 /* Allocate the structure if it has not already been allocated by a 421 675 subclass. */ 422 if (ret == (struct elf_i386_link_hash_entry *) NULL) 423 ret = ((struct elf_i386_link_hash_entry *) 424 bfd_hash_allocate (table, 425 sizeof (struct elf_i386_link_hash_entry))); 426 if (ret == (struct elf_i386_link_hash_entry *) NULL) 427 return (struct bfd_hash_entry *) ret; 676 if (entry == NULL) 677 { 678 entry = bfd_hash_allocate (table, 679 sizeof (struct elf_i386_link_hash_entry)); 680 if (entry == NULL) 681 return entry; 682 } 428 683 429 684 /* Call the allocation method of the superclass. */ 430 ret = ((struct elf_i386_link_hash_entry *) 431 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, 432 table, string)); 433 if (ret != (struct elf_i386_link_hash_entry *) NULL) 434 { 435 ret->pcrel_relocs_copied = NULL; 436 } 437 438 return (struct bfd_hash_entry *) ret; 685 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 686 if (entry != NULL) 687 { 688 struct elf_i386_link_hash_entry *eh; 689 690 eh = (struct elf_i386_link_hash_entry *) entry; 691 eh->dyn_relocs = NULL; 692 eh->tls_type = GOT_UNKNOWN; 693 } 694 695 return entry; 439 696 } 440 697 … … 446 703 { 447 704 struct elf_i386_link_hash_table *ret; 448 449 ret = ((struct elf_i386_link_hash_table *) 450 bfd_alloc (abfd, sizeof (struct elf_i386_link_hash_table)));451 if (ret == (struct elf_i386_link_hash_table *)NULL)705 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table); 706 707 ret = (struct elf_i386_link_hash_table *) bfd_malloc (amt); 708 if (ret == NULL) 452 709 return NULL; 453 710 454 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd, 455 elf_i386_link_hash_newfunc)) 456 { 457 bfd_release (abfd, ret); 711 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc)) 712 { 713 free (ret); 458 714 return NULL; 459 715 } 460 716 461 return &ret->root.root; 717 ret->sgot = NULL; 718 ret->sgotplt = NULL; 719 ret->srelgot = NULL; 720 ret->splt = NULL; 721 ret->srelplt = NULL; 722 ret->sdynbss = NULL; 723 ret->srelbss = NULL; 724 ret->tls_ldm_got.refcount = 0; 725 ret->sym_sec.abfd = NULL; 726 727 return &ret->elf.root; 462 728 } 463 729 730 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up 731 shortcuts to them in our hash table. */ 732 733 static bfd_boolean 734 create_got_section (dynobj, info) 735 bfd *dynobj; 736 struct bfd_link_info *info; 737 { 738 struct elf_i386_link_hash_table *htab; 739 740 if (! _bfd_elf_create_got_section (dynobj, info)) 741 return FALSE; 742 743 htab = elf_i386_hash_table (info); 744 htab->sgot = bfd_get_section_by_name (dynobj, ".got"); 745 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); 746 if (!htab->sgot || !htab->sgotplt) 747 abort (); 748 749 htab->srelgot = bfd_make_section (dynobj, ".rel.got"); 750 if (htab->srelgot == NULL 751 || ! bfd_set_section_flags (dynobj, htab->srelgot, 752 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS 753 | SEC_IN_MEMORY | SEC_LINKER_CREATED 754 | SEC_READONLY)) 755 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2)) 756 return FALSE; 757 return TRUE; 758 } 759 760 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and 761 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our 762 hash table. */ 763 764 static bfd_boolean 765 elf_i386_create_dynamic_sections (dynobj, info) 766 bfd *dynobj; 767 struct bfd_link_info *info; 768 { 769 struct elf_i386_link_hash_table *htab; 770 771 htab = elf_i386_hash_table (info); 772 if (!htab->sgot && !create_got_section (dynobj, info)) 773 return FALSE; 774 775 if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 776 return FALSE; 777 778 htab->splt = bfd_get_section_by_name (dynobj, ".plt"); 779 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt"); 780 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); 781 if (!info->shared) 782 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss"); 783 784 if (!htab->splt || !htab->srelplt || !htab->sdynbss 785 || (!info->shared && !htab->srelbss)) 786 abort (); 787 788 return TRUE; 789 } 790 791 /* Copy the extra info we tack onto an elf_link_hash_entry. */ 792 793 static void 794 elf_i386_copy_indirect_symbol (bed, dir, ind) 795 struct elf_backend_data *bed; 796 struct elf_link_hash_entry *dir, *ind; 797 { 798 struct elf_i386_link_hash_entry *edir, *eind; 799 800 edir = (struct elf_i386_link_hash_entry *) dir; 801 eind = (struct elf_i386_link_hash_entry *) ind; 802 803 if (eind->dyn_relocs != NULL) 804 { 805 if (edir->dyn_relocs != NULL) 806 { 807 struct elf_i386_dyn_relocs **pp; 808 struct elf_i386_dyn_relocs *p; 809 810 if (ind->root.type == bfd_link_hash_indirect) 811 abort (); 812 813 /* Add reloc counts against the weak sym to the strong sym 814 list. Merge any entries against the same section. */ 815 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 816 { 817 struct elf_i386_dyn_relocs *q; 818 819 for (q = edir->dyn_relocs; q != NULL; q = q->next) 820 if (q->sec == p->sec) 821 { 822 q->pc_count += p->pc_count; 823 q->count += p->count; 824 *pp = p->next; 825 break; 826 } 827 if (q == NULL) 828 pp = &p->next; 829 } 830 *pp = edir->dyn_relocs; 831 } 832 833 edir->dyn_relocs = eind->dyn_relocs; 834 eind->dyn_relocs = NULL; 835 } 836 837 if (ind->root.type == bfd_link_hash_indirect 838 && dir->got.refcount <= 0) 839 { 840 edir->tls_type = eind->tls_type; 841 eind->tls_type = GOT_UNKNOWN; 842 } 843 844 if (ELIMINATE_COPY_RELOCS 845 && ind->root.type != bfd_link_hash_indirect 846 && (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0) 847 /* If called to transfer flags for a weakdef during processing 848 of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF. 849 We clear it ourselves for ELIMINATE_COPY_RELOCS. */ 850 dir->elf_link_hash_flags |= 851 (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC 852 | ELF_LINK_HASH_REF_REGULAR 853 | ELF_LINK_HASH_REF_REGULAR_NONWEAK)); 854 else 855 _bfd_elf_link_hash_copy_indirect (bed, dir, ind); 856 } 857 858 static int 859 elf_i386_tls_transition (info, r_type, is_local) 860 struct bfd_link_info *info; 861 int r_type; 862 int is_local; 863 { 864 if (info->shared) 865 return r_type; 866 867 switch (r_type) 868 { 869 case R_386_TLS_GD: 870 case R_386_TLS_IE_32: 871 if (is_local) 872 return R_386_TLS_LE_32; 873 return R_386_TLS_IE_32; 874 case R_386_TLS_IE: 875 case R_386_TLS_GOTIE: 876 if (is_local) 877 return R_386_TLS_LE_32; 878 return r_type; 879 case R_386_TLS_LDM: 880 return R_386_TLS_LE_32; 881 } 882 883 return r_type; 884 } 885 464 886 /* Look through the relocs for a section during the first phase, and 465 allocate space in the global offset table orprocedure linkage466 table . */467 468 static b oolean887 calculate needed space in the global offset table, procedure linkage 888 table, and dynamic reloc sections. */ 889 890 static bfd_boolean 469 891 elf_i386_check_relocs (abfd, info, sec, relocs) 470 892 bfd *abfd; … … 473 895 const Elf_Internal_Rela *relocs; 474 896 { 475 bfd *dynobj;897 struct elf_i386_link_hash_table *htab; 476 898 Elf_Internal_Shdr *symtab_hdr; 477 899 struct elf_link_hash_entry **sym_hashes; 478 bfd_signed_vma *local_got_refcounts;479 900 const Elf_Internal_Rela *rel; 480 901 const Elf_Internal_Rela *rel_end; 481 asection *sgot;482 asection *srelgot;483 902 asection *sreloc; 484 903 485 904 if (info->relocateable) 486 return true;487 488 dynobj = elf_hash_table (info)->dynobj;905 return TRUE; 906 907 htab = elf_i386_hash_table (info); 489 908 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 490 909 sym_hashes = elf_sym_hashes (abfd); 491 local_got_refcounts = elf_local_got_refcounts (abfd); 492 493 sgot = NULL; 494 srelgot = NULL; 910 495 911 sreloc = NULL; 496 912 … … 498 914 for (rel = relocs; rel < rel_end; rel++) 499 915 { 916 unsigned int r_type; 500 917 unsigned long r_symndx; 501 918 struct elf_link_hash_entry *h; 502 919 503 920 r_symndx = ELF32_R_SYM (rel->r_info); 921 r_type = ELF32_R_TYPE (rel->r_info); 504 922 505 923 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) 506 924 { 507 if (abfd->my_archive) 508 (*_bfd_error_handler) (_("%s(%s): bad symbol index: %d"), 509 bfd_get_filename (abfd->my_archive), 510 bfd_get_filename (abfd), 511 r_symndx); 512 else 513 (*_bfd_error_handler) (_("%s: bad symbol index: %d"), 514 bfd_get_filename (abfd), 515 r_symndx); 516 return false; 925 (*_bfd_error_handler) (_("%s: bad symbol index: %d"), 926 bfd_archive_filename (abfd), 927 r_symndx); 928 return FALSE; 517 929 } 518 930 … … 522 934 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 523 935 524 /* Some relocs require a global offset table. */ 525 if (dynobj == NULL) 526 { 527 switch (ELF32_R_TYPE (rel->r_info)) 528 { 529 case R_386_GOT32: 530 case R_386_GOTOFF: 531 case R_386_GOTPC: 532 elf_hash_table (info)->dynobj = dynobj = abfd; 533 if (! _bfd_elf_create_got_section (dynobj, info)) 534 return false; 535 break; 536 537 default: 538 break; 539 } 540 } 541 542 switch (ELF32_R_TYPE (rel->r_info)) 543 { 544 case R_386_GOT32: 545 /* This symbol requires a global offset table entry. */ 546 547 if (sgot == NULL) 548 { 549 sgot = bfd_get_section_by_name (dynobj, ".got"); 550 BFD_ASSERT (sgot != NULL); 551 } 552 553 if (srelgot == NULL 554 && (h != NULL || info->shared)) 555 { 556 srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); 557 if (srelgot == NULL) 558 { 559 srelgot = bfd_make_section (dynobj, ".rel.got"); 560 if (srelgot == NULL 561 || ! bfd_set_section_flags (dynobj, srelgot, 562 (SEC_ALLOC 563 | SEC_LOAD 564 | SEC_HAS_CONTENTS 565 | SEC_IN_MEMORY 566 | SEC_LINKER_CREATED 567 | SEC_READONLY)) 568 || ! bfd_set_section_alignment (dynobj, srelgot, 2)) 569 return false; 570 } 571 } 572 573 if (h != NULL) 574 { 575 if (h->got.refcount == -1) 576 { 577 h->got.refcount = 1; 578 579 /* Make sure this symbol is output as a dynamic symbol. */ 580 if (h->dynindx == -1) 581 { 582 if (! bfd_elf32_link_record_dynamic_symbol (info, h)) 583 return false; 584 } 585 586 sgot->_raw_size += 4; 587 srelgot->_raw_size += sizeof (Elf32_External_Rel); 588 } 589 else 590 h->got.refcount += 1; 591 } 592 else 593 { 594 /* This is a global offset table entry for a local symbol. */ 595 if (local_got_refcounts == NULL) 596 { 597 size_t size; 598 599 size = symtab_hdr->sh_info * sizeof (bfd_signed_vma); 600 local_got_refcounts = ((bfd_signed_vma *) 601 bfd_alloc (abfd, size)); 602 if (local_got_refcounts == NULL) 603 return false; 604 elf_local_got_refcounts (abfd) = local_got_refcounts; 605 memset (local_got_refcounts, -1, size); 606 } 607 if (local_got_refcounts[r_symndx] == -1) 608 { 609 local_got_refcounts[r_symndx] = 1; 610 611 sgot->_raw_size += 4; 612 if (info->shared) 613 { 614 /* If we are generating a shared object, we need to 615 output a R_386_RELATIVE reloc so that the dynamic 616 linker can adjust this GOT entry. */ 617 srelgot->_raw_size += sizeof (Elf32_External_Rel); 618 } 619 } 620 else 621 local_got_refcounts[r_symndx] += 1; 622 } 623 break; 936 r_type = elf_i386_tls_transition (info, r_type, h == NULL); 937 938 switch (r_type) 939 { 940 case R_386_TLS_LDM: 941 htab->tls_ldm_got.refcount += 1; 942 goto create_got; 624 943 625 944 case R_386_PLT32: 626 945 /* This symbol requires a procedure linkage table entry. We 627 628 629 630 631 946 actually build the entry in adjust_dynamic_symbol, 947 because this might be a case of linking PIC code which is 948 never referenced by a dynamic object, in which case we 949 don't need to generate a procedure linkage table entry 950 after all. */ 632 951 633 952 /* If this is a local symbol, we resolve it directly without 634 953 creating a procedure linkage table entry. */ 635 954 if (h == NULL) 636 955 continue; 637 956 638 if (h->plt.refcount == -1) 639 { 640 h->plt.refcount = 1; 641 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 642 } 643 else 644 h->plt.refcount += 1; 957 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 958 h->plt.refcount += 1; 645 959 break; 960 961 case R_386_TLS_IE_32: 962 case R_386_TLS_IE: 963 case R_386_TLS_GOTIE: 964 if (info->shared) 965 info->flags |= DF_STATIC_TLS; 966 /* Fall through */ 967 968 case R_386_GOT32: 969 case R_386_TLS_GD: 970 /* This symbol requires a global offset table entry. */ 971 { 972 int tls_type, old_tls_type; 973 974 switch (r_type) 975 { 976 default: 977 case R_386_GOT32: tls_type = GOT_NORMAL; break; 978 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break; 979 case R_386_TLS_IE_32: 980 if (ELF32_R_TYPE (rel->r_info) == r_type) 981 tls_type = GOT_TLS_IE_NEG; 982 else 983 /* If this is a GD->IE transition, we may use either of 984 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */ 985 tls_type = GOT_TLS_IE; 986 break; 987 case R_386_TLS_IE: 988 case R_386_TLS_GOTIE: 989 tls_type = GOT_TLS_IE_POS; break; 990 } 991 992 if (h != NULL) 993 { 994 h->got.refcount += 1; 995 old_tls_type = elf_i386_hash_entry(h)->tls_type; 996 } 997 else 998 { 999 bfd_signed_vma *local_got_refcounts; 1000 1001 /* This is a global offset table entry for a local symbol. */ 1002 local_got_refcounts = elf_local_got_refcounts (abfd); 1003 if (local_got_refcounts == NULL) 1004 { 1005 bfd_size_type size; 1006 1007 size = symtab_hdr->sh_info; 1008 size *= (sizeof (bfd_signed_vma) + sizeof(char)); 1009 local_got_refcounts = ((bfd_signed_vma *) 1010 bfd_zalloc (abfd, size)); 1011 if (local_got_refcounts == NULL) 1012 return FALSE; 1013 elf_local_got_refcounts (abfd) = local_got_refcounts; 1014 elf_i386_local_got_tls_type (abfd) 1015 = (char *) (local_got_refcounts + symtab_hdr->sh_info); 1016 } 1017 local_got_refcounts[r_symndx] += 1; 1018 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx]; 1019 } 1020 1021 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE)) 1022 tls_type |= old_tls_type; 1023 /* If a TLS symbol is accessed using IE at least once, 1024 there is no point to use dynamic model for it. */ 1025 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN 1026 && (old_tls_type != GOT_TLS_GD 1027 || (tls_type & GOT_TLS_IE) == 0)) 1028 { 1029 if ((old_tls_type & GOT_TLS_IE) && tls_type == GOT_TLS_GD) 1030 tls_type = old_tls_type; 1031 else 1032 { 1033 (*_bfd_error_handler) 1034 (_("%s: `%s' accessed both as normal and thread local symbol"), 1035 bfd_archive_filename (abfd), 1036 h ? h->root.root.string : "<local>"); 1037 return FALSE; 1038 } 1039 } 1040 1041 if (old_tls_type != tls_type) 1042 { 1043 if (h != NULL) 1044 elf_i386_hash_entry (h)->tls_type = tls_type; 1045 else 1046 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type; 1047 } 1048 } 1049 /* Fall through */ 1050 1051 case R_386_GOTOFF: 1052 case R_386_GOTPC: 1053 create_got: 1054 if (htab->sgot == NULL) 1055 { 1056 if (htab->elf.dynobj == NULL) 1057 htab->elf.dynobj = abfd; 1058 if (!create_got_section (htab->elf.dynobj, info)) 1059 return FALSE; 1060 } 1061 if (r_type != R_386_TLS_IE) 1062 break; 1063 /* Fall through */ 1064 1065 case R_386_TLS_LE_32: 1066 case R_386_TLS_LE: 1067 if (!info->shared) 1068 break; 1069 info->flags |= DF_STATIC_TLS; 1070 /* Fall through */ 646 1071 647 1072 case R_386_32: 648 1073 case R_386_PC32: 649 if (h != NULL) 650 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; 1074 if (h != NULL && !info->shared) 1075 { 1076 /* If this reloc is in a read-only section, we might 1077 need a copy reloc. We can't check reliably at this 1078 stage whether the section is read-only, as input 1079 sections have not yet been mapped to output sections. 1080 Tentatively set the flag for now, and correct in 1081 adjust_dynamic_symbol. */ 1082 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; 1083 1084 /* We may need a .plt entry if the function this reloc 1085 refers to is in a shared lib. */ 1086 h->plt.refcount += 1; 1087 } 651 1088 652 1089 /* If we are creating a shared library, and this is a reloc … … 661 1098 later (it is never cleared). In case of a weak definition, 662 1099 DEF_REGULAR may be cleared later by a strong definition in 663 a shared library. We account for that possibility below by1100 a shared library. We account for that possibility below by 664 1101 storing information in the relocs_copied field of the hash 665 1102 table entry. A similar situation occurs when creating 666 1103 shared libraries and symbol visibility changes render the 667 symbol local. */ 668 if (info->shared 669 && (sec->flags & SEC_ALLOC) != 0 670 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32 671 || (h != NULL 672 && (! info->symbolic 673 || h->root.type == bfd_link_hash_defweak 674 || (h->elf_link_hash_flags 675 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 676 { 677 /* When creating a shared object, we must copy these 678 reloc types into the output file. We create a reloc 679 section in dynobj and make room for this reloc. */ 1104 symbol local. 1105 1106 If on the other hand, we are creating an executable, we 1107 may need to keep relocations for symbols satisfied by a 1108 dynamic library if we manage to avoid copy relocs for the 1109 symbol. */ 1110 if ((info->shared 1111 && (sec->flags & SEC_ALLOC) != 0 1112 && (r_type != R_386_PC32 1113 || (h != NULL 1114 && (! info->symbolic 1115 || h->root.type == bfd_link_hash_defweak 1116 || (h->elf_link_hash_flags 1117 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 1118 || (ELIMINATE_COPY_RELOCS 1119 && !info->shared 1120 && (sec->flags & SEC_ALLOC) != 0 1121 && h != NULL 1122 && (h->root.type == bfd_link_hash_defweak 1123 || (h->elf_link_hash_flags 1124 & ELF_LINK_HASH_DEF_REGULAR) == 0))) 1125 { 1126 struct elf_i386_dyn_relocs *p; 1127 struct elf_i386_dyn_relocs **head; 1128 1129 /* We must copy these reloc types into the output file. 1130 Create a reloc section in dynobj and make room for 1131 this reloc. */ 680 1132 if (sreloc == NULL) 681 1133 { 682 1134 const char *name; 683 684 name = (bfd_elf_string_from_elf_section685 (abfd,686 elf_elfheader (abfd)->e_shstrndx, 687 elf_section_data (sec)->rel_hdr.sh_name));1135 bfd *dynobj; 1136 unsigned int strndx = elf_elfheader (abfd)->e_shstrndx; 1137 unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name; 1138 1139 name = bfd_elf_string_from_elf_section (abfd, strndx, shnam); 688 1140 if (name == NULL) 689 return false;1141 return FALSE; 690 1142 691 1143 if (strncmp (name, ".rel", 4) != 0 … … 693 1145 name + 4) != 0) 694 1146 { 695 if (abfd->my_archive) 696 (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"), 697 bfd_get_filename (abfd->my_archive), 698 bfd_get_filename (abfd), 699 name); 700 else 701 (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"), 702 bfd_get_filename (abfd), 703 name); 1147 (*_bfd_error_handler) 1148 (_("%s: bad relocation section name `%s\'"), 1149 bfd_archive_filename (abfd), name); 704 1150 } 705 1151 1152 if (htab->elf.dynobj == NULL) 1153 htab->elf.dynobj = abfd; 1154 1155 dynobj = htab->elf.dynobj; 706 1156 sreloc = bfd_get_section_by_name (dynobj, name); 707 1157 if (sreloc == NULL) … … 717 1167 || ! bfd_set_section_flags (dynobj, sreloc, flags) 718 1168 || ! bfd_set_section_alignment (dynobj, sreloc, 2)) 719 return false;1169 return FALSE; 720 1170 } 1171 elf_section_data (sec)->sreloc = sreloc; 721 1172 } 722 1173 723 sreloc->_raw_size += sizeof (Elf32_External_Rel); 724 725 /* If this is a global symbol, we count the number of PC 726 relative relocations we have entered for this symbol, 727 so that we can discard them later as necessary. Note 728 that this function is only called if we are using an 729 elf_i386 linker hash table, which means that h is 730 really a pointer to an elf_i386_link_hash_entry. */ 731 if (h != NULL 732 && ELF32_R_TYPE (rel->r_info) == R_386_PC32) 1174 /* If this is a global symbol, we count the number of 1175 relocations we need for this symbol. */ 1176 if (h != NULL) 733 1177 { 734 struct elf_i386_link_hash_entry *eh; 735 struct elf_i386_pcrel_relocs_copied *p; 736 737 eh = (struct elf_i386_link_hash_entry *) h; 738 739 for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) 740 if (p->section == sreloc) 741 break; 742 1178 head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs; 1179 } 1180 else 1181 { 1182 /* Track dynamic relocs needed for local syms too. 1183 We really need local syms available to do this 1184 easily. Oh well. */ 1185 1186 asection *s; 1187 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, 1188 sec, r_symndx); 1189 if (s == NULL) 1190 return FALSE; 1191 1192 head = ((struct elf_i386_dyn_relocs **) 1193 &elf_section_data (s)->local_dynrel); 1194 } 1195 1196 p = *head; 1197 if (p == NULL || p->sec != sec) 1198 { 1199 bfd_size_type amt = sizeof *p; 1200 p = ((struct elf_i386_dyn_relocs *) 1201 bfd_alloc (htab->elf.dynobj, amt)); 743 1202 if (p == NULL) 744 { 745 p = ((struct elf_i386_pcrel_relocs_copied *) 746 bfd_alloc (dynobj, sizeof *p)); 747 if (p == NULL) 748 return false; 749 p->next = eh->pcrel_relocs_copied; 750 eh->pcrel_relocs_copied = p; 751 p->section = sreloc; 752 p->count = 0; 753 } 754 755 ++p->count; 1203 return FALSE; 1204 p->next = *head; 1205 *head = p; 1206 p->sec = sec; 1207 p->count = 0; 1208 p->pc_count = 0; 756 1209 } 757 } 758 1210 1211 p->count += 1; 1212 if (r_type == R_386_PC32) 1213 p->pc_count += 1; 1214 } 759 1215 break; 760 1216 … … 763 1219 case R_386_GNU_VTINHERIT: 764 1220 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 765 return false;1221 return FALSE; 766 1222 break; 767 1223 … … 770 1226 case R_386_GNU_VTENTRY: 771 1227 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset)) 772 return false;1228 return FALSE; 773 1229 break; 774 1230 … … 778 1234 } 779 1235 780 return true;1236 return TRUE; 781 1237 } 782 1238 … … 785 1241 786 1242 static asection * 787 elf_i386_gc_mark_hook ( abfd, info, rel, h, sym)788 bfd *abfd;1243 elf_i386_gc_mark_hook (sec, info, rel, h, sym) 1244 asection *sec; 789 1245 struct bfd_link_info *info ATTRIBUTE_UNUSED; 790 1246 Elf_Internal_Rela *rel; … … 816 1272 } 817 1273 else 818 { 819 if (!(elf_bad_symtab (abfd) 820 && ELF_ST_BIND (sym->st_info) != STB_LOCAL) 821 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE) 822 && sym->st_shndx != SHN_COMMON)) 823 { 824 return bfd_section_from_elf_index (abfd, sym->st_shndx); 825 } 826 } 1274 return bfd_section_from_elf_index (sec->owner, sym->st_shndx); 827 1275 828 1276 return NULL; … … 831 1279 /* Update the got entry reference counts for the section being removed. */ 832 1280 833 static b oolean1281 static bfd_boolean 834 1282 elf_i386_gc_sweep_hook (abfd, info, sec, relocs) 835 1283 bfd *abfd; … … 842 1290 bfd_signed_vma *local_got_refcounts; 843 1291 const Elf_Internal_Rela *rel, *relend; 844 unsigned long r_symndx; 845 struct elf_link_hash_entry *h; 846 bfd *dynobj; 847 asection *sgot; 848 asection *srelgot; 1292 1293 elf_section_data (sec)->local_dynrel = NULL; 849 1294 850 1295 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; … … 852 1297 local_got_refcounts = elf_local_got_refcounts (abfd); 853 1298 854 dynobj = elf_hash_table (info)->dynobj;855 if (dynobj == NULL)856 return true;857 858 sgot = bfd_get_section_by_name (dynobj, ".got");859 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");860 861 1299 relend = relocs + sec->reloc_count; 862 1300 for (rel = relocs; rel < relend; rel++) 863 switch (ELF32_R_TYPE (rel->r_info)) 864 { 865 case R_386_GOT32: 866 case R_386_GOTOFF: 867 case R_386_GOTPC: 868 r_symndx = ELF32_R_SYM (rel->r_info); 869 if (r_symndx >= symtab_hdr->sh_info) 870 { 871 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 872 if (h->got.refcount > 0) 1301 { 1302 unsigned long r_symndx; 1303 unsigned int r_type; 1304 struct elf_link_hash_entry *h = NULL; 1305 1306 r_symndx = ELF32_R_SYM (rel->r_info); 1307 if (r_symndx >= symtab_hdr->sh_info) 1308 { 1309 struct elf_i386_link_hash_entry *eh; 1310 struct elf_i386_dyn_relocs **pp; 1311 struct elf_i386_dyn_relocs *p; 1312 1313 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1314 eh = (struct elf_i386_link_hash_entry *) h; 1315 1316 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 1317 if (p->sec == sec) 873 1318 { 1319 /* Everything must go for SEC. */ 1320 *pp = p->next; 1321 break; 1322 } 1323 } 1324 1325 r_type = ELF32_R_TYPE (rel->r_info); 1326 r_type = elf_i386_tls_transition (info, r_type, h != NULL); 1327 switch (r_type) 1328 { 1329 case R_386_TLS_LDM: 1330 if (elf_i386_hash_table (info)->tls_ldm_got.refcount > 0) 1331 elf_i386_hash_table (info)->tls_ldm_got.refcount -= 1; 1332 break; 1333 1334 case R_386_TLS_GD: 1335 case R_386_TLS_IE_32: 1336 case R_386_TLS_IE: 1337 case R_386_TLS_GOTIE: 1338 case R_386_GOT32: 1339 if (h != NULL) 1340 { 1341 if (h->got.refcount > 0) 874 1342 h->got.refcount -= 1; 875 if (h->got.refcount == 0) 876 { 877 sgot->_raw_size -= 4; 878 srelgot->_raw_size -= sizeof (Elf32_External_Rel); 879 } 880 } 881 } 882 else if (local_got_refcounts != NULL) 883 { 884 if (local_got_refcounts[r_symndx] > 0) 885 { 1343 } 1344 else if (local_got_refcounts != NULL) 1345 { 1346 if (local_got_refcounts[r_symndx] > 0) 886 1347 local_got_refcounts[r_symndx] -= 1; 887 if (local_got_refcounts[r_symndx] == 0) 888 { 889 sgot->_raw_size -= 4; 890 if (info->shared) 891 srelgot->_raw_size -= sizeof (Elf32_External_Rel); 892 } 893 } 894 } 895 break; 896 897 case R_386_PLT32: 898 r_symndx = ELF32_R_SYM (rel->r_info); 899 if (r_symndx >= symtab_hdr->sh_info) 900 { 901 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 902 if (h->plt.refcount > 0) 903 h->plt.refcount -= 1; 904 } 905 break; 906 907 default: 908 break; 909 } 910 911 return true; 1348 } 1349 break; 1350 1351 case R_386_32: 1352 case R_386_PC32: 1353 if (info->shared) 1354 break; 1355 /* Fall through */ 1356 1357 case R_386_PLT32: 1358 if (h != NULL) 1359 { 1360 if (h->plt.refcount > 0) 1361 h->plt.refcount -= 1; 1362 } 1363 break; 1364 1365 default: 1366 break; 1367 } 1368 } 1369 1370 return TRUE; 912 1371 } 913 1372 … … 918 1377 understand. */ 919 1378 920 static b oolean1379 static bfd_boolean 921 1380 elf_i386_adjust_dynamic_symbol (info, h) 922 1381 struct bfd_link_info *info; 923 1382 struct elf_link_hash_entry *h; 924 1383 { 925 bfd *dynobj;1384 struct elf_i386_link_hash_table *htab; 926 1385 asection *s; 927 1386 unsigned int power_of_two; 928 929 dynobj = elf_hash_table (info)->dynobj;930 931 /* Make sure we know what is going on here. */932 BFD_ASSERT (dynobj != NULL933 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)934 || h->weakdef != NULL935 || ((h->elf_link_hash_flags936 & ELF_LINK_HASH_DEF_DYNAMIC) != 0937 && (h->elf_link_hash_flags938 & ELF_LINK_HASH_REF_REGULAR) != 0939 && (h->elf_link_hash_flags940 & ELF_LINK_HASH_DEF_REGULAR) == 0)));941 1387 942 1388 /* If this is a function, put it in the procedure linkage table. We … … 946 1392 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) 947 1393 { 948 if ((! info->shared 949 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 950 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0) 951 || (info->shared && h->plt.refcount <= 0)) 1394 if (h->plt.refcount <= 0 1395 || (! info->shared 1396 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 1397 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0 1398 && h->root.type != bfd_link_hash_undefweak 1399 && h->root.type != bfd_link_hash_undefined)) 952 1400 { 953 1401 /* This case can occur if we saw a PLT32 reloc in an input … … 958 1406 h->plt.offset = (bfd_vma) -1; 959 1407 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 960 return true; 961 } 962 963 /* Make sure this symbol is output as a dynamic symbol. */ 964 if (h->dynindx == -1) 965 { 966 if (! bfd_elf32_link_record_dynamic_symbol (info, h)) 967 return false; 968 } 969 970 s = bfd_get_section_by_name (dynobj, ".plt"); 971 BFD_ASSERT (s != NULL); 972 973 /* If this is the first .plt entry, make room for the special 974 first entry. */ 975 if (s->_raw_size == 0) 976 s->_raw_size += PLT_ENTRY_SIZE; 977 978 /* If this symbol is not defined in a regular file, and we are 979 not generating a shared library, then set the symbol to this 980 location in the .plt. This is required to make function 981 pointers compare as equal between the normal executable and 982 the shared library. */ 983 if (! info->shared 984 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 985 { 986 h->root.u.def.section = s; 987 h->root.u.def.value = s->_raw_size; 988 } 989 990 h->plt.offset = s->_raw_size; 991 992 /* Make room for this entry. */ 993 s->_raw_size += PLT_ENTRY_SIZE; 994 995 /* We also need to make an entry in the .got.plt section, which 996 will be placed in the .got section by the linker script. */ 997 s = bfd_get_section_by_name (dynobj, ".got.plt"); 998 BFD_ASSERT (s != NULL); 999 s->_raw_size += 4; 1000 1001 /* We also need to make an entry in the .rel.plt section. */ 1002 s = bfd_get_section_by_name (dynobj, ".rel.plt"); 1003 BFD_ASSERT (s != NULL); 1004 s->_raw_size += sizeof (Elf32_External_Rel); 1005 1006 return true; 1007 } 1408 } 1409 1410 return TRUE; 1411 } 1412 else 1413 /* It's possible that we incorrectly decided a .plt reloc was 1414 needed for an R_386_PC32 reloc to a non-function sym in 1415 check_relocs. We can't decide accurately between function and 1416 non-function syms in check-relocs; Objects loaded later in 1417 the link may change h->type. So fix it now. */ 1418 h->plt.offset = (bfd_vma) -1; 1008 1419 1009 1420 /* If this is a weak symbol, and there is a real definition, the … … 1016 1427 h->root.u.def.section = h->weakdef->root.u.def.section; 1017 1428 h->root.u.def.value = h->weakdef->root.u.def.value; 1018 return true; 1429 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc) 1430 h->elf_link_hash_flags 1431 = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF) 1432 | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF)); 1433 return TRUE; 1019 1434 } 1020 1435 … … 1027 1442 be handled correctly by relocate_section. */ 1028 1443 if (info->shared) 1029 return true;1444 return TRUE; 1030 1445 1031 1446 /* If there are no references to this symbol that do not use the 1032 1447 GOT, we don't need to generate a copy reloc. */ 1033 1448 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0) 1034 return true; 1449 return TRUE; 1450 1451 /* If -z nocopyreloc was given, we won't generate them either. */ 1452 if (info->nocopyreloc) 1453 { 1454 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; 1455 return TRUE; 1456 } 1457 1458 if (ELIMINATE_COPY_RELOCS) 1459 { 1460 struct elf_i386_link_hash_entry * eh; 1461 struct elf_i386_dyn_relocs *p; 1462 1463 eh = (struct elf_i386_link_hash_entry *) h; 1464 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1465 { 1466 s = p->sec->output_section; 1467 if (s != NULL && (s->flags & SEC_READONLY) != 0) 1468 break; 1469 } 1470 1471 /* If we didn't find any dynamic relocs in read-only sections, then 1472 we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 1473 if (p == NULL) 1474 { 1475 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; 1476 return TRUE; 1477 } 1478 } 1035 1479 1036 1480 /* We must allocate the symbol in our .dynbss section, which will … … 1044 1488 same memory location for the variable. */ 1045 1489 1046 s = bfd_get_section_by_name (dynobj, ".dynbss"); 1047 BFD_ASSERT (s != NULL); 1490 htab = elf_i386_hash_table (info); 1048 1491 1049 1492 /* We must generate a R_386_COPY reloc to tell the dynamic linker to 1050 1493 copy the initial value out of the dynamic object and into the 1051 runtime process image. We need to remember the offset into the 1052 .rel.bss section we are going to use. */ 1494 runtime process image. */ 1053 1495 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 1054 1496 { 1055 asection *srel; 1056 1057 srel = bfd_get_section_by_name (dynobj, ".rel.bss"); 1058 BFD_ASSERT (srel != NULL); 1059 srel->_raw_size += sizeof (Elf32_External_Rel); 1497 htab->srelbss->_raw_size += sizeof (Elf32_External_Rel); 1060 1498 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; 1061 1499 } … … 1068 1506 1069 1507 /* Apply the required alignment. */ 1070 s ->_raw_size = BFD_ALIGN (s->_raw_size,1071 1072 if (power_of_two > bfd_get_section_alignment ( dynobj, s))1073 { 1074 if (! bfd_set_section_alignment ( dynobj, s, power_of_two))1075 return false;1508 s = htab->sdynbss; 1509 s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two)); 1510 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s)) 1511 { 1512 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two)) 1513 return FALSE; 1076 1514 } 1077 1515 … … 1083 1521 s->_raw_size += h->size; 1084 1522 1085 return true;1523 return TRUE; 1086 1524 } 1087 1525 1526 /* This is the condition under which elf_i386_finish_dynamic_symbol 1527 will be called from elflink.h. If elflink.h doesn't call our 1528 finish_dynamic_symbol routine, we'll need to do something about 1529 initializing any .plt and .got entries in elf_i386_relocate_section. */ 1530 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \ 1531 ((DYN) \ 1532 && ((SHARED) \ 1533 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \ 1534 && ((H)->dynindx != -1 \ 1535 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)) 1536 1537 /* Allocate space in .plt, .got and associated reloc sections for 1538 dynamic relocs. */ 1539 1540 static bfd_boolean 1541 allocate_dynrelocs (h, inf) 1542 struct elf_link_hash_entry *h; 1543 PTR inf; 1544 { 1545 struct bfd_link_info *info; 1546 struct elf_i386_link_hash_table *htab; 1547 struct elf_i386_link_hash_entry *eh; 1548 struct elf_i386_dyn_relocs *p; 1549 1550 if (h->root.type == bfd_link_hash_indirect) 1551 return TRUE; 1552 1553 if (h->root.type == bfd_link_hash_warning) 1554 /* When warning symbols are created, they **replace** the "real" 1555 entry in the hash table, thus we never get to see the real 1556 symbol in a hash traversal. So look at it now. */ 1557 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1558 1559 info = (struct bfd_link_info *) inf; 1560 htab = elf_i386_hash_table (info); 1561 1562 if (htab->elf.dynamic_sections_created 1563 && h->plt.refcount > 0) 1564 { 1565 /* Make sure this symbol is output as a dynamic symbol. 1566 Undefined weak syms won't yet be marked as dynamic. */ 1567 if (h->dynindx == -1 1568 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1569 { 1570 if (! bfd_elf32_link_record_dynamic_symbol (info, h)) 1571 return FALSE; 1572 } 1573 1574 if (info->shared 1575 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h)) 1576 { 1577 asection *s = htab->splt; 1578 1579 /* If this is the first .plt entry, make room for the special 1580 first entry. */ 1581 if (s->_raw_size == 0) 1582 s->_raw_size += PLT_ENTRY_SIZE; 1583 1584 h->plt.offset = s->_raw_size; 1585 1586 /* If this symbol is not defined in a regular file, and we are 1587 not generating a shared library, then set the symbol to this 1588 location in the .plt. This is required to make function 1589 pointers compare as equal between the normal executable and 1590 the shared library. */ 1591 if (! info->shared 1592 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 1593 { 1594 h->root.u.def.section = s; 1595 h->root.u.def.value = h->plt.offset; 1596 } 1597 1598 /* Make room for this entry. */ 1599 s->_raw_size += PLT_ENTRY_SIZE; 1600 1601 /* We also need to make an entry in the .got.plt section, which 1602 will be placed in the .got section by the linker script. */ 1603 htab->sgotplt->_raw_size += 4; 1604 1605 /* We also need to make an entry in the .rel.plt section. */ 1606 htab->srelplt->_raw_size += sizeof (Elf32_External_Rel); 1607 } 1608 else 1609 { 1610 h->plt.offset = (bfd_vma) -1; 1611 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 1612 } 1613 } 1614 else 1615 { 1616 h->plt.offset = (bfd_vma) -1; 1617 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 1618 } 1619 1620 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary, 1621 make it a R_386_TLS_LE_32 requiring no TLS entry. */ 1622 if (h->got.refcount > 0 1623 && !info->shared 1624 && h->dynindx == -1 1625 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE)) 1626 h->got.offset = (bfd_vma) -1; 1627 else if (h->got.refcount > 0) 1628 { 1629 asection *s; 1630 bfd_boolean dyn; 1631 int tls_type = elf_i386_hash_entry(h)->tls_type; 1632 1633 /* Make sure this symbol is output as a dynamic symbol. 1634 Undefined weak syms won't yet be marked as dynamic. */ 1635 if (h->dynindx == -1 1636 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1637 { 1638 if (! bfd_elf32_link_record_dynamic_symbol (info, h)) 1639 return FALSE; 1640 } 1641 1642 s = htab->sgot; 1643 h->got.offset = s->_raw_size; 1644 s->_raw_size += 4; 1645 /* R_386_TLS_GD needs 2 consecutive GOT slots. */ 1646 if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE_BOTH) 1647 s->_raw_size += 4; 1648 dyn = htab->elf.dynamic_sections_created; 1649 /* R_386_TLS_IE_32 needs one dynamic relocation, 1650 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation, 1651 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we 1652 need two), R_386_TLS_GD needs one if local symbol and two if 1653 global. */ 1654 if (tls_type == GOT_TLS_IE_BOTH) 1655 htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rel); 1656 else if ((tls_type == GOT_TLS_GD && h->dynindx == -1) 1657 || (tls_type & GOT_TLS_IE)) 1658 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); 1659 else if (tls_type == GOT_TLS_GD) 1660 htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rel); 1661 else if (info->shared 1662 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)) 1663 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); 1664 } 1665 else 1666 h->got.offset = (bfd_vma) -1; 1667 1668 eh = (struct elf_i386_link_hash_entry *) h; 1669 if (eh->dyn_relocs == NULL) 1670 return TRUE; 1671 1672 /* In the shared -Bsymbolic case, discard space allocated for 1673 dynamic pc-relative relocs against symbols which turn out to be 1674 defined in regular objects. For the normal shared case, discard 1675 space for pc-relative relocs that have become local due to symbol 1676 visibility changes. */ 1677 1678 if (info->shared) 1679 { 1680 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 1681 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 1682 || info->symbolic)) 1683 { 1684 struct elf_i386_dyn_relocs **pp; 1685 1686 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 1687 { 1688 p->count -= p->pc_count; 1689 p->pc_count = 0; 1690 if (p->count == 0) 1691 *pp = p->next; 1692 else 1693 pp = &p->next; 1694 } 1695 } 1696 } 1697 else if (ELIMINATE_COPY_RELOCS) 1698 { 1699 /* For the non-shared case, discard space for relocs against 1700 symbols which turn out to need copy relocs or are not 1701 dynamic. */ 1702 1703 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 1704 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 1705 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 1706 || (htab->elf.dynamic_sections_created 1707 && (h->root.type == bfd_link_hash_undefweak 1708 || h->root.type == bfd_link_hash_undefined)))) 1709 { 1710 /* Make sure this symbol is output as a dynamic symbol. 1711 Undefined weak syms won't yet be marked as dynamic. */ 1712 if (h->dynindx == -1 1713 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1714 { 1715 if (! bfd_elf32_link_record_dynamic_symbol (info, h)) 1716 return FALSE; 1717 } 1718 1719 /* If that succeeded, we know we'll be keeping all the 1720 relocs. */ 1721 if (h->dynindx != -1) 1722 goto keep; 1723 } 1724 1725 eh->dyn_relocs = NULL; 1726 1727 keep: ; 1728 } 1729 1730 /* Finally, allocate space. */ 1731 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1732 { 1733 asection *sreloc = elf_section_data (p->sec)->sreloc; 1734 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel); 1735 } 1736 1737 return TRUE; 1738 } 1739 1740 /* Find any dynamic relocs that apply to read-only sections. */ 1741 1742 static bfd_boolean 1743 readonly_dynrelocs (h, inf) 1744 struct elf_link_hash_entry *h; 1745 PTR inf; 1746 { 1747 struct elf_i386_link_hash_entry *eh; 1748 struct elf_i386_dyn_relocs *p; 1749 1750 if (h->root.type == bfd_link_hash_warning) 1751 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1752 1753 eh = (struct elf_i386_link_hash_entry *) h; 1754 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1755 { 1756 asection *s = p->sec->output_section; 1757 1758 if (s != NULL && (s->flags & SEC_READONLY) != 0) 1759 { 1760 struct bfd_link_info *info = (struct bfd_link_info *) inf; 1761 1762 info->flags |= DF_TEXTREL; 1763 1764 /* Not an error, just cut short the traversal. */ 1765 return FALSE; 1766 } 1767 } 1768 return TRUE; 1769 } 1770 1088 1771 /* Set the sizes of the dynamic sections. */ 1089 1772 1090 static b oolean1773 static bfd_boolean 1091 1774 elf_i386_size_dynamic_sections (output_bfd, info) 1092 bfd *output_bfd ;1775 bfd *output_bfd ATTRIBUTE_UNUSED; 1093 1776 struct bfd_link_info *info; 1094 1777 { 1778 struct elf_i386_link_hash_table *htab; 1095 1779 bfd *dynobj; 1096 1780 asection *s; 1097 boolean plt; 1098 boolean relocs; 1099 boolean reltext; 1100 1101 dynobj = elf_hash_table (info)->dynobj; 1102 BFD_ASSERT (dynobj != NULL); 1103 1104 if (elf_hash_table (info)->dynamic_sections_created) 1781 bfd_boolean relocs; 1782 bfd *ibfd; 1783 1784 htab = elf_i386_hash_table (info); 1785 dynobj = htab->elf.dynobj; 1786 if (dynobj == NULL) 1787 abort (); 1788 1789 if (htab->elf.dynamic_sections_created) 1105 1790 { 1106 1791 /* Set the contents of the .interp section to the interpreter. */ … … 1108 1793 { 1109 1794 s = bfd_get_section_by_name (dynobj, ".interp"); 1110 BFD_ASSERT (s != NULL); 1795 if (s == NULL) 1796 abort (); 1111 1797 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; 1112 1798 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 1113 1799 } 1114 1800 } 1801 1802 /* Set up .got offsets for local syms, and space for local dynamic 1803 relocs. */ 1804 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 1805 { 1806 bfd_signed_vma *local_got; 1807 bfd_signed_vma *end_local_got; 1808 char *local_tls_type; 1809 bfd_size_type locsymcount; 1810 Elf_Internal_Shdr *symtab_hdr; 1811 asection *srel; 1812 1813 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 1814 continue; 1815 1816 for (s = ibfd->sections; s != NULL; s = s->next) 1817 { 1818 struct elf_i386_dyn_relocs *p; 1819 1820 for (p = *((struct elf_i386_dyn_relocs **) 1821 &elf_section_data (s)->local_dynrel); 1822 p != NULL; 1823 p = p->next) 1824 { 1825 if (!bfd_is_abs_section (p->sec) 1826 && bfd_is_abs_section (p->sec->output_section)) 1827 { 1828 /* Input section has been discarded, either because 1829 it is a copy of a linkonce section or due to 1830 linker script /DISCARD/, so we'll be discarding 1831 the relocs too. */ 1832 } 1833 else if (p->count != 0) 1834 { 1835 srel = elf_section_data (p->sec)->sreloc; 1836 srel->_raw_size += p->count * sizeof (Elf32_External_Rel); 1837 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 1838 info->flags |= DF_TEXTREL; 1839 } 1840 } 1841 } 1842 1843 local_got = elf_local_got_refcounts (ibfd); 1844 if (!local_got) 1845 continue; 1846 1847 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 1848 locsymcount = symtab_hdr->sh_info; 1849 end_local_got = local_got + locsymcount; 1850 local_tls_type = elf_i386_local_got_tls_type (ibfd); 1851 s = htab->sgot; 1852 srel = htab->srelgot; 1853 for (; local_got < end_local_got; ++local_got, ++local_tls_type) 1854 { 1855 if (*local_got > 0) 1856 { 1857 *local_got = s->_raw_size; 1858 s->_raw_size += 4; 1859 if (*local_tls_type == GOT_TLS_GD 1860 || *local_tls_type == GOT_TLS_IE_BOTH) 1861 s->_raw_size += 4; 1862 if (info->shared 1863 || *local_tls_type == GOT_TLS_GD 1864 || (*local_tls_type & GOT_TLS_IE)) 1865 { 1866 if (*local_tls_type == GOT_TLS_IE_BOTH) 1867 srel->_raw_size += 2 * sizeof (Elf32_External_Rel); 1868 else 1869 srel->_raw_size += sizeof (Elf32_External_Rel); 1870 } 1871 } 1872 else 1873 *local_got = (bfd_vma) -1; 1874 } 1875 } 1876 1877 if (htab->tls_ldm_got.refcount > 0) 1878 { 1879 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM 1880 relocs. */ 1881 htab->tls_ldm_got.offset = htab->sgot->_raw_size; 1882 htab->sgot->_raw_size += 8; 1883 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); 1884 } 1115 1885 else 1116 { 1117 /* We may have created entries in the .rel.got section. 1118 However, if we are not creating the dynamic sections, we will 1119 not actually use these entries. Reset the size of .rel.got, 1120 which will cause it to get stripped from the output file 1121 below. */ 1122 s = bfd_get_section_by_name (dynobj, ".rel.got"); 1123 if (s != NULL) 1124 s->_raw_size = 0; 1125 } 1126 1127 /* If this is a -Bsymbolic shared link, then we need to discard all 1128 PC relative relocs against symbols defined in a regular object. 1129 We allocated space for them in the check_relocs routine, but we 1130 will not fill them in in the relocate_section routine. */ 1131 if (info->shared) 1132 elf_i386_link_hash_traverse (elf_i386_hash_table (info), 1133 elf_i386_discard_copies, 1134 (PTR) info); 1135 1136 /* The check_relocs and adjust_dynamic_symbol entry points have 1137 determined the sizes of the various dynamic sections. Allocate 1138 memory for them. */ 1139 plt = false; 1140 relocs = false; 1141 reltext = false; 1886 htab->tls_ldm_got.offset = -1; 1887 1888 /* Allocate global sym .plt and .got entries, and space for global 1889 sym dynamic relocs. */ 1890 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info); 1891 1892 /* We now have determined the sizes of the various dynamic sections. 1893 Allocate memory for them. */ 1894 relocs = FALSE; 1142 1895 for (s = dynobj->sections; s != NULL; s = s->next) 1143 1896 { 1144 const char *name;1145 boolean strip;1146 1147 1897 if ((s->flags & SEC_LINKER_CREATED) == 0) 1148 1898 continue; 1149 1899 1150 /* It's OK to base decisions on the section name, because none 1151 of the dynobj section names depend upon the input files. */ 1152 name = bfd_get_section_name (dynobj, s); 1153 1154 strip = false; 1155 1156 if (strcmp (name, ".plt") == 0) 1157 { 1158 if (s->_raw_size == 0) 1159 { 1160 /* Strip this section if we don't need it; see the 1161 comment below. */ 1162 strip = true; 1163 } 1164 else 1165 { 1166 /* Remember whether there is a PLT. */ 1167 plt = true; 1168 } 1169 } 1170 else if (strncmp (name, ".rel", 4) == 0) 1171 { 1172 if (s->_raw_size == 0) 1173 { 1174 /* If we don't need this section, strip it from the 1175 output file. This is mostly to handle .rel.bss and 1176 .rel.plt. We must create both sections in 1177 create_dynamic_sections, because they must be created 1178 before the linker maps input sections to output 1179 sections. The linker does that before 1180 adjust_dynamic_symbol is called, and it is that 1181 function which decides whether anything needs to go 1182 into these sections. */ 1183 strip = true; 1184 } 1185 else 1186 { 1187 asection *target; 1188 1189 /* Remember whether there are any reloc sections other 1190 than .rel.plt. */ 1191 if (strcmp (name, ".rel.plt") != 0) 1192 { 1193 const char *outname; 1194 1195 relocs = true; 1196 1197 /* If this relocation section applies to a read only 1198 section, then we probably need a DT_TEXTREL 1199 entry. The entries in the .rel.plt section 1200 really apply to the .got section, which we 1201 created ourselves and so know is not readonly. */ 1202 outname = bfd_get_section_name (output_bfd, 1203 s->output_section); 1204 target = bfd_get_section_by_name (output_bfd, outname + 4); 1205 if (target != NULL 1206 && (target->flags & SEC_READONLY) != 0 1207 && (target->flags & SEC_ALLOC) != 0) 1208 reltext = true; 1209 } 1210 1211 /* We use the reloc_count field as a counter if we need 1212 to copy relocs into the output file. */ 1213 s->reloc_count = 0; 1214 } 1215 } 1216 else if (strncmp (name, ".got", 4) != 0) 1900 if (s == htab->splt 1901 || s == htab->sgot 1902 || s == htab->sgotplt) 1903 { 1904 /* Strip this section if we don't need it; see the 1905 comment below. */ 1906 } 1907 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0) 1908 { 1909 if (s->_raw_size != 0 && s != htab->srelplt) 1910 relocs = TRUE; 1911 1912 /* We use the reloc_count field as a counter if we need 1913 to copy relocs into the output file. */ 1914 s->reloc_count = 0; 1915 } 1916 else 1217 1917 { 1218 1918 /* It's not one of our sections, so don't allocate space. */ … … 1220 1920 } 1221 1921 1222 if (strip) 1223 { 1922 if (s->_raw_size == 0) 1923 { 1924 /* If we don't need this section, strip it from the 1925 output file. This is mostly to handle .rel.bss and 1926 .rel.plt. We must create both sections in 1927 create_dynamic_sections, because they must be created 1928 before the linker maps input sections to output 1929 sections. The linker does that before 1930 adjust_dynamic_symbol is called, and it is that 1931 function which decides whether anything needs to go 1932 into these sections. */ 1933 1224 1934 _bfd_strip_section_from_output (info, s); 1225 1935 continue; … … 1232 1942 of garbage. */ 1233 1943 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size); 1234 if (s->contents == NULL && s->_raw_size != 0)1235 return false;1236 } 1237 1238 if ( elf_hash_table (info)->dynamic_sections_created)1944 if (s->contents == NULL) 1945 return FALSE; 1946 } 1947 1948 if (htab->elf.dynamic_sections_created) 1239 1949 { 1240 1950 /* Add some entries to the .dynamic section. We fill in the … … 1243 1953 the .dynamic section. The DT_DEBUG entry is filled in by the 1244 1954 dynamic linker and used by the debugger. */ 1955 #define add_dynamic_entry(TAG, VAL) \ 1956 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL)) 1957 1245 1958 if (! info->shared) 1246 1959 { 1247 if (! bfd_elf32_add_dynamic_entry (info,DT_DEBUG, 0))1248 return false;1249 } 1250 1251 if ( plt)1252 { 1253 if (! bfd_elf32_add_dynamic_entry (info,DT_PLTGOT, 0)1254 || ! bfd_elf32_add_dynamic_entry (info,DT_PLTRELSZ, 0)1255 || ! bfd_elf32_add_dynamic_entry (info,DT_PLTREL, DT_REL)1256 || ! bfd_elf32_add_dynamic_entry (info,DT_JMPREL, 0))1257 return false;1960 if (!add_dynamic_entry (DT_DEBUG, 0)) 1961 return FALSE; 1962 } 1963 1964 if (htab->splt->_raw_size != 0) 1965 { 1966 if (!add_dynamic_entry (DT_PLTGOT, 0) 1967 || !add_dynamic_entry (DT_PLTRELSZ, 0) 1968 || !add_dynamic_entry (DT_PLTREL, DT_REL) 1969 || !add_dynamic_entry (DT_JMPREL, 0)) 1970 return FALSE; 1258 1971 } 1259 1972 1260 1973 if (relocs) 1261 1974 { 1262 if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0) 1263 || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0) 1264 || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT, 1265 sizeof (Elf32_External_Rel))) 1266 return false; 1267 } 1268 1269 if (reltext) 1270 { 1271 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) 1272 return false; 1273 info->flags |= DF_TEXTREL; 1274 } 1275 } 1276 1277 return true; 1975 if (!add_dynamic_entry (DT_REL, 0) 1976 || !add_dynamic_entry (DT_RELSZ, 0) 1977 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel))) 1978 return FALSE; 1979 1980 /* If any dynamic relocs apply to a read-only section, 1981 then we need a DT_TEXTREL entry. */ 1982 if ((info->flags & DF_TEXTREL) == 0) 1983 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, 1984 (PTR) info); 1985 1986 if ((info->flags & DF_TEXTREL) != 0) 1987 { 1988 if (!add_dynamic_entry (DT_TEXTREL, 0)) 1989 return FALSE; 1990 } 1991 } 1992 } 1993 #undef add_dynamic_entry 1994 1995 return TRUE; 1278 1996 } 1279 1997 1280 /* This function is called via elf_i386_link_hash_traverse if we are 1281 creating a shared object. In the -Bsymbolic case, it discards the 1282 space allocated to copy PC relative relocs against symbols which 1283 are defined in regular objects. For the normal non-symbolic case, 1284 we also discard space for relocs that have become local due to 1285 symbol visibility changes. We allocated space for them in the 1286 check_relocs routine, but we won't fill them in in the 1287 relocate_section routine. */ 1288 1289 static boolean 1290 elf_i386_discard_copies (h, inf) 1291 struct elf_i386_link_hash_entry *h; 1292 PTR inf; 1293 { 1294 struct elf_i386_pcrel_relocs_copied *s; 1295 struct bfd_link_info *info = (struct bfd_link_info *) inf; 1296 1297 /* If a symbol has been forced local or we have found a regular 1298 definition for the symbolic link case, then we won't be needing 1299 any relocs. */ 1300 if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 1301 && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 1302 || info->symbolic)) 1303 { 1304 for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) 1305 s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel); 1306 } 1307 1308 return true; 1998 /* Set the correct type for an x86 ELF section. We do this by the 1999 section name, which is a hack, but ought to work. */ 2000 2001 static bfd_boolean 2002 elf_i386_fake_sections (abfd, hdr, sec) 2003 bfd *abfd ATTRIBUTE_UNUSED; 2004 Elf_Internal_Shdr *hdr; 2005 asection *sec; 2006 { 2007 register const char *name; 2008 2009 name = bfd_get_section_name (abfd, sec); 2010 2011 /* This is an ugly, but unfortunately necessary hack that is 2012 needed when producing EFI binaries on x86. It tells 2013 elf.c:elf_fake_sections() not to consider ".reloc" as a section 2014 containing ELF relocation info. We need this hack in order to 2015 be able to generate ELF binaries that can be translated into 2016 EFI applications (which are essentially COFF objects). Those 2017 files contain a COFF ".reloc" section inside an ELFNN object, 2018 which would normally cause BFD to segfault because it would 2019 attempt to interpret this section as containing relocation 2020 entries for section "oc". With this hack enabled, ".reloc" 2021 will be treated as a normal data section, which will avoid the 2022 segfault. However, you won't be able to create an ELFNN binary 2023 with a section named "oc" that needs relocations, but that's 2024 the kind of ugly side-effects you get when detecting section 2025 types based on their names... In practice, this limitation is 2026 unlikely to bite. */ 2027 if (strcmp (name, ".reloc") == 0) 2028 hdr->sh_type = SHT_PROGBITS; 2029 2030 return TRUE; 1309 2031 } 1310 2032 2033 /* Return the base VMA address which should be subtracted from real addresses 2034 when resolving @dtpoff relocation. 2035 This is PT_TLS segment p_vaddr. */ 2036 2037 static bfd_vma 2038 dtpoff_base (info) 2039 struct bfd_link_info *info; 2040 { 2041 /* If tls_segment is NULL, we should have signalled an error already. */ 2042 if (elf_hash_table (info)->tls_segment == NULL) 2043 return 0; 2044 return elf_hash_table (info)->tls_segment->start; 2045 } 2046 2047 /* Return the relocation value for @tpoff relocation 2048 if STT_TLS virtual address is ADDRESS. */ 2049 2050 static bfd_vma 2051 tpoff (info, address) 2052 struct bfd_link_info *info; 2053 bfd_vma address; 2054 { 2055 struct elf_link_tls_segment *tls_segment 2056 = elf_hash_table (info)->tls_segment; 2057 2058 /* If tls_segment is NULL, we should have signalled an error already. */ 2059 if (tls_segment == NULL) 2060 return 0; 2061 return (align_power (tls_segment->size, tls_segment->align) 2062 + tls_segment->start - address); 2063 } 2064 1311 2065 /* Relocate an i386 ELF section. */ 1312 2066 1313 static b oolean2067 static bfd_boolean 1314 2068 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section, 1315 2069 contents, relocs, local_syms, local_sections) … … 1323 2077 asection **local_sections; 1324 2078 { 1325 bfd *dynobj;2079 struct elf_i386_link_hash_table *htab; 1326 2080 Elf_Internal_Shdr *symtab_hdr; 1327 2081 struct elf_link_hash_entry **sym_hashes; 1328 2082 bfd_vma *local_got_offsets; 1329 asection *sgot;1330 asection *splt;1331 asection *sreloc;1332 2083 Elf_Internal_Rela *rel; 1333 2084 Elf_Internal_Rela *relend; 1334 2085 1335 dynobj = elf_hash_table (info)->dynobj;2086 htab = elf_i386_hash_table (info); 1336 2087 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1337 2088 sym_hashes = elf_sym_hashes (input_bfd); 1338 2089 local_got_offsets = elf_local_got_offsets (input_bfd); 1339 2090 1340 sreloc = NULL;1341 splt = NULL;1342 sgot = NULL;1343 if (dynobj != NULL)1344 {1345 splt = bfd_get_section_by_name (dynobj, ".plt");1346 sgot = bfd_get_section_by_name (dynobj, ".got");1347 }1348 1349 2091 rel = relocs; 1350 2092 relend = relocs + input_section->reloc_count; 1351 2093 for (; rel < relend; rel++) 1352 2094 { 1353 int r_type;2095 unsigned int r_type; 1354 2096 reloc_howto_type *howto; 1355 2097 unsigned long r_symndx; … … 1357 2099 Elf_Internal_Sym *sym; 1358 2100 asection *sec; 2101 bfd_vma off; 1359 2102 bfd_vma relocation; 2103 bfd_boolean unresolved_reloc; 1360 2104 bfd_reloc_status_type r; 1361 2105 unsigned int indx; 2106 int tls_type; 1362 2107 1363 2108 r_type = ELF32_R_TYPE (rel->r_info); … … 1367 2112 1368 2113 if ((indx = (unsigned) r_type) >= R_386_standard 1369 && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard 1370 >= R_386_ext - R_386_standard)) 2114 && ((indx = r_type - R_386_ext_offset) - R_386_standard 2115 >= R_386_ext - R_386_standard) 2116 && ((indx = r_type - R_386_tls_offset) - R_386_ext 2117 >= R_386_tls - R_386_ext)) 1371 2118 { 1372 2119 bfd_set_error (bfd_error_bad_value); 1373 return false;2120 return FALSE; 1374 2121 } 1375 2122 howto = elf_howto_table + indx; … … 1379 2126 if (info->relocateable) 1380 2127 { 1381 /* This is a relocateable link. We don't have to change 2128 bfd_vma val; 2129 bfd_byte *where; 2130 2131 /* This is a relocatable link. We don't have to change 1382 2132 anything, unless the reloc is against a section symbol, 1383 2133 in which case we have to adjust according to where the 1384 2134 section symbol winds up in the output section. */ 1385 if (r_symndx < symtab_hdr->sh_info) 1386 { 1387 sym = local_syms + r_symndx; 1388 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) 1389 { 1390 bfd_vma val; 1391 1392 sec = local_sections[r_symndx]; 1393 val = bfd_get_32 (input_bfd, contents + rel->r_offset); 1394 val += sec->output_offset + sym->st_value; 1395 bfd_put_32 (input_bfd, val, contents + rel->r_offset); 1396 } 1397 } 1398 2135 if (r_symndx >= symtab_hdr->sh_info) 2136 continue; 2137 2138 sym = local_syms + r_symndx; 2139 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) 2140 continue; 2141 2142 sec = local_sections[r_symndx]; 2143 val = sec->output_offset; 2144 if (val == 0) 2145 continue; 2146 2147 where = contents + rel->r_offset; 2148 switch (howto->size) 2149 { 2150 /* FIXME: overflow checks. */ 2151 case 0: 2152 val += bfd_get_8 (input_bfd, where); 2153 bfd_put_8 (input_bfd, val, where); 2154 break; 2155 case 1: 2156 val += bfd_get_16 (input_bfd, where); 2157 bfd_put_16 (input_bfd, val, where); 2158 break; 2159 case 2: 2160 val += bfd_get_32 (input_bfd, where); 2161 bfd_put_32 (input_bfd, val, where); 2162 break; 2163 default: 2164 abort (); 2165 } 1399 2166 continue; 1400 2167 } … … 1404 2171 sym = NULL; 1405 2172 sec = NULL; 2173 unresolved_reloc = FALSE; 1406 2174 if (r_symndx < symtab_hdr->sh_info) 1407 2175 { … … 1411 2179 + sec->output_offset 1412 2180 + sym->st_value); 2181 if ((sec->flags & SEC_MERGE) 2182 && ELF_ST_TYPE (sym->st_info) == STT_SECTION) 2183 { 2184 asection *msec; 2185 bfd_vma addend; 2186 bfd_byte *where = contents + rel->r_offset; 2187 2188 switch (howto->size) 2189 { 2190 case 0: 2191 addend = bfd_get_8 (input_bfd, where); 2192 if (howto->pc_relative) 2193 { 2194 addend = (addend ^ 0x80) - 0x80; 2195 addend += 1; 2196 } 2197 break; 2198 case 1: 2199 addend = bfd_get_16 (input_bfd, where); 2200 if (howto->pc_relative) 2201 { 2202 addend = (addend ^ 0x8000) - 0x8000; 2203 addend += 2; 2204 } 2205 break; 2206 case 2: 2207 addend = bfd_get_32 (input_bfd, where); 2208 if (howto->pc_relative) 2209 { 2210 addend = (addend ^ 0x80000000) - 0x80000000; 2211 addend += 4; 2212 } 2213 break; 2214 default: 2215 abort (); 2216 } 2217 2218 msec = sec; 2219 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend); 2220 addend -= relocation; 2221 addend += msec->output_section->vma + msec->output_offset; 2222 2223 switch (howto->size) 2224 { 2225 case 0: 2226 /* FIXME: overflow checks. */ 2227 if (howto->pc_relative) 2228 addend -= 1; 2229 bfd_put_8 (input_bfd, addend, where); 2230 break; 2231 case 1: 2232 if (howto->pc_relative) 2233 addend -= 2; 2234 bfd_put_16 (input_bfd, addend, where); 2235 break; 2236 case 2: 2237 if (howto->pc_relative) 2238 addend -= 4; 2239 bfd_put_32 (input_bfd, addend, where); 2240 break; 2241 } 2242 } 1413 2243 } 1414 2244 else … … 1418 2248 || h->root.type == bfd_link_hash_warning) 1419 2249 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2250 2251 relocation = 0; 1420 2252 if (h->root.type == bfd_link_hash_defined 1421 2253 || h->root.type == bfd_link_hash_defweak) 1422 2254 { 1423 2255 sec = h->root.u.def.section; 1424 if (r_type == R_386_GOTPC 1425 || (r_type == R_386_PLT32 1426 && splt != NULL 1427 && h->plt.offset != (bfd_vma) -1) 1428 || (r_type == R_386_GOT32 1429 && elf_hash_table (info)->dynamic_sections_created 1430 && (! info->shared 1431 || (! info->symbolic && h->dynindx != -1) 1432 || (h->elf_link_hash_flags 1433 & ELF_LINK_HASH_DEF_REGULAR) == 0)) 1434 || (info->shared 1435 && ((! info->symbolic && h->dynindx != -1) 1436 || (h->elf_link_hash_flags 1437 & ELF_LINK_HASH_DEF_REGULAR) == 0) 1438 && (r_type == R_386_32 1439 || r_type == R_386_PC32) 1440 && ((input_section->flags & SEC_ALLOC) != 0 1441 /* DWARF will emit R_386_32 relocations in its 1442 sections against symbols defined externally 1443 in shared libraries. We can't do anything 1444 with them here. */ 1445 || ((input_section->flags & SEC_DEBUGGING) != 0 1446 && (h->elf_link_hash_flags 1447 & ELF_LINK_HASH_DEF_DYNAMIC) != 0)))) 1448 { 1449 /* In these cases, we don't need the relocation 1450 value. We check specially because in some 1451 obscure cases sec->output_section will be NULL. */ 1452 relocation = 0; 1453 } 1454 else if (sec->output_section == NULL) 1455 { 1456 (*_bfd_error_handler) 1457 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"), 1458 bfd_get_filename (input_bfd), h->root.root.string, 1459 bfd_get_section_name (input_bfd, input_section)); 1460 relocation = 0; 1461 } 2256 if (sec->output_section == NULL) 2257 /* Set a flag that will be cleared later if we find a 2258 relocation value for this symbol. output_section 2259 is typically NULL for symbols satisfied by a shared 2260 library. */ 2261 unresolved_reloc = TRUE; 1462 2262 else 1463 2263 relocation = (h->root.u.def.value … … 1466 2266 } 1467 2267 else if (h->root.type == bfd_link_hash_undefweak) 1468 relocation = 0;1469 else if (info->shared && !info->symbolic2268 ; 2269 else if (info->shared 1470 2270 && !info->no_undefined 1471 2271 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 1472 relocation = 0;2272 ; 1473 2273 else 1474 2274 { … … 1478 2278 (!info->shared || info->no_undefined 1479 2279 || ELF_ST_VISIBILITY (h->other))))) 1480 return false; 1481 relocation = 0; 2280 return FALSE; 1482 2281 } 1483 2282 } … … 1488 2287 /* Relocation is to the entry for this symbol in the global 1489 2288 offset table. */ 1490 BFD_ASSERT (sgot != NULL); 2289 if (htab->sgot == NULL) 2290 abort (); 1491 2291 1492 2292 if (h != NULL) 1493 2293 { 1494 bfd_ vma off;2294 bfd_boolean dyn; 1495 2295 1496 2296 off = h->got.offset; 1497 BFD_ASSERT (off != (bfd_vma) -1); 1498 1499 if (! elf_hash_table (info)->dynamic_sections_created 2297 dyn = htab->elf.dynamic_sections_created; 2298 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 1500 2299 || (info->shared 1501 && (info->symbolic || h->dynindx == -1) 2300 && (info->symbolic 2301 || h->dynindx == -1 2302 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) 1502 2303 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) 1503 2304 { … … 1519 2320 { 1520 2321 bfd_put_32 (output_bfd, relocation, 1521 sgot->contents + off);2322 htab->sgot->contents + off); 1522 2323 h->got.offset |= 1; 1523 2324 } 1524 2325 } 1525 1526 relocation = sgot->output_offset + off;2326 else 2327 unresolved_reloc = FALSE; 1527 2328 } 1528 2329 else 1529 2330 { 1530 bfd_vma off; 1531 1532 BFD_ASSERT (local_got_offsets != NULL 1533 && local_got_offsets[r_symndx] != (bfd_vma) -1); 2331 if (local_got_offsets == NULL) 2332 abort (); 1534 2333 1535 2334 off = local_got_offsets[r_symndx]; 1536 2335 1537 2336 /* The offset must always be a multiple of 4. We use 1538 1539 2337 the least significant bit to record whether we have 2338 already generated the necessary reloc. */ 1540 2339 if ((off & 1) != 0) 1541 2340 off &= ~1; 1542 2341 else 1543 2342 { 1544 bfd_put_32 (output_bfd, relocation, sgot->contents + off); 2343 bfd_put_32 (output_bfd, relocation, 2344 htab->sgot->contents + off); 1545 2345 1546 2346 if (info->shared) 1547 2347 { 1548 asection *srelgot; 1549 Elf_Internal_Rel outrel; 1550 1551 srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); 1552 BFD_ASSERT (srelgot != NULL); 1553 1554 outrel.r_offset = (sgot->output_section->vma 1555 + sgot->output_offset 2348 asection *s; 2349 Elf_Internal_Rela outrel; 2350 bfd_byte *loc; 2351 2352 s = htab->srelgot; 2353 if (s == NULL) 2354 abort (); 2355 2356 outrel.r_offset = (htab->sgot->output_section->vma 2357 + htab->sgot->output_offset 1556 2358 + off); 1557 2359 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 1558 bfd_elf32_swap_reloc_out (output_bfd, &outrel, 1559 (((Elf32_External_Rel *) 1560 srelgot->contents) 1561 + srelgot->reloc_count)); 1562 ++srelgot->reloc_count; 2360 loc = s->contents; 2361 loc += s->reloc_count++ * sizeof (Elf32_External_Rel); 2362 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 1563 2363 } 1564 2364 1565 2365 local_got_offsets[r_symndx] |= 1; 1566 2366 } 1567 1568 relocation = sgot->output_offset + off; 1569 } 1570 2367 } 2368 2369 if (off >= (bfd_vma) -2) 2370 abort (); 2371 2372 relocation = htab->sgot->output_offset + off; 1571 2373 break; 1572 2374 … … 1574 2376 /* Relocation is relative to the start of the global offset 1575 2377 table. */ 1576 1577 if (sgot == NULL)1578 {1579 sgot = bfd_get_section_by_name (dynobj, ".got");1580 BFD_ASSERT (sgot != NULL);1581 }1582 2378 1583 2379 /* Note that sgot->output_offset is not involved in this … … 1586 2382 permitted by the ABI, we might have to change this 1587 2383 calculation. */ 1588 relocation -= sgot->output_section->vma; 1589 2384 relocation -= htab->sgot->output_section->vma; 1590 2385 break; 1591 2386 1592 2387 case R_386_GOTPC: 1593 2388 /* Use global offset table as symbol value. */ 1594 1595 if (sgot == NULL) 1596 { 1597 sgot = bfd_get_section_by_name (dynobj, ".got"); 1598 BFD_ASSERT (sgot != NULL); 1599 } 1600 1601 relocation = sgot->output_section->vma; 1602 2389 relocation = htab->sgot->output_section->vma; 2390 unresolved_reloc = FALSE; 1603 2391 break; 1604 2392 … … 1608 2396 1609 2397 /* Resolve a PLT32 reloc against a local symbol directly, 1610 2398 without using the procedure linkage table. */ 1611 2399 if (h == NULL) 1612 2400 break; 1613 2401 1614 2402 if (h->plt.offset == (bfd_vma) -1 1615 || splt == NULL)2403 || htab->splt == NULL) 1616 2404 { 1617 2405 /* We didn't make a PLT entry for this symbol. This 1618 1619 2406 happens when statically linking PIC code, or when 2407 using -Bsymbolic. */ 1620 2408 break; 1621 2409 } 1622 2410 1623 relocation = ( splt->output_section->vma1624 + splt->output_offset2411 relocation = (htab->splt->output_section->vma 2412 + htab->splt->output_offset 1625 2413 + h->plt.offset); 1626 2414 unresolved_reloc = FALSE; 1627 2415 break; 1628 2416 1629 2417 case R_386_32: 1630 2418 case R_386_PC32: 1631 if (info->shared 1632 && (input_section->flags & SEC_ALLOC) != 0 1633 && (r_type != R_386_PC32 1634 || (h != NULL 1635 && h->dynindx != -1 1636 && (! info->symbolic 1637 || (h->elf_link_hash_flags 1638 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 1639 { 1640 Elf_Internal_Rel outrel; 1641 boolean skip, relocate; 2419 /* r_symndx will be zero only for relocs against symbols 2420 from removed linkonce sections, or sections discarded by 2421 a linker script. */ 2422 if (r_symndx == 0 2423 || (input_section->flags & SEC_ALLOC) == 0) 2424 break; 2425 2426 if ((info->shared 2427 && (r_type != R_386_PC32 2428 || (h != NULL 2429 && h->dynindx != -1 2430 && (! info->symbolic 2431 || (h->elf_link_hash_flags 2432 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 2433 || (ELIMINATE_COPY_RELOCS 2434 && !info->shared 2435 && h != NULL 2436 && h->dynindx != -1 2437 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 2438 && (((h->elf_link_hash_flags 2439 & ELF_LINK_HASH_DEF_DYNAMIC) != 0 2440 && (h->elf_link_hash_flags 2441 & ELF_LINK_HASH_DEF_REGULAR) == 0) 2442 || h->root.type == bfd_link_hash_undefweak 2443 || h->root.type == bfd_link_hash_undefined))) 2444 { 2445 Elf_Internal_Rela outrel; 2446 bfd_byte *loc; 2447 bfd_boolean skip, relocate; 2448 asection *sreloc; 1642 2449 1643 2450 /* When generating a shared object, these relocations … … 1645 2452 time. */ 1646 2453 1647 if (sreloc == NULL) 1648 { 1649 const char *name; 1650 1651 name = (bfd_elf_string_from_elf_section 1652 (input_bfd, 1653 elf_elfheader (input_bfd)->e_shstrndx, 1654 elf_section_data (input_section)->rel_hdr.sh_name)); 1655 if (name == NULL) 1656 return false; 1657 1658 if (strncmp (name, ".rel", 4) != 0 1659 || strcmp (bfd_get_section_name (input_bfd, 1660 input_section), 1661 name + 4) != 0) 1662 { 1663 if (input_bfd->my_archive) 1664 (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"), 1665 bfd_get_filename (input_bfd->my_archive), 1666 bfd_get_filename (input_bfd), 1667 name); 1668 else 1669 (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"), 1670 bfd_get_filename (input_bfd), 1671 name); 1672 return false; 1673 } 1674 1675 sreloc = bfd_get_section_by_name (dynobj, name); 1676 BFD_ASSERT (sreloc != NULL); 1677 } 1678 1679 skip = false; 1680 1681 if (elf_section_data (input_section)->stab_info == NULL) 1682 outrel.r_offset = rel->r_offset; 2454 skip = FALSE; 2455 relocate = FALSE; 2456 2457 outrel.r_offset = 2458 _bfd_elf_section_offset (output_bfd, info, input_section, 2459 rel->r_offset); 2460 if (outrel.r_offset == (bfd_vma) -1) 2461 skip = TRUE; 2462 else if (outrel.r_offset == (bfd_vma) -2) 2463 skip = TRUE, relocate = TRUE; 2464 outrel.r_offset += (input_section->output_section->vma 2465 + input_section->output_offset); 2466 2467 if (skip) 2468 memset (&outrel, 0, sizeof outrel); 2469 else if (h != NULL 2470 && h->dynindx != -1 2471 && (r_type == R_386_PC32 2472 || !info->shared 2473 || !info->symbolic 2474 || (h->elf_link_hash_flags 2475 & ELF_LINK_HASH_DEF_REGULAR) == 0)) 2476 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 1683 2477 else 1684 2478 { 1685 bfd_vma off; 1686 1687 off = (_bfd_stab_section_offset 1688 (output_bfd, &elf_hash_table (info)->stab_info, 1689 input_section, 1690 &elf_section_data (input_section)->stab_info, 1691 rel->r_offset)); 1692 if (off == (bfd_vma) -1) 1693 skip = true; 1694 outrel.r_offset = off; 2479 /* This symbol is local, or marked to become local. */ 2480 relocate = TRUE; 2481 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 1695 2482 } 1696 2483 1697 outrel.r_offset += (input_section->output_section->vma 1698 + input_section->output_offset); 1699 1700 if (skip) 1701 { 1702 memset (&outrel, 0, sizeof outrel); 1703 relocate = false; 1704 } 1705 else if (r_type == R_386_PC32) 1706 { 1707 BFD_ASSERT (h != NULL && h->dynindx != -1); 1708 relocate = false; 1709 outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_PC32); 1710 } 1711 else 1712 { 1713 /* h->dynindx may be -1 if this symbol was marked to 1714 become local. */ 1715 if (h == NULL 1716 || ((info->symbolic || h->dynindx == -1) 1717 && (h->elf_link_hash_flags 1718 & ELF_LINK_HASH_DEF_REGULAR) != 0)) 1719 { 1720 relocate = true; 1721 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 1722 } 1723 else 1724 { 1725 BFD_ASSERT (h->dynindx != -1); 1726 relocate = false; 1727 outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32); 1728 } 1729 } 1730 1731 bfd_elf32_swap_reloc_out (output_bfd, &outrel, 1732 (((Elf32_External_Rel *) 1733 sreloc->contents) 1734 + sreloc->reloc_count)); 1735 ++sreloc->reloc_count; 2484 sreloc = elf_section_data (input_section)->sreloc; 2485 if (sreloc == NULL) 2486 abort (); 2487 2488 loc = sreloc->contents; 2489 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 2490 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 1736 2491 1737 2492 /* If this reloc is against an external symbol, we do … … 1742 2497 continue; 1743 2498 } 1744 2499 break; 2500 2501 case R_386_TLS_IE: 2502 if (info->shared) 2503 { 2504 Elf_Internal_Rela outrel; 2505 bfd_byte *loc; 2506 asection *sreloc; 2507 2508 outrel.r_offset = rel->r_offset 2509 + input_section->output_section->vma 2510 + input_section->output_offset; 2511 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 2512 sreloc = elf_section_data (input_section)->sreloc; 2513 if (sreloc == NULL) 2514 abort (); 2515 loc = sreloc->contents; 2516 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 2517 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2518 } 2519 /* Fall through */ 2520 2521 case R_386_TLS_GD: 2522 case R_386_TLS_IE_32: 2523 case R_386_TLS_GOTIE: 2524 r_type = elf_i386_tls_transition (info, r_type, h == NULL); 2525 tls_type = GOT_UNKNOWN; 2526 if (h == NULL && local_got_offsets) 2527 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx]; 2528 else if (h != NULL) 2529 { 2530 tls_type = elf_i386_hash_entry(h)->tls_type; 2531 if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE)) 2532 r_type = R_386_TLS_LE_32; 2533 } 2534 if (tls_type == GOT_TLS_IE) 2535 tls_type = GOT_TLS_IE_NEG; 2536 if (r_type == R_386_TLS_GD) 2537 { 2538 if (tls_type == GOT_TLS_IE_POS) 2539 r_type = R_386_TLS_GOTIE; 2540 else if (tls_type & GOT_TLS_IE) 2541 r_type = R_386_TLS_IE_32; 2542 } 2543 2544 if (r_type == R_386_TLS_LE_32) 2545 { 2546 BFD_ASSERT (! unresolved_reloc); 2547 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD) 2548 { 2549 unsigned int val, type; 2550 bfd_vma roff; 2551 2552 /* GD->LE transition. */ 2553 BFD_ASSERT (rel->r_offset >= 2); 2554 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2555 BFD_ASSERT (type == 0x8d || type == 0x04); 2556 BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size); 2557 BFD_ASSERT (bfd_get_8 (input_bfd, 2558 contents + rel->r_offset + 4) 2559 == 0xe8); 2560 BFD_ASSERT (rel + 1 < relend); 2561 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 2562 roff = rel->r_offset + 5; 2563 val = bfd_get_8 (input_bfd, 2564 contents + rel->r_offset - 1); 2565 if (type == 0x04) 2566 { 2567 /* leal foo(,%reg,1), %eax; call ___tls_get_addr 2568 Change it into: 2569 movl %gs:0, %eax; subl $foo@tpoff, %eax 2570 (6 byte form of subl). */ 2571 BFD_ASSERT (rel->r_offset >= 3); 2572 BFD_ASSERT (bfd_get_8 (input_bfd, 2573 contents + rel->r_offset - 3) 2574 == 0x8d); 2575 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3)); 2576 memcpy (contents + rel->r_offset - 3, 2577 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 2578 } 2579 else 2580 { 2581 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 2582 if (rel->r_offset + 10 <= input_section->_raw_size 2583 && bfd_get_8 (input_bfd, 2584 contents + rel->r_offset + 9) == 0x90) 2585 { 2586 /* leal foo(%reg), %eax; call ___tls_get_addr; nop 2587 Change it into: 2588 movl %gs:0, %eax; subl $foo@tpoff, %eax 2589 (6 byte form of subl). */ 2590 memcpy (contents + rel->r_offset - 2, 2591 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 2592 roff = rel->r_offset + 6; 2593 } 2594 else 2595 { 2596 /* leal foo(%reg), %eax; call ___tls_get_addr 2597 Change it into: 2598 movl %gs:0, %eax; subl $foo@tpoff, %eax 2599 (5 byte form of subl). */ 2600 memcpy (contents + rel->r_offset - 2, 2601 "\x65\xa1\0\0\0\0\x2d\0\0\0", 11); 2602 } 2603 } 2604 bfd_put_32 (output_bfd, tpoff (info, relocation), 2605 contents + roff); 2606 /* Skip R_386_PLT32. */ 2607 rel++; 2608 continue; 2609 } 2610 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE) 2611 { 2612 unsigned int val, type; 2613 2614 /* IE->LE transition: 2615 Originally it can be one of: 2616 movl foo, %eax 2617 movl foo, %reg 2618 addl foo, %reg 2619 We change it into: 2620 movl $foo, %eax 2621 movl $foo, %reg 2622 addl $foo, %reg. */ 2623 BFD_ASSERT (rel->r_offset >= 1); 2624 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2625 BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size); 2626 if (val == 0xa1) 2627 { 2628 /* movl foo, %eax. */ 2629 bfd_put_8 (output_bfd, 0xb8, contents + rel->r_offset - 1); 2630 } 2631 else 2632 { 2633 BFD_ASSERT (rel->r_offset >= 2); 2634 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2635 switch (type) 2636 { 2637 case 0x8b: 2638 /* movl */ 2639 BFD_ASSERT ((val & 0xc7) == 0x05); 2640 bfd_put_8 (output_bfd, 0xc7, 2641 contents + rel->r_offset - 2); 2642 bfd_put_8 (output_bfd, 2643 0xc0 | ((val >> 3) & 7), 2644 contents + rel->r_offset - 1); 2645 break; 2646 case 0x03: 2647 /* addl */ 2648 BFD_ASSERT ((val & 0xc7) == 0x05); 2649 bfd_put_8 (output_bfd, 0x81, 2650 contents + rel->r_offset - 2); 2651 bfd_put_8 (output_bfd, 2652 0xc0 | ((val >> 3) & 7), 2653 contents + rel->r_offset - 1); 2654 break; 2655 default: 2656 BFD_FAIL (); 2657 break; 2658 } 2659 } 2660 bfd_put_32 (output_bfd, -tpoff (info, relocation), 2661 contents + rel->r_offset); 2662 continue; 2663 } 2664 else 2665 { 2666 unsigned int val, type; 2667 2668 /* {IE_32,GOTIE}->LE transition: 2669 Originally it can be one of: 2670 subl foo(%reg1), %reg2 2671 movl foo(%reg1), %reg2 2672 addl foo(%reg1), %reg2 2673 We change it into: 2674 subl $foo, %reg2 2675 movl $foo, %reg2 (6 byte form) 2676 addl $foo, %reg2. */ 2677 BFD_ASSERT (rel->r_offset >= 2); 2678 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2679 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2680 BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size); 2681 BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4); 2682 if (type == 0x8b) 2683 { 2684 /* movl */ 2685 bfd_put_8 (output_bfd, 0xc7, 2686 contents + rel->r_offset - 2); 2687 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7), 2688 contents + rel->r_offset - 1); 2689 } 2690 else if (type == 0x2b) 2691 { 2692 /* subl */ 2693 bfd_put_8 (output_bfd, 0x81, 2694 contents + rel->r_offset - 2); 2695 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7), 2696 contents + rel->r_offset - 1); 2697 } 2698 else if (type == 0x03) 2699 { 2700 /* addl */ 2701 bfd_put_8 (output_bfd, 0x81, 2702 contents + rel->r_offset - 2); 2703 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7), 2704 contents + rel->r_offset - 1); 2705 } 2706 else 2707 BFD_FAIL (); 2708 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE) 2709 bfd_put_32 (output_bfd, -tpoff (info, relocation), 2710 contents + rel->r_offset); 2711 else 2712 bfd_put_32 (output_bfd, tpoff (info, relocation), 2713 contents + rel->r_offset); 2714 continue; 2715 } 2716 } 2717 2718 if (htab->sgot == NULL) 2719 abort (); 2720 2721 if (h != NULL) 2722 off = h->got.offset; 2723 else 2724 { 2725 if (local_got_offsets == NULL) 2726 abort (); 2727 2728 off = local_got_offsets[r_symndx]; 2729 } 2730 2731 if ((off & 1) != 0) 2732 off &= ~1; 2733 else 2734 { 2735 Elf_Internal_Rela outrel; 2736 bfd_byte *loc; 2737 int dr_type, indx; 2738 2739 if (htab->srelgot == NULL) 2740 abort (); 2741 2742 outrel.r_offset = (htab->sgot->output_section->vma 2743 + htab->sgot->output_offset + off); 2744 2745 indx = h && h->dynindx != -1 ? h->dynindx : 0; 2746 if (r_type == R_386_TLS_GD) 2747 dr_type = R_386_TLS_DTPMOD32; 2748 else if (tls_type == GOT_TLS_IE_POS) 2749 dr_type = R_386_TLS_TPOFF; 2750 else 2751 dr_type = R_386_TLS_TPOFF32; 2752 if (dr_type == R_386_TLS_TPOFF && indx == 0) 2753 bfd_put_32 (output_bfd, relocation - dtpoff_base (info), 2754 htab->sgot->contents + off); 2755 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0) 2756 bfd_put_32 (output_bfd, dtpoff_base (info) - relocation, 2757 htab->sgot->contents + off); 2758 else 2759 bfd_put_32 (output_bfd, 0, 2760 htab->sgot->contents + off); 2761 outrel.r_info = ELF32_R_INFO (indx, dr_type); 2762 loc = htab->srelgot->contents; 2763 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel); 2764 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2765 2766 if (r_type == R_386_TLS_GD) 2767 { 2768 if (indx == 0) 2769 { 2770 BFD_ASSERT (! unresolved_reloc); 2771 bfd_put_32 (output_bfd, 2772 relocation - dtpoff_base (info), 2773 htab->sgot->contents + off + 4); 2774 } 2775 else 2776 { 2777 bfd_put_32 (output_bfd, 0, 2778 htab->sgot->contents + off + 4); 2779 outrel.r_info = ELF32_R_INFO (indx, 2780 R_386_TLS_DTPOFF32); 2781 outrel.r_offset += 4; 2782 htab->srelgot->reloc_count++; 2783 loc += sizeof (Elf32_External_Rel); 2784 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2785 } 2786 } 2787 else if (tls_type == GOT_TLS_IE_BOTH) 2788 { 2789 bfd_put_32 (output_bfd, 2790 indx == 0 ? relocation - dtpoff_base (info) : 0, 2791 htab->sgot->contents + off + 4); 2792 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF); 2793 outrel.r_offset += 4; 2794 htab->srelgot->reloc_count++; 2795 loc += sizeof (Elf32_External_Rel); 2796 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2797 } 2798 2799 if (h != NULL) 2800 h->got.offset |= 1; 2801 else 2802 local_got_offsets[r_symndx] |= 1; 2803 } 2804 2805 if (off >= (bfd_vma) -2) 2806 abort (); 2807 if (r_type == ELF32_R_TYPE (rel->r_info)) 2808 { 2809 relocation = htab->sgot->output_offset + off; 2810 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE) 2811 && tls_type == GOT_TLS_IE_BOTH) 2812 relocation += 4; 2813 if (r_type == R_386_TLS_IE) 2814 relocation += htab->sgot->output_section->vma; 2815 unresolved_reloc = FALSE; 2816 } 2817 else 2818 { 2819 unsigned int val, type; 2820 bfd_vma roff; 2821 2822 /* GD->IE transition. */ 2823 BFD_ASSERT (rel->r_offset >= 2); 2824 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2825 BFD_ASSERT (type == 0x8d || type == 0x04); 2826 BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size); 2827 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4) 2828 == 0xe8); 2829 BFD_ASSERT (rel + 1 < relend); 2830 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 2831 roff = rel->r_offset - 3; 2832 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2833 if (type == 0x04) 2834 { 2835 /* leal foo(,%reg,1), %eax; call ___tls_get_addr 2836 Change it into: 2837 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */ 2838 BFD_ASSERT (rel->r_offset >= 3); 2839 BFD_ASSERT (bfd_get_8 (input_bfd, 2840 contents + rel->r_offset - 3) 2841 == 0x8d); 2842 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3)); 2843 val >>= 3; 2844 } 2845 else 2846 { 2847 /* leal foo(%reg), %eax; call ___tls_get_addr; nop 2848 Change it into: 2849 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */ 2850 BFD_ASSERT (rel->r_offset + 10 <= input_section->_raw_size); 2851 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 2852 BFD_ASSERT (bfd_get_8 (input_bfd, 2853 contents + rel->r_offset + 9) 2854 == 0x90); 2855 roff = rel->r_offset - 2; 2856 } 2857 memcpy (contents + roff, 2858 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12); 2859 contents[roff + 7] = 0x80 | (val & 7); 2860 /* If foo is used only with foo@gotntpoff(%reg) and 2861 foo@indntpoff, but not with foo@gottpoff(%reg), change 2862 subl $foo@gottpoff(%reg), %eax 2863 into: 2864 addl $foo@gotntpoff(%reg), %eax. */ 2865 if (r_type == R_386_TLS_GOTIE) 2866 { 2867 contents[roff + 6] = 0x03; 2868 if (tls_type == GOT_TLS_IE_BOTH) 2869 off += 4; 2870 } 2871 bfd_put_32 (output_bfd, htab->sgot->output_offset + off, 2872 contents + roff + 8); 2873 /* Skip R_386_PLT32. */ 2874 rel++; 2875 continue; 2876 } 2877 break; 2878 2879 case R_386_TLS_LDM: 2880 if (! info->shared) 2881 { 2882 unsigned int val; 2883 2884 /* LD->LE transition: 2885 Ensure it is: 2886 leal foo(%reg), %eax; call ___tls_get_addr. 2887 We change it into: 2888 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */ 2889 BFD_ASSERT (rel->r_offset >= 2); 2890 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2) 2891 == 0x8d); 2892 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2893 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 2894 BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size); 2895 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4) 2896 == 0xe8); 2897 BFD_ASSERT (rel + 1 < relend); 2898 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 2899 memcpy (contents + rel->r_offset - 2, 2900 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11); 2901 /* Skip R_386_PLT32. */ 2902 rel++; 2903 continue; 2904 } 2905 2906 if (htab->sgot == NULL) 2907 abort (); 2908 2909 off = htab->tls_ldm_got.offset; 2910 if (off & 1) 2911 off &= ~1; 2912 else 2913 { 2914 Elf_Internal_Rela outrel; 2915 bfd_byte *loc; 2916 2917 if (htab->srelgot == NULL) 2918 abort (); 2919 2920 outrel.r_offset = (htab->sgot->output_section->vma 2921 + htab->sgot->output_offset + off); 2922 2923 bfd_put_32 (output_bfd, 0, 2924 htab->sgot->contents + off); 2925 bfd_put_32 (output_bfd, 0, 2926 htab->sgot->contents + off + 4); 2927 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32); 2928 loc = htab->srelgot->contents; 2929 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel); 2930 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2931 htab->tls_ldm_got.offset |= 1; 2932 } 2933 relocation = htab->sgot->output_offset + off; 2934 unresolved_reloc = FALSE; 2935 break; 2936 2937 case R_386_TLS_LDO_32: 2938 if (info->shared || (input_section->flags & SEC_CODE) == 0) 2939 relocation -= dtpoff_base (info); 2940 else 2941 /* When converting LDO to LE, we must negate. */ 2942 relocation = -tpoff (info, relocation); 2943 break; 2944 2945 case R_386_TLS_LE_32: 2946 case R_386_TLS_LE: 2947 if (info->shared) 2948 { 2949 Elf_Internal_Rela outrel; 2950 asection *sreloc; 2951 bfd_byte *loc; 2952 int indx; 2953 2954 outrel.r_offset = rel->r_offset 2955 + input_section->output_section->vma 2956 + input_section->output_offset; 2957 if (h != NULL && h->dynindx != -1) 2958 indx = h->dynindx; 2959 else 2960 indx = 0; 2961 if (r_type == R_386_TLS_LE_32) 2962 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32); 2963 else 2964 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF); 2965 sreloc = elf_section_data (input_section)->sreloc; 2966 if (sreloc == NULL) 2967 abort (); 2968 loc = sreloc->contents; 2969 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 2970 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2971 if (indx) 2972 continue; 2973 else if (r_type == R_386_TLS_LE_32) 2974 relocation = dtpoff_base (info) - relocation; 2975 else 2976 relocation -= dtpoff_base (info); 2977 } 2978 else if (r_type == R_386_TLS_LE_32) 2979 relocation = tpoff (info, relocation); 2980 else 2981 relocation = -tpoff (info, relocation); 1745 2982 break; 1746 2983 1747 2984 default: 1748 2985 break; 2986 } 2987 2988 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 2989 because such sections are not SEC_ALLOC and thus ld.so will 2990 not process them. */ 2991 if (unresolved_reloc 2992 && !((input_section->flags & SEC_DEBUGGING) != 0 2993 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0)) 2994 { 2995 (*_bfd_error_handler) 2996 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"), 2997 bfd_archive_filename (input_bfd), 2998 bfd_get_section_name (input_bfd, input_section), 2999 (long) rel->r_offset, 3000 h->root.root.string); 3001 return FALSE; 1749 3002 } 1750 3003 … … 1755 3008 if (r != bfd_reloc_ok) 1756 3009 { 1757 switch (r) 1758 { 1759 default: 1760 case bfd_reloc_outofrange: 1761 abort (); 1762 case bfd_reloc_overflow: 1763 { 1764 const char *name; 1765 1766 if (h != NULL) 1767 name = h->root.root.string; 1768 else 1769 { 1770 name = bfd_elf_string_from_elf_section (input_bfd, 1771 symtab_hdr->sh_link, 1772 sym->st_name); 1773 if (name == NULL) 1774 return false; 1775 if (*name == '\0') 1776 name = bfd_section_name (input_bfd, sec); 1777 } 1778 if (! ((*info->callbacks->reloc_overflow) 1779 (info, name, howto->name, (bfd_vma) 0, 1780 input_bfd, input_section, rel->r_offset))) 1781 return false; 1782 } 1783 break; 1784 } 1785 } 1786 } 1787 1788 return true; 3010 const char *name; 3011 3012 if (h != NULL) 3013 name = h->root.root.string; 3014 else 3015 { 3016 name = bfd_elf_string_from_elf_section (input_bfd, 3017 symtab_hdr->sh_link, 3018 sym->st_name); 3019 if (name == NULL) 3020 return FALSE; 3021 if (*name == '\0') 3022 name = bfd_section_name (input_bfd, sec); 3023 } 3024 3025 if (r == bfd_reloc_overflow) 3026 { 3027 if (! ((*info->callbacks->reloc_overflow) 3028 (info, name, howto->name, (bfd_vma) 0, 3029 input_bfd, input_section, rel->r_offset))) 3030 return FALSE; 3031 } 3032 else 3033 { 3034 (*_bfd_error_handler) 3035 (_("%s(%s+0x%lx): reloc against `%s': error %d"), 3036 bfd_archive_filename (input_bfd), 3037 bfd_get_section_name (input_bfd, input_section), 3038 (long) rel->r_offset, name, (int) r); 3039 return FALSE; 3040 } 3041 } 3042 } 3043 3044 return TRUE; 1789 3045 } 1790 3046 … … 1792 3048 dynamic sections here. */ 1793 3049 1794 static b oolean3050 static bfd_boolean 1795 3051 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym) 1796 3052 bfd *output_bfd; … … 1799 3055 Elf_Internal_Sym *sym; 1800 3056 { 1801 bfd *dynobj;1802 1803 dynobj = elf_hash_table (info)->dynobj;3057 struct elf_i386_link_hash_table *htab; 3058 3059 htab = elf_i386_hash_table (info); 1804 3060 1805 3061 if (h->plt.offset != (bfd_vma) -1) 1806 3062 { 1807 asection *splt;1808 asection *sgot;1809 asection *srel;1810 3063 bfd_vma plt_index; 1811 3064 bfd_vma got_offset; 1812 Elf_Internal_Rel rel; 3065 Elf_Internal_Rela rel; 3066 bfd_byte *loc; 1813 3067 1814 3068 /* This symbol has an entry in the procedure linkage table. Set 1815 3069 it up. */ 1816 3070 1817 BFD_ASSERT (h->dynindx != -1); 1818 1819 splt = bfd_get_section_by_name (dynobj, ".plt"); 1820 sgot = bfd_get_section_by_name (dynobj, ".got.plt"); 1821 srel = bfd_get_section_by_name (dynobj, ".rel.plt"); 1822 BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); 3071 if (h->dynindx == -1 3072 || htab->splt == NULL 3073 || htab->sgotplt == NULL 3074 || htab->srelplt == NULL) 3075 abort (); 1823 3076 1824 3077 /* Get the index in the procedure linkage table which … … 1836 3089 if (! info->shared) 1837 3090 { 1838 memcpy ( splt->contents + h->plt.offset, elf_i386_plt_entry,3091 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry, 1839 3092 PLT_ENTRY_SIZE); 1840 3093 bfd_put_32 (output_bfd, 1841 ( sgot->output_section->vma1842 + sgot->output_offset3094 (htab->sgotplt->output_section->vma 3095 + htab->sgotplt->output_offset 1843 3096 + got_offset), 1844 splt->contents + h->plt.offset + 2);3097 htab->splt->contents + h->plt.offset + 2); 1845 3098 } 1846 3099 else 1847 3100 { 1848 memcpy ( splt->contents + h->plt.offset, elf_i386_pic_plt_entry,3101 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry, 1849 3102 PLT_ENTRY_SIZE); 1850 3103 bfd_put_32 (output_bfd, got_offset, 1851 splt->contents + h->plt.offset + 2);3104 htab->splt->contents + h->plt.offset + 2); 1852 3105 } 1853 3106 1854 3107 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel), 1855 splt->contents + h->plt.offset + 7);3108 htab->splt->contents + h->plt.offset + 7); 1856 3109 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE), 1857 splt->contents + h->plt.offset + 12);3110 htab->splt->contents + h->plt.offset + 12); 1858 3111 1859 3112 /* Fill in the entry in the global offset table. */ 1860 3113 bfd_put_32 (output_bfd, 1861 ( splt->output_section->vma1862 + splt->output_offset3114 (htab->splt->output_section->vma 3115 + htab->splt->output_offset 1863 3116 + h->plt.offset 1864 3117 + 6), 1865 sgot->contents + got_offset);3118 htab->sgotplt->contents + got_offset); 1866 3119 1867 3120 /* Fill in the entry in the .rel.plt section. */ 1868 rel.r_offset = ( sgot->output_section->vma1869 + sgot->output_offset3121 rel.r_offset = (htab->sgotplt->output_section->vma 3122 + htab->sgotplt->output_offset 1870 3123 + got_offset); 1871 3124 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT); 1872 bfd_elf32_swap_reloc_out (output_bfd, &rel, 1873 ((Elf32_External_Rel *) srel->contents 1874 + plt_index)); 3125 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel); 3126 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 1875 3127 1876 3128 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 1877 3129 { 1878 3130 /* Mark the symbol as undefined, rather than as defined in 1879 the .plt section. Leave the value alone. */ 3131 the .plt section. Leave the value alone. This is a clue 3132 for the dynamic linker, to make function pointer 3133 comparisons work between an application and shared 3134 library. */ 1880 3135 sym->st_shndx = SHN_UNDEF; 1881 3136 } 1882 3137 } 1883 3138 1884 if (h->got.offset != (bfd_vma) -1) 1885 { 1886 asection *sgot; 1887 asection *srel; 1888 Elf_Internal_Rel rel; 3139 if (h->got.offset != (bfd_vma) -1 3140 && elf_i386_hash_entry(h)->tls_type != GOT_TLS_GD 3141 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0) 3142 { 3143 Elf_Internal_Rela rel; 3144 bfd_byte *loc; 1889 3145 1890 3146 /* This symbol has an entry in the global offset table. Set it 1891 3147 up. */ 1892 3148 1893 sgot = bfd_get_section_by_name (dynobj, ".got"); 1894 srel = bfd_get_section_by_name (dynobj, ".rel.got"); 1895 BFD_ASSERT (sgot != NULL && srel != NULL); 1896 1897 rel.r_offset = (sgot->output_section->vma 1898 + sgot->output_offset 1899 + (h->got.offset &~ 1)); 3149 if (htab->sgot == NULL || htab->srelgot == NULL) 3150 abort (); 3151 3152 rel.r_offset = (htab->sgot->output_section->vma 3153 + htab->sgot->output_offset 3154 + (h->got.offset & ~(bfd_vma) 1)); 1900 3155 1901 3156 /* If this is a static link, or it is a -Bsymbolic link and the … … 1904 3159 The entry in the global offset table will already have been 1905 3160 initialized in the relocate_section function. */ 1906 if (! elf_hash_table (info)->dynamic_sections_created 1907 || (info->shared 1908 && (info->symbolic || h->dynindx == -1) 1909 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) 1910 { 3161 if (info->shared 3162 && (info->symbolic 3163 || h->dynindx == -1 3164 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) 3165 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) 3166 { 3167 BFD_ASSERT((h->got.offset & 1) != 0); 1911 3168 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 1912 3169 } … … 1914 3171 { 1915 3172 BFD_ASSERT((h->got.offset & 1) == 0); 1916 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); 3173 bfd_put_32 (output_bfd, (bfd_vma) 0, 3174 htab->sgot->contents + h->got.offset); 1917 3175 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT); 1918 3176 } 1919 3177 1920 bfd_elf32_swap_reloc_out (output_bfd, &rel, 1921 ((Elf32_External_Rel *) srel->contents 1922 + srel->reloc_count)); 1923 ++srel->reloc_count; 3178 loc = htab->srelgot->contents; 3179 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel); 3180 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 1924 3181 } 1925 3182 1926 3183 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) 1927 3184 { 1928 asection *s;1929 Elf_Internal_Rel rel;3185 Elf_Internal_Rela rel; 3186 bfd_byte *loc; 1930 3187 1931 3188 /* This symbol needs a copy reloc. Set it up. */ 1932 3189 1933 BFD_ASSERT (h->dynindx != -1 1934 && (h->root.type == bfd_link_hash_defined 1935 || h->root.type == bfd_link_hash_defweak)); 1936 1937 s = bfd_get_section_by_name (h->root.u.def.section->owner, 1938 ".rel.bss"); 1939 BFD_ASSERT (s != NULL); 3190 if (h->dynindx == -1 3191 || (h->root.type != bfd_link_hash_defined 3192 && h->root.type != bfd_link_hash_defweak) 3193 || htab->srelbss == NULL) 3194 abort (); 1940 3195 1941 3196 rel.r_offset = (h->root.u.def.value … … 1943 3198 + h->root.u.def.section->output_offset); 1944 3199 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY); 1945 bfd_elf32_swap_reloc_out (output_bfd, &rel, 1946 ((Elf32_External_Rel *) s->contents 1947 + s->reloc_count)); 1948 ++s->reloc_count; 3200 loc = htab->srelbss->contents; 3201 loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel); 3202 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 1949 3203 } 1950 3204 … … 1954 3208 sym->st_shndx = SHN_ABS; 1955 3209 1956 return true;3210 return TRUE; 1957 3211 } 1958 3212 3213 /* Used to decide how to sort relocs in an optimal manner for the 3214 dynamic linker, before writing them out. */ 3215 3216 static enum elf_reloc_type_class 3217 elf_i386_reloc_type_class (rela) 3218 const Elf_Internal_Rela *rela; 3219 { 3220 switch ((int) ELF32_R_TYPE (rela->r_info)) 3221 { 3222 case R_386_RELATIVE: 3223 return reloc_class_relative; 3224 case R_386_JUMP_SLOT: 3225 return reloc_class_plt; 3226 case R_386_COPY: 3227 return reloc_class_copy; 3228 default: 3229 return reloc_class_normal; 3230 } 3231 } 3232 1959 3233 /* Finish up the dynamic sections. */ 1960 3234 1961 static b oolean3235 static bfd_boolean 1962 3236 elf_i386_finish_dynamic_sections (output_bfd, info) 1963 3237 bfd *output_bfd; 1964 3238 struct bfd_link_info *info; 1965 3239 { 3240 struct elf_i386_link_hash_table *htab; 1966 3241 bfd *dynobj; 1967 asection *sgot;1968 3242 asection *sdyn; 1969 3243 1970 dynobj = elf_hash_table (info)->dynobj; 1971 1972 sgot = bfd_get_section_by_name (dynobj, ".got.plt"); 1973 BFD_ASSERT (sgot != NULL); 3244 htab = elf_i386_hash_table (info); 3245 dynobj = htab->elf.dynobj; 1974 3246 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); 1975 3247 1976 if (elf_hash_table (info)->dynamic_sections_created) 1977 { 1978 asection *splt; 3248 if (htab->elf.dynamic_sections_created) 3249 { 1979 3250 Elf32_External_Dyn *dyncon, *dynconend; 1980 3251 1981 BFD_ASSERT (sdyn != NULL); 3252 if (sdyn == NULL || htab->sgot == NULL) 3253 abort (); 1982 3254 1983 3255 dyncon = (Elf32_External_Dyn *) sdyn->contents; … … 1986 3258 { 1987 3259 Elf_Internal_Dyn dyn; 1988 const char *name;1989 3260 asection *s; 1990 3261 … … 1994 3265 { 1995 3266 default: 3267 continue; 3268 3269 case DT_PLTGOT: 3270 dyn.d_un.d_ptr = htab->sgot->output_section->vma; 1996 3271 break; 1997 3272 1998 case DT_PLTGOT:1999 name = ".got";2000 goto get_vma;2001 3273 case DT_JMPREL: 2002 name = ".rel.plt"; 2003 get_vma: 2004 s = bfd_get_section_by_name (output_bfd, name); 2005 BFD_ASSERT (s != NULL); 2006 dyn.d_un.d_ptr = s->vma; 2007 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3274 s = htab->srelplt; 3275 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 2008 3276 break; 2009 3277 2010 3278 case DT_PLTRELSZ: 2011 s = bfd_get_section_by_name (output_bfd, ".rel.plt"); 2012 BFD_ASSERT (s != NULL); 2013 if (s->_cooked_size != 0) 2014 dyn.d_un.d_val = s->_cooked_size; 2015 else 2016 dyn.d_un.d_val = s->_raw_size; 2017 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3279 s = htab->srelplt; 3280 dyn.d_un.d_val = s->_raw_size; 2018 3281 break; 2019 3282 … … 2024 3287 what Solaris does. However, UnixWare can not handle 2025 3288 that case. Therefore, we override the DT_RELSZ entry 2026 here to make it not include the JMPREL relocs. Since 2027 the linker script arranges for .rel.plt to follow all 2028 other relocation sections, we don't have to worry 2029 about changing the DT_REL entry. */ 2030 s = bfd_get_section_by_name (output_bfd, ".rel.plt"); 2031 if (s != NULL) 2032 { 2033 if (s->_cooked_size != 0) 2034 dyn.d_un.d_val -= s->_cooked_size; 2035 else 2036 dyn.d_un.d_val -= s->_raw_size; 2037 } 2038 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3289 here to make it not include the JMPREL relocs. */ 3290 s = htab->srelplt; 3291 if (s == NULL) 3292 continue; 3293 dyn.d_un.d_val -= s->_raw_size; 2039 3294 break; 2040 } 3295 3296 case DT_REL: 3297 /* We may not be using the standard ELF linker script. 3298 If .rel.plt is the first .rel section, we adjust 3299 DT_REL to not include it. */ 3300 s = htab->srelplt; 3301 if (s == NULL) 3302 continue; 3303 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset) 3304 continue; 3305 dyn.d_un.d_ptr += s->_raw_size; 3306 break; 3307 } 3308 3309 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 2041 3310 } 2042 3311 2043 3312 /* Fill in the first entry in the procedure linkage table. */ 2044 splt = bfd_get_section_by_name (dynobj, ".plt"); 2045 if (splt && splt->_raw_size > 0) 3313 if (htab->splt && htab->splt->_raw_size > 0) 2046 3314 { 2047 3315 if (info->shared) 2048 memcpy (splt->contents, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE); 3316 memcpy (htab->splt->contents, 3317 elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE); 2049 3318 else 2050 3319 { 2051 memcpy (splt->contents, elf_i386_plt0_entry, PLT_ENTRY_SIZE); 3320 memcpy (htab->splt->contents, 3321 elf_i386_plt0_entry, PLT_ENTRY_SIZE); 2052 3322 bfd_put_32 (output_bfd, 2053 sgot->output_section->vma + sgot->output_offset + 4, 2054 splt->contents + 2); 3323 (htab->sgotplt->output_section->vma 3324 + htab->sgotplt->output_offset 3325 + 4), 3326 htab->splt->contents + 2); 2055 3327 bfd_put_32 (output_bfd, 2056 sgot->output_section->vma + sgot->output_offset + 8, 2057 splt->contents + 8); 3328 (htab->sgotplt->output_section->vma 3329 + htab->sgotplt->output_offset 3330 + 8), 3331 htab->splt->contents + 8); 2058 3332 } 2059 3333 2060 3334 /* UnixWare sets the entsize of .plt to 4, although that doesn't 2061 3335 really seem like the right value. */ 2062 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; 2063 } 2064 } 2065 2066 /* Fill in the first three entries in the global offset table. */ 2067 if (sgot->_raw_size > 0) 2068 { 2069 if (sdyn == NULL) 2070 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); 2071 else 2072 bfd_put_32 (output_bfd, 2073 sdyn->output_section->vma + sdyn->output_offset, 2074 sgot->contents); 2075 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4); 2076 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8); 2077 } 2078 2079 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; 2080 2081 return true; 3336 elf_section_data (htab->splt->output_section) 3337 ->this_hdr.sh_entsize = 4; 3338 } 3339 } 3340 3341 if (htab->sgotplt) 3342 { 3343 /* Fill in the first three entries in the global offset table. */ 3344 if (htab->sgotplt->_raw_size > 0) 3345 { 3346 bfd_put_32 (output_bfd, 3347 (sdyn == NULL ? (bfd_vma) 0 3348 : sdyn->output_section->vma + sdyn->output_offset), 3349 htab->sgotplt->contents); 3350 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4); 3351 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8); 3352 } 3353 3354 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4; 3355 } 3356 return TRUE; 2082 3357 } 2083 2084 /* Set the correct type for an x86 ELF section. We do this by the2085 section name, which is a hack, but ought to work. */2086 2087 static boolean2088 elf_i386_fake_sections (abfd, hdr, sec)2089 bfd *abfd ATTRIBUTE_UNUSED;2090 Elf32_Internal_Shdr *hdr;2091 asection *sec;2092 {2093 register const char *name;2094 2095 name = bfd_get_section_name (abfd, sec);2096 2097 if (strcmp (name, ".reloc") == 0)2098 /*2099 * This is an ugly, but unfortunately necessary hack that is2100 * needed when producing EFI binaries on x86. It tells2101 * elf.c:elf_fake_sections() not to consider ".reloc" as a section2102 * containing ELF relocation info. We need this hack in order to2103 * be able to generate ELF binaries that can be translated into2104 * EFI applications (which are essentially COFF objects). Those2105 * files contain a COFF ".reloc" section inside an ELFNN object,2106 * which would normally cause BFD to segfault because it would2107 * attempt to interpret this section as containing relocation2108 * entries for section "oc". With this hack enabled, ".reloc"2109 * will be treated as a normal data section, which will avoid the2110 * segfault. However, you won't be able to create an ELFNN binary2111 * with a section named "oc" that needs relocations, but that's2112 * the kind of ugly side-effects you get when detecting section2113 * types based on their names... In practice, this limitation is2114 * unlikely to bite.2115 */2116 hdr->sh_type = SHT_PROGBITS;2117 2118 return true;2119 }2120 2121 3358 2122 3359 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec … … 2127 3364 2128 3365 #define elf_backend_can_gc_sections 1 3366 #define elf_backend_can_refcount 1 2129 3367 #define elf_backend_want_got_plt 1 2130 3368 #define elf_backend_plt_readonly 1 … … 2133 3371 #define elf_backend_plt_header_size PLT_ENTRY_SIZE 2134 3372 2135 #define elf_info_to_howto elf_i386_info_to_howto 3373 /* Support RELA for objdump of prelink objects. */ 3374 #define elf_info_to_howto elf_i386_info_to_howto_rel 2136 3375 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel 2137 3376 2138 #define bfd_elf32_bfd_final_link _bfd_elf32_gc_common_final_link 3377 #define bfd_elf32_mkobject elf_i386_mkobject 3378 #define elf_backend_object_p elf_i386_object_p 3379 2139 3380 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name 2140 3381 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create … … 2143 3384 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol 2144 3385 #define elf_backend_check_relocs elf_i386_check_relocs 2145 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections 3386 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol 3387 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections 3388 #define elf_backend_fake_sections elf_i386_fake_sections 2146 3389 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections 2147 3390 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol 2148 3391 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook 2149 3392 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook 3393 #define elf_backend_grok_prstatus elf_i386_grok_prstatus 3394 #define elf_backend_grok_psinfo elf_i386_grok_psinfo 3395 #define elf_backend_reloc_type_class elf_i386_reloc_type_class 2150 3396 #define elf_backend_relocate_section elf_i386_relocate_section 2151 3397 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections 2152 #define elf_backend_fake_sections elf_i386_fake_sections2153 3398 2154 3399 #include "elf32-target.h" 3400 3401 /* FreeBSD support. */ 3402 3403 #undef TARGET_LITTLE_SYM 3404 #define TARGET_LITTLE_SYM bfd_elf32_i386_freebsd_vec 3405 #undef TARGET_LITTLE_NAME 3406 #define TARGET_LITTLE_NAME "elf32-i386-freebsd" 3407 3408 /* The kernel recognizes executables as valid only if they carry a 3409 "FreeBSD" label in the ELF header. So we put this label on all 3410 executables and (for simplicity) also all other object files. */ 3411 3412 static void elf_i386_post_process_headers 3413 PARAMS ((bfd *, struct bfd_link_info *)); 3414 3415 static void 3416 elf_i386_post_process_headers (abfd, link_info) 3417 bfd *abfd; 3418 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 3419 { 3420 Elf_Internal_Ehdr *i_ehdrp; 3421 3422 i_ehdrp = elf_elfheader (abfd); 3423 3424 /* Put an ABI label supported by FreeBSD >= 4.1. */ 3425 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD; 3426 #ifdef OLD_FREEBSD_ABI_LABEL 3427 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */ 3428 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8); 3429 #endif 3430 } 3431 3432 #undef elf_backend_post_process_headers 3433 #define elf_backend_post_process_headers elf_i386_post_process_headers 3434 #undef elf32_bed 3435 #define elf32_bed elf32_i386_fbsd_bed 3436 3437 #include "elf32-target.h" -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.