1 /* Intel 80386/80486-specific support for 32-bit ELF 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 3 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 20 21 #include "bfd.h" 22 #include "sysdep.h" 23 #include "bfdlink.h" 24 #include "libbfd.h" 25 #include "elf-bfd.h" 26 #include "elf-vxworks.h" 27 28 /* 386 uses REL relocations instead of RELA. */ 29 #define USE_REL 1 30 31 #include "elf/i386.h" 32 33 static reloc_howto_type elf_howto_table[]= 34 { 35 HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield, 36 bfd_elf_generic_reloc, "R_386_NONE", 37 TRUE, 0x00000000, 0x00000000, FALSE), 38 HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 39 bfd_elf_generic_reloc, "R_386_32", 40 TRUE, 0xffffffff, 0xffffffff, FALSE), 41 HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 42 bfd_elf_generic_reloc, "R_386_PC32", 43 TRUE, 0xffffffff, 0xffffffff, TRUE), 44 HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 45 bfd_elf_generic_reloc, "R_386_GOT32", 46 TRUE, 0xffffffff, 0xffffffff, FALSE), 47 HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 48 bfd_elf_generic_reloc, "R_386_PLT32", 49 TRUE, 0xffffffff, 0xffffffff, TRUE), 50 HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 51 bfd_elf_generic_reloc, "R_386_COPY", 52 TRUE, 0xffffffff, 0xffffffff, FALSE), 53 HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 54 bfd_elf_generic_reloc, "R_386_GLOB_DAT", 55 TRUE, 0xffffffff, 0xffffffff, FALSE), 56 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 57 bfd_elf_generic_reloc, "R_386_JUMP_SLOT", 58 TRUE, 0xffffffff, 0xffffffff, FALSE), 59 HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 60 bfd_elf_generic_reloc, "R_386_RELATIVE", 61 TRUE, 0xffffffff, 0xffffffff, FALSE), 62 HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 63 bfd_elf_generic_reloc, "R_386_GOTOFF", 64 TRUE, 0xffffffff, 0xffffffff, FALSE), 65 HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, 66 bfd_elf_generic_reloc, "R_386_GOTPC", 67 TRUE, 0xffffffff, 0xffffffff, TRUE), 68 69 /* We have a gap in the reloc numbers here. 70 R_386_standard counts the number up to this point, and 71 R_386_ext_offset is the value to subtract from a reloc type of 72 R_386_16 thru R_386_PC8 to form an index into this table. */ 73 #define R_386_standard (R_386_GOTPC + 1) 74 #define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard) 75 76 /* These relocs are a GNU extension. */ 77 HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 78 bfd_elf_generic_reloc, "R_386_TLS_TPOFF", 79 TRUE, 0xffffffff, 0xffffffff, FALSE), 80 HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 81 bfd_elf_generic_reloc, "R_386_TLS_IE", 82 TRUE, 0xffffffff, 0xffffffff, FALSE), 83 HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 84 bfd_elf_generic_reloc, "R_386_TLS_GOTIE", 85 TRUE, 0xffffffff, 0xffffffff, FALSE), 86 HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 87 bfd_elf_generic_reloc, "R_386_TLS_LE", 88 TRUE, 0xffffffff, 0xffffffff, FALSE), 89 HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 90 bfd_elf_generic_reloc, "R_386_TLS_GD", 91 TRUE, 0xffffffff, 0xffffffff, FALSE), 92 HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 93 bfd_elf_generic_reloc, "R_386_TLS_LDM", 94 TRUE, 0xffffffff, 0xffffffff, FALSE), 95 HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, 96 bfd_elf_generic_reloc, "R_386_16", 97 TRUE, 0xffff, 0xffff, FALSE), 98 HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield, 99 bfd_elf_generic_reloc, "R_386_PC16", 100 TRUE, 0xffff, 0xffff, TRUE), 101 HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, 102 bfd_elf_generic_reloc, "R_386_8", 103 TRUE, 0xff, 0xff, FALSE), 104 HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed, 105 bfd_elf_generic_reloc, "R_386_PC8", 106 TRUE, 0xff, 0xff, TRUE), 107 108 #define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset) 109 #define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext) 110 /* These are common with Solaris TLS implementation. */ 111 HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 112 bfd_elf_generic_reloc, "R_386_TLS_LDO_32", 113 TRUE, 0xffffffff, 0xffffffff, FALSE), 114 HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 115 bfd_elf_generic_reloc, "R_386_TLS_IE_32", 116 TRUE, 0xffffffff, 0xffffffff, FALSE), 117 HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 118 bfd_elf_generic_reloc, "R_386_TLS_LE_32", 119 TRUE, 0xffffffff, 0xffffffff, FALSE), 120 HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 121 bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32", 122 TRUE, 0xffffffff, 0xffffffff, FALSE), 123 HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 124 bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32", 125 TRUE, 0xffffffff, 0xffffffff, FALSE), 126 HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 127 bfd_elf_generic_reloc, "R_386_TLS_TPOFF32", 128 TRUE, 0xffffffff, 0xffffffff, FALSE), 129 EMPTY_HOWTO (38), 130 HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 131 bfd_elf_generic_reloc, "R_386_TLS_GOTDESC", 132 TRUE, 0xffffffff, 0xffffffff, FALSE), 133 HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont, 134 bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL", 135 FALSE, 0, 0, FALSE), 136 HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 137 bfd_elf_generic_reloc, "R_386_TLS_DESC", 138 TRUE, 0xffffffff, 0xffffffff, FALSE), 139 EMPTY_HOWTO (42), /* R_386_IRELATIVE */ 140 HOWTO(R_386_GOT32X, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 141 bfd_elf_generic_reloc, "R_386_GOT32X", 142 TRUE, 0xffffffff, 0xffffffff, FALSE), 143 144 /* Another gap. */ 145 /* XXX R_386_GOT32X isn't really a TLS relocation */ 146 #define R_386_tls (R_386_GOT32X + 1 - R_386_tls_offset) 147 #define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_tls) 148 149 /* GNU extension to record C++ vtable hierarchy. */ 150 HOWTO (R_386_GNU_VTINHERIT, /* type */ 151 0, /* rightshift */ 152 2, /* size (0 = byte, 1 = short, 2 = long) */ 153 0, /* bitsize */ 154 FALSE, /* pc_relative */ 155 0, /* bitpos */ 156 complain_overflow_dont, /* complain_on_overflow */ 157 NULL, /* special_function */ 158 "R_386_GNU_VTINHERIT", /* name */ 159 FALSE, /* partial_inplace */ 160 0, /* src_mask */ 161 0, /* dst_mask */ 162 FALSE), /* pcrel_offset */ 163 164 /* GNU extension to record C++ vtable member usage. */ 165 HOWTO (R_386_GNU_VTENTRY, /* type */ 166 0, /* rightshift */ 167 2, /* size (0 = byte, 1 = short, 2 = long) */ 168 0, /* bitsize */ 169 FALSE, /* pc_relative */ 170 0, /* bitpos */ 171 complain_overflow_dont, /* complain_on_overflow */ 172 _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 173 "R_386_GNU_VTENTRY", /* name */ 174 FALSE, /* partial_inplace */ 175 0, /* src_mask */ 176 0, /* dst_mask */ 177 FALSE) /* pcrel_offset */ 178 179 #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset) 180 181 }; 182 183 #ifdef DEBUG_GEN_RELOC 184 #define TRACE(str) \ 185 fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str) 186 #else 187 #define TRACE(str) 188 #endif 189 190 static reloc_howto_type * 191 elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 192 bfd_reloc_code_real_type code) 193 { 194 switch (code) 195 { 196 case BFD_RELOC_NONE: 197 TRACE ("BFD_RELOC_NONE"); 198 return &elf_howto_table[R_386_NONE]; 199 200 case BFD_RELOC_32: 201 TRACE ("BFD_RELOC_32"); 202 return &elf_howto_table[R_386_32]; 203 204 case BFD_RELOC_CTOR: 205 TRACE ("BFD_RELOC_CTOR"); 206 return &elf_howto_table[R_386_32]; 207 208 case BFD_RELOC_32_PCREL: 209 TRACE ("BFD_RELOC_PC32"); 210 return &elf_howto_table[R_386_PC32]; 211 212 case BFD_RELOC_386_GOT32: 213 TRACE ("BFD_RELOC_386_GOT32"); 214 return &elf_howto_table[R_386_GOT32]; 215 216 case BFD_RELOC_386_PLT32: 217 TRACE ("BFD_RELOC_386_PLT32"); 218 return &elf_howto_table[R_386_PLT32]; 219 220 case BFD_RELOC_386_COPY: 221 TRACE ("BFD_RELOC_386_COPY"); 222 return &elf_howto_table[R_386_COPY]; 223 224 case BFD_RELOC_386_GLOB_DAT: 225 TRACE ("BFD_RELOC_386_GLOB_DAT"); 226 return &elf_howto_table[R_386_GLOB_DAT]; 227 228 case BFD_RELOC_386_JUMP_SLOT: 229 TRACE ("BFD_RELOC_386_JUMP_SLOT"); 230 return &elf_howto_table[R_386_JUMP_SLOT]; 231 232 case BFD_RELOC_386_RELATIVE: 233 TRACE ("BFD_RELOC_386_RELATIVE"); 234 return &elf_howto_table[R_386_RELATIVE]; 235 236 case BFD_RELOC_386_GOTOFF: 237 TRACE ("BFD_RELOC_386_GOTOFF"); 238 return &elf_howto_table[R_386_GOTOFF]; 239 240 case BFD_RELOC_386_GOTPC: 241 TRACE ("BFD_RELOC_386_GOTPC"); 242 return &elf_howto_table[R_386_GOTPC]; 243 244 /* These relocs are a GNU extension. */ 245 case BFD_RELOC_386_TLS_TPOFF: 246 TRACE ("BFD_RELOC_386_TLS_TPOFF"); 247 return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset]; 248 249 case BFD_RELOC_386_TLS_IE: 250 TRACE ("BFD_RELOC_386_TLS_IE"); 251 return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset]; 252 253 case BFD_RELOC_386_TLS_GOTIE: 254 TRACE ("BFD_RELOC_386_TLS_GOTIE"); 255 return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset]; 256 257 case BFD_RELOC_386_TLS_LE: 258 TRACE ("BFD_RELOC_386_TLS_LE"); 259 return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset]; 260 261 case BFD_RELOC_386_TLS_GD: 262 TRACE ("BFD_RELOC_386_TLS_GD"); 263 return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset]; 264 265 case BFD_RELOC_386_TLS_LDM: 266 TRACE ("BFD_RELOC_386_TLS_LDM"); 267 return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset]; 268 269 case BFD_RELOC_16: 270 TRACE ("BFD_RELOC_16"); 271 return &elf_howto_table[R_386_16 - R_386_ext_offset]; 272 273 case BFD_RELOC_16_PCREL: 274 TRACE ("BFD_RELOC_16_PCREL"); 275 return &elf_howto_table[R_386_PC16 - R_386_ext_offset]; 276 277 case BFD_RELOC_8: 278 TRACE ("BFD_RELOC_8"); 279 return &elf_howto_table[R_386_8 - R_386_ext_offset]; 280 281 case BFD_RELOC_8_PCREL: 282 TRACE ("BFD_RELOC_8_PCREL"); 283 return &elf_howto_table[R_386_PC8 - R_386_ext_offset]; 284 285 /* Common with Sun TLS implementation. */ 286 case BFD_RELOC_386_TLS_LDO_32: 287 TRACE ("BFD_RELOC_386_TLS_LDO_32"); 288 return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset]; 289 290 case BFD_RELOC_386_TLS_IE_32: 291 TRACE ("BFD_RELOC_386_TLS_IE_32"); 292 return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset]; 293 294 case BFD_RELOC_386_TLS_LE_32: 295 TRACE ("BFD_RELOC_386_TLS_LE_32"); 296 return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset]; 297 298 case BFD_RELOC_386_TLS_DTPMOD32: 299 TRACE ("BFD_RELOC_386_TLS_DTPMOD32"); 300 return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset]; 301 302 case BFD_RELOC_386_TLS_DTPOFF32: 303 TRACE ("BFD_RELOC_386_TLS_DTPOFF32"); 304 return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset]; 305 306 case BFD_RELOC_386_TLS_TPOFF32: 307 TRACE ("BFD_RELOC_386_TLS_TPOFF32"); 308 return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset]; 309 310 case BFD_RELOC_386_TLS_GOTDESC: 311 TRACE ("BFD_RELOC_386_TLS_GOTDESC"); 312 return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset]; 313 314 case BFD_RELOC_386_TLS_DESC_CALL: 315 TRACE ("BFD_RELOC_386_TLS_DESC_CALL"); 316 return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset]; 317 318 case BFD_RELOC_386_TLS_DESC: 319 TRACE ("BFD_RELOC_386_TLS_DESC"); 320 return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset]; 321 322 case BFD_RELOC_386_GOT32X: 323 TRACE ("BFD_RELOC_386_GOT32X"); 324 return &elf_howto_table[R_386_GOT32X - R_386_tls_offset]; 325 326 case BFD_RELOC_VTABLE_INHERIT: 327 TRACE ("BFD_RELOC_VTABLE_INHERIT"); 328 return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset]; 329 330 case BFD_RELOC_VTABLE_ENTRY: 331 TRACE ("BFD_RELOC_VTABLE_ENTRY"); 332 return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset]; 333 334 default: 335 break; 336 } 337 338 TRACE ("Unknown"); 339 return 0; 340 } 341 342 static void 343 elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, 344 arelent *cache_ptr, 345 Elf_Internal_Rela *dst) 346 { 347 unsigned int r_type = ELF32_R_TYPE (dst->r_info); 348 unsigned int indx; 349 350 if ((indx = r_type) >= R_386_standard 351 && ((indx = r_type - R_386_ext_offset) - R_386_standard 352 >= R_386_ext - R_386_standard) 353 && ((indx = r_type - R_386_tls_offset) - R_386_ext 354 >= R_386_tls - R_386_ext) 355 && ((indx = r_type - R_386_vt_offset) - R_386_tls 356 >= R_386_vt - R_386_tls)) 357 { 358 (*_bfd_error_handler) (_("%B: invalid relocation type %d"), 359 abfd, (int) r_type); 360 indx = R_386_NONE; 361 } 362 cache_ptr->howto = &elf_howto_table[indx]; 363 } 364 365 /* Return whether a symbol name implies a local label. The UnixWare 366 2.1 cc generates temporary symbols that start with .X, so we 367 recognize them here. FIXME: do other SVR4 compilers also use .X?. 368 If so, we should move the .X recognition into 369 _bfd_elf_is_local_label_name. */ 370 371 static bfd_boolean 372 elf_i386_is_local_label_name (bfd *abfd, const char *name) 373 { 374 if (name[0] == '.' && name[1] == 'X') 375 return TRUE; 376 377 return _bfd_elf_is_local_label_name (abfd, name); 378 } 379 380 /* Support for core dump NOTE sections. */ 381 382 static bfd_boolean 383 elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 384 { 385 int offset; 386 size_t size; 387 388 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0) 389 { 390 int pr_version = bfd_get_32 (abfd, note->descdata); 391 392 if (pr_version != 1) 393 return FALSE; 394 395 /* pr_cursig */ 396 elf_tdata (abfd)->core_signal = bfd_get_32 (abfd, note->descdata + 20); 397 398 /* pr_pid */ 399 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); 400 401 /* pr_reg */ 402 offset = 28; 403 size = bfd_get_32 (abfd, note->descdata + 8); 404 } 405 else 406 { 407 switch (note->descsz) 408 { 409 default: 410 return FALSE; 411 412 case 144: /* Linux/i386 */ 413 /* pr_cursig */ 414 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 415 416 /* pr_pid */ 417 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); 418 419 /* pr_reg */ 420 offset = 72; 421 size = 68; 422 423 break; 424 } 425 } 426 427 /* Make a ".reg/999" section. */ 428 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 429 size, note->descpos + offset); 430 } 431 432 static bfd_boolean 433 elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 434 { 435 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0) 436 { 437 int pr_version = bfd_get_32 (abfd, note->descdata); 438 439 if (pr_version != 1) 440 return FALSE; 441 442 elf_tdata (abfd)->core_program 443 = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17); 444 elf_tdata (abfd)->core_command 445 = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81); 446 } 447 else 448 { 449 switch (note->descsz) 450 { 451 default: 452 return FALSE; 453 454 case 124: /* Linux/i386 elf_prpsinfo. */ 455 elf_tdata (abfd)->core_program 456 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 457 elf_tdata (abfd)->core_command 458 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 459 } 460 } 461 462 /* Note that for some reason, a spurious space is tacked 463 onto the end of the args in some (at least one anyway) 464 implementations, so strip it off if it exists. */ 465 { 466 char *command = elf_tdata (abfd)->core_command; 467 int n = strlen (command); 468 469 if (0 < n && command[n - 1] == ' ') 470 command[n - 1] = '\0'; 471 } 472 473 return TRUE; 474 } 475 476 /* Functions for the i386 ELF linker. 477 478 In order to gain some understanding of code in this file without 479 knowing all the intricate details of the linker, note the 480 following: 481 482 Functions named elf_i386_* are called by external routines, other 483 functions are only called locally. elf_i386_* functions appear 484 in this file more or less in the order in which they are called 485 from external routines. eg. elf_i386_check_relocs is called 486 early in the link process, elf_i386_finish_dynamic_sections is 487 one of the last functions. */ 488 489 490 /* The name of the dynamic interpreter. This is put in the .interp 491 section. */ 492 493 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" 494 495 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid 496 copying dynamic variables from a shared lib into an app's dynbss 497 section, and instead use a dynamic relocation to point into the 498 shared lib. */ 499 #define ELIMINATE_COPY_RELOCS 1 500 501 /* The size in bytes of an entry in the procedure linkage table. */ 502 503 #define PLT_ENTRY_SIZE 16 504 505 /* The first entry in an absolute procedure linkage table looks like 506 this. See the SVR4 ABI i386 supplement to see how this works. 507 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */ 508 509 static const bfd_byte elf_i386_plt0_entry[12] = 510 { 511 0xff, 0x35, /* pushl contents of address */ 512 0, 0, 0, 0, /* replaced with address of .got + 4. */ 513 0xff, 0x25, /* jmp indirect */ 514 0, 0, 0, 0 /* replaced with address of .got + 8. */ 515 }; 516 517 /* Subsequent entries in an absolute procedure linkage table look like 518 this. */ 519 520 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] = 521 { 522 0xff, 0x25, /* jmp indirect */ 523 0, 0, 0, 0, /* replaced with address of this symbol in .got. */ 524 0x68, /* pushl immediate */ 525 0, 0, 0, 0, /* replaced with offset into relocation table. */ 526 0xe9, /* jmp relative */ 527 0, 0, 0, 0 /* replaced with offset to start of .plt. */ 528 }; 529 530 /* The first entry in a PIC procedure linkage table look like this. 531 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */ 532 533 static const bfd_byte elf_i386_pic_plt0_entry[12] = 534 { 535 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */ 536 0xff, 0xa3, 8, 0, 0, 0 /* jmp *8(%ebx) */ 537 }; 538 539 /* Subsequent entries in a PIC procedure linkage table look like this. */ 540 541 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] = 542 { 543 0xff, 0xa3, /* jmp *offset(%ebx) */ 544 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */ 545 0x68, /* pushl immediate */ 546 0, 0, 0, 0, /* replaced with offset into relocation table. */ 547 0xe9, /* jmp relative */ 548 0, 0, 0, 0 /* replaced with offset to start of .plt. */ 549 }; 550 551 /* On VxWorks, the .rel.plt.unloaded section has absolute relocations 552 for the PLTResolve stub and then for each PLT entry. */ 553 #define PLTRESOLVE_RELOCS_SHLIB 0 554 #define PLTRESOLVE_RELOCS 2 555 #define PLT_NON_JUMP_SLOT_RELOCS 2 556 557 /* The i386 linker needs to keep track of the number of relocs that it 558 decides to copy as dynamic relocs in check_relocs for each symbol. 559 This is so that it can later discard them if they are found to be 560 unnecessary. We store the information in a field extending the 561 regular ELF linker hash table. */ 562 563 struct elf_i386_dyn_relocs 564 { 565 struct elf_i386_dyn_relocs *next; 566 567 /* The input section of the reloc. */ 568 asection *sec; 569 570 /* Total number of relocs copied for the input section. */ 571 bfd_size_type count; 572 573 /* Number of pc-relative relocs copied for the input section. */ 574 bfd_size_type pc_count; 575 }; 576 577 /* i386 ELF linker hash entry. */ 578 579 struct elf_i386_link_hash_entry 580 { 581 struct elf_link_hash_entry elf; 582 583 /* Track dynamic relocs copied for this symbol. */ 584 struct elf_i386_dyn_relocs *dyn_relocs; 585 586 #define GOT_UNKNOWN 0 587 #define GOT_NORMAL 1 588 #define GOT_TLS_GD 2 589 #define GOT_TLS_IE 4 590 #define GOT_TLS_IE_POS 5 591 #define GOT_TLS_IE_NEG 6 592 #define GOT_TLS_IE_BOTH 7 593 #define GOT_TLS_GDESC 8 594 #define GOT_TLS_MASK 0x0f 595 #define GOT_TLS_IE_IE 0x10 596 #define GOT_TLS_IE_GD 0x20 597 #define GOT_TLS_IE_MASK 0x30 598 #define GOT_TLS_GD_BOTH_P(type) \ 599 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC)) 600 #define GOT_TLS_GD_P(type) \ 601 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type)) 602 #define GOT_TLS_GDESC_P(type) \ 603 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type)) 604 #define GOT_TLS_GD_ANY_P(type) \ 605 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type)) 606 unsigned char tls_type; 607 608 /* Offset of the GOTPLT entry reserved for the TLS descriptor, 609 starting at the end of the jump table. */ 610 bfd_vma tlsdesc_got; 611 }; 612 613 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent)) 614 615 struct elf_i386_obj_tdata 616 { 617 struct elf_obj_tdata root; 618 619 /* tls_type for each local got entry. */ 620 char *local_got_tls_type; 621 622 /* GOTPLT entries for TLS descriptors. */ 623 bfd_vma *local_tlsdesc_gotent; 624 }; 625 626 #define elf_i386_tdata(abfd) \ 627 ((struct elf_i386_obj_tdata *) (abfd)->tdata.any) 628 629 #define elf_i386_local_got_tls_type(abfd) \ 630 (elf_i386_tdata (abfd)->local_got_tls_type) 631 632 #define elf_i386_local_tlsdesc_gotent(abfd) \ 633 (elf_i386_tdata (abfd)->local_tlsdesc_gotent) 634 635 static bfd_boolean 636 elf_i386_mkobject (bfd *abfd) 637 { 638 bfd_size_type amt = sizeof (struct elf_i386_obj_tdata); 639 abfd->tdata.any = bfd_zalloc (abfd, amt); 640 if (abfd->tdata.any == NULL) 641 return FALSE; 642 return TRUE; 643 } 644 645 /* i386 ELF linker hash table. */ 646 647 struct elf_i386_link_hash_table 648 { 649 struct elf_link_hash_table elf; 650 651 /* Short-cuts to get to dynamic linker sections. */ 652 asection *sgot; 653 asection *sgotplt; 654 asection *srelgot; 655 asection *splt; 656 asection *srelplt; 657 asection *sdynbss; 658 asection *srelbss; 659 660 /* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */ 661 asection *srelplt2; 662 663 /* True if the target system is VxWorks. */ 664 int is_vxworks; 665 666 /* Value used to fill the last word of the first plt entry. */ 667 bfd_byte plt0_pad_byte; 668 669 /* The index of the next unused R_386_TLS_DESC slot in .rel.plt. */ 670 bfd_vma next_tls_desc_index; 671 672 union { 673 bfd_signed_vma refcount; 674 bfd_vma offset; 675 } tls_ldm_got; 676 677 /* The amount of space used by the reserved portion of the sgotplt 678 section, plus whatever space is used by the jump slots. */ 679 bfd_vma sgotplt_jump_table_size; 680 681 /* Small local sym to section mapping cache. */ 682 struct sym_sec_cache sym_sec; 683 }; 684 685 /* Get the i386 ELF linker hash table from a link_info structure. */ 686 687 #define elf_i386_hash_table(p) \ 688 ((struct elf_i386_link_hash_table *) ((p)->hash)) 689 690 #define elf_i386_compute_jump_table_size(htab) \ 691 ((htab)->next_tls_desc_index * 4) 692 693 /* Create an entry in an i386 ELF linker hash table. */ 694 695 static struct bfd_hash_entry * 696 link_hash_newfunc (struct bfd_hash_entry *entry, 697 struct bfd_hash_table *table, 698 const char *string) 699 { 700 /* Allocate the structure if it has not already been allocated by a 701 subclass. */ 702 if (entry == NULL) 703 { 704 entry = bfd_hash_allocate (table, 705 sizeof (struct elf_i386_link_hash_entry)); 706 if (entry == NULL) 707 return entry; 708 } 709 710 /* Call the allocation method of the superclass. */ 711 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 712 if (entry != NULL) 713 { 714 struct elf_i386_link_hash_entry *eh; 715 716 eh = (struct elf_i386_link_hash_entry *) entry; 717 eh->dyn_relocs = NULL; 718 eh->tls_type = GOT_UNKNOWN; 719 eh->tlsdesc_got = (bfd_vma) -1; 720 } 721 722 return entry; 723 } 724 725 /* Create an i386 ELF linker hash table. */ 726 727 static struct bfd_link_hash_table * 728 elf_i386_link_hash_table_create (bfd *abfd) 729 { 730 struct elf_i386_link_hash_table *ret; 731 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table); 732 733 ret = bfd_malloc (amt); 734 if (ret == NULL) 735 return NULL; 736 737 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc, 738 sizeof (struct elf_i386_link_hash_entry))) 739 { 740 free (ret); 741 return NULL; 742 } 743 744 ret->sgot = NULL; 745 ret->sgotplt = NULL; 746 ret->srelgot = NULL; 747 ret->splt = NULL; 748 ret->srelplt = NULL; 749 ret->sdynbss = NULL; 750 ret->srelbss = NULL; 751 ret->tls_ldm_got.refcount = 0; 752 ret->next_tls_desc_index = 0; 753 ret->sgotplt_jump_table_size = 0; 754 ret->sym_sec.abfd = NULL; 755 ret->is_vxworks = 0; 756 ret->srelplt2 = NULL; 757 ret->plt0_pad_byte = 0; 758 759 return &ret->elf.root; 760 } 761 762 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up 763 shortcuts to them in our hash table. */ 764 765 static bfd_boolean 766 create_got_section (bfd *dynobj, struct bfd_link_info *info) 767 { 768 struct elf_i386_link_hash_table *htab; 769 770 if (! _bfd_elf_create_got_section (dynobj, info)) 771 return FALSE; 772 773 htab = elf_i386_hash_table (info); 774 htab->sgot = bfd_get_section_by_name (dynobj, ".got"); 775 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); 776 if (!htab->sgot || !htab->sgotplt) 777 abort (); 778 779 htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got", 780 (SEC_ALLOC | SEC_LOAD 781 | SEC_HAS_CONTENTS 782 | SEC_IN_MEMORY 783 | SEC_LINKER_CREATED 784 | SEC_READONLY)); 785 if (htab->srelgot == NULL 786 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2)) 787 return FALSE; 788 return TRUE; 789 } 790 791 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and 792 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our 793 hash table. */ 794 795 static bfd_boolean 796 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 797 { 798 struct elf_i386_link_hash_table *htab; 799 800 htab = elf_i386_hash_table (info); 801 if (!htab->sgot && !create_got_section (dynobj, info)) 802 return FALSE; 803 804 if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 805 return FALSE; 806 807 htab->splt = bfd_get_section_by_name (dynobj, ".plt"); 808 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt"); 809 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); 810 if (!info->shared) 811 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss"); 812 813 if (!htab->splt || !htab->srelplt || !htab->sdynbss 814 || (!info->shared && !htab->srelbss)) 815 abort (); 816 817 if (htab->is_vxworks 818 && !elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) 819 return FALSE; 820 821 return TRUE; 822 } 823 824 /* Copy the extra info we tack onto an elf_link_hash_entry. */ 825 826 static void 827 elf_i386_copy_indirect_symbol (struct bfd_link_info *info, 828 struct elf_link_hash_entry *dir, 829 struct elf_link_hash_entry *ind) 830 { 831 struct elf_i386_link_hash_entry *edir, *eind; 832 833 edir = (struct elf_i386_link_hash_entry *) dir; 834 eind = (struct elf_i386_link_hash_entry *) ind; 835 836 if (eind->dyn_relocs != NULL) 837 { 838 if (edir->dyn_relocs != NULL) 839 { 840 struct elf_i386_dyn_relocs **pp; 841 struct elf_i386_dyn_relocs *p; 842 843 /* Add reloc counts against the indirect sym to the direct sym 844 list. Merge any entries against the same section. */ 845 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 846 { 847 struct elf_i386_dyn_relocs *q; 848 849 for (q = edir->dyn_relocs; q != NULL; q = q->next) 850 if (q->sec == p->sec) 851 { 852 q->pc_count += p->pc_count; 853 q->count += p->count; 854 *pp = p->next; 855 break; 856 } 857 if (q == NULL) 858 pp = &p->next; 859 } 860 *pp = edir->dyn_relocs; 861 } 862 863 edir->dyn_relocs = eind->dyn_relocs; 864 eind->dyn_relocs = NULL; 865 } 866 867 if (ind->root.type == bfd_link_hash_indirect 868 && dir->got.refcount <= 0) 869 { 870 edir->tls_type = eind->tls_type; 871 eind->tls_type = GOT_UNKNOWN; 872 } 873 874 if (ELIMINATE_COPY_RELOCS 875 && ind->root.type != bfd_link_hash_indirect 876 && dir->dynamic_adjusted) 877 { 878 /* If called to transfer flags for a weakdef during processing 879 of elf_adjust_dynamic_symbol, don't copy non_got_ref. 880 We clear it ourselves for ELIMINATE_COPY_RELOCS. */ 881 dir->ref_dynamic |= ind->ref_dynamic; 882 dir->ref_regular |= ind->ref_regular; 883 dir->ref_regular_nonweak |= ind->ref_regular_nonweak; 884 dir->needs_plt |= ind->needs_plt; 885 dir->pointer_equality_needed |= ind->pointer_equality_needed; 886 } 887 else 888 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 889 } 890 891 static int 892 elf_i386_tls_transition (struct bfd_link_info *info, int r_type, int is_local) 893 { 894 if (info->shared && !info->executable) 895 return r_type; 896 897 switch (r_type) 898 { 899 case R_386_TLS_GD: 900 case R_386_TLS_GOTDESC: 901 case R_386_TLS_DESC_CALL: 902 case R_386_TLS_IE_32: 903 if (is_local) 904 return R_386_TLS_LE_32; 905 return R_386_TLS_IE_32; 906 case R_386_TLS_IE: 907 case R_386_TLS_GOTIE: 908 if (is_local) 909 return R_386_TLS_LE_32; 910 return r_type; 911 case R_386_TLS_LDM: 912 return R_386_TLS_LE_32; 913 } 914 915 return r_type; 916 } 917 918 /* Look through the relocs for a section during the first phase, and 919 calculate needed space in the global offset table, procedure linkage 920 table, and dynamic reloc sections. */ 921 922 static bfd_boolean 923 elf_i386_check_relocs (bfd *abfd, 924 struct bfd_link_info *info, 925 asection *sec, 926 const Elf_Internal_Rela *relocs) 927 { 928 struct elf_i386_link_hash_table *htab; 929 Elf_Internal_Shdr *symtab_hdr; 930 struct elf_link_hash_entry **sym_hashes; 931 const Elf_Internal_Rela *rel; 932 const Elf_Internal_Rela *rel_end; 933 asection *sreloc; 934 935 if (info->relocatable) 936 return TRUE; 937 938 htab = elf_i386_hash_table (info); 939 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 940 sym_hashes = elf_sym_hashes (abfd); 941 942 sreloc = NULL; 943 944 rel_end = relocs + sec->reloc_count; 945 for (rel = relocs; rel < rel_end; rel++) 946 { 947 unsigned int r_type; 948 unsigned long r_symndx; 949 struct elf_link_hash_entry *h; 950 951 r_symndx = ELF32_R_SYM (rel->r_info); 952 r_type = ELF32_R_TYPE (rel->r_info); 953 954 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) 955 { 956 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), 957 abfd, 958 r_symndx); 959 return FALSE; 960 } 961 962 if (r_symndx < symtab_hdr->sh_info) 963 h = NULL; 964 else 965 { 966 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 967 while (h->root.type == bfd_link_hash_indirect 968 || h->root.type == bfd_link_hash_warning) 969 h = (struct elf_link_hash_entry *) h->root.u.i.link; 970 } 971 972 r_type = elf_i386_tls_transition (info, r_type, h == NULL); 973 974 switch (r_type) 975 { 976 case R_386_TLS_LDM: 977 htab->tls_ldm_got.refcount += 1; 978 goto create_got; 979 980 case R_386_PLT32: 981 /* This symbol requires a procedure linkage table entry. We 982 actually build the entry in adjust_dynamic_symbol, 983 because this might be a case of linking PIC code which is 984 never referenced by a dynamic object, in which case we 985 don't need to generate a procedure linkage table entry 986 after all. */ 987 988 /* If this is a local symbol, we resolve it directly without 989 creating a procedure linkage table entry. */ 990 if (h == NULL) 991 continue; 992 993 h->needs_plt = 1; 994 h->plt.refcount += 1; 995 break; 996 997 case R_386_TLS_IE_32: 998 case R_386_TLS_IE: 999 case R_386_TLS_GOTIE: 1000 if (info->shared && !info->executable) 1001 info->flags |= DF_STATIC_TLS; 1002 /* Fall through */ 1003 1004 case R_386_GOT32: 1005 case R_386_GOT32X: 1006 case R_386_TLS_GD: 1007 case R_386_TLS_GOTDESC: 1008 case R_386_TLS_DESC_CALL: 1009 /* This symbol requires a global offset table entry. */ 1010 { 1011 int tls_type, old_tls_type; 1012 1013 switch (r_type) 1014 { 1015 default: 1016 case R_386_GOT32: tls_type = GOT_NORMAL; break; 1017 case R_386_GOT32X: tls_type = GOT_NORMAL; break; 1018 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break; 1019 case R_386_TLS_GOTDESC: 1020 case R_386_TLS_DESC_CALL: 1021 tls_type = GOT_TLS_GDESC; break; 1022 case R_386_TLS_IE_32: 1023 if (ELF32_R_TYPE (rel->r_info) == r_type) 1024 tls_type = GOT_TLS_IE_NEG; 1025 else if (h 1026 && ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD) 1027 /* If this is a GD->IE transition, we may use either 1028 of R_386_TLS_TPOFF and R_386_TLS_TPOFF32. But if 1029 we may have both R_386_TLS_IE and R_386_TLS_GD, 1030 we can't share the same R_386_TLS_TPOFF since 1031 they require different offsets. So we remember 1032 it comes from R_386_TLS_GD. */ 1033 tls_type = GOT_TLS_IE | GOT_TLS_IE_GD; 1034 else 1035 tls_type = GOT_TLS_IE; 1036 break; 1037 case R_386_TLS_IE: 1038 if (h) 1039 { 1040 /* We remember it comes from R_386_TLS_IE. */ 1041 tls_type = GOT_TLS_IE_POS | GOT_TLS_IE_IE; 1042 break; 1043 } 1044 case R_386_TLS_GOTIE: 1045 tls_type = GOT_TLS_IE_POS; break; 1046 } 1047 1048 if (h != NULL) 1049 { 1050 h->got.refcount += 1; 1051 old_tls_type = elf_i386_hash_entry(h)->tls_type; 1052 } 1053 else 1054 { 1055 bfd_signed_vma *local_got_refcounts; 1056 1057 /* This is a global offset table entry for a local symbol. */ 1058 local_got_refcounts = elf_local_got_refcounts (abfd); 1059 if (local_got_refcounts == NULL) 1060 { 1061 bfd_size_type size; 1062 1063 size = symtab_hdr->sh_info; 1064 size *= (sizeof (bfd_signed_vma) 1065 + sizeof (bfd_vma) + sizeof(char)); 1066 local_got_refcounts = bfd_zalloc (abfd, size); 1067 if (local_got_refcounts == NULL) 1068 return FALSE; 1069 elf_local_got_refcounts (abfd) = local_got_refcounts; 1070 elf_i386_local_tlsdesc_gotent (abfd) 1071 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info); 1072 elf_i386_local_got_tls_type (abfd) 1073 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info); 1074 } 1075 local_got_refcounts[r_symndx] += 1; 1076 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx]; 1077 } 1078 1079 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE)) 1080 tls_type |= old_tls_type; 1081 /* If a TLS symbol is accessed using IE at least once, 1082 there is no point to use dynamic model for it. */ 1083 else if (old_tls_type != tls_type 1084 && old_tls_type != GOT_UNKNOWN 1085 && (! GOT_TLS_GD_ANY_P (old_tls_type) 1086 || (tls_type & GOT_TLS_IE) == 0)) 1087 { 1088 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type)) 1089 tls_type = old_tls_type; 1090 else if (GOT_TLS_GD_ANY_P (old_tls_type) 1091 && GOT_TLS_GD_ANY_P (tls_type)) 1092 tls_type |= old_tls_type; 1093 else 1094 { 1095 (*_bfd_error_handler) 1096 (_("%B: `%s' accessed both as normal and " 1097 "thread local symbol"), 1098 abfd, 1099 h ? h->root.root.string : "<local>"); 1100 return FALSE; 1101 } 1102 } 1103 1104 if (old_tls_type != tls_type) 1105 { 1106 if (h != NULL) 1107 elf_i386_hash_entry (h)->tls_type = tls_type; 1108 else 1109 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type; 1110 } 1111 } 1112 /* Fall through */ 1113 1114 case R_386_GOTOFF: 1115 case R_386_GOTPC: 1116 create_got: 1117 if (htab->sgot == NULL) 1118 { 1119 if (htab->elf.dynobj == NULL) 1120 htab->elf.dynobj = abfd; 1121 if (!create_got_section (htab->elf.dynobj, info)) 1122 return FALSE; 1123 } 1124 if (r_type != R_386_TLS_IE) 1125 break; 1126 /* Fall through */ 1127 1128 case R_386_TLS_LE_32: 1129 case R_386_TLS_LE: 1130 if (!info->shared || info->executable) 1131 break; 1132 info->flags |= DF_STATIC_TLS; 1133 /* Fall through */ 1134 1135 case R_386_32: 1136 case R_386_PC32: 1137 if (h != NULL && !info->shared) 1138 { 1139 /* If this reloc is in a read-only section, we might 1140 need a copy reloc. We can't check reliably at this 1141 stage whether the section is read-only, as input 1142 sections have not yet been mapped to output sections. 1143 Tentatively set the flag for now, and correct in 1144 adjust_dynamic_symbol. */ 1145 h->non_got_ref = 1; 1146 1147 /* We may need a .plt entry if the function this reloc 1148 refers to is in a shared lib. */ 1149 h->plt.refcount += 1; 1150 if (r_type != R_386_PC32) 1151 h->pointer_equality_needed = 1; 1152 } 1153 1154 /* If we are creating a shared library, and this is a reloc 1155 against a global symbol, or a non PC relative reloc 1156 against a local symbol, then we need to copy the reloc 1157 into the shared library. However, if we are linking with 1158 -Bsymbolic, we do not need to copy a reloc against a 1159 global symbol which is defined in an object we are 1160 including in the link (i.e., DEF_REGULAR is set). At 1161 this point we have not seen all the input files, so it is 1162 possible that DEF_REGULAR is not set now but will be set 1163 later (it is never cleared). In case of a weak definition, 1164 DEF_REGULAR may be cleared later by a strong definition in 1165 a shared library. We account for that possibility below by 1166 storing information in the relocs_copied field of the hash 1167 table entry. A similar situation occurs when creating 1168 shared libraries and symbol visibility changes render the 1169 symbol local. 1170 1171 If on the other hand, we are creating an executable, we 1172 may need to keep relocations for symbols satisfied by a 1173 dynamic library if we manage to avoid copy relocs for the 1174 symbol. */ 1175 if ((info->shared 1176 && (sec->flags & SEC_ALLOC) != 0 1177 && (r_type != R_386_PC32 1178 || (h != NULL 1179 && (! info->symbolic 1180 || h->root.type == bfd_link_hash_defweak 1181 || !h->def_regular)))) 1182 || (ELIMINATE_COPY_RELOCS 1183 && !info->shared 1184 && (sec->flags & SEC_ALLOC) != 0 1185 && h != NULL 1186 && (h->root.type == bfd_link_hash_defweak 1187 || !h->def_regular))) 1188 { 1189 struct elf_i386_dyn_relocs *p; 1190 struct elf_i386_dyn_relocs **head; 1191 1192 /* We must copy these reloc types into the output file. 1193 Create a reloc section in dynobj and make room for 1194 this reloc. */ 1195 if (sreloc == NULL) 1196 { 1197 const char *name; 1198 bfd *dynobj; 1199 unsigned int strndx = elf_elfheader (abfd)->e_shstrndx; 1200 unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name; 1201 1202 name = bfd_elf_string_from_elf_section (abfd, strndx, shnam); 1203 if (name == NULL) 1204 return FALSE; 1205 1206 if (strncmp (name, ".rel", 4) != 0 1207 || strcmp (bfd_get_section_name (abfd, sec), 1208 name + 4) != 0) 1209 { 1210 (*_bfd_error_handler) 1211 (_("%B: bad relocation section name `%s\'"), 1212 abfd, name); 1213 } 1214 1215 if (htab->elf.dynobj == NULL) 1216 htab->elf.dynobj = abfd; 1217 1218 dynobj = htab->elf.dynobj; 1219 sreloc = bfd_get_section_by_name (dynobj, name); 1220 if (sreloc == NULL) 1221 { 1222 flagword flags; 1223 1224 flags = (SEC_HAS_CONTENTS | SEC_READONLY 1225 | SEC_IN_MEMORY | SEC_LINKER_CREATED); 1226 if ((sec->flags & SEC_ALLOC) != 0) 1227 flags |= SEC_ALLOC | SEC_LOAD; 1228 sreloc = bfd_make_section_with_flags (dynobj, 1229 name, 1230 flags); 1231 if (sreloc == NULL 1232 || ! bfd_set_section_alignment (dynobj, sreloc, 2)) 1233 return FALSE; 1234 } 1235 elf_section_data (sec)->sreloc = sreloc; 1236 } 1237 1238 /* If this is a global symbol, we count the number of 1239 relocations we need for this symbol. */ 1240 if (h != NULL) 1241 { 1242 head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs; 1243 } 1244 else 1245 { 1246 void **vpp; 1247 /* Track dynamic relocs needed for local syms too. 1248 We really need local syms available to do this 1249 easily. Oh well. */ 1250 1251 asection *s; 1252 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, 1253 sec, r_symndx); 1254 if (s == NULL) 1255 return FALSE; 1256 1257 vpp = &elf_section_data (s)->local_dynrel; 1258 head = (struct elf_i386_dyn_relocs **)vpp; 1259 } 1260 1261 p = *head; 1262 if (p == NULL || p->sec != sec) 1263 { 1264 bfd_size_type amt = sizeof *p; 1265 p = bfd_alloc (htab->elf.dynobj, amt); 1266 if (p == NULL) 1267 return FALSE; 1268 p->next = *head; 1269 *head = p; 1270 p->sec = sec; 1271 p->count = 0; 1272 p->pc_count = 0; 1273 } 1274 1275 p->count += 1; 1276 if (r_type == R_386_PC32) 1277 p->pc_count += 1; 1278 } 1279 break; 1280 1281 /* This relocation describes the C++ object vtable hierarchy. 1282 Reconstruct it for later use during GC. */ 1283 case R_386_GNU_VTINHERIT: 1284 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 1285 return FALSE; 1286 break; 1287 1288 /* This relocation describes which C++ vtable entries are actually 1289 used. Record for later use during GC. */ 1290 case R_386_GNU_VTENTRY: 1291 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset)) 1292 return FALSE; 1293 break; 1294 1295 default: 1296 break; 1297 } 1298 } 1299 1300 return TRUE; 1301 } 1302 1303 /* Return the section that should be marked against GC for a given 1304 relocation. */ 1305 1306 static asection * 1307 elf_i386_gc_mark_hook (asection *sec, 1308 struct bfd_link_info *info ATTRIBUTE_UNUSED, 1309 Elf_Internal_Rela *rel, 1310 struct elf_link_hash_entry *h, 1311 Elf_Internal_Sym *sym) 1312 { 1313 if (h != NULL) 1314 { 1315 switch (ELF32_R_TYPE (rel->r_info)) 1316 { 1317 case R_386_GNU_VTINHERIT: 1318 case R_386_GNU_VTENTRY: 1319 break; 1320 1321 default: 1322 switch (h->root.type) 1323 { 1324 case bfd_link_hash_defined: 1325 case bfd_link_hash_defweak: 1326 return h->root.u.def.section; 1327 1328 case bfd_link_hash_common: 1329 return h->root.u.c.p->section; 1330 1331 default: 1332 break; 1333 } 1334 } 1335 } 1336 else 1337 return bfd_section_from_elf_index (sec->owner, sym->st_shndx); 1338 1339 return NULL; 1340 } 1341 1342 /* Update the got entry reference counts for the section being removed. */ 1343 1344 static bfd_boolean 1345 elf_i386_gc_sweep_hook (bfd *abfd, 1346 struct bfd_link_info *info, 1347 asection *sec, 1348 const Elf_Internal_Rela *relocs) 1349 { 1350 Elf_Internal_Shdr *symtab_hdr; 1351 struct elf_link_hash_entry **sym_hashes; 1352 bfd_signed_vma *local_got_refcounts; 1353 const Elf_Internal_Rela *rel, *relend; 1354 1355 elf_section_data (sec)->local_dynrel = NULL; 1356 1357 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1358 sym_hashes = elf_sym_hashes (abfd); 1359 local_got_refcounts = elf_local_got_refcounts (abfd); 1360 1361 relend = relocs + sec->reloc_count; 1362 for (rel = relocs; rel < relend; rel++) 1363 { 1364 unsigned long r_symndx; 1365 unsigned int r_type; 1366 struct elf_link_hash_entry *h = NULL; 1367 1368 r_symndx = ELF32_R_SYM (rel->r_info); 1369 if (r_symndx >= symtab_hdr->sh_info) 1370 { 1371 struct elf_i386_link_hash_entry *eh; 1372 struct elf_i386_dyn_relocs **pp; 1373 struct elf_i386_dyn_relocs *p; 1374 1375 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1376 while (h->root.type == bfd_link_hash_indirect 1377 || h->root.type == bfd_link_hash_warning) 1378 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1379 eh = (struct elf_i386_link_hash_entry *) h; 1380 1381 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 1382 if (p->sec == sec) 1383 { 1384 /* Everything must go for SEC. */ 1385 *pp = p->next; 1386 break; 1387 } 1388 } 1389 1390 r_type = ELF32_R_TYPE (rel->r_info); 1391 r_type = elf_i386_tls_transition (info, r_type, h != NULL); 1392 switch (r_type) 1393 { 1394 case R_386_TLS_LDM: 1395 if (elf_i386_hash_table (info)->tls_ldm_got.refcount > 0) 1396 elf_i386_hash_table (info)->tls_ldm_got.refcount -= 1; 1397 break; 1398 1399 case R_386_TLS_GD: 1400 case R_386_TLS_GOTDESC: 1401 case R_386_TLS_DESC_CALL: 1402 case R_386_TLS_IE_32: 1403 case R_386_TLS_IE: 1404 case R_386_TLS_GOTIE: 1405 case R_386_GOT32: 1406 case R_386_GOT32X: 1407 if (h != NULL) 1408 { 1409 if (h->got.refcount > 0) 1410 h->got.refcount -= 1; 1411 } 1412 else if (local_got_refcounts != NULL) 1413 { 1414 if (local_got_refcounts[r_symndx] > 0) 1415 local_got_refcounts[r_symndx] -= 1; 1416 } 1417 break; 1418 1419 case R_386_32: 1420 case R_386_PC32: 1421 if (info->shared) 1422 break; 1423 /* Fall through */ 1424 1425 case R_386_PLT32: 1426 if (h != NULL) 1427 { 1428 if (h->plt.refcount > 0) 1429 h->plt.refcount -= 1; 1430 } 1431 break; 1432 1433 default: 1434 break; 1435 } 1436 } 1437 1438 return TRUE; 1439 } 1440 1441 /* Adjust a symbol defined by a dynamic object and referenced by a 1442 regular object. The current definition is in some section of the 1443 dynamic object, but we're not including those sections. We have to 1444 change the definition to something the rest of the link can 1445 understand. */ 1446 1447 static bfd_boolean 1448 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info, 1449 struct elf_link_hash_entry *h) 1450 { 1451 struct elf_i386_link_hash_table *htab; 1452 asection *s; 1453 unsigned int power_of_two; 1454 1455 /* If this is a function, put it in the procedure linkage table. We 1456 will fill in the contents of the procedure linkage table later, 1457 when we know the address of the .got section. */ 1458 if (h->type == STT_FUNC 1459 || h->needs_plt) 1460 { 1461 if (h->plt.refcount <= 0 1462 || SYMBOL_CALLS_LOCAL (info, h) 1463 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 1464 && h->root.type == bfd_link_hash_undefweak)) 1465 { 1466 /* This case can occur if we saw a PLT32 reloc in an input 1467 file, but the symbol was never referred to by a dynamic 1468 object, or if all references were garbage collected. In 1469 such a case, we don't actually need to build a procedure 1470 linkage table, and we can just do a PC32 reloc instead. */ 1471 h->plt.offset = (bfd_vma) -1; 1472 h->needs_plt = 0; 1473 } 1474 1475 return TRUE; 1476 } 1477 else 1478 /* It's possible that we incorrectly decided a .plt reloc was 1479 needed for an R_386_PC32 reloc to a non-function sym in 1480 check_relocs. We can't decide accurately between function and 1481 non-function syms in check-relocs; Objects loaded later in 1482 the link may change h->type. So fix it now. */ 1483 h->plt.offset = (bfd_vma) -1; 1484 1485 /* If this is a weak symbol, and there is a real definition, the 1486 processor independent code will have arranged for us to see the 1487 real definition first, and we can just use the same value. */ 1488 if (h->u.weakdef != NULL) 1489 { 1490 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 1491 || h->u.weakdef->root.type == bfd_link_hash_defweak); 1492 h->root.u.def.section = h->u.weakdef->root.u.def.section; 1493 h->root.u.def.value = h->u.weakdef->root.u.def.value; 1494 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc) 1495 h->non_got_ref = h->u.weakdef->non_got_ref; 1496 return TRUE; 1497 } 1498 1499 /* This is a reference to a symbol defined by a dynamic object which 1500 is not a function. */ 1501 1502 /* If we are creating a shared library, we must presume that the 1503 only references to the symbol are via the global offset table. 1504 For such cases we need not do anything here; the relocations will 1505 be handled correctly by relocate_section. */ 1506 if (info->shared) 1507 return TRUE; 1508 1509 /* If there are no references to this symbol that do not use the 1510 GOT, we don't need to generate a copy reloc. */ 1511 if (!h->non_got_ref) 1512 return TRUE; 1513 1514 /* If -z nocopyreloc was given, we won't generate them either. */ 1515 if (info->nocopyreloc) 1516 { 1517 h->non_got_ref = 0; 1518 return TRUE; 1519 } 1520 1521 htab = elf_i386_hash_table (info); 1522 1523 /* If there aren't any dynamic relocs in read-only sections, then 1524 we can keep the dynamic relocs and avoid the copy reloc. This 1525 doesn't work on VxWorks, where we can not have dynamic relocations 1526 (other than copy and jump slot relocations) in an executable. */ 1527 if (ELIMINATE_COPY_RELOCS && !htab->is_vxworks) 1528 { 1529 struct elf_i386_link_hash_entry * eh; 1530 struct elf_i386_dyn_relocs *p; 1531 1532 eh = (struct elf_i386_link_hash_entry *) h; 1533 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1534 { 1535 s = p->sec->output_section; 1536 if (s != NULL && (s->flags & SEC_READONLY) != 0) 1537 break; 1538 } 1539 1540 if (p == NULL) 1541 { 1542 h->non_got_ref = 0; 1543 return TRUE; 1544 } 1545 } 1546 1547 if (h->size == 0) 1548 { 1549 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), 1550 h->root.root.string); 1551 return TRUE; 1552 } 1553 1554 /* We must allocate the symbol in our .dynbss section, which will 1555 become part of the .bss section of the executable. There will be 1556 an entry for this symbol in the .dynsym section. The dynamic 1557 object will contain position independent code, so all references 1558 from the dynamic object to this symbol will go through the global 1559 offset table. The dynamic linker will use the .dynsym entry to 1560 determine the address it must put in the global offset table, so 1561 both the dynamic object and the regular object will refer to the 1562 same memory location for the variable. */ 1563 1564 /* We must generate a R_386_COPY reloc to tell the dynamic linker to 1565 copy the initial value out of the dynamic object and into the 1566 runtime process image. */ 1567 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 1568 { 1569 htab->srelbss->size += sizeof (Elf32_External_Rel); 1570 h->needs_copy = 1; 1571 } 1572 1573 /* We need to figure out the alignment required for this symbol. I 1574 have no idea how ELF linkers handle this. */ 1575 power_of_two = bfd_log2 (h->size); 1576 if (power_of_two > 3) 1577 power_of_two = 3; 1578 1579 /* Apply the required alignment. */ 1580 s = htab->sdynbss; 1581 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two)); 1582 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s)) 1583 { 1584 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two)) 1585 return FALSE; 1586 } 1587 1588 /* Define the symbol as being at this point in the section. */ 1589 h->root.u.def.section = s; 1590 h->root.u.def.value = s->size; 1591 1592 /* Increment the section size to make room for the symbol. */ 1593 s->size += h->size; 1594 1595 return TRUE; 1596 } 1597 1598 /* Allocate space in .plt, .got and associated reloc sections for 1599 dynamic relocs. */ 1600 1601 static bfd_boolean 1602 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) 1603 { 1604 struct bfd_link_info *info; 1605 struct elf_i386_link_hash_table *htab; 1606 struct elf_i386_link_hash_entry *eh; 1607 struct elf_i386_dyn_relocs *p; 1608 1609 if (h->root.type == bfd_link_hash_indirect) 1610 return TRUE; 1611 1612 if (h->root.type == bfd_link_hash_warning) 1613 /* When warning symbols are created, they **replace** the "real" 1614 entry in the hash table, thus we never get to see the real 1615 symbol in a hash traversal. So look at it now. */ 1616 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1617 1618 info = (struct bfd_link_info *) inf; 1619 htab = elf_i386_hash_table (info); 1620 1621 if (htab->elf.dynamic_sections_created 1622 && h->plt.refcount > 0) 1623 { 1624 /* Make sure this symbol is output as a dynamic symbol. 1625 Undefined weak syms won't yet be marked as dynamic. */ 1626 if (h->dynindx == -1 1627 && !h->forced_local) 1628 { 1629 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1630 return FALSE; 1631 } 1632 1633 if (info->shared 1634 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h)) 1635 { 1636 asection *s = htab->splt; 1637 1638 /* If this is the first .plt entry, make room for the special 1639 first entry. */ 1640 if (s->size == 0) 1641 s->size += PLT_ENTRY_SIZE; 1642 1643 h->plt.offset = s->size; 1644 1645 /* If this symbol is not defined in a regular file, and we are 1646 not generating a shared library, then set the symbol to this 1647 location in the .plt. This is required to make function 1648 pointers compare as equal between the normal executable and 1649 the shared library. */ 1650 if (! info->shared 1651 && !h->def_regular) 1652 { 1653 h->root.u.def.section = s; 1654 h->root.u.def.value = h->plt.offset; 1655 } 1656 1657 /* Make room for this entry. */ 1658 s->size += PLT_ENTRY_SIZE; 1659 1660 /* We also need to make an entry in the .got.plt section, which 1661 will be placed in the .got section by the linker script. */ 1662 htab->sgotplt->size += 4; 1663 1664 /* We also need to make an entry in the .rel.plt section. */ 1665 htab->srelplt->size += sizeof (Elf32_External_Rel); 1666 htab->next_tls_desc_index++; 1667 1668 if (htab->is_vxworks && !info->shared) 1669 { 1670 /* VxWorks has a second set of relocations for each PLT entry 1671 in executables. They go in a separate relocation section, 1672 which is processed by the kernel loader. */ 1673 1674 /* There are two relocations for the initial PLT entry: an 1675 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an 1676 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */ 1677 1678 if (h->plt.offset == PLT_ENTRY_SIZE) 1679 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2); 1680 1681 /* There are two extra relocations for each subsequent PLT entry: 1682 an R_386_32 relocation for the GOT entry, and an R_386_32 1683 relocation for the PLT entry. */ 1684 1685 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2); 1686 } 1687 } 1688 else 1689 { 1690 h->plt.offset = (bfd_vma) -1; 1691 h->needs_plt = 0; 1692 } 1693 } 1694 else 1695 { 1696 h->plt.offset = (bfd_vma) -1; 1697 h->needs_plt = 0; 1698 } 1699 1700 eh = (struct elf_i386_link_hash_entry *) h; 1701 eh->tlsdesc_got = (bfd_vma) -1; 1702 1703 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary, 1704 make it a R_386_TLS_LE_32 requiring no TLS entry. */ 1705 if (h->got.refcount > 0 1706 && (!info->shared || info->executable) 1707 && h->dynindx == -1 1708 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE)) 1709 h->got.offset = (bfd_vma) -1; 1710 else if (h->got.refcount > 0) 1711 { 1712 asection *s; 1713 bfd_boolean dyn; 1714 int tls_type = elf_i386_hash_entry(h)->tls_type; 1715 1716 /* If we have both R_386_TLS_IE and R_386_TLS_GD, GOT_TLS_IE_BOTH 1717 should be used. */ 1718 if ((tls_type & GOT_TLS_IE_MASK) 1719 == (GOT_TLS_IE_IE | GOT_TLS_IE_GD)) 1720 tls_type = GOT_TLS_IE_BOTH; 1721 else 1722 tls_type &= GOT_TLS_MASK; 1723 1724 /* Make sure this symbol is output as a dynamic symbol. 1725 Undefined weak syms won't yet be marked as dynamic. */ 1726 if (h->dynindx == -1 1727 && !h->forced_local) 1728 { 1729 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1730 return FALSE; 1731 } 1732 1733 s = htab->sgot; 1734 if (GOT_TLS_GDESC_P (tls_type)) 1735 { 1736 eh->tlsdesc_got = htab->sgotplt->size 1737 - elf_i386_compute_jump_table_size (htab); 1738 htab->sgotplt->size += 8; 1739 h->got.offset = (bfd_vma) -2; 1740 } 1741 if (! GOT_TLS_GDESC_P (tls_type) 1742 || GOT_TLS_GD_P (tls_type)) 1743 { 1744 h->got.offset = s->size; 1745 s->size += 4; 1746 /* R_386_TLS_GD needs 2 consecutive GOT slots. */ 1747 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH) 1748 s->size += 4; 1749 } 1750 dyn = htab->elf.dynamic_sections_created; 1751 /* R_386_TLS_IE_32 needs one dynamic relocation, 1752 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation, 1753 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we 1754 need two), R_386_TLS_GD needs one if local symbol and two if 1755 global. */ 1756 if (tls_type == GOT_TLS_IE_BOTH) 1757 htab->srelgot->size += 2 * sizeof (Elf32_External_Rel); 1758 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1) 1759 || (tls_type & GOT_TLS_IE)) 1760 htab->srelgot->size += sizeof (Elf32_External_Rel); 1761 else if (GOT_TLS_GD_P (tls_type)) 1762 htab->srelgot->size += 2 * sizeof (Elf32_External_Rel); 1763 else if (! GOT_TLS_GDESC_P (tls_type) 1764 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 1765 || h->root.type != bfd_link_hash_undefweak) 1766 && (info->shared 1767 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 1768 htab->srelgot->size += sizeof (Elf32_External_Rel); 1769 if (GOT_TLS_GDESC_P (tls_type)) 1770 htab->srelplt->size += sizeof (Elf32_External_Rel); 1771 } 1772 else 1773 h->got.offset = (bfd_vma) -1; 1774 1775 if (eh->dyn_relocs == NULL) 1776 return TRUE; 1777 1778 /* In the shared -Bsymbolic case, discard space allocated for 1779 dynamic pc-relative relocs against symbols which turn out to be 1780 defined in regular objects. For the normal shared case, discard 1781 space for pc-relative relocs that have become local due to symbol 1782 visibility changes. */ 1783 1784 if (info->shared) 1785 { 1786 /* The only reloc that uses pc_count is R_386_PC32, which will 1787 appear on a call or on something like ".long foo - .". We 1788 want calls to protected symbols to resolve directly to the 1789 function rather than going via the plt. If people want 1790 function pointer comparisons to work as expected then they 1791 should avoid writing assembly like ".long foo - .". */ 1792 if (SYMBOL_CALLS_LOCAL (info, h)) 1793 { 1794 struct elf_i386_dyn_relocs **pp; 1795 1796 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 1797 { 1798 p->count -= p->pc_count; 1799 p->pc_count = 0; 1800 if (p->count == 0) 1801 *pp = p->next; 1802 else 1803 pp = &p->next; 1804 } 1805 } 1806 1807 /* Also discard relocs on undefined weak syms with non-default 1808 visibility. */ 1809 if (eh->dyn_relocs != NULL 1810 && h->root.type == bfd_link_hash_undefweak) 1811 { 1812 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 1813 eh->dyn_relocs = NULL; 1814 1815 /* Make sure undefined weak symbols are output as a dynamic 1816 symbol in PIEs. */ 1817 else if (h->dynindx == -1 1818 && !h->forced_local) 1819 { 1820 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1821 return FALSE; 1822 } 1823 } 1824 } 1825 else if (ELIMINATE_COPY_RELOCS) 1826 { 1827 /* For the non-shared case, discard space for relocs against 1828 symbols which turn out to need copy relocs or are not 1829 dynamic. */ 1830 1831 if (!h->non_got_ref 1832 && ((h->def_dynamic 1833 && !h->def_regular) 1834 || (htab->elf.dynamic_sections_created 1835 && (h->root.type == bfd_link_hash_undefweak 1836 || h->root.type == bfd_link_hash_undefined)))) 1837 { 1838 /* Make sure this symbol is output as a dynamic symbol. 1839 Undefined weak syms won't yet be marked as dynamic. */ 1840 if (h->dynindx == -1 1841 && !h->forced_local) 1842 { 1843 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1844 return FALSE; 1845 } 1846 1847 /* If that succeeded, we know we'll be keeping all the 1848 relocs. */ 1849 if (h->dynindx != -1) 1850 goto keep; 1851 } 1852 1853 eh->dyn_relocs = NULL; 1854 1855 keep: ; 1856 } 1857 1858 /* Finally, allocate space. */ 1859 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1860 { 1861 asection *sreloc = elf_section_data (p->sec)->sreloc; 1862 sreloc->size += p->count * sizeof (Elf32_External_Rel); 1863 } 1864 1865 return TRUE; 1866 } 1867 1868 /* Find any dynamic relocs that apply to read-only sections. */ 1869 1870 static bfd_boolean 1871 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) 1872 { 1873 struct elf_i386_link_hash_entry *eh; 1874 struct elf_i386_dyn_relocs *p; 1875 1876 if (h->root.type == bfd_link_hash_warning) 1877 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1878 1879 eh = (struct elf_i386_link_hash_entry *) h; 1880 for (p = eh->dyn_relocs; p != NULL; p = p->next) 1881 { 1882 asection *s = p->sec->output_section; 1883 1884 if (s != NULL && (s->flags & SEC_READONLY) != 0) 1885 { 1886 struct bfd_link_info *info = (struct bfd_link_info *) inf; 1887 1888 info->flags |= DF_TEXTREL; 1889 1890 /* Not an error, just cut short the traversal. */ 1891 return FALSE; 1892 } 1893 } 1894 return TRUE; 1895 } 1896 1897 /* Set the sizes of the dynamic sections. */ 1898 1899 static bfd_boolean 1900 elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 1901 struct bfd_link_info *info) 1902 { 1903 struct elf_i386_link_hash_table *htab; 1904 bfd *dynobj; 1905 asection *s; 1906 bfd_boolean relocs; 1907 bfd *ibfd; 1908 1909 htab = elf_i386_hash_table (info); 1910 dynobj = htab->elf.dynobj; 1911 if (dynobj == NULL) 1912 abort (); 1913 1914 if (htab->elf.dynamic_sections_created) 1915 { 1916 /* Set the contents of the .interp section to the interpreter. */ 1917 if (info->executable && !info->static_link) 1918 { 1919 s = bfd_get_section_by_name (dynobj, ".interp"); 1920 if (s == NULL) 1921 abort (); 1922 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 1923 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 1924 } 1925 } 1926 1927 /* Set up .got offsets for local syms, and space for local dynamic 1928 relocs. */ 1929 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 1930 { 1931 bfd_signed_vma *local_got; 1932 bfd_signed_vma *end_local_got; 1933 char *local_tls_type; 1934 bfd_vma *local_tlsdesc_gotent; 1935 bfd_size_type locsymcount; 1936 Elf_Internal_Shdr *symtab_hdr; 1937 asection *srel; 1938 1939 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 1940 continue; 1941 1942 for (s = ibfd->sections; s != NULL; s = s->next) 1943 { 1944 struct elf_i386_dyn_relocs *p; 1945 1946 for (p = ((struct elf_i386_dyn_relocs *) 1947 elf_section_data (s)->local_dynrel); 1948 p != NULL; 1949 p = p->next) 1950 { 1951 if (!bfd_is_abs_section (p->sec) 1952 && bfd_is_abs_section (p->sec->output_section)) 1953 { 1954 /* Input section has been discarded, either because 1955 it is a copy of a linkonce section or due to 1956 linker script /DISCARD/, so we'll be discarding 1957 the relocs too. */ 1958 } 1959 else if (p->count != 0) 1960 { 1961 srel = elf_section_data (p->sec)->sreloc; 1962 srel->size += p->count * sizeof (Elf32_External_Rel); 1963 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 1964 info->flags |= DF_TEXTREL; 1965 } 1966 } 1967 } 1968 1969 local_got = elf_local_got_refcounts (ibfd); 1970 if (!local_got) 1971 continue; 1972 1973 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 1974 locsymcount = symtab_hdr->sh_info; 1975 end_local_got = local_got + locsymcount; 1976 local_tls_type = elf_i386_local_got_tls_type (ibfd); 1977 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd); 1978 s = htab->sgot; 1979 srel = htab->srelgot; 1980 for (; local_got < end_local_got; 1981 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent) 1982 { 1983 *local_tlsdesc_gotent = (bfd_vma) -1; 1984 if (*local_got > 0) 1985 { 1986 if (GOT_TLS_GDESC_P (*local_tls_type)) 1987 { 1988 *local_tlsdesc_gotent = htab->sgotplt->size 1989 - elf_i386_compute_jump_table_size (htab); 1990 htab->sgotplt->size += 8; 1991 *local_got = (bfd_vma) -2; 1992 } 1993 if (! GOT_TLS_GDESC_P (*local_tls_type) 1994 || GOT_TLS_GD_P (*local_tls_type)) 1995 { 1996 *local_got = s->size; 1997 s->size += 4; 1998 if (GOT_TLS_GD_P (*local_tls_type) 1999 || *local_tls_type == GOT_TLS_IE_BOTH) 2000 s->size += 4; 2001 } 2002 if (info->shared 2003 || GOT_TLS_GD_ANY_P (*local_tls_type) 2004 || (*local_tls_type & GOT_TLS_IE)) 2005 { 2006 if (*local_tls_type == GOT_TLS_IE_BOTH) 2007 srel->size += 2 * sizeof (Elf32_External_Rel); 2008 else if (GOT_TLS_GD_P (*local_tls_type) 2009 || ! GOT_TLS_GDESC_P (*local_tls_type)) 2010 srel->size += sizeof (Elf32_External_Rel); 2011 if (GOT_TLS_GDESC_P (*local_tls_type)) 2012 htab->srelplt->size += sizeof (Elf32_External_Rel); 2013 } 2014 } 2015 else 2016 *local_got = (bfd_vma) -1; 2017 } 2018 } 2019 2020 if (htab->tls_ldm_got.refcount > 0) 2021 { 2022 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM 2023 relocs. */ 2024 htab->tls_ldm_got.offset = htab->sgot->size; 2025 htab->sgot->size += 8; 2026 htab->srelgot->size += sizeof (Elf32_External_Rel); 2027 } 2028 else 2029 htab->tls_ldm_got.offset = -1; 2030 2031 /* Allocate global sym .plt and .got entries, and space for global 2032 sym dynamic relocs. */ 2033 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info); 2034 2035 /* For every jump slot reserved in the sgotplt, reloc_count is 2036 incremented. However, when we reserve space for TLS descriptors, 2037 it's not incremented, so in order to compute the space reserved 2038 for them, it suffices to multiply the reloc count by the jump 2039 slot size. */ 2040 if (htab->srelplt) 2041 htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4; 2042 2043 /* We now have determined the sizes of the various dynamic sections. 2044 Allocate memory for them. */ 2045 relocs = FALSE; 2046 for (s = dynobj->sections; s != NULL; s = s->next) 2047 { 2048 bfd_boolean strip_section = TRUE; 2049 2050 if ((s->flags & SEC_LINKER_CREATED) == 0) 2051 continue; 2052 2053 if (s == htab->splt 2054 || s == htab->sgot 2055 || s == htab->sgotplt 2056 || s == htab->sdynbss) 2057 { 2058 /* Strip this section if we don't need it; see the 2059 comment below. */ 2060 /* We'd like to strip these sections if they aren't needed, but if 2061 we've exported dynamic symbols from them we must leave them. 2062 It's too late to tell BFD to get rid of the symbols. */ 2063 2064 if (htab->elf.hplt != NULL) 2065 strip_section = FALSE; 2066 } 2067 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0) 2068 { 2069 if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2) 2070 relocs = TRUE; 2071 2072 /* We use the reloc_count field as a counter if we need 2073 to copy relocs into the output file. */ 2074 s->reloc_count = 0; 2075 } 2076 else 2077 { 2078 /* It's not one of our sections, so don't allocate space. */ 2079 continue; 2080 } 2081 2082 if (s->size == 0) 2083 { 2084 /* If we don't need this section, strip it from the 2085 output file. This is mostly to handle .rel.bss and 2086 .rel.plt. We must create both sections in 2087 create_dynamic_sections, because they must be created 2088 before the linker maps input sections to output 2089 sections. The linker does that before 2090 adjust_dynamic_symbol is called, and it is that 2091 function which decides whether anything needs to go 2092 into these sections. */ 2093 if (strip_section) 2094 s->flags |= SEC_EXCLUDE; 2095 continue; 2096 } 2097 2098 if ((s->flags & SEC_HAS_CONTENTS) == 0) 2099 continue; 2100 2101 /* Allocate memory for the section contents. We use bfd_zalloc 2102 here in case unused entries are not reclaimed before the 2103 section's contents are written out. This should not happen, 2104 but this way if it does, we get a R_386_NONE reloc instead 2105 of garbage. */ 2106 s->contents = bfd_zalloc (dynobj, s->size); 2107 if (s->contents == NULL) 2108 return FALSE; 2109 } 2110 2111 if (htab->elf.dynamic_sections_created) 2112 { 2113 /* Add some entries to the .dynamic section. We fill in the 2114 values later, in elf_i386_finish_dynamic_sections, but we 2115 must add the entries now so that we get the correct size for 2116 the .dynamic section. The DT_DEBUG entry is filled in by the 2117 dynamic linker and used by the debugger. */ 2118 #define add_dynamic_entry(TAG, VAL) \ 2119 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 2120 2121 if (info->executable) 2122 { 2123 if (!add_dynamic_entry (DT_DEBUG, 0)) 2124 return FALSE; 2125 } 2126 2127 if (htab->splt->size != 0) 2128 { 2129 if (!add_dynamic_entry (DT_PLTGOT, 0) 2130 || !add_dynamic_entry (DT_PLTRELSZ, 0) 2131 || !add_dynamic_entry (DT_PLTREL, DT_REL) 2132 || !add_dynamic_entry (DT_JMPREL, 0)) 2133 return FALSE; 2134 } 2135 2136 if (relocs) 2137 { 2138 if (!add_dynamic_entry (DT_REL, 0) 2139 || !add_dynamic_entry (DT_RELSZ, 0) 2140 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel))) 2141 return FALSE; 2142 2143 /* If any dynamic relocs apply to a read-only section, 2144 then we need a DT_TEXTREL entry. */ 2145 if ((info->flags & DF_TEXTREL) == 0) 2146 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, 2147 (PTR) info); 2148 2149 if ((info->flags & DF_TEXTREL) != 0) 2150 { 2151 if (!add_dynamic_entry (DT_TEXTREL, 0)) 2152 return FALSE; 2153 } 2154 } 2155 } 2156 #undef add_dynamic_entry 2157 2158 return TRUE; 2159 } 2160 2161 static bfd_boolean 2162 elf_i386_always_size_sections (bfd *output_bfd, 2163 struct bfd_link_info *info) 2164 { 2165 asection *tls_sec = elf_hash_table (info)->tls_sec; 2166 2167 if (tls_sec) 2168 { 2169 struct elf_link_hash_entry *tlsbase; 2170 2171 tlsbase = elf_link_hash_lookup (elf_hash_table (info), 2172 "_TLS_MODULE_BASE_", 2173 FALSE, FALSE, FALSE); 2174 2175 if (tlsbase && tlsbase->type == STT_TLS) 2176 { 2177 struct bfd_link_hash_entry *bh = NULL; 2178 const struct elf_backend_data *bed 2179 = get_elf_backend_data (output_bfd); 2180 2181 if (!(_bfd_generic_link_add_one_symbol 2182 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL, 2183 tls_sec, 0, NULL, FALSE, 2184 bed->collect, &bh))) 2185 return FALSE; 2186 tlsbase = (struct elf_link_hash_entry *)bh; 2187 tlsbase->def_regular = 1; 2188 tlsbase->other = STV_HIDDEN; 2189 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE); 2190 } 2191 } 2192 2193 return TRUE; 2194 } 2195 2196 /* Set the correct type for an x86 ELF section. We do this by the 2197 section name, which is a hack, but ought to work. */ 2198 2199 static bfd_boolean 2200 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, 2201 Elf_Internal_Shdr *hdr, 2202 asection *sec) 2203 { 2204 register const char *name; 2205 2206 name = bfd_get_section_name (abfd, sec); 2207 2208 /* This is an ugly, but unfortunately necessary hack that is 2209 needed when producing EFI binaries on x86. It tells 2210 elf.c:elf_fake_sections() not to consider ".reloc" as a section 2211 containing ELF relocation info. We need this hack in order to 2212 be able to generate ELF binaries that can be translated into 2213 EFI applications (which are essentially COFF objects). Those 2214 files contain a COFF ".reloc" section inside an ELFNN object, 2215 which would normally cause BFD to segfault because it would 2216 attempt to interpret this section as containing relocation 2217 entries for section "oc". With this hack enabled, ".reloc" 2218 will be treated as a normal data section, which will avoid the 2219 segfault. However, you won't be able to create an ELFNN binary 2220 with a section named "oc" that needs relocations, but that's 2221 the kind of ugly side-effects you get when detecting section 2222 types based on their names... In practice, this limitation is 2223 unlikely to bite. */ 2224 if (strcmp (name, ".reloc") == 0) 2225 hdr->sh_type = SHT_PROGBITS; 2226 2227 return TRUE; 2228 } 2229 2230 /* Return the base VMA address which should be subtracted from real addresses 2231 when resolving @dtpoff relocation. 2232 This is PT_TLS segment p_vaddr. */ 2233 2234 static bfd_vma 2235 dtpoff_base (struct bfd_link_info *info) 2236 { 2237 /* If tls_sec is NULL, we should have signalled an error already. */ 2238 if (elf_hash_table (info)->tls_sec == NULL) 2239 return 0; 2240 return elf_hash_table (info)->tls_sec->vma; 2241 } 2242 2243 /* Return the relocation value for @tpoff relocation 2244 if STT_TLS virtual address is ADDRESS. */ 2245 2246 static bfd_vma 2247 tpoff (struct bfd_link_info *info, bfd_vma address) 2248 { 2249 struct elf_link_hash_table *htab = elf_hash_table (info); 2250 2251 /* If tls_sec is NULL, we should have signalled an error already. */ 2252 if (htab->tls_sec == NULL) 2253 return 0; 2254 return htab->tls_size + htab->tls_sec->vma - address; 2255 } 2256 2257 /* Relocate an i386 ELF section. */ 2258 2259 static bfd_boolean 2260 elf_i386_relocate_section (bfd *output_bfd, 2261 struct bfd_link_info *info, 2262 bfd *input_bfd, 2263 asection *input_section, 2264 bfd_byte *contents, 2265 Elf_Internal_Rela *relocs, 2266 Elf_Internal_Sym *local_syms, 2267 asection **local_sections) 2268 { 2269 struct elf_i386_link_hash_table *htab; 2270 Elf_Internal_Shdr *symtab_hdr; 2271 struct elf_link_hash_entry **sym_hashes; 2272 bfd_vma *local_got_offsets; 2273 bfd_vma *local_tlsdesc_gotents; 2274 Elf_Internal_Rela *rel; 2275 Elf_Internal_Rela *relend; 2276 2277 htab = elf_i386_hash_table (info); 2278 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 2279 sym_hashes = elf_sym_hashes (input_bfd); 2280 local_got_offsets = elf_local_got_offsets (input_bfd); 2281 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd); 2282 2283 rel = relocs; 2284 relend = relocs + input_section->reloc_count; 2285 for (; rel < relend; rel++) 2286 { 2287 unsigned int r_type; 2288 reloc_howto_type *howto; 2289 unsigned long r_symndx; 2290 struct elf_link_hash_entry *h; 2291 Elf_Internal_Sym *sym; 2292 asection *sec; 2293 bfd_vma off, offplt; 2294 bfd_vma relocation; 2295 bfd_boolean unresolved_reloc; 2296 bfd_reloc_status_type r; 2297 unsigned int indx; 2298 int tls_type; 2299 2300 r_type = ELF32_R_TYPE (rel->r_info); 2301 if (r_type == R_386_GNU_VTINHERIT 2302 || r_type == R_386_GNU_VTENTRY) 2303 continue; 2304 2305 if ((indx = r_type) >= R_386_standard 2306 && ((indx = r_type - R_386_ext_offset) - R_386_standard 2307 >= R_386_ext - R_386_standard) 2308 && ((indx = r_type - R_386_tls_offset) - R_386_ext 2309 >= R_386_tls - R_386_ext)) 2310 { 2311 (*_bfd_error_handler) 2312 (_("%B: unrecognized relocation (0x%x) in section `%A'"), 2313 input_bfd, input_section, r_type); 2314 bfd_set_error (bfd_error_bad_value); 2315 return FALSE; 2316 } 2317 howto = elf_howto_table + indx; 2318 2319 r_symndx = ELF32_R_SYM (rel->r_info); 2320 2321 if (info->relocatable) 2322 { 2323 bfd_vma val; 2324 bfd_byte *where; 2325 2326 /* This is a relocatable link. We don't have to change 2327 anything, unless the reloc is against a section symbol, 2328 in which case we have to adjust according to where the 2329 section symbol winds up in the output section. */ 2330 if (r_symndx >= symtab_hdr->sh_info) 2331 continue; 2332 2333 sym = local_syms + r_symndx; 2334 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) 2335 continue; 2336 2337 sec = local_sections[r_symndx]; 2338 val = sec->output_offset; 2339 if (val == 0) 2340 continue; 2341 2342 where = contents + rel->r_offset; 2343 switch (howto->size) 2344 { 2345 /* FIXME: overflow checks. */ 2346 case 0: 2347 val += bfd_get_8 (input_bfd, where); 2348 bfd_put_8 (input_bfd, val, where); 2349 break; 2350 case 1: 2351 val += bfd_get_16 (input_bfd, where); 2352 bfd_put_16 (input_bfd, val, where); 2353 break; 2354 case 2: 2355 val += bfd_get_32 (input_bfd, where); 2356 bfd_put_32 (input_bfd, val, where); 2357 break; 2358 default: 2359 abort (); 2360 } 2361 continue; 2362 } 2363 2364 /* This is a final link. */ 2365 h = NULL; 2366 sym = NULL; 2367 sec = NULL; 2368 unresolved_reloc = FALSE; 2369 if (r_symndx < symtab_hdr->sh_info) 2370 { 2371 sym = local_syms + r_symndx; 2372 sec = local_sections[r_symndx]; 2373 relocation = (sec->output_section->vma 2374 + sec->output_offset 2375 + sym->st_value); 2376 if ((sec->flags & SEC_MERGE) 2377 && ELF_ST_TYPE (sym->st_info) == STT_SECTION) 2378 { 2379 asection *msec; 2380 bfd_vma addend; 2381 bfd_byte *where = contents + rel->r_offset; 2382 2383 switch (howto->size) 2384 { 2385 case 0: 2386 addend = bfd_get_8 (input_bfd, where); 2387 if (howto->pc_relative) 2388 { 2389 addend = (addend ^ 0x80) - 0x80; 2390 addend += 1; 2391 } 2392 break; 2393 case 1: 2394 addend = bfd_get_16 (input_bfd, where); 2395 if (howto->pc_relative) 2396 { 2397 addend = (addend ^ 0x8000) - 0x8000; 2398 addend += 2; 2399 } 2400 break; 2401 case 2: 2402 addend = bfd_get_32 (input_bfd, where); 2403 if (howto->pc_relative) 2404 { 2405 addend = (addend ^ 0x80000000) - 0x80000000; 2406 addend += 4; 2407 } 2408 break; 2409 default: 2410 abort (); 2411 } 2412 2413 msec = sec; 2414 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend); 2415 addend -= relocation; 2416 addend += msec->output_section->vma + msec->output_offset; 2417 2418 switch (howto->size) 2419 { 2420 case 0: 2421 /* FIXME: overflow checks. */ 2422 if (howto->pc_relative) 2423 addend -= 1; 2424 bfd_put_8 (input_bfd, addend, where); 2425 break; 2426 case 1: 2427 if (howto->pc_relative) 2428 addend -= 2; 2429 bfd_put_16 (input_bfd, addend, where); 2430 break; 2431 case 2: 2432 if (howto->pc_relative) 2433 addend -= 4; 2434 bfd_put_32 (input_bfd, addend, where); 2435 break; 2436 } 2437 } 2438 } 2439 else 2440 { 2441 bfd_boolean warned; 2442 2443 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 2444 r_symndx, symtab_hdr, sym_hashes, 2445 h, sec, relocation, 2446 unresolved_reloc, warned); 2447 } 2448 2449 if (r_symndx == 0) 2450 { 2451 /* r_symndx will be zero only for relocs against symbols from 2452 removed linkonce sections, or sections discarded by a linker 2453 script. For these relocs, we just want the section contents 2454 zeroed. Avoid any special processing in the switch below. */ 2455 r_type = R_386_NONE; 2456 2457 relocation = 0; 2458 if (howto->pc_relative) 2459 relocation = (input_section->output_section->vma 2460 + input_section->output_offset 2461 + rel->r_offset); 2462 } 2463 2464 switch (r_type) 2465 { 2466 case R_386_GOT32: 2467 case R_386_GOT32X: 2468 /* Relocation is to the entry for this symbol in the global 2469 offset table. */ 2470 if (htab->sgot == NULL) 2471 abort (); 2472 2473 if (h != NULL) 2474 { 2475 bfd_boolean dyn; 2476 2477 off = h->got.offset; 2478 dyn = htab->elf.dynamic_sections_created; 2479 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 2480 || (info->shared 2481 && SYMBOL_REFERENCES_LOCAL (info, h)) 2482 || (ELF_ST_VISIBILITY (h->other) 2483 && h->root.type == bfd_link_hash_undefweak)) 2484 { 2485 /* This is actually a static link, or it is a 2486 -Bsymbolic link and the symbol is defined 2487 locally, or the symbol was forced to be local 2488 because of a version file. We must initialize 2489 this entry in the global offset table. Since the 2490 offset must always be a multiple of 4, we use the 2491 least significant bit to record whether we have 2492 initialized it already. 2493 2494 When doing a dynamic link, we create a .rel.got 2495 relocation entry to initialize the value. This 2496 is done in the finish_dynamic_symbol routine. */ 2497 if ((off & 1) != 0) 2498 off &= ~1; 2499 else 2500 { 2501 bfd_put_32 (output_bfd, relocation, 2502 htab->sgot->contents + off); 2503 h->got.offset |= 1; 2504 } 2505 } 2506 else 2507 unresolved_reloc = FALSE; 2508 } 2509 else 2510 { 2511 if (local_got_offsets == NULL) 2512 abort (); 2513 2514 off = local_got_offsets[r_symndx]; 2515 2516 /* The offset must always be a multiple of 4. We use 2517 the least significant bit to record whether we have 2518 already generated the necessary reloc. */ 2519 if ((off & 1) != 0) 2520 off &= ~1; 2521 else 2522 { 2523 bfd_put_32 (output_bfd, relocation, 2524 htab->sgot->contents + off); 2525 2526 if (info->shared) 2527 { 2528 asection *s; 2529 Elf_Internal_Rela outrel; 2530 bfd_byte *loc; 2531 2532 s = htab->srelgot; 2533 if (s == NULL) 2534 abort (); 2535 2536 outrel.r_offset = (htab->sgot->output_section->vma 2537 + htab->sgot->output_offset 2538 + off); 2539 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 2540 loc = s->contents; 2541 loc += s->reloc_count++ * sizeof (Elf32_External_Rel); 2542 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2543 } 2544 2545 local_got_offsets[r_symndx] |= 1; 2546 } 2547 } 2548 2549 if (off >= (bfd_vma) -2) 2550 abort (); 2551 2552 relocation = htab->sgot->output_section->vma 2553 + htab->sgot->output_offset + off 2554 - htab->sgotplt->output_section->vma 2555 - htab->sgotplt->output_offset; 2556 break; 2557 2558 case R_386_GOTOFF: 2559 /* Relocation is relative to the start of the global offset 2560 table. */ 2561 2562 /* Check to make sure it isn't a protected function symbol 2563 for shared library since it may not be local when used 2564 as function address. */ 2565 if (info->shared 2566 && !info->executable 2567 && h 2568 && h->def_regular 2569 && h->type == STT_FUNC 2570 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) 2571 { 2572 (*_bfd_error_handler) 2573 (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"), 2574 input_bfd, h->root.root.string); 2575 bfd_set_error (bfd_error_bad_value); 2576 return FALSE; 2577 } 2578 2579 /* Note that sgot is not involved in this 2580 calculation. We always want the start of .got.plt. If we 2581 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is 2582 permitted by the ABI, we might have to change this 2583 calculation. */ 2584 relocation -= htab->sgotplt->output_section->vma 2585 + htab->sgotplt->output_offset; 2586 break; 2587 2588 case R_386_GOTPC: 2589 /* Use global offset table as symbol value. */ 2590 relocation = htab->sgotplt->output_section->vma 2591 + htab->sgotplt->output_offset; 2592 unresolved_reloc = FALSE; 2593 break; 2594 2595 case R_386_PLT32: 2596 /* Relocation is to the entry for this symbol in the 2597 procedure linkage table. */ 2598 2599 /* Resolve a PLT32 reloc against a local symbol directly, 2600 without using the procedure linkage table. */ 2601 if (h == NULL) 2602 break; 2603 2604 if (h->plt.offset == (bfd_vma) -1 2605 || htab->splt == NULL) 2606 { 2607 /* We didn't make a PLT entry for this symbol. This 2608 happens when statically linking PIC code, or when 2609 using -Bsymbolic. */ 2610 break; 2611 } 2612 2613 relocation = (htab->splt->output_section->vma 2614 + htab->splt->output_offset 2615 + h->plt.offset); 2616 unresolved_reloc = FALSE; 2617 break; 2618 2619 case R_386_32: 2620 case R_386_PC32: 2621 if ((input_section->flags & SEC_ALLOC) == 0) 2622 break; 2623 2624 if ((info->shared 2625 && (h == NULL 2626 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 2627 || h->root.type != bfd_link_hash_undefweak) 2628 && (r_type != R_386_PC32 2629 || !SYMBOL_CALLS_LOCAL (info, h))) 2630 || (ELIMINATE_COPY_RELOCS 2631 && !info->shared 2632 && h != NULL 2633 && h->dynindx != -1 2634 && !h->non_got_ref 2635 && ((h->def_dynamic 2636 && !h->def_regular) 2637 || h->root.type == bfd_link_hash_undefweak 2638 || h->root.type == bfd_link_hash_undefined))) 2639 { 2640 Elf_Internal_Rela outrel; 2641 bfd_byte *loc; 2642 bfd_boolean skip, relocate; 2643 asection *sreloc; 2644 2645 /* When generating a shared object, these relocations 2646 are copied into the output file to be resolved at run 2647 time. */ 2648 2649 skip = FALSE; 2650 relocate = FALSE; 2651 2652 outrel.r_offset = 2653 _bfd_elf_section_offset (output_bfd, info, input_section, 2654 rel->r_offset); 2655 if (outrel.r_offset == (bfd_vma) -1) 2656 skip = TRUE; 2657 else if (outrel.r_offset == (bfd_vma) -2) 2658 skip = TRUE, relocate = TRUE; 2659 outrel.r_offset += (input_section->output_section->vma 2660 + input_section->output_offset); 2661 2662 if (skip) 2663 memset (&outrel, 0, sizeof outrel); 2664 else if (h != NULL 2665 && h->dynindx != -1 2666 && (r_type == R_386_PC32 2667 || !info->shared 2668 || !info->symbolic 2669 || !h->def_regular)) 2670 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 2671 else 2672 { 2673 /* This symbol is local, or marked to become local. */ 2674 relocate = TRUE; 2675 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 2676 } 2677 2678 sreloc = elf_section_data (input_section)->sreloc; 2679 if (sreloc == NULL) 2680 abort (); 2681 2682 loc = sreloc->contents; 2683 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 2684 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2685 2686 /* If this reloc is against an external symbol, we do 2687 not want to fiddle with the addend. Otherwise, we 2688 need to include the symbol value so that it becomes 2689 an addend for the dynamic reloc. */ 2690 if (! relocate) 2691 continue; 2692 } 2693 break; 2694 2695 case R_386_TLS_IE: 2696 if (info->shared) 2697 { 2698 Elf_Internal_Rela outrel; 2699 bfd_byte *loc; 2700 asection *sreloc; 2701 2702 outrel.r_offset = rel->r_offset 2703 + input_section->output_section->vma 2704 + input_section->output_offset; 2705 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 2706 sreloc = elf_section_data (input_section)->sreloc; 2707 if (sreloc == NULL) 2708 abort (); 2709 loc = sreloc->contents; 2710 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 2711 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 2712 } 2713 /* Fall through */ 2714 2715 case R_386_TLS_GD: 2716 case R_386_TLS_GOTDESC: 2717 case R_386_TLS_DESC_CALL: 2718 case R_386_TLS_IE_32: 2719 case R_386_TLS_GOTIE: 2720 r_type = elf_i386_tls_transition (info, r_type, h == NULL); 2721 tls_type = GOT_UNKNOWN; 2722 if (h == NULL && local_got_offsets) 2723 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx]; 2724 else if (h != NULL) 2725 { 2726 tls_type = elf_i386_hash_entry(h)->tls_type; 2727 /* If we have both R_386_TLS_IE and R_386_TLS_GD, 2728 GOT_TLS_IE_BOTH should be used. */ 2729 if ((tls_type & GOT_TLS_IE_MASK) 2730 == (GOT_TLS_IE_IE | GOT_TLS_IE_GD)) 2731 tls_type = GOT_TLS_IE_BOTH; 2732 else 2733 tls_type &= GOT_TLS_MASK; 2734 if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE)) 2735 r_type = R_386_TLS_LE_32; 2736 } 2737 if (tls_type == GOT_TLS_IE) 2738 tls_type = GOT_TLS_IE_NEG; 2739 if (r_type == R_386_TLS_GD 2740 || r_type == R_386_TLS_GOTDESC 2741 || r_type == R_386_TLS_DESC_CALL) 2742 { 2743 if (tls_type == GOT_TLS_IE_POS) 2744 r_type = R_386_TLS_GOTIE; 2745 else if (tls_type & GOT_TLS_IE) 2746 r_type = R_386_TLS_IE_32; 2747 } 2748 2749 if (r_type == R_386_TLS_LE_32) 2750 { 2751 BFD_ASSERT (! unresolved_reloc); 2752 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD) 2753 { 2754 unsigned int val, type; 2755 bfd_vma roff; 2756 2757 /* GD->LE transition. */ 2758 BFD_ASSERT (rel->r_offset >= 2); 2759 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2760 BFD_ASSERT (type == 0x8d || type == 0x04); 2761 BFD_ASSERT (rel->r_offset + 9 <= input_section->size); 2762 BFD_ASSERT (bfd_get_8 (input_bfd, 2763 contents + rel->r_offset + 4) 2764 == 0xe8); 2765 BFD_ASSERT (rel + 1 < relend); 2766 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 2767 roff = rel->r_offset + 5; 2768 val = bfd_get_8 (input_bfd, 2769 contents + rel->r_offset - 1); 2770 if (type == 0x04) 2771 { 2772 /* leal foo(,%reg,1), %eax; call ___tls_get_addr 2773 Change it into: 2774 movl %gs:0, %eax; subl $foo@tpoff, %eax 2775 (6 byte form of subl). */ 2776 BFD_ASSERT (rel->r_offset >= 3); 2777 BFD_ASSERT (bfd_get_8 (input_bfd, 2778 contents + rel->r_offset - 3) 2779 == 0x8d); 2780 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3)); 2781 memcpy (contents + rel->r_offset - 3, 2782 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 2783 } 2784 else 2785 { 2786 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 2787 if (rel->r_offset + 10 <= input_section->size 2788 && bfd_get_8 (input_bfd, 2789 contents + rel->r_offset + 9) == 0x90) 2790 { 2791 /* leal foo(%reg), %eax; call ___tls_get_addr; nop 2792 Change it into: 2793 movl %gs:0, %eax; subl $foo@tpoff, %eax 2794 (6 byte form of subl). */ 2795 memcpy (contents + rel->r_offset - 2, 2796 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 2797 roff = rel->r_offset + 6; 2798 } 2799 else 2800 { 2801 /* leal foo(%reg), %eax; call ___tls_get_addr 2802 Change it into: 2803 movl %gs:0, %eax; subl $foo@tpoff, %eax 2804 (5 byte form of subl). */ 2805 memcpy (contents + rel->r_offset - 2, 2806 "\x65\xa1\0\0\0\0\x2d\0\0\0", 11); 2807 } 2808 } 2809 bfd_put_32 (output_bfd, tpoff (info, relocation), 2810 contents + roff); 2811 /* Skip R_386_PLT32. */ 2812 rel++; 2813 continue; 2814 } 2815 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC) 2816 { 2817 /* GDesc -> LE transition. 2818 It's originally something like: 2819 leal x@tlsdesc(%ebx), %eax 2820 2821 leal x@ntpoff, %eax 2822 2823 Registers other than %eax may be set up here. */ 2824 2825 unsigned int val, type; 2826 bfd_vma roff; 2827 2828 /* First, make sure it's a leal adding ebx to a 2829 32-bit offset into any register, although it's 2830 probably almost always going to be eax. */ 2831 roff = rel->r_offset; 2832 BFD_ASSERT (roff >= 2); 2833 type = bfd_get_8 (input_bfd, contents + roff - 2); 2834 BFD_ASSERT (type == 0x8d); 2835 val = bfd_get_8 (input_bfd, contents + roff - 1); 2836 BFD_ASSERT ((val & 0xc7) == 0x83); 2837 BFD_ASSERT (roff + 4 <= input_section->size); 2838 2839 /* Now modify the instruction as appropriate. */ 2840 /* aoliva FIXME: remove the above and xor the byte 2841 below with 0x86. */ 2842 bfd_put_8 (output_bfd, val ^ 0x86, 2843 contents + roff - 1); 2844 bfd_put_32 (output_bfd, -tpoff (info, relocation), 2845 contents + roff); 2846 continue; 2847 } 2848 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL) 2849 { 2850 /* GDesc -> LE transition. 2851 It's originally: 2852 call *(%eax) 2853 Turn it into: 2854 nop; nop */ 2855 2856 unsigned int val, type; 2857 bfd_vma roff; 2858 2859 /* First, make sure it's a call *(%eax). */ 2860 roff = rel->r_offset; 2861 BFD_ASSERT (roff + 2 <= input_section->size); 2862 type = bfd_get_8 (input_bfd, contents + roff); 2863 BFD_ASSERT (type == 0xff); 2864 val = bfd_get_8 (input_bfd, contents + roff + 1); 2865 BFD_ASSERT (val == 0x10); 2866 2867 /* Now modify the instruction as appropriate. */ 2868 bfd_put_8 (output_bfd, 0x90, contents + roff); 2869 bfd_put_8 (output_bfd, 0x90, contents + roff + 1); 2870 continue; 2871 } 2872 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE) 2873 { 2874 unsigned int val, type; 2875 2876 /* IE->LE transition: 2877 Originally it can be one of: 2878 movl foo, %eax 2879 movl foo, %reg 2880 addl foo, %reg 2881 We change it into: 2882 movl $foo, %eax 2883 movl $foo, %reg 2884 addl $foo, %reg. */ 2885 BFD_ASSERT (rel->r_offset >= 1); 2886 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2887 BFD_ASSERT (rel->r_offset + 4 <= input_section->size); 2888 if (val == 0xa1) 2889 { 2890 /* movl foo, %eax. */ 2891 bfd_put_8 (output_bfd, 0xb8, 2892 contents + rel->r_offset - 1); 2893 } 2894 else 2895 { 2896 BFD_ASSERT (rel->r_offset >= 2); 2897 type = bfd_get_8 (input_bfd, 2898 contents + rel->r_offset - 2); 2899 switch (type) 2900 { 2901 case 0x8b: 2902 /* movl */ 2903 BFD_ASSERT ((val & 0xc7) == 0x05); 2904 bfd_put_8 (output_bfd, 0xc7, 2905 contents + rel->r_offset - 2); 2906 bfd_put_8 (output_bfd, 2907 0xc0 | ((val >> 3) & 7), 2908 contents + rel->r_offset - 1); 2909 break; 2910 case 0x03: 2911 /* addl */ 2912 BFD_ASSERT ((val & 0xc7) == 0x05); 2913 bfd_put_8 (output_bfd, 0x81, 2914 contents + rel->r_offset - 2); 2915 bfd_put_8 (output_bfd, 2916 0xc0 | ((val >> 3) & 7), 2917 contents + rel->r_offset - 1); 2918 break; 2919 default: 2920 BFD_FAIL (); 2921 break; 2922 } 2923 } 2924 bfd_put_32 (output_bfd, -tpoff (info, relocation), 2925 contents + rel->r_offset); 2926 continue; 2927 } 2928 else 2929 { 2930 unsigned int val, type; 2931 2932 /* {IE_32,GOTIE}->LE transition: 2933 Originally it can be one of: 2934 subl foo(%reg1), %reg2 2935 movl foo(%reg1), %reg2 2936 addl foo(%reg1), %reg2 2937 We change it into: 2938 subl $foo, %reg2 2939 movl $foo, %reg2 (6 byte form) 2940 addl $foo, %reg2. */ 2941 BFD_ASSERT (rel->r_offset >= 2); 2942 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 2943 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 2944 BFD_ASSERT (rel->r_offset + 4 <= input_section->size); 2945 BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4); 2946 if (type == 0x8b) 2947 { 2948 /* movl */ 2949 bfd_put_8 (output_bfd, 0xc7, 2950 contents + rel->r_offset - 2); 2951 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7), 2952 contents + rel->r_offset - 1); 2953 } 2954 else if (type == 0x2b) 2955 { 2956 /* subl */ 2957 bfd_put_8 (output_bfd, 0x81, 2958 contents + rel->r_offset - 2); 2959 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7), 2960 contents + rel->r_offset - 1); 2961 } 2962 else if (type == 0x03) 2963 { 2964 /* addl */ 2965 bfd_put_8 (output_bfd, 0x81, 2966 contents + rel->r_offset - 2); 2967 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7), 2968 contents + rel->r_offset - 1); 2969 } 2970 else 2971 BFD_FAIL (); 2972 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE) 2973 bfd_put_32 (output_bfd, -tpoff (info, relocation), 2974 contents + rel->r_offset); 2975 else 2976 bfd_put_32 (output_bfd, tpoff (info, relocation), 2977 contents + rel->r_offset); 2978 continue; 2979 } 2980 } 2981 2982 if (htab->sgot == NULL) 2983 abort (); 2984 2985 if (h != NULL) 2986 { 2987 off = h->got.offset; 2988 offplt = elf_i386_hash_entry (h)->tlsdesc_got; 2989 } 2990 else 2991 { 2992 if (local_got_offsets == NULL) 2993 abort (); 2994 2995 off = local_got_offsets[r_symndx]; 2996 offplt = local_tlsdesc_gotents[r_symndx]; 2997 } 2998 2999 if ((off & 1) != 0) 3000 off &= ~1; 3001 else 3002 { 3003 Elf_Internal_Rela outrel; 3004 bfd_byte *loc; 3005 int dr_type, indx; 3006 asection *sreloc; 3007 3008 if (htab->srelgot == NULL) 3009 abort (); 3010 3011 indx = h && h->dynindx != -1 ? h->dynindx : 0; 3012 3013 if (GOT_TLS_GDESC_P (tls_type)) 3014 { 3015 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC); 3016 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8 3017 <= htab->sgotplt->size); 3018 outrel.r_offset = (htab->sgotplt->output_section->vma 3019 + htab->sgotplt->output_offset 3020 + offplt 3021 + htab->sgotplt_jump_table_size); 3022 sreloc = htab->srelplt; 3023 loc = sreloc->contents; 3024 loc += (htab->next_tls_desc_index++ 3025 * sizeof (Elf32_External_Rel)); 3026 BFD_ASSERT (loc + sizeof (Elf32_External_Rel) 3027 <= sreloc->contents + sreloc->size); 3028 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3029 if (indx == 0) 3030 { 3031 BFD_ASSERT (! unresolved_reloc); 3032 bfd_put_32 (output_bfd, 3033 relocation - dtpoff_base (info), 3034 htab->sgotplt->contents + offplt 3035 + htab->sgotplt_jump_table_size + 4); 3036 } 3037 else 3038 { 3039 bfd_put_32 (output_bfd, 0, 3040 htab->sgotplt->contents + offplt 3041 + htab->sgotplt_jump_table_size + 4); 3042 } 3043 } 3044 3045 sreloc = htab->srelgot; 3046 3047 outrel.r_offset = (htab->sgot->output_section->vma 3048 + htab->sgot->output_offset + off); 3049 3050 if (GOT_TLS_GD_P (tls_type)) 3051 dr_type = R_386_TLS_DTPMOD32; 3052 else if (GOT_TLS_GDESC_P (tls_type)) 3053 goto dr_done; 3054 else if (tls_type == GOT_TLS_IE_POS) 3055 dr_type = R_386_TLS_TPOFF; 3056 else 3057 dr_type = R_386_TLS_TPOFF32; 3058 3059 if (dr_type == R_386_TLS_TPOFF && indx == 0) 3060 bfd_put_32 (output_bfd, relocation - dtpoff_base (info), 3061 htab->sgot->contents + off); 3062 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0) 3063 bfd_put_32 (output_bfd, dtpoff_base (info) - relocation, 3064 htab->sgot->contents + off); 3065 else if (dr_type != R_386_TLS_DESC) 3066 bfd_put_32 (output_bfd, 0, 3067 htab->sgot->contents + off); 3068 outrel.r_info = ELF32_R_INFO (indx, dr_type); 3069 3070 loc = sreloc->contents; 3071 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 3072 BFD_ASSERT (loc + sizeof (Elf32_External_Rel) 3073 <= sreloc->contents + sreloc->size); 3074 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3075 3076 if (GOT_TLS_GD_P (tls_type)) 3077 { 3078 if (indx == 0) 3079 { 3080 BFD_ASSERT (! unresolved_reloc); 3081 bfd_put_32 (output_bfd, 3082 relocation - dtpoff_base (info), 3083 htab->sgot->contents + off + 4); 3084 } 3085 else 3086 { 3087 bfd_put_32 (output_bfd, 0, 3088 htab->sgot->contents + off + 4); 3089 outrel.r_info = ELF32_R_INFO (indx, 3090 R_386_TLS_DTPOFF32); 3091 outrel.r_offset += 4; 3092 sreloc->reloc_count++; 3093 loc += sizeof (Elf32_External_Rel); 3094 BFD_ASSERT (loc + sizeof (Elf32_External_Rel) 3095 <= sreloc->contents + sreloc->size); 3096 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3097 } 3098 } 3099 else if (tls_type == GOT_TLS_IE_BOTH) 3100 { 3101 bfd_put_32 (output_bfd, 3102 indx == 0 ? relocation - dtpoff_base (info) : 0, 3103 htab->sgot->contents + off + 4); 3104 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF); 3105 outrel.r_offset += 4; 3106 sreloc->reloc_count++; 3107 loc += sizeof (Elf32_External_Rel); 3108 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3109 } 3110 3111 dr_done: 3112 if (h != NULL) 3113 h->got.offset |= 1; 3114 else 3115 local_got_offsets[r_symndx] |= 1; 3116 } 3117 3118 if (off >= (bfd_vma) -2 3119 && ! GOT_TLS_GDESC_P (tls_type)) 3120 abort (); 3121 if (r_type == R_386_TLS_GOTDESC 3122 || r_type == R_386_TLS_DESC_CALL) 3123 { 3124 relocation = htab->sgotplt_jump_table_size + offplt; 3125 unresolved_reloc = FALSE; 3126 } 3127 else if (r_type == ELF32_R_TYPE (rel->r_info)) 3128 { 3129 bfd_vma g_o_t = htab->sgotplt->output_section->vma 3130 + htab->sgotplt->output_offset; 3131 relocation = htab->sgot->output_section->vma 3132 + htab->sgot->output_offset + off - g_o_t; 3133 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE) 3134 && tls_type == GOT_TLS_IE_BOTH) 3135 relocation += 4; 3136 if (r_type == R_386_TLS_IE) 3137 relocation += g_o_t; 3138 unresolved_reloc = FALSE; 3139 } 3140 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD) 3141 { 3142 unsigned int val, type; 3143 bfd_vma roff; 3144 3145 /* GD->IE transition. */ 3146 BFD_ASSERT (rel->r_offset >= 2); 3147 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2); 3148 BFD_ASSERT (type == 0x8d || type == 0x04); 3149 BFD_ASSERT (rel->r_offset + 9 <= input_section->size); 3150 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4) 3151 == 0xe8); 3152 BFD_ASSERT (rel + 1 < relend); 3153 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 3154 roff = rel->r_offset - 3; 3155 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 3156 if (type == 0x04) 3157 { 3158 /* leal foo(,%reg,1), %eax; call ___tls_get_addr 3159 Change it into: 3160 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */ 3161 BFD_ASSERT (rel->r_offset >= 3); 3162 BFD_ASSERT (bfd_get_8 (input_bfd, 3163 contents + rel->r_offset - 3) 3164 == 0x8d); 3165 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3)); 3166 val >>= 3; 3167 } 3168 else 3169 { 3170 /* leal foo(%reg), %eax; call ___tls_get_addr; nop 3171 Change it into: 3172 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */ 3173 BFD_ASSERT (rel->r_offset + 10 <= input_section->size); 3174 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 3175 BFD_ASSERT (bfd_get_8 (input_bfd, 3176 contents + rel->r_offset + 9) 3177 == 0x90); 3178 roff = rel->r_offset - 2; 3179 } 3180 memcpy (contents + roff, 3181 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12); 3182 contents[roff + 7] = 0x80 | (val & 7); 3183 /* If foo is used only with foo@gotntpoff(%reg) and 3184 foo@indntpoff, but not with foo@gottpoff(%reg), change 3185 subl $foo@gottpoff(%reg), %eax 3186 into: 3187 addl $foo@gotntpoff(%reg), %eax. */ 3188 if (r_type == R_386_TLS_GOTIE) 3189 { 3190 contents[roff + 6] = 0x03; 3191 if (tls_type == GOT_TLS_IE_BOTH) 3192 off += 4; 3193 } 3194 bfd_put_32 (output_bfd, 3195 htab->sgot->output_section->vma 3196 + htab->sgot->output_offset + off 3197 - htab->sgotplt->output_section->vma 3198 - htab->sgotplt->output_offset, 3199 contents + roff + 8); 3200 /* Skip R_386_PLT32. */ 3201 rel++; 3202 continue; 3203 } 3204 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC) 3205 { 3206 /* GDesc -> IE transition. 3207 It's originally something like: 3208 leal x@tlsdesc(%ebx), %eax 3209 3210 Change it to: 3211 movl x@gotntpoff(%ebx), %eax # before nop; nop 3212 or: 3213 movl x@gottpoff(%ebx), %eax # before negl %eax 3214 3215 Registers other than %eax may be set up here. */ 3216 3217 unsigned int val, type; 3218 bfd_vma roff; 3219 3220 /* First, make sure it's a leal adding ebx to a 32-bit 3221 offset into any register, although it's probably 3222 almost always going to be eax. */ 3223 roff = rel->r_offset; 3224 BFD_ASSERT (roff >= 2); 3225 type = bfd_get_8 (input_bfd, contents + roff - 2); 3226 BFD_ASSERT (type == 0x8d); 3227 val = bfd_get_8 (input_bfd, contents + roff - 1); 3228 BFD_ASSERT ((val & 0xc7) == 0x83); 3229 BFD_ASSERT (roff + 4 <= input_section->size); 3230 3231 /* Now modify the instruction as appropriate. */ 3232 /* To turn a leal into a movl in the form we use it, it 3233 suffices to change the first byte from 0x8d to 0x8b. 3234 aoliva FIXME: should we decide to keep the leal, all 3235 we have to do is remove the statement below, and 3236 adjust the relaxation of R_386_TLS_DESC_CALL. */ 3237 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2); 3238 3239 if (tls_type == GOT_TLS_IE_BOTH) 3240 off += 4; 3241 3242 bfd_put_32 (output_bfd, 3243 htab->sgot->output_section->vma 3244 + htab->sgot->output_offset + off 3245 - htab->sgotplt->output_section->vma 3246 - htab->sgotplt->output_offset, 3247 contents + roff); 3248 continue; 3249 } 3250 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL) 3251 { 3252 /* GDesc -> IE transition. 3253 It's originally: 3254 call *(%eax) 3255 3256 Change it to: 3257 nop; nop 3258 or 3259 negl %eax 3260 depending on how we transformed the TLS_GOTDESC above. 3261 */ 3262 3263 unsigned int val, type; 3264 bfd_vma roff; 3265 3266 /* First, make sure it's a call *(%eax). */ 3267 roff = rel->r_offset; 3268 BFD_ASSERT (roff + 2 <= input_section->size); 3269 type = bfd_get_8 (input_bfd, contents + roff); 3270 BFD_ASSERT (type == 0xff); 3271 val = bfd_get_8 (input_bfd, contents + roff + 1); 3272 BFD_ASSERT (val == 0x10); 3273 3274 /* Now modify the instruction as appropriate. */ 3275 if (tls_type != GOT_TLS_IE_NEG) 3276 { 3277 /* nop; nop */ 3278 bfd_put_8 (output_bfd, 0x90, contents + roff); 3279 bfd_put_8 (output_bfd, 0x90, contents + roff + 1); 3280 } 3281 else 3282 { 3283 /* negl %eax */ 3284 bfd_put_8 (output_bfd, 0xf7, contents + roff); 3285 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1); 3286 } 3287 3288 continue; 3289 } 3290 else 3291 BFD_ASSERT (FALSE); 3292 break; 3293 3294 case R_386_TLS_LDM: 3295 if (! info->shared || info->executable) 3296 { 3297 unsigned int val; 3298 3299 /* LD->LE transition: 3300 Ensure it is: 3301 leal foo(%reg), %eax; call ___tls_get_addr. 3302 We change it into: 3303 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */ 3304 BFD_ASSERT (rel->r_offset >= 2); 3305 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2) 3306 == 0x8d); 3307 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1); 3308 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4); 3309 BFD_ASSERT (rel->r_offset + 9 <= input_section->size); 3310 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4) 3311 == 0xe8); 3312 BFD_ASSERT (rel + 1 < relend); 3313 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32); 3314 memcpy (contents + rel->r_offset - 2, 3315 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11); 3316 /* Skip R_386_PLT32. */ 3317 rel++; 3318 continue; 3319 } 3320 3321 if (htab->sgot == NULL) 3322 abort (); 3323 3324 off = htab->tls_ldm_got.offset; 3325 if (off & 1) 3326 off &= ~1; 3327 else 3328 { 3329 Elf_Internal_Rela outrel; 3330 bfd_byte *loc; 3331 3332 if (htab->srelgot == NULL) 3333 abort (); 3334 3335 outrel.r_offset = (htab->sgot->output_section->vma 3336 + htab->sgot->output_offset + off); 3337 3338 bfd_put_32 (output_bfd, 0, 3339 htab->sgot->contents + off); 3340 bfd_put_32 (output_bfd, 0, 3341 htab->sgot->contents + off + 4); 3342 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32); 3343 loc = htab->srelgot->contents; 3344 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel); 3345 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3346 htab->tls_ldm_got.offset |= 1; 3347 } 3348 relocation = htab->sgot->output_section->vma 3349 + htab->sgot->output_offset + off 3350 - htab->sgotplt->output_section->vma 3351 - htab->sgotplt->output_offset; 3352 unresolved_reloc = FALSE; 3353 break; 3354 3355 case R_386_TLS_LDO_32: 3356 if ((info->shared && !info->executable) 3357 || (input_section->flags & SEC_CODE) == 0) 3358 relocation -= dtpoff_base (info); 3359 else 3360 /* When converting LDO to LE, we must negate. */ 3361 relocation = -tpoff (info, relocation); 3362 break; 3363 3364 case R_386_TLS_LE_32: 3365 case R_386_TLS_LE: 3366 if (info->shared && !info->executable) 3367 { 3368 Elf_Internal_Rela outrel; 3369 asection *sreloc; 3370 bfd_byte *loc; 3371 int indx; 3372 3373 outrel.r_offset = rel->r_offset 3374 + input_section->output_section->vma 3375 + input_section->output_offset; 3376 if (h != NULL && h->dynindx != -1) 3377 indx = h->dynindx; 3378 else 3379 indx = 0; 3380 if (r_type == R_386_TLS_LE_32) 3381 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32); 3382 else 3383 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF); 3384 sreloc = elf_section_data (input_section)->sreloc; 3385 if (sreloc == NULL) 3386 abort (); 3387 loc = sreloc->contents; 3388 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel); 3389 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc); 3390 if (indx) 3391 continue; 3392 else if (r_type == R_386_TLS_LE_32) 3393 relocation = dtpoff_base (info) - relocation; 3394 else 3395 relocation -= dtpoff_base (info); 3396 } 3397 else if (r_type == R_386_TLS_LE_32) 3398 relocation = tpoff (info, relocation); 3399 else 3400 relocation = -tpoff (info, relocation); 3401 break; 3402 3403 default: 3404 break; 3405 } 3406 3407 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 3408 because such sections are not SEC_ALLOC and thus ld.so will 3409 not process them. */ 3410 if (unresolved_reloc 3411 && !((input_section->flags & SEC_DEBUGGING) != 0 3412 && h->def_dynamic)) 3413 { 3414 (*_bfd_error_handler) 3415 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), 3416 input_bfd, 3417 input_section, 3418 (long) rel->r_offset, 3419 howto->name, 3420 h->root.root.string); 3421 return FALSE; 3422 } 3423 3424 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 3425 contents, rel->r_offset, 3426 relocation, 0); 3427 3428 if (r != bfd_reloc_ok) 3429 { 3430 const char *name; 3431 3432 if (h != NULL) 3433 name = h->root.root.string; 3434 else 3435 { 3436 name = bfd_elf_string_from_elf_section (input_bfd, 3437 symtab_hdr->sh_link, 3438 sym->st_name); 3439 if (name == NULL) 3440 return FALSE; 3441 if (*name == '\0') 3442 name = bfd_section_name (input_bfd, sec); 3443 } 3444 3445 if (r == bfd_reloc_overflow) 3446 { 3447 if (! ((*info->callbacks->reloc_overflow) 3448 (info, (h ? &h->root : NULL), name, howto->name, 3449 (bfd_vma) 0, input_bfd, input_section, 3450 rel->r_offset))) 3451 return FALSE; 3452 } 3453 else 3454 { 3455 (*_bfd_error_handler) 3456 (_("%B(%A+0x%lx): reloc against `%s': error %d"), 3457 input_bfd, input_section, 3458 (long) rel->r_offset, name, (int) r); 3459 return FALSE; 3460 } 3461 } 3462 } 3463 3464 return TRUE; 3465 } 3466 3467 /* Finish up dynamic symbol handling. We set the contents of various 3468 dynamic sections here. */ 3469 3470 static bfd_boolean 3471 elf_i386_finish_dynamic_symbol (bfd *output_bfd, 3472 struct bfd_link_info *info, 3473 struct elf_link_hash_entry *h, 3474 Elf_Internal_Sym *sym) 3475 { 3476 struct elf_i386_link_hash_table *htab; 3477 3478 htab = elf_i386_hash_table (info); 3479 3480 if (h->plt.offset != (bfd_vma) -1) 3481 { 3482 bfd_vma plt_index; 3483 bfd_vma got_offset; 3484 Elf_Internal_Rela rel; 3485 bfd_byte *loc; 3486 3487 /* This symbol has an entry in the procedure linkage table. Set 3488 it up. */ 3489 3490 if (h->dynindx == -1 3491 || htab->splt == NULL 3492 || htab->sgotplt == NULL 3493 || htab->srelplt == NULL) 3494 abort (); 3495 3496 /* Get the index in the procedure linkage table which 3497 corresponds to this symbol. This is the index of this symbol 3498 in all the symbols for which we are making plt entries. The 3499 first entry in the procedure linkage table is reserved. */ 3500 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; 3501 3502 /* Get the offset into the .got table of the entry that 3503 corresponds to this function. Each .got entry is 4 bytes. 3504 The first three are reserved. */ 3505 got_offset = (plt_index + 3) * 4; 3506 3507 /* Fill in the entry in the procedure linkage table. */ 3508 if (! info->shared) 3509 { 3510 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry, 3511 PLT_ENTRY_SIZE); 3512 bfd_put_32 (output_bfd, 3513 (htab->sgotplt->output_section->vma 3514 + htab->sgotplt->output_offset 3515 + got_offset), 3516 htab->splt->contents + h->plt.offset + 2); 3517 3518 if (htab->is_vxworks) 3519 { 3520 int s, k, reloc_index; 3521 3522 /* Create the R_386_32 relocation referencing the GOT 3523 for this PLT entry. */ 3524 3525 /* S: Current slot number (zero-based). */ 3526 s = (h->plt.offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE; 3527 /* K: Number of relocations for PLTResolve. */ 3528 if (info->shared) 3529 k = PLTRESOLVE_RELOCS_SHLIB; 3530 else 3531 k = PLTRESOLVE_RELOCS; 3532 /* Skip the PLTresolve relocations, and the relocations for 3533 the other PLT slots. */ 3534 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS; 3535 loc = (htab->srelplt2->contents + reloc_index 3536 * sizeof (Elf32_External_Rel)); 3537 3538 rel.r_offset = (htab->splt->output_section->vma 3539 + htab->splt->output_offset 3540 + h->plt.offset + 2), 3541 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32); 3542 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 3543 3544 /* Create the R_386_32 relocation referencing the beginning of 3545 the PLT for this GOT entry. */ 3546 rel.r_offset = (htab->sgotplt->output_section->vma 3547 + htab->sgotplt->output_offset 3548 + got_offset); 3549 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32); 3550 bfd_elf32_swap_reloc_out (output_bfd, &rel, 3551 loc + sizeof (Elf32_External_Rel)); 3552 } 3553 } 3554 else 3555 { 3556 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry, 3557 PLT_ENTRY_SIZE); 3558 bfd_put_32 (output_bfd, got_offset, 3559 htab->splt->contents + h->plt.offset + 2); 3560 } 3561 3562 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel), 3563 htab->splt->contents + h->plt.offset + 7); 3564 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE), 3565 htab->splt->contents + h->plt.offset + 12); 3566 3567 /* Fill in the entry in the global offset table. */ 3568 bfd_put_32 (output_bfd, 3569 (htab->splt->output_section->vma 3570 + htab->splt->output_offset 3571 + h->plt.offset 3572 + 6), 3573 htab->sgotplt->contents + got_offset); 3574 3575 /* Fill in the entry in the .rel.plt section. */ 3576 rel.r_offset = (htab->sgotplt->output_section->vma 3577 + htab->sgotplt->output_offset 3578 + got_offset); 3579 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT); 3580 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel); 3581 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 3582 3583 if (!h->def_regular) 3584 { 3585 /* Mark the symbol as undefined, rather than as defined in 3586 the .plt section. Leave the value if there were any 3587 relocations where pointer equality matters (this is a clue 3588 for the dynamic linker, to make function pointer 3589 comparisons work between an application and shared 3590 library), otherwise set it to zero. If a function is only 3591 called from a binary, there is no need to slow down 3592 shared libraries because of that. */ 3593 sym->st_shndx = SHN_UNDEF; 3594 if (!h->pointer_equality_needed) 3595 sym->st_value = 0; 3596 } 3597 } 3598 3599 if (h->got.offset != (bfd_vma) -1 3600 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type) 3601 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0) 3602 { 3603 Elf_Internal_Rela rel; 3604 bfd_byte *loc; 3605 3606 /* This symbol has an entry in the global offset table. Set it 3607 up. */ 3608 3609 if (htab->sgot == NULL || htab->srelgot == NULL) 3610 abort (); 3611 3612 rel.r_offset = (htab->sgot->output_section->vma 3613 + htab->sgot->output_offset 3614 + (h->got.offset & ~(bfd_vma) 1)); 3615 3616 /* If this is a static link, or it is a -Bsymbolic link and the 3617 symbol is defined locally or was forced to be local because 3618 of a version file, we just want to emit a RELATIVE reloc. 3619 The entry in the global offset table will already have been 3620 initialized in the relocate_section function. */ 3621 if (info->shared 3622 && SYMBOL_REFERENCES_LOCAL (info, h)) 3623 { 3624 BFD_ASSERT((h->got.offset & 1) != 0); 3625 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); 3626 } 3627 else 3628 { 3629 BFD_ASSERT((h->got.offset & 1) == 0); 3630 bfd_put_32 (output_bfd, (bfd_vma) 0, 3631 htab->sgot->contents + h->got.offset); 3632 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT); 3633 } 3634 3635 loc = htab->srelgot->contents; 3636 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel); 3637 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 3638 } 3639 3640 if (h->needs_copy) 3641 { 3642 Elf_Internal_Rela rel; 3643 bfd_byte *loc; 3644 3645 /* This symbol needs a copy reloc. Set it up. */ 3646 3647 if (h->dynindx == -1 3648 || (h->root.type != bfd_link_hash_defined 3649 && h->root.type != bfd_link_hash_defweak) 3650 || htab->srelbss == NULL) 3651 abort (); 3652 3653 rel.r_offset = (h->root.u.def.value 3654 + h->root.u.def.section->output_section->vma 3655 + h->root.u.def.section->output_offset); 3656 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY); 3657 loc = htab->srelbss->contents; 3658 loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel); 3659 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 3660 } 3661 3662 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. 3663 On VxWorks, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it 3664 is relative to the ".got" section. */ 3665 if (strcmp (h->root.root.string, "_DYNAMIC") == 0 3666 || (!htab->is_vxworks && h == htab->elf.hgot)) 3667 sym->st_shndx = SHN_ABS; 3668 3669 return TRUE; 3670 } 3671 3672 /* Used to decide how to sort relocs in an optimal manner for the 3673 dynamic linker, before writing them out. */ 3674 3675 static enum elf_reloc_type_class 3676 elf_i386_reloc_type_class (const Elf_Internal_Rela *rela) 3677 { 3678 switch (ELF32_R_TYPE (rela->r_info)) 3679 { 3680 case R_386_RELATIVE: 3681 return reloc_class_relative; 3682 case R_386_JUMP_SLOT: 3683 return reloc_class_plt; 3684 case R_386_COPY: 3685 return reloc_class_copy; 3686 default: 3687 return reloc_class_normal; 3688 } 3689 } 3690 3691 /* Finish up the dynamic sections. */ 3692 3693 static bfd_boolean 3694 elf_i386_finish_dynamic_sections (bfd *output_bfd, 3695 struct bfd_link_info *info) 3696 { 3697 struct elf_i386_link_hash_table *htab; 3698 bfd *dynobj; 3699 asection *sdyn; 3700 3701 htab = elf_i386_hash_table (info); 3702 dynobj = htab->elf.dynobj; 3703 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); 3704 3705 if (htab->elf.dynamic_sections_created) 3706 { 3707 Elf32_External_Dyn *dyncon, *dynconend; 3708 3709 if (sdyn == NULL || htab->sgot == NULL) 3710 abort (); 3711 3712 dyncon = (Elf32_External_Dyn *) sdyn->contents; 3713 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 3714 for (; dyncon < dynconend; dyncon++) 3715 { 3716 Elf_Internal_Dyn dyn; 3717 asection *s; 3718 3719 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); 3720 3721 switch (dyn.d_tag) 3722 { 3723 default: 3724 continue; 3725 3726 case DT_PLTGOT: 3727 s = htab->sgotplt; 3728 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 3729 break; 3730 3731 case DT_JMPREL: 3732 s = htab->srelplt; 3733 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 3734 break; 3735 3736 case DT_PLTRELSZ: 3737 s = htab->srelplt; 3738 dyn.d_un.d_val = s->size; 3739 break; 3740 3741 case DT_RELSZ: 3742 /* My reading of the SVR4 ABI indicates that the 3743 procedure linkage table relocs (DT_JMPREL) should be 3744 included in the overall relocs (DT_REL). This is 3745 what Solaris does. However, UnixWare can not handle 3746 that case. Therefore, we override the DT_RELSZ entry 3747 here to make it not include the JMPREL relocs. */ 3748 s = htab->srelplt; 3749 if (s == NULL) 3750 continue; 3751 dyn.d_un.d_val -= s->size; 3752 break; 3753 3754 case DT_REL: 3755 /* We may not be using the standard ELF linker script. 3756 If .rel.plt is the first .rel section, we adjust 3757 DT_REL to not include it. */ 3758 s = htab->srelplt; 3759 if (s == NULL) 3760 continue; 3761 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset) 3762 continue; 3763 dyn.d_un.d_ptr += s->size; 3764 break; 3765 } 3766 3767 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3768 } 3769 3770 /* Fill in the first entry in the procedure linkage table. */ 3771 if (htab->splt && htab->splt->size > 0) 3772 { 3773 if (info->shared) 3774 { 3775 memcpy (htab->splt->contents, elf_i386_pic_plt0_entry, 3776 sizeof (elf_i386_pic_plt0_entry)); 3777 memset (htab->splt->contents + sizeof (elf_i386_pic_plt0_entry), 3778 htab->plt0_pad_byte, 3779 PLT_ENTRY_SIZE - sizeof (elf_i386_pic_plt0_entry)); 3780 } 3781 else 3782 { 3783 memcpy (htab->splt->contents, elf_i386_plt0_entry, 3784 sizeof(elf_i386_plt0_entry)); 3785 memset (htab->splt->contents + sizeof (elf_i386_plt0_entry), 3786 htab->plt0_pad_byte, 3787 PLT_ENTRY_SIZE - sizeof (elf_i386_plt0_entry)); 3788 bfd_put_32 (output_bfd, 3789 (htab->sgotplt->output_section->vma 3790 + htab->sgotplt->output_offset 3791 + 4), 3792 htab->splt->contents + 2); 3793 bfd_put_32 (output_bfd, 3794 (htab->sgotplt->output_section->vma 3795 + htab->sgotplt->output_offset 3796 + 8), 3797 htab->splt->contents + 8); 3798 3799 if (htab->is_vxworks) 3800 { 3801 Elf_Internal_Rela rel; 3802 3803 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4. 3804 On IA32 we use REL relocations so the addend goes in 3805 the PLT directly. */ 3806 rel.r_offset = (htab->splt->output_section->vma 3807 + htab->splt->output_offset 3808 + 2); 3809 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32); 3810 bfd_elf32_swap_reloc_out (output_bfd, &rel, 3811 htab->srelplt2->contents); 3812 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */ 3813 rel.r_offset = (htab->splt->output_section->vma 3814 + htab->splt->output_offset 3815 + 8); 3816 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32); 3817 bfd_elf32_swap_reloc_out (output_bfd, &rel, 3818 htab->srelplt2->contents + 3819 sizeof (Elf32_External_Rel)); 3820 } 3821 } 3822 3823 /* UnixWare sets the entsize of .plt to 4, although that doesn't 3824 really seem like the right value. */ 3825 elf_section_data (htab->splt->output_section) 3826 ->this_hdr.sh_entsize = 4; 3827 3828 /* Correct the .rel.plt.unloaded relocations. */ 3829 if (htab->is_vxworks && !info->shared) 3830 { 3831 int num_plts = (htab->splt->size / PLT_ENTRY_SIZE) - 1; 3832 unsigned char *p; 3833 3834 p = htab->srelplt2->contents; 3835 if (info->shared) 3836 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel); 3837 else 3838 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel); 3839 3840 for (; num_plts; num_plts--) 3841 { 3842 Elf_Internal_Rela rel; 3843 bfd_elf32_swap_reloc_in (output_bfd, p, &rel); 3844 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32); 3845 bfd_elf32_swap_reloc_out (output_bfd, &rel, p); 3846 p += sizeof (Elf32_External_Rel); 3847 3848 bfd_elf32_swap_reloc_in (output_bfd, p, &rel); 3849 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32); 3850 bfd_elf32_swap_reloc_out (output_bfd, &rel, p); 3851 p += sizeof (Elf32_External_Rel); 3852 } 3853 } 3854 } 3855 } 3856 3857 if (htab->sgotplt) 3858 { 3859 /* Fill in the first three entries in the global offset table. */ 3860 if (htab->sgotplt->size > 0) 3861 { 3862 bfd_put_32 (output_bfd, 3863 (sdyn == NULL ? 0 3864 : sdyn->output_section->vma + sdyn->output_offset), 3865 htab->sgotplt->contents); 3866 bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 4); 3867 bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 8); 3868 } 3869 3870 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4; 3871 } 3872 3873 if (htab->sgot && htab->sgot->size > 0) 3874 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4; 3875 3876 return TRUE; 3877 } 3878 3879 /* Return address for Ith PLT stub in section PLT, for relocation REL 3880 or (bfd_vma) -1 if it should not be included. */ 3881 3882 static bfd_vma 3883 elf_i386_plt_sym_val (bfd_vma i, const asection *plt, 3884 const arelent *rel ATTRIBUTE_UNUSED) 3885 { 3886 return plt->vma + (i + 1) * PLT_ENTRY_SIZE; 3887 } 3888 3889 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */ 3890 3891 static bfd_boolean 3892 elf_i386_hash_symbol (struct elf_link_hash_entry *h) 3893 { 3894 if (h->plt.offset != (bfd_vma) -1 3895 && !h->def_regular 3896 && !h->pointer_equality_needed) 3897 return FALSE; 3898 3899 return _bfd_elf_hash_symbol (h); 3900 } 3901 3902 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec 3903 #define TARGET_LITTLE_NAME "elf32-i386" 3904 #define ELF_ARCH bfd_arch_i386 3905 #define ELF_MACHINE_CODE EM_386 3906 #define ELF_MAXPAGESIZE 0x1000 3907 3908 #define elf_backend_can_gc_sections 1 3909 #define elf_backend_can_refcount 1 3910 #define elf_backend_want_got_plt 1 3911 #define elf_backend_plt_readonly 1 3912 #define elf_backend_want_plt_sym 0 3913 #define elf_backend_got_header_size 12 3914 3915 /* Support RELA for objdump of prelink objects. */ 3916 #define elf_info_to_howto elf_i386_info_to_howto_rel 3917 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel 3918 3919 #define bfd_elf32_mkobject elf_i386_mkobject 3920 3921 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name 3922 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create 3923 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup 3924 3925 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol 3926 #define elf_backend_check_relocs elf_i386_check_relocs 3927 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol 3928 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections 3929 #define elf_backend_fake_sections elf_i386_fake_sections 3930 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections 3931 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol 3932 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook 3933 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook 3934 #define elf_backend_grok_prstatus elf_i386_grok_prstatus 3935 #define elf_backend_grok_psinfo elf_i386_grok_psinfo 3936 #define elf_backend_reloc_type_class elf_i386_reloc_type_class 3937 #define elf_backend_relocate_section elf_i386_relocate_section 3938 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections 3939 #define elf_backend_always_size_sections elf_i386_always_size_sections 3940 #define elf_backend_plt_sym_val elf_i386_plt_sym_val 3941 #define elf_backend_hash_symbol elf_i386_hash_symbol 3942 3943 #include "elf32-target.h" 3944 3945 /* FreeBSD support. */ 3946 3947 #undef TARGET_LITTLE_SYM 3948 #define TARGET_LITTLE_SYM bfd_elf32_i386_freebsd_vec 3949 #undef TARGET_LITTLE_NAME 3950 #define TARGET_LITTLE_NAME "elf32-i386-freebsd" 3951 3952 /* The kernel recognizes executables as valid only if they carry a 3953 "FreeBSD" label in the ELF header. So we put this label on all 3954 executables and (for simplicity) also all other object files. */ 3955 3956 static void 3957 elf_i386_post_process_headers (bfd *abfd, 3958 struct bfd_link_info *info ATTRIBUTE_UNUSED) 3959 { 3960 Elf_Internal_Ehdr *i_ehdrp; 3961 3962 i_ehdrp = elf_elfheader (abfd); 3963 3964 /* Put an ABI label supported by FreeBSD >= 4.1. */ 3965 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD; 3966 #ifdef OLD_FREEBSD_ABI_LABEL 3967 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */ 3968 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8); 3969 #endif 3970 } 3971 3972 #undef elf_backend_post_process_headers 3973 #define elf_backend_post_process_headers elf_i386_post_process_headers 3974 #undef elf32_bed 3975 #define elf32_bed elf32_i386_fbsd_bed 3976 3977 #include "elf32-target.h" 3978 3979 /* VxWorks support. */ 3980 3981 #undef TARGET_LITTLE_SYM 3982 #define TARGET_LITTLE_SYM bfd_elf32_i386_vxworks_vec 3983 #undef TARGET_LITTLE_NAME 3984 #define TARGET_LITTLE_NAME "elf32-i386-vxworks" 3985 3986 3987 /* Like elf_i386_link_hash_table_create but with tweaks for VxWorks. */ 3988 3989 static struct bfd_link_hash_table * 3990 elf_i386_vxworks_link_hash_table_create (bfd *abfd) 3991 { 3992 struct bfd_link_hash_table *ret; 3993 struct elf_i386_link_hash_table *htab; 3994 3995 ret = elf_i386_link_hash_table_create (abfd); 3996 if (ret) 3997 { 3998 htab = (struct elf_i386_link_hash_table *) ret; 3999 htab->is_vxworks = 1; 4000 htab->plt0_pad_byte = 0x90; 4001 } 4002 4003 return ret; 4004 } 4005 4006 4007 #undef elf_backend_post_process_headers 4008 #undef bfd_elf32_bfd_link_hash_table_create 4009 #define bfd_elf32_bfd_link_hash_table_create \ 4010 elf_i386_vxworks_link_hash_table_create 4011 #undef elf_backend_add_symbol_hook 4012 #define elf_backend_add_symbol_hook \ 4013 elf_vxworks_add_symbol_hook 4014 #undef elf_backend_link_output_symbol_hook 4015 #define elf_backend_link_output_symbol_hook \ 4016 elf_vxworks_link_output_symbol_hook 4017 #undef elf_backend_emit_relocs 4018 #define elf_backend_emit_relocs elf_vxworks_emit_relocs 4019 #undef elf_backend_final_write_processing 4020 #define elf_backend_final_write_processing \ 4021 elf_vxworks_final_write_processing 4022 4023 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so 4024 define it. */ 4025 #undef elf_backend_want_plt_sym 4026 #define elf_backend_want_plt_sym 1 4027 4028 #undef elf32_bed 4029 #define elf32_bed elf32_i386_vxworks_bed 4030 4031 #include "elf32-target.h" 4032