elf64-x86-64.c revision 1.1.1.6
1/* X86-64 specific support for ELF 2 Copyright (C) 2000-2016 Free Software Foundation, Inc. 3 Contributed by Jan Hubicka <jh@suse.cz>. 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 3 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, 20 MA 02110-1301, USA. */ 21 22#include "sysdep.h" 23#include "bfd.h" 24#include "bfdlink.h" 25#include "libbfd.h" 26#include "elf-bfd.h" 27#include "elf-nacl.h" 28#include "bfd_stdint.h" 29#include "objalloc.h" 30#include "hashtab.h" 31#include "dwarf2.h" 32#include "libiberty.h" 33 34#include "opcode/i386.h" 35#include "elf/x86-64.h" 36 37#ifdef CORE_HEADER 38#include <stdarg.h> 39#include CORE_HEADER 40#endif 41 42/* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */ 43#define MINUS_ONE (~ (bfd_vma) 0) 44 45/* Since both 32-bit and 64-bit x86-64 encode relocation type in the 46 identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get 47 relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE 48 since they are the same. */ 49 50#define ABI_64_P(abfd) \ 51 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64) 52 53/* The relocation "howto" table. Order of fields: 54 type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow, 55 special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */ 56static reloc_howto_type x86_64_elf_howto_table[] = 57{ 58 HOWTO(R_X86_64_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont, 59 bfd_elf_generic_reloc, "R_X86_64_NONE", FALSE, 0x00000000, 0x00000000, 60 FALSE), 61 HOWTO(R_X86_64_64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 62 bfd_elf_generic_reloc, "R_X86_64_64", FALSE, MINUS_ONE, MINUS_ONE, 63 FALSE), 64 HOWTO(R_X86_64_PC32, 0, 2, 32, TRUE, 0, complain_overflow_signed, 65 bfd_elf_generic_reloc, "R_X86_64_PC32", FALSE, 0xffffffff, 0xffffffff, 66 TRUE), 67 HOWTO(R_X86_64_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_signed, 68 bfd_elf_generic_reloc, "R_X86_64_GOT32", FALSE, 0xffffffff, 0xffffffff, 69 FALSE), 70 HOWTO(R_X86_64_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_signed, 71 bfd_elf_generic_reloc, "R_X86_64_PLT32", FALSE, 0xffffffff, 0xffffffff, 72 TRUE), 73 HOWTO(R_X86_64_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 74 bfd_elf_generic_reloc, "R_X86_64_COPY", FALSE, 0xffffffff, 0xffffffff, 75 FALSE), 76 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 77 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", FALSE, MINUS_ONE, 78 MINUS_ONE, FALSE), 79 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 80 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", FALSE, MINUS_ONE, 81 MINUS_ONE, FALSE), 82 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 83 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", FALSE, MINUS_ONE, 84 MINUS_ONE, FALSE), 85 HOWTO(R_X86_64_GOTPCREL, 0, 2, 32, TRUE, 0, complain_overflow_signed, 86 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", FALSE, 0xffffffff, 87 0xffffffff, TRUE), 88 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned, 89 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff, 90 FALSE), 91 HOWTO(R_X86_64_32S, 0, 2, 32, FALSE, 0, complain_overflow_signed, 92 bfd_elf_generic_reloc, "R_X86_64_32S", FALSE, 0xffffffff, 0xffffffff, 93 FALSE), 94 HOWTO(R_X86_64_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, 95 bfd_elf_generic_reloc, "R_X86_64_16", FALSE, 0xffff, 0xffff, FALSE), 96 HOWTO(R_X86_64_PC16,0, 1, 16, TRUE, 0, complain_overflow_bitfield, 97 bfd_elf_generic_reloc, "R_X86_64_PC16", FALSE, 0xffff, 0xffff, TRUE), 98 HOWTO(R_X86_64_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, 99 bfd_elf_generic_reloc, "R_X86_64_8", FALSE, 0xff, 0xff, FALSE), 100 HOWTO(R_X86_64_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed, 101 bfd_elf_generic_reloc, "R_X86_64_PC8", FALSE, 0xff, 0xff, TRUE), 102 HOWTO(R_X86_64_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 103 bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", FALSE, MINUS_ONE, 104 MINUS_ONE, FALSE), 105 HOWTO(R_X86_64_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 106 bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", FALSE, MINUS_ONE, 107 MINUS_ONE, FALSE), 108 HOWTO(R_X86_64_TPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 109 bfd_elf_generic_reloc, "R_X86_64_TPOFF64", FALSE, MINUS_ONE, 110 MINUS_ONE, FALSE), 111 HOWTO(R_X86_64_TLSGD, 0, 2, 32, TRUE, 0, complain_overflow_signed, 112 bfd_elf_generic_reloc, "R_X86_64_TLSGD", FALSE, 0xffffffff, 113 0xffffffff, TRUE), 114 HOWTO(R_X86_64_TLSLD, 0, 2, 32, TRUE, 0, complain_overflow_signed, 115 bfd_elf_generic_reloc, "R_X86_64_TLSLD", FALSE, 0xffffffff, 116 0xffffffff, TRUE), 117 HOWTO(R_X86_64_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed, 118 bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", FALSE, 0xffffffff, 119 0xffffffff, FALSE), 120 HOWTO(R_X86_64_GOTTPOFF, 0, 2, 32, TRUE, 0, complain_overflow_signed, 121 bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", FALSE, 0xffffffff, 122 0xffffffff, TRUE), 123 HOWTO(R_X86_64_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed, 124 bfd_elf_generic_reloc, "R_X86_64_TPOFF32", FALSE, 0xffffffff, 125 0xffffffff, FALSE), 126 HOWTO(R_X86_64_PC64, 0, 4, 64, TRUE, 0, complain_overflow_bitfield, 127 bfd_elf_generic_reloc, "R_X86_64_PC64", FALSE, MINUS_ONE, MINUS_ONE, 128 TRUE), 129 HOWTO(R_X86_64_GOTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 130 bfd_elf_generic_reloc, "R_X86_64_GOTOFF64", 131 FALSE, MINUS_ONE, MINUS_ONE, FALSE), 132 HOWTO(R_X86_64_GOTPC32, 0, 2, 32, TRUE, 0, complain_overflow_signed, 133 bfd_elf_generic_reloc, "R_X86_64_GOTPC32", 134 FALSE, 0xffffffff, 0xffffffff, TRUE), 135 HOWTO(R_X86_64_GOT64, 0, 4, 64, FALSE, 0, complain_overflow_signed, 136 bfd_elf_generic_reloc, "R_X86_64_GOT64", FALSE, MINUS_ONE, MINUS_ONE, 137 FALSE), 138 HOWTO(R_X86_64_GOTPCREL64, 0, 4, 64, TRUE, 0, complain_overflow_signed, 139 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", FALSE, MINUS_ONE, 140 MINUS_ONE, TRUE), 141 HOWTO(R_X86_64_GOTPC64, 0, 4, 64, TRUE, 0, complain_overflow_signed, 142 bfd_elf_generic_reloc, "R_X86_64_GOTPC64", 143 FALSE, MINUS_ONE, MINUS_ONE, TRUE), 144 HOWTO(R_X86_64_GOTPLT64, 0, 4, 64, FALSE, 0, complain_overflow_signed, 145 bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", FALSE, MINUS_ONE, 146 MINUS_ONE, FALSE), 147 HOWTO(R_X86_64_PLTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_signed, 148 bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", FALSE, MINUS_ONE, 149 MINUS_ONE, FALSE), 150 HOWTO(R_X86_64_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned, 151 bfd_elf_generic_reloc, "R_X86_64_SIZE32", FALSE, 0xffffffff, 0xffffffff, 152 FALSE), 153 HOWTO(R_X86_64_SIZE64, 0, 4, 64, FALSE, 0, complain_overflow_unsigned, 154 bfd_elf_generic_reloc, "R_X86_64_SIZE64", FALSE, MINUS_ONE, MINUS_ONE, 155 FALSE), 156 HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 2, 32, TRUE, 0, 157 complain_overflow_bitfield, bfd_elf_generic_reloc, 158 "R_X86_64_GOTPC32_TLSDESC", 159 FALSE, 0xffffffff, 0xffffffff, TRUE), 160 HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, FALSE, 0, 161 complain_overflow_dont, bfd_elf_generic_reloc, 162 "R_X86_64_TLSDESC_CALL", 163 FALSE, 0, 0, FALSE), 164 HOWTO(R_X86_64_TLSDESC, 0, 4, 64, FALSE, 0, 165 complain_overflow_bitfield, bfd_elf_generic_reloc, 166 "R_X86_64_TLSDESC", 167 FALSE, MINUS_ONE, MINUS_ONE, FALSE), 168 HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 169 bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE, 170 MINUS_ONE, FALSE), 171 HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, 172 bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE, 173 MINUS_ONE, FALSE), 174 HOWTO(R_X86_64_PC32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed, 175 bfd_elf_generic_reloc, "R_X86_64_PC32_BND", FALSE, 0xffffffff, 0xffffffff, 176 TRUE), 177 HOWTO(R_X86_64_PLT32_BND, 0, 2, 32, TRUE, 0, complain_overflow_signed, 178 bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", FALSE, 0xffffffff, 0xffffffff, 179 TRUE), 180 HOWTO(R_X86_64_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed, 181 bfd_elf_generic_reloc, "R_X86_64_GOTPCRELX", FALSE, 0xffffffff, 182 0xffffffff, TRUE), 183 HOWTO(R_X86_64_REX_GOTPCRELX, 0, 2, 32, TRUE, 0, complain_overflow_signed, 184 bfd_elf_generic_reloc, "R_X86_64_REX_GOTPCRELX", FALSE, 0xffffffff, 185 0xffffffff, TRUE), 186 187 /* We have a gap in the reloc numbers here. 188 R_X86_64_standard counts the number up to this point, and 189 R_X86_64_vt_offset is the value to subtract from a reloc type of 190 R_X86_64_GNU_VT* to form an index into this table. */ 191#define R_X86_64_standard (R_X86_64_REX_GOTPCRELX + 1) 192#define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard) 193 194/* GNU extension to record C++ vtable hierarchy. */ 195 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, FALSE, 0, complain_overflow_dont, 196 NULL, "R_X86_64_GNU_VTINHERIT", FALSE, 0, 0, FALSE), 197 198/* GNU extension to record C++ vtable member usage. */ 199 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont, 200 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0, 201 FALSE), 202 203/* Use complain_overflow_bitfield on R_X86_64_32 for x32. */ 204 HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 205 bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff, 206 FALSE) 207}; 208 209#define IS_X86_64_PCREL_TYPE(TYPE) \ 210 ( ((TYPE) == R_X86_64_PC8) \ 211 || ((TYPE) == R_X86_64_PC16) \ 212 || ((TYPE) == R_X86_64_PC32) \ 213 || ((TYPE) == R_X86_64_PC32_BND) \ 214 || ((TYPE) == R_X86_64_PC64)) 215 216/* Map BFD relocs to the x86_64 elf relocs. */ 217struct elf_reloc_map 218{ 219 bfd_reloc_code_real_type bfd_reloc_val; 220 unsigned char elf_reloc_val; 221}; 222 223static const struct elf_reloc_map x86_64_reloc_map[] = 224{ 225 { BFD_RELOC_NONE, R_X86_64_NONE, }, 226 { BFD_RELOC_64, R_X86_64_64, }, 227 { BFD_RELOC_32_PCREL, R_X86_64_PC32, }, 228 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,}, 229 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,}, 230 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, }, 231 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, }, 232 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, }, 233 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, }, 234 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, }, 235 { BFD_RELOC_32, R_X86_64_32, }, 236 { BFD_RELOC_X86_64_32S, R_X86_64_32S, }, 237 { BFD_RELOC_16, R_X86_64_16, }, 238 { BFD_RELOC_16_PCREL, R_X86_64_PC16, }, 239 { BFD_RELOC_8, R_X86_64_8, }, 240 { BFD_RELOC_8_PCREL, R_X86_64_PC8, }, 241 { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, }, 242 { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, }, 243 { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, }, 244 { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, }, 245 { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, }, 246 { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, }, 247 { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, }, 248 { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, }, 249 { BFD_RELOC_64_PCREL, R_X86_64_PC64, }, 250 { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, }, 251 { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, }, 252 { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, }, 253 { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, }, 254 { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, }, 255 { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, }, 256 { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, }, 257 { BFD_RELOC_SIZE32, R_X86_64_SIZE32, }, 258 { BFD_RELOC_SIZE64, R_X86_64_SIZE64, }, 259 { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, }, 260 { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, }, 261 { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, }, 262 { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, }, 263 { BFD_RELOC_X86_64_PC32_BND, R_X86_64_PC32_BND, }, 264 { BFD_RELOC_X86_64_PLT32_BND, R_X86_64_PLT32_BND, }, 265 { BFD_RELOC_X86_64_GOTPCRELX, R_X86_64_GOTPCRELX, }, 266 { BFD_RELOC_X86_64_REX_GOTPCRELX, R_X86_64_REX_GOTPCRELX, }, 267 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, }, 268 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, }, 269}; 270 271static reloc_howto_type * 272elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type) 273{ 274 unsigned i; 275 276 if (r_type == (unsigned int) R_X86_64_32) 277 { 278 if (ABI_64_P (abfd)) 279 i = r_type; 280 else 281 i = ARRAY_SIZE (x86_64_elf_howto_table) - 1; 282 } 283 else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT 284 || r_type >= (unsigned int) R_X86_64_max) 285 { 286 if (r_type >= (unsigned int) R_X86_64_standard) 287 { 288 (*_bfd_error_handler) (_("%B: invalid relocation type %d"), 289 abfd, (int) r_type); 290 r_type = R_X86_64_NONE; 291 } 292 i = r_type; 293 } 294 else 295 i = r_type - (unsigned int) R_X86_64_vt_offset; 296 BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type); 297 return &x86_64_elf_howto_table[i]; 298} 299 300/* Given a BFD reloc type, return a HOWTO structure. */ 301static reloc_howto_type * 302elf_x86_64_reloc_type_lookup (bfd *abfd, 303 bfd_reloc_code_real_type code) 304{ 305 unsigned int i; 306 307 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map); 308 i++) 309 { 310 if (x86_64_reloc_map[i].bfd_reloc_val == code) 311 return elf_x86_64_rtype_to_howto (abfd, 312 x86_64_reloc_map[i].elf_reloc_val); 313 } 314 return NULL; 315} 316 317static reloc_howto_type * 318elf_x86_64_reloc_name_lookup (bfd *abfd, 319 const char *r_name) 320{ 321 unsigned int i; 322 323 if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0) 324 { 325 /* Get x32 R_X86_64_32. */ 326 reloc_howto_type *reloc 327 = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1]; 328 BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32); 329 return reloc; 330 } 331 332 for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++) 333 if (x86_64_elf_howto_table[i].name != NULL 334 && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0) 335 return &x86_64_elf_howto_table[i]; 336 337 return NULL; 338} 339 340/* Given an x86_64 ELF reloc type, fill in an arelent structure. */ 341 342static void 343elf_x86_64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, 344 Elf_Internal_Rela *dst) 345{ 346 unsigned r_type; 347 348 r_type = ELF32_R_TYPE (dst->r_info); 349 cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type); 350 BFD_ASSERT (r_type == cache_ptr->howto->type); 351} 352 353/* Support for core dump NOTE sections. */ 354static bfd_boolean 355elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 356{ 357 int offset; 358 size_t size; 359 360 switch (note->descsz) 361 { 362 default: 363 return FALSE; 364 365 case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */ 366 /* pr_cursig */ 367 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 368 369 /* pr_pid */ 370 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24); 371 372 /* pr_reg */ 373 offset = 72; 374 size = 216; 375 376 break; 377 378 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */ 379 /* pr_cursig */ 380 elf_tdata (abfd)->core->signal 381 = bfd_get_16 (abfd, note->descdata + 12); 382 383 /* pr_pid */ 384 elf_tdata (abfd)->core->lwpid 385 = bfd_get_32 (abfd, note->descdata + 32); 386 387 /* pr_reg */ 388 offset = 112; 389 size = 216; 390 391 break; 392 } 393 394 /* Make a ".reg/999" section. */ 395 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 396 size, note->descpos + offset); 397} 398 399static bfd_boolean 400elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 401{ 402 switch (note->descsz) 403 { 404 default: 405 return FALSE; 406 407 case 124: /* sizeof(struct elf_prpsinfo) on Linux/x32 */ 408 elf_tdata (abfd)->core->pid 409 = bfd_get_32 (abfd, note->descdata + 12); 410 elf_tdata (abfd)->core->program 411 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 412 elf_tdata (abfd)->core->command 413 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 414 break; 415 416 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */ 417 elf_tdata (abfd)->core->pid 418 = bfd_get_32 (abfd, note->descdata + 24); 419 elf_tdata (abfd)->core->program 420 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16); 421 elf_tdata (abfd)->core->command 422 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80); 423 } 424 425 /* Note that for some reason, a spurious space is tacked 426 onto the end of the args in some (at least one anyway) 427 implementations, so strip it off if it exists. */ 428 429 { 430 char *command = elf_tdata (abfd)->core->command; 431 int n = strlen (command); 432 433 if (0 < n && command[n - 1] == ' ') 434 command[n - 1] = '\0'; 435 } 436 437 return TRUE; 438} 439 440#ifdef CORE_HEADER 441static char * 442elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz, 443 int note_type, ...) 444{ 445 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 446 va_list ap; 447 const char *fname, *psargs; 448 long pid; 449 int cursig; 450 const void *gregs; 451 452 switch (note_type) 453 { 454 default: 455 return NULL; 456 457 case NT_PRPSINFO: 458 va_start (ap, note_type); 459 fname = va_arg (ap, const char *); 460 psargs = va_arg (ap, const char *); 461 va_end (ap); 462 463 if (bed->s->elfclass == ELFCLASS32) 464 { 465 prpsinfo32_t data; 466 memset (&data, 0, sizeof (data)); 467 strncpy (data.pr_fname, fname, sizeof (data.pr_fname)); 468 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs)); 469 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, 470 &data, sizeof (data)); 471 } 472 else 473 { 474 prpsinfo64_t data; 475 memset (&data, 0, sizeof (data)); 476 strncpy (data.pr_fname, fname, sizeof (data.pr_fname)); 477 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs)); 478 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, 479 &data, sizeof (data)); 480 } 481 /* NOTREACHED */ 482 483 case NT_PRSTATUS: 484 va_start (ap, note_type); 485 pid = va_arg (ap, long); 486 cursig = va_arg (ap, int); 487 gregs = va_arg (ap, const void *); 488 va_end (ap); 489 490 if (bed->s->elfclass == ELFCLASS32) 491 { 492 if (bed->elf_machine_code == EM_X86_64) 493 { 494 prstatusx32_t prstat; 495 memset (&prstat, 0, sizeof (prstat)); 496 prstat.pr_pid = pid; 497 prstat.pr_cursig = cursig; 498 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); 499 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, 500 &prstat, sizeof (prstat)); 501 } 502 else 503 { 504 prstatus32_t prstat; 505 memset (&prstat, 0, sizeof (prstat)); 506 prstat.pr_pid = pid; 507 prstat.pr_cursig = cursig; 508 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); 509 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, 510 &prstat, sizeof (prstat)); 511 } 512 } 513 else 514 { 515 prstatus64_t prstat; 516 memset (&prstat, 0, sizeof (prstat)); 517 prstat.pr_pid = pid; 518 prstat.pr_cursig = cursig; 519 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); 520 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, 521 &prstat, sizeof (prstat)); 522 } 523 } 524 /* NOTREACHED */ 525} 526#endif 527 528/* Functions for the x86-64 ELF linker. */ 529 530/* The name of the dynamic interpreter. This is put in the .interp 531 section. */ 532 533#define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1" 534#define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1" 535 536/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid 537 copying dynamic variables from a shared lib into an app's dynbss 538 section, and instead use a dynamic relocation to point into the 539 shared lib. */ 540#define ELIMINATE_COPY_RELOCS 1 541 542/* The size in bytes of an entry in the global offset table. */ 543 544#define GOT_ENTRY_SIZE 8 545 546/* The size in bytes of an entry in the procedure linkage table. */ 547 548#define PLT_ENTRY_SIZE 16 549 550/* The first entry in a procedure linkage table looks like this. See the 551 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */ 552 553static const bfd_byte elf_x86_64_plt0_entry[PLT_ENTRY_SIZE] = 554{ 555 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */ 556 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */ 557 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */ 558}; 559 560/* Subsequent entries in a procedure linkage table look like this. */ 561 562static const bfd_byte elf_x86_64_plt_entry[PLT_ENTRY_SIZE] = 563{ 564 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */ 565 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */ 566 0x68, /* pushq immediate */ 567 0, 0, 0, 0, /* replaced with index into relocation table. */ 568 0xe9, /* jmp relative */ 569 0, 0, 0, 0 /* replaced with offset to start of .plt0. */ 570}; 571 572/* The first entry in a procedure linkage table with BND relocations 573 like this. */ 574 575static const bfd_byte elf_x86_64_bnd_plt0_entry[PLT_ENTRY_SIZE] = 576{ 577 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */ 578 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */ 579 0x0f, 0x1f, 0 /* nopl (%rax) */ 580}; 581 582/* Subsequent entries for legacy branches in a procedure linkage table 583 with BND relocations look like this. */ 584 585static const bfd_byte elf_x86_64_legacy_plt_entry[PLT_ENTRY_SIZE] = 586{ 587 0x68, 0, 0, 0, 0, /* pushq immediate */ 588 0xe9, 0, 0, 0, 0, /* jmpq relative */ 589 0x66, 0x0f, 0x1f, 0x44, 0, 0 /* nopw (%rax,%rax,1) */ 590}; 591 592/* Subsequent entries for branches with BND prefx in a procedure linkage 593 table with BND relocations look like this. */ 594 595static const bfd_byte elf_x86_64_bnd_plt_entry[PLT_ENTRY_SIZE] = 596{ 597 0x68, 0, 0, 0, 0, /* pushq immediate */ 598 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */ 599 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */ 600}; 601 602/* Entries for legacy branches in the second procedure linkage table 603 look like this. */ 604 605static const bfd_byte elf_x86_64_legacy_plt2_entry[8] = 606{ 607 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */ 608 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */ 609 0x66, 0x90 /* xchg %ax,%ax */ 610}; 611 612/* Entries for branches with BND prefix in the second procedure linkage 613 table look like this. */ 614 615static const bfd_byte elf_x86_64_bnd_plt2_entry[8] = 616{ 617 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */ 618 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */ 619 0x90 /* nop */ 620}; 621 622/* .eh_frame covering the .plt section. */ 623 624static const bfd_byte elf_x86_64_eh_frame_plt[] = 625{ 626#define PLT_CIE_LENGTH 20 627#define PLT_FDE_LENGTH 36 628#define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8 629#define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12 630 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */ 631 0, 0, 0, 0, /* CIE ID */ 632 1, /* CIE version */ 633 'z', 'R', 0, /* Augmentation string */ 634 1, /* Code alignment factor */ 635 0x78, /* Data alignment factor */ 636 16, /* Return address column */ 637 1, /* Augmentation size */ 638 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */ 639 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */ 640 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */ 641 DW_CFA_nop, DW_CFA_nop, 642 643 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */ 644 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */ 645 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */ 646 0, 0, 0, 0, /* .plt size goes here */ 647 0, /* Augmentation size */ 648 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */ 649 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */ 650 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */ 651 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */ 652 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */ 653 11, /* Block length */ 654 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */ 655 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */ 656 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge, 657 DW_OP_lit3, DW_OP_shl, DW_OP_plus, 658 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop 659}; 660 661/* Architecture-specific backend data for x86-64. */ 662 663struct elf_x86_64_backend_data 664{ 665 /* Templates for the initial PLT entry and for subsequent entries. */ 666 const bfd_byte *plt0_entry; 667 const bfd_byte *plt_entry; 668 unsigned int plt_entry_size; /* Size of each PLT entry. */ 669 670 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */ 671 unsigned int plt0_got1_offset; 672 unsigned int plt0_got2_offset; 673 674 /* Offset of the end of the PC-relative instruction containing 675 plt0_got2_offset. */ 676 unsigned int plt0_got2_insn_end; 677 678 /* Offsets into plt_entry that are to be replaced with... */ 679 unsigned int plt_got_offset; /* ... address of this symbol in .got. */ 680 unsigned int plt_reloc_offset; /* ... offset into relocation table. */ 681 unsigned int plt_plt_offset; /* ... offset to start of .plt. */ 682 683 /* Length of the PC-relative instruction containing plt_got_offset. */ 684 unsigned int plt_got_insn_size; 685 686 /* Offset of the end of the PC-relative jump to plt0_entry. */ 687 unsigned int plt_plt_insn_end; 688 689 /* Offset into plt_entry where the initial value of the GOT entry points. */ 690 unsigned int plt_lazy_offset; 691 692 /* .eh_frame covering the .plt section. */ 693 const bfd_byte *eh_frame_plt; 694 unsigned int eh_frame_plt_size; 695}; 696 697#define get_elf_x86_64_arch_data(bed) \ 698 ((const struct elf_x86_64_backend_data *) (bed)->arch_data) 699 700#define get_elf_x86_64_backend_data(abfd) \ 701 get_elf_x86_64_arch_data (get_elf_backend_data (abfd)) 702 703#define GET_PLT_ENTRY_SIZE(abfd) \ 704 get_elf_x86_64_backend_data (abfd)->plt_entry_size 705 706/* These are the standard parameters. */ 707static const struct elf_x86_64_backend_data elf_x86_64_arch_bed = 708 { 709 elf_x86_64_plt0_entry, /* plt0_entry */ 710 elf_x86_64_plt_entry, /* plt_entry */ 711 sizeof (elf_x86_64_plt_entry), /* plt_entry_size */ 712 2, /* plt0_got1_offset */ 713 8, /* plt0_got2_offset */ 714 12, /* plt0_got2_insn_end */ 715 2, /* plt_got_offset */ 716 7, /* plt_reloc_offset */ 717 12, /* plt_plt_offset */ 718 6, /* plt_got_insn_size */ 719 PLT_ENTRY_SIZE, /* plt_plt_insn_end */ 720 6, /* plt_lazy_offset */ 721 elf_x86_64_eh_frame_plt, /* eh_frame_plt */ 722 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */ 723 }; 724 725static const struct elf_x86_64_backend_data elf_x86_64_bnd_arch_bed = 726 { 727 elf_x86_64_bnd_plt0_entry, /* plt0_entry */ 728 elf_x86_64_bnd_plt_entry, /* plt_entry */ 729 sizeof (elf_x86_64_bnd_plt_entry), /* plt_entry_size */ 730 2, /* plt0_got1_offset */ 731 1+8, /* plt0_got2_offset */ 732 1+12, /* plt0_got2_insn_end */ 733 1+2, /* plt_got_offset */ 734 1, /* plt_reloc_offset */ 735 7, /* plt_plt_offset */ 736 1+6, /* plt_got_insn_size */ 737 11, /* plt_plt_insn_end */ 738 0, /* plt_lazy_offset */ 739 elf_x86_64_eh_frame_plt, /* eh_frame_plt */ 740 sizeof (elf_x86_64_eh_frame_plt), /* eh_frame_plt_size */ 741 }; 742 743#define elf_backend_arch_data &elf_x86_64_arch_bed 744 745/* Is a undefined weak symbol which is resolved to 0. Reference to an 746 undefined weak symbol is resolved to 0 when building executable if 747 it isn't dynamic and 748 1. Has non-GOT/non-PLT relocations in text section. Or 749 2. Has no GOT/PLT relocation. 750 */ 751#define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH) \ 752 ((EH)->elf.root.type == bfd_link_hash_undefweak \ 753 && bfd_link_executable (INFO) \ 754 && (elf_x86_64_hash_table (INFO)->interp == NULL \ 755 || !(GOT_RELOC) \ 756 || (EH)->has_non_got_reloc \ 757 || !(INFO)->dynamic_undefined_weak)) 758 759/* x86-64 ELF linker hash entry. */ 760 761struct elf_x86_64_link_hash_entry 762{ 763 struct elf_link_hash_entry elf; 764 765 /* Track dynamic relocs copied for this symbol. */ 766 struct elf_dyn_relocs *dyn_relocs; 767 768#define GOT_UNKNOWN 0 769#define GOT_NORMAL 1 770#define GOT_TLS_GD 2 771#define GOT_TLS_IE 3 772#define GOT_TLS_GDESC 4 773#define GOT_TLS_GD_BOTH_P(type) \ 774 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC)) 775#define GOT_TLS_GD_P(type) \ 776 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type)) 777#define GOT_TLS_GDESC_P(type) \ 778 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type)) 779#define GOT_TLS_GD_ANY_P(type) \ 780 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type)) 781 unsigned char tls_type; 782 783 /* TRUE if a weak symbol with a real definition needs a copy reloc. 784 When there is a weak symbol with a real definition, the processor 785 independent code will have arranged for us to see the real 786 definition first. We need to copy the needs_copy bit from the 787 real definition and check it when allowing copy reloc in PIE. */ 788 unsigned int needs_copy : 1; 789 790 /* TRUE if symbol has at least one BND relocation. */ 791 unsigned int has_bnd_reloc : 1; 792 793 /* TRUE if symbol has GOT or PLT relocations. */ 794 unsigned int has_got_reloc : 1; 795 796 /* TRUE if symbol has non-GOT/non-PLT relocations in text sections. */ 797 unsigned int has_non_got_reloc : 1; 798 799 /* 0: symbol isn't __tls_get_addr. 800 1: symbol is __tls_get_addr. 801 2: symbol is unknown. */ 802 unsigned int tls_get_addr : 2; 803 804 /* Reference count of C/C++ function pointer relocations in read-write 805 section which can be resolved at run-time. */ 806 bfd_signed_vma func_pointer_refcount; 807 808 /* Information about the GOT PLT entry. Filled when there are both 809 GOT and PLT relocations against the same function. */ 810 union gotplt_union plt_got; 811 812 /* Information about the second PLT entry. Filled when has_bnd_reloc is 813 set. */ 814 union gotplt_union plt_bnd; 815 816 /* Offset of the GOTPLT entry reserved for the TLS descriptor, 817 starting at the end of the jump table. */ 818 bfd_vma tlsdesc_got; 819}; 820 821#define elf_x86_64_hash_entry(ent) \ 822 ((struct elf_x86_64_link_hash_entry *)(ent)) 823 824struct elf_x86_64_obj_tdata 825{ 826 struct elf_obj_tdata root; 827 828 /* tls_type for each local got entry. */ 829 char *local_got_tls_type; 830 831 /* GOTPLT entries for TLS descriptors. */ 832 bfd_vma *local_tlsdesc_gotent; 833}; 834 835#define elf_x86_64_tdata(abfd) \ 836 ((struct elf_x86_64_obj_tdata *) (abfd)->tdata.any) 837 838#define elf_x86_64_local_got_tls_type(abfd) \ 839 (elf_x86_64_tdata (abfd)->local_got_tls_type) 840 841#define elf_x86_64_local_tlsdesc_gotent(abfd) \ 842 (elf_x86_64_tdata (abfd)->local_tlsdesc_gotent) 843 844#define is_x86_64_elf(bfd) \ 845 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 846 && elf_tdata (bfd) != NULL \ 847 && elf_object_id (bfd) == X86_64_ELF_DATA) 848 849static bfd_boolean 850elf_x86_64_mkobject (bfd *abfd) 851{ 852 return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_64_obj_tdata), 853 X86_64_ELF_DATA); 854} 855 856/* x86-64 ELF linker hash table. */ 857 858struct elf_x86_64_link_hash_table 859{ 860 struct elf_link_hash_table elf; 861 862 /* Short-cuts to get to dynamic linker sections. */ 863 asection *interp; 864 asection *sdynbss; 865 asection *srelbss; 866 asection *plt_eh_frame; 867 asection *plt_bnd; 868 asection *plt_got; 869 870 union 871 { 872 bfd_signed_vma refcount; 873 bfd_vma offset; 874 } tls_ld_got; 875 876 /* The amount of space used by the jump slots in the GOT. */ 877 bfd_vma sgotplt_jump_table_size; 878 879 /* Small local sym cache. */ 880 struct sym_cache sym_cache; 881 882 bfd_vma (*r_info) (bfd_vma, bfd_vma); 883 bfd_vma (*r_sym) (bfd_vma); 884 unsigned int pointer_r_type; 885 const char *dynamic_interpreter; 886 int dynamic_interpreter_size; 887 888 /* _TLS_MODULE_BASE_ symbol. */ 889 struct bfd_link_hash_entry *tls_module_base; 890 891 /* Used by local STT_GNU_IFUNC symbols. */ 892 htab_t loc_hash_table; 893 void * loc_hash_memory; 894 895 /* The offset into splt of the PLT entry for the TLS descriptor 896 resolver. Special values are 0, if not necessary (or not found 897 to be necessary yet), and -1 if needed but not determined 898 yet. */ 899 bfd_vma tlsdesc_plt; 900 /* The offset into sgot of the GOT entry used by the PLT entry 901 above. */ 902 bfd_vma tlsdesc_got; 903 904 /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */ 905 bfd_vma next_jump_slot_index; 906 /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */ 907 bfd_vma next_irelative_index; 908 909 /* TRUE if there are dynamic relocs against IFUNC symbols that apply 910 to read-only sections. */ 911 bfd_boolean readonly_dynrelocs_against_ifunc; 912}; 913 914/* Get the x86-64 ELF linker hash table from a link_info structure. */ 915 916#define elf_x86_64_hash_table(p) \ 917 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ 918 == X86_64_ELF_DATA ? ((struct elf_x86_64_link_hash_table *) ((p)->hash)) : NULL) 919 920#define elf_x86_64_compute_jump_table_size(htab) \ 921 ((htab)->elf.srelplt->reloc_count * GOT_ENTRY_SIZE) 922 923/* Create an entry in an x86-64 ELF linker hash table. */ 924 925static struct bfd_hash_entry * 926elf_x86_64_link_hash_newfunc (struct bfd_hash_entry *entry, 927 struct bfd_hash_table *table, 928 const char *string) 929{ 930 /* Allocate the structure if it has not already been allocated by a 931 subclass. */ 932 if (entry == NULL) 933 { 934 entry = (struct bfd_hash_entry *) 935 bfd_hash_allocate (table, 936 sizeof (struct elf_x86_64_link_hash_entry)); 937 if (entry == NULL) 938 return entry; 939 } 940 941 /* Call the allocation method of the superclass. */ 942 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 943 if (entry != NULL) 944 { 945 struct elf_x86_64_link_hash_entry *eh; 946 947 eh = (struct elf_x86_64_link_hash_entry *) entry; 948 eh->dyn_relocs = NULL; 949 eh->tls_type = GOT_UNKNOWN; 950 eh->needs_copy = 0; 951 eh->has_bnd_reloc = 0; 952 eh->has_got_reloc = 0; 953 eh->has_non_got_reloc = 0; 954 eh->tls_get_addr = 2; 955 eh->func_pointer_refcount = 0; 956 eh->plt_bnd.offset = (bfd_vma) -1; 957 eh->plt_got.offset = (bfd_vma) -1; 958 eh->tlsdesc_got = (bfd_vma) -1; 959 } 960 961 return entry; 962} 963 964/* Compute a hash of a local hash entry. We use elf_link_hash_entry 965 for local symbol so that we can handle local STT_GNU_IFUNC symbols 966 as global symbol. We reuse indx and dynstr_index for local symbol 967 hash since they aren't used by global symbols in this backend. */ 968 969static hashval_t 970elf_x86_64_local_htab_hash (const void *ptr) 971{ 972 struct elf_link_hash_entry *h 973 = (struct elf_link_hash_entry *) ptr; 974 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index); 975} 976 977/* Compare local hash entries. */ 978 979static int 980elf_x86_64_local_htab_eq (const void *ptr1, const void *ptr2) 981{ 982 struct elf_link_hash_entry *h1 983 = (struct elf_link_hash_entry *) ptr1; 984 struct elf_link_hash_entry *h2 985 = (struct elf_link_hash_entry *) ptr2; 986 987 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index; 988} 989 990/* Find and/or create a hash entry for local symbol. */ 991 992static struct elf_link_hash_entry * 993elf_x86_64_get_local_sym_hash (struct elf_x86_64_link_hash_table *htab, 994 bfd *abfd, const Elf_Internal_Rela *rel, 995 bfd_boolean create) 996{ 997 struct elf_x86_64_link_hash_entry e, *ret; 998 asection *sec = abfd->sections; 999 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id, 1000 htab->r_sym (rel->r_info)); 1001 void **slot; 1002 1003 e.elf.indx = sec->id; 1004 e.elf.dynstr_index = htab->r_sym (rel->r_info); 1005 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h, 1006 create ? INSERT : NO_INSERT); 1007 1008 if (!slot) 1009 return NULL; 1010 1011 if (*slot) 1012 { 1013 ret = (struct elf_x86_64_link_hash_entry *) *slot; 1014 return &ret->elf; 1015 } 1016 1017 ret = (struct elf_x86_64_link_hash_entry *) 1018 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory, 1019 sizeof (struct elf_x86_64_link_hash_entry)); 1020 if (ret) 1021 { 1022 memset (ret, 0, sizeof (*ret)); 1023 ret->elf.indx = sec->id; 1024 ret->elf.dynstr_index = htab->r_sym (rel->r_info); 1025 ret->elf.dynindx = -1; 1026 ret->func_pointer_refcount = 0; 1027 ret->plt_got.offset = (bfd_vma) -1; 1028 *slot = ret; 1029 } 1030 return &ret->elf; 1031} 1032 1033/* Destroy an X86-64 ELF linker hash table. */ 1034 1035static void 1036elf_x86_64_link_hash_table_free (bfd *obfd) 1037{ 1038 struct elf_x86_64_link_hash_table *htab 1039 = (struct elf_x86_64_link_hash_table *) obfd->link.hash; 1040 1041 if (htab->loc_hash_table) 1042 htab_delete (htab->loc_hash_table); 1043 if (htab->loc_hash_memory) 1044 objalloc_free ((struct objalloc *) htab->loc_hash_memory); 1045 _bfd_elf_link_hash_table_free (obfd); 1046} 1047 1048/* Create an X86-64 ELF linker hash table. */ 1049 1050static struct bfd_link_hash_table * 1051elf_x86_64_link_hash_table_create (bfd *abfd) 1052{ 1053 struct elf_x86_64_link_hash_table *ret; 1054 bfd_size_type amt = sizeof (struct elf_x86_64_link_hash_table); 1055 1056 ret = (struct elf_x86_64_link_hash_table *) bfd_zmalloc (amt); 1057 if (ret == NULL) 1058 return NULL; 1059 1060 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, 1061 elf_x86_64_link_hash_newfunc, 1062 sizeof (struct elf_x86_64_link_hash_entry), 1063 X86_64_ELF_DATA)) 1064 { 1065 free (ret); 1066 return NULL; 1067 } 1068 1069 if (ABI_64_P (abfd)) 1070 { 1071 ret->r_info = elf64_r_info; 1072 ret->r_sym = elf64_r_sym; 1073 ret->pointer_r_type = R_X86_64_64; 1074 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER; 1075 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER; 1076 } 1077 else 1078 { 1079 ret->r_info = elf32_r_info; 1080 ret->r_sym = elf32_r_sym; 1081 ret->pointer_r_type = R_X86_64_32; 1082 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER; 1083 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER; 1084 } 1085 1086 ret->loc_hash_table = htab_try_create (1024, 1087 elf_x86_64_local_htab_hash, 1088 elf_x86_64_local_htab_eq, 1089 NULL); 1090 ret->loc_hash_memory = objalloc_create (); 1091 if (!ret->loc_hash_table || !ret->loc_hash_memory) 1092 { 1093 elf_x86_64_link_hash_table_free (abfd); 1094 return NULL; 1095 } 1096 ret->elf.root.hash_table_free = elf_x86_64_link_hash_table_free; 1097 1098 return &ret->elf.root; 1099} 1100 1101/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and 1102 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 1103 hash table. */ 1104 1105static bfd_boolean 1106elf_x86_64_create_dynamic_sections (bfd *dynobj, 1107 struct bfd_link_info *info) 1108{ 1109 struct elf_x86_64_link_hash_table *htab; 1110 1111 if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 1112 return FALSE; 1113 1114 htab = elf_x86_64_hash_table (info); 1115 if (htab == NULL) 1116 return FALSE; 1117 1118 /* Set the contents of the .interp section to the interpreter. */ 1119 if (bfd_link_executable (info) && !info->nointerp) 1120 { 1121 asection *s = bfd_get_linker_section (dynobj, ".interp"); 1122 if (s == NULL) 1123 abort (); 1124 s->size = htab->dynamic_interpreter_size; 1125 s->contents = (unsigned char *) htab->dynamic_interpreter; 1126 htab->interp = s; 1127 } 1128 1129 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); 1130 if (!htab->sdynbss) 1131 abort (); 1132 1133 if (bfd_link_executable (info)) 1134 { 1135 /* Always allow copy relocs for building executables. */ 1136 asection *s = bfd_get_linker_section (dynobj, ".rela.bss"); 1137 if (s == NULL) 1138 { 1139 const struct elf_backend_data *bed = get_elf_backend_data (dynobj); 1140 s = bfd_make_section_anyway_with_flags (dynobj, 1141 ".rela.bss", 1142 (bed->dynamic_sec_flags 1143 | SEC_READONLY)); 1144 if (s == NULL 1145 || ! bfd_set_section_alignment (dynobj, s, 1146 bed->s->log_file_align)) 1147 return FALSE; 1148 } 1149 htab->srelbss = s; 1150 } 1151 1152 if (!info->no_ld_generated_unwind_info 1153 && htab->plt_eh_frame == NULL 1154 && htab->elf.splt != NULL) 1155 { 1156 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY 1157 | SEC_HAS_CONTENTS | SEC_IN_MEMORY 1158 | SEC_LINKER_CREATED); 1159 htab->plt_eh_frame 1160 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags); 1161 if (htab->plt_eh_frame == NULL 1162 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 3)) 1163 return FALSE; 1164 } 1165 1166 /* Align .got section to its entry size. */ 1167 if (htab->elf.sgot != NULL 1168 && !bfd_set_section_alignment (dynobj, htab->elf.sgot, 3)) 1169 return FALSE; 1170 1171 /* Align .got.plt section to its entry size. */ 1172 if (htab->elf.sgotplt != NULL 1173 && !bfd_set_section_alignment (dynobj, htab->elf.sgotplt, 3)) 1174 return FALSE; 1175 1176 return TRUE; 1177} 1178 1179/* Copy the extra info we tack onto an elf_link_hash_entry. */ 1180 1181static void 1182elf_x86_64_copy_indirect_symbol (struct bfd_link_info *info, 1183 struct elf_link_hash_entry *dir, 1184 struct elf_link_hash_entry *ind) 1185{ 1186 struct elf_x86_64_link_hash_entry *edir, *eind; 1187 1188 edir = (struct elf_x86_64_link_hash_entry *) dir; 1189 eind = (struct elf_x86_64_link_hash_entry *) ind; 1190 1191 if (!edir->has_bnd_reloc) 1192 edir->has_bnd_reloc = eind->has_bnd_reloc; 1193 1194 if (!edir->has_got_reloc) 1195 edir->has_got_reloc = eind->has_got_reloc; 1196 1197 if (!edir->has_non_got_reloc) 1198 edir->has_non_got_reloc = eind->has_non_got_reloc; 1199 1200 if (eind->dyn_relocs != NULL) 1201 { 1202 if (edir->dyn_relocs != NULL) 1203 { 1204 struct elf_dyn_relocs **pp; 1205 struct elf_dyn_relocs *p; 1206 1207 /* Add reloc counts against the indirect sym to the direct sym 1208 list. Merge any entries against the same section. */ 1209 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 1210 { 1211 struct elf_dyn_relocs *q; 1212 1213 for (q = edir->dyn_relocs; q != NULL; q = q->next) 1214 if (q->sec == p->sec) 1215 { 1216 q->pc_count += p->pc_count; 1217 q->count += p->count; 1218 *pp = p->next; 1219 break; 1220 } 1221 if (q == NULL) 1222 pp = &p->next; 1223 } 1224 *pp = edir->dyn_relocs; 1225 } 1226 1227 edir->dyn_relocs = eind->dyn_relocs; 1228 eind->dyn_relocs = NULL; 1229 } 1230 1231 if (ind->root.type == bfd_link_hash_indirect 1232 && dir->got.refcount <= 0) 1233 { 1234 edir->tls_type = eind->tls_type; 1235 eind->tls_type = GOT_UNKNOWN; 1236 } 1237 1238 if (ELIMINATE_COPY_RELOCS 1239 && ind->root.type != bfd_link_hash_indirect 1240 && dir->dynamic_adjusted) 1241 { 1242 /* If called to transfer flags for a weakdef during processing 1243 of elf_adjust_dynamic_symbol, don't copy non_got_ref. 1244 We clear it ourselves for ELIMINATE_COPY_RELOCS. */ 1245 dir->ref_dynamic |= ind->ref_dynamic; 1246 dir->ref_regular |= ind->ref_regular; 1247 dir->ref_regular_nonweak |= ind->ref_regular_nonweak; 1248 dir->needs_plt |= ind->needs_plt; 1249 dir->pointer_equality_needed |= ind->pointer_equality_needed; 1250 } 1251 else 1252 { 1253 if (eind->func_pointer_refcount > 0) 1254 { 1255 edir->func_pointer_refcount += eind->func_pointer_refcount; 1256 eind->func_pointer_refcount = 0; 1257 } 1258 1259 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 1260 } 1261} 1262 1263static bfd_boolean 1264elf64_x86_64_elf_object_p (bfd *abfd) 1265{ 1266 /* Set the right machine number for an x86-64 elf64 file. */ 1267 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64); 1268 return TRUE; 1269} 1270 1271static bfd_boolean 1272elf32_x86_64_elf_object_p (bfd *abfd) 1273{ 1274 /* Set the right machine number for an x86-64 elf32 file. */ 1275 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32); 1276 return TRUE; 1277} 1278 1279/* Return TRUE if the TLS access code sequence support transition 1280 from R_TYPE. */ 1281 1282static bfd_boolean 1283elf_x86_64_check_tls_transition (bfd *abfd, 1284 struct bfd_link_info *info, 1285 asection *sec, 1286 bfd_byte *contents, 1287 Elf_Internal_Shdr *symtab_hdr, 1288 struct elf_link_hash_entry **sym_hashes, 1289 unsigned int r_type, 1290 const Elf_Internal_Rela *rel, 1291 const Elf_Internal_Rela *relend) 1292{ 1293 unsigned int val; 1294 unsigned long r_symndx; 1295 bfd_boolean largepic = FALSE; 1296 struct elf_link_hash_entry *h; 1297 bfd_vma offset; 1298 struct elf_x86_64_link_hash_table *htab; 1299 bfd_byte *call; 1300 bfd_boolean indirect_call, tls_get_addr; 1301 1302 htab = elf_x86_64_hash_table (info); 1303 offset = rel->r_offset; 1304 switch (r_type) 1305 { 1306 case R_X86_64_TLSGD: 1307 case R_X86_64_TLSLD: 1308 if ((rel + 1) >= relend) 1309 return FALSE; 1310 1311 if (r_type == R_X86_64_TLSGD) 1312 { 1313 /* Check transition from GD access model. For 64bit, only 1314 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 1315 .word 0x6666; rex64; call __tls_get_addr@PLT 1316 or 1317 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 1318 .byte 0x66; rex64 1319 call *__tls_get_addr@GOTPCREL(%rip) 1320 which may be converted to 1321 addr32 call __tls_get_addr 1322 can transit to different access model. For 32bit, only 1323 leaq foo@tlsgd(%rip), %rdi 1324 .word 0x6666; rex64; call __tls_get_addr@PLT 1325 or 1326 leaq foo@tlsgd(%rip), %rdi 1327 .byte 0x66; rex64 1328 call *__tls_get_addr@GOTPCREL(%rip) 1329 which may be converted to 1330 addr32 call __tls_get_addr 1331 can transit to different access model. For largepic, 1332 we also support: 1333 leaq foo@tlsgd(%rip), %rdi 1334 movabsq $__tls_get_addr@pltoff, %rax 1335 addq $r15, %rax 1336 call *%rax 1337 or 1338 leaq foo@tlsgd(%rip), %rdi 1339 movabsq $__tls_get_addr@pltoff, %rax 1340 addq $rbx, %rax 1341 call *%rax */ 1342 1343 static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d }; 1344 1345 if ((offset + 12) > sec->size) 1346 return FALSE; 1347 1348 call = contents + offset + 4; 1349 if (call[0] != 0x66 1350 || !((call[1] == 0x48 1351 && call[2] == 0xff 1352 && call[3] == 0x15) 1353 || (call[1] == 0x48 1354 && call[2] == 0x67 1355 && call[3] == 0xe8) 1356 || (call[1] == 0x66 1357 && call[2] == 0x48 1358 && call[3] == 0xe8))) 1359 { 1360 if (!ABI_64_P (abfd) 1361 || (offset + 19) > sec->size 1362 || offset < 3 1363 || memcmp (call - 7, leaq + 1, 3) != 0 1364 || memcmp (call, "\x48\xb8", 2) != 0 1365 || call[11] != 0x01 1366 || call[13] != 0xff 1367 || call[14] != 0xd0 1368 || !((call[10] == 0x48 && call[12] == 0xd8) 1369 || (call[10] == 0x4c && call[12] == 0xf8))) 1370 return FALSE; 1371 largepic = TRUE; 1372 } 1373 else if (ABI_64_P (abfd)) 1374 { 1375 if (offset < 4 1376 || memcmp (contents + offset - 4, leaq, 4) != 0) 1377 return FALSE; 1378 } 1379 else 1380 { 1381 if (offset < 3 1382 || memcmp (contents + offset - 3, leaq + 1, 3) != 0) 1383 return FALSE; 1384 } 1385 indirect_call = call[2] == 0xff; 1386 } 1387 else 1388 { 1389 /* Check transition from LD access model. Only 1390 leaq foo@tlsld(%rip), %rdi; 1391 call __tls_get_addr@PLT 1392 or 1393 leaq foo@tlsld(%rip), %rdi; 1394 call *__tls_get_addr@GOTPCREL(%rip) 1395 which may be converted to 1396 addr32 call __tls_get_addr 1397 can transit to different access model. For largepic 1398 we also support: 1399 leaq foo@tlsld(%rip), %rdi 1400 movabsq $__tls_get_addr@pltoff, %rax 1401 addq $r15, %rax 1402 call *%rax 1403 or 1404 leaq foo@tlsld(%rip), %rdi 1405 movabsq $__tls_get_addr@pltoff, %rax 1406 addq $rbx, %rax 1407 call *%rax */ 1408 1409 static const unsigned char lea[] = { 0x48, 0x8d, 0x3d }; 1410 1411 if (offset < 3 || (offset + 9) > sec->size) 1412 return FALSE; 1413 1414 if (memcmp (contents + offset - 3, lea, 3) != 0) 1415 return FALSE; 1416 1417 call = contents + offset + 4; 1418 if (!(call[0] == 0xe8 1419 || (call[0] == 0xff && call[1] == 0x15) 1420 || (call[0] == 0x67 && call[1] == 0xe8))) 1421 { 1422 if (!ABI_64_P (abfd) 1423 || (offset + 19) > sec->size 1424 || memcmp (call, "\x48\xb8", 2) != 0 1425 || call[11] != 0x01 1426 || call[13] != 0xff 1427 || call[14] != 0xd0 1428 || !((call[10] == 0x48 && call[12] == 0xd8) 1429 || (call[10] == 0x4c && call[12] == 0xf8))) 1430 return FALSE; 1431 largepic = TRUE; 1432 } 1433 indirect_call = call[0] == 0xff; 1434 } 1435 1436 r_symndx = htab->r_sym (rel[1].r_info); 1437 if (r_symndx < symtab_hdr->sh_info) 1438 return FALSE; 1439 1440 tls_get_addr = FALSE; 1441 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1442 if (h != NULL && h->root.root.string != NULL) 1443 { 1444 struct elf_x86_64_link_hash_entry *eh 1445 = (struct elf_x86_64_link_hash_entry *) h; 1446 tls_get_addr = eh->tls_get_addr == 1; 1447 if (eh->tls_get_addr > 1) 1448 { 1449 /* Use strncmp to check __tls_get_addr since 1450 __tls_get_addr may be versioned. */ 1451 if (strncmp (h->root.root.string, "__tls_get_addr", 14) 1452 == 0) 1453 { 1454 eh->tls_get_addr = 1; 1455 tls_get_addr = TRUE; 1456 } 1457 else 1458 eh->tls_get_addr = 0; 1459 } 1460 } 1461 1462 if (!tls_get_addr) 1463 return FALSE; 1464 else if (largepic) 1465 return ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64; 1466 else if (indirect_call) 1467 return ELF32_R_TYPE (rel[1].r_info) == R_X86_64_GOTPCRELX; 1468 else 1469 return (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32 1470 || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32); 1471 1472 case R_X86_64_GOTTPOFF: 1473 /* Check transition from IE access model: 1474 mov foo@gottpoff(%rip), %reg 1475 add foo@gottpoff(%rip), %reg 1476 */ 1477 1478 /* Check REX prefix first. */ 1479 if (offset >= 3 && (offset + 4) <= sec->size) 1480 { 1481 val = bfd_get_8 (abfd, contents + offset - 3); 1482 if (val != 0x48 && val != 0x4c) 1483 { 1484 /* X32 may have 0x44 REX prefix or no REX prefix. */ 1485 if (ABI_64_P (abfd)) 1486 return FALSE; 1487 } 1488 } 1489 else 1490 { 1491 /* X32 may not have any REX prefix. */ 1492 if (ABI_64_P (abfd)) 1493 return FALSE; 1494 if (offset < 2 || (offset + 3) > sec->size) 1495 return FALSE; 1496 } 1497 1498 val = bfd_get_8 (abfd, contents + offset - 2); 1499 if (val != 0x8b && val != 0x03) 1500 return FALSE; 1501 1502 val = bfd_get_8 (abfd, contents + offset - 1); 1503 return (val & 0xc7) == 5; 1504 1505 case R_X86_64_GOTPC32_TLSDESC: 1506 /* Check transition from GDesc access model: 1507 leaq x@tlsdesc(%rip), %rax 1508 1509 Make sure it's a leaq adding rip to a 32-bit offset 1510 into any register, although it's probably almost always 1511 going to be rax. */ 1512 1513 if (offset < 3 || (offset + 4) > sec->size) 1514 return FALSE; 1515 1516 val = bfd_get_8 (abfd, contents + offset - 3); 1517 if ((val & 0xfb) != 0x48) 1518 return FALSE; 1519 1520 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d) 1521 return FALSE; 1522 1523 val = bfd_get_8 (abfd, contents + offset - 1); 1524 return (val & 0xc7) == 0x05; 1525 1526 case R_X86_64_TLSDESC_CALL: 1527 /* Check transition from GDesc access model: 1528 call *x@tlsdesc(%rax) 1529 */ 1530 if (offset + 2 <= sec->size) 1531 { 1532 /* Make sure that it's a call *x@tlsdesc(%rax). */ 1533 call = contents + offset; 1534 return call[0] == 0xff && call[1] == 0x10; 1535 } 1536 1537 return FALSE; 1538 1539 default: 1540 abort (); 1541 } 1542} 1543 1544/* Return TRUE if the TLS access transition is OK or no transition 1545 will be performed. Update R_TYPE if there is a transition. */ 1546 1547static bfd_boolean 1548elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd, 1549 asection *sec, bfd_byte *contents, 1550 Elf_Internal_Shdr *symtab_hdr, 1551 struct elf_link_hash_entry **sym_hashes, 1552 unsigned int *r_type, int tls_type, 1553 const Elf_Internal_Rela *rel, 1554 const Elf_Internal_Rela *relend, 1555 struct elf_link_hash_entry *h, 1556 unsigned long r_symndx, 1557 bfd_boolean from_relocate_section) 1558{ 1559 unsigned int from_type = *r_type; 1560 unsigned int to_type = from_type; 1561 bfd_boolean check = TRUE; 1562 1563 /* Skip TLS transition for functions. */ 1564 if (h != NULL 1565 && (h->type == STT_FUNC 1566 || h->type == STT_GNU_IFUNC)) 1567 return TRUE; 1568 1569 switch (from_type) 1570 { 1571 case R_X86_64_TLSGD: 1572 case R_X86_64_GOTPC32_TLSDESC: 1573 case R_X86_64_TLSDESC_CALL: 1574 case R_X86_64_GOTTPOFF: 1575 if (bfd_link_executable (info)) 1576 { 1577 if (h == NULL) 1578 to_type = R_X86_64_TPOFF32; 1579 else 1580 to_type = R_X86_64_GOTTPOFF; 1581 } 1582 1583 /* When we are called from elf_x86_64_relocate_section, there may 1584 be additional transitions based on TLS_TYPE. */ 1585 if (from_relocate_section) 1586 { 1587 unsigned int new_to_type = to_type; 1588 1589 if (bfd_link_executable (info) 1590 && h != NULL 1591 && h->dynindx == -1 1592 && tls_type == GOT_TLS_IE) 1593 new_to_type = R_X86_64_TPOFF32; 1594 1595 if (to_type == R_X86_64_TLSGD 1596 || to_type == R_X86_64_GOTPC32_TLSDESC 1597 || to_type == R_X86_64_TLSDESC_CALL) 1598 { 1599 if (tls_type == GOT_TLS_IE) 1600 new_to_type = R_X86_64_GOTTPOFF; 1601 } 1602 1603 /* We checked the transition before when we were called from 1604 elf_x86_64_check_relocs. We only want to check the new 1605 transition which hasn't been checked before. */ 1606 check = new_to_type != to_type && from_type == to_type; 1607 to_type = new_to_type; 1608 } 1609 1610 break; 1611 1612 case R_X86_64_TLSLD: 1613 if (bfd_link_executable (info)) 1614 to_type = R_X86_64_TPOFF32; 1615 break; 1616 1617 default: 1618 return TRUE; 1619 } 1620 1621 /* Return TRUE if there is no transition. */ 1622 if (from_type == to_type) 1623 return TRUE; 1624 1625 /* Check if the transition can be performed. */ 1626 if (check 1627 && ! elf_x86_64_check_tls_transition (abfd, info, sec, contents, 1628 symtab_hdr, sym_hashes, 1629 from_type, rel, relend)) 1630 { 1631 reloc_howto_type *from, *to; 1632 const char *name; 1633 1634 from = elf_x86_64_rtype_to_howto (abfd, from_type); 1635 to = elf_x86_64_rtype_to_howto (abfd, to_type); 1636 1637 if (h) 1638 name = h->root.root.string; 1639 else 1640 { 1641 struct elf_x86_64_link_hash_table *htab; 1642 1643 htab = elf_x86_64_hash_table (info); 1644 if (htab == NULL) 1645 name = "*unknown*"; 1646 else 1647 { 1648 Elf_Internal_Sym *isym; 1649 1650 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 1651 abfd, r_symndx); 1652 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL); 1653 } 1654 } 1655 1656 (*_bfd_error_handler) 1657 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx " 1658 "in section `%A' failed"), 1659 abfd, sec, from->name, to->name, name, 1660 (unsigned long) rel->r_offset); 1661 bfd_set_error (bfd_error_bad_value); 1662 return FALSE; 1663 } 1664 1665 *r_type = to_type; 1666 return TRUE; 1667} 1668 1669/* Rename some of the generic section flags to better document how they 1670 are used here. */ 1671#define need_convert_load sec_flg0 1672#define check_relocs_failed sec_flg1 1673 1674static bfd_boolean 1675elf_x86_64_need_pic (bfd *input_bfd, asection *sec, 1676 struct elf_link_hash_entry *h, 1677 Elf_Internal_Shdr *symtab_hdr, 1678 Elf_Internal_Sym *isym, 1679 reloc_howto_type *howto) 1680{ 1681 const char *v = ""; 1682 const char *und = ""; 1683 const char *pic = ""; 1684 1685 const char *name; 1686 if (h) 1687 { 1688 name = h->root.root.string; 1689 switch (ELF_ST_VISIBILITY (h->other)) 1690 { 1691 case STV_HIDDEN: 1692 v = _("hidden symbol "); 1693 break; 1694 case STV_INTERNAL: 1695 v = _("internal symbol "); 1696 break; 1697 case STV_PROTECTED: 1698 v = _("protected symbol "); 1699 break; 1700 default: 1701 v = _("symbol "); 1702 pic = _("; recompile with -fPIC"); 1703 break; 1704 } 1705 1706 if (!h->def_regular && !h->def_dynamic) 1707 und = _("undefined "); 1708 } 1709 else 1710 { 1711 name = bfd_elf_sym_name (input_bfd, symtab_hdr, isym, NULL); 1712 pic = _("; recompile with -fPIC"); 1713 } 1714 1715 (*_bfd_error_handler) (_("%B: relocation %s against %s%s`%s' can " 1716 "not be used when making a shared object%s"), 1717 input_bfd, howto->name, und, v, name, pic); 1718 bfd_set_error (bfd_error_bad_value); 1719 sec->check_relocs_failed = 1; 1720 return FALSE; 1721} 1722 1723/* With the local symbol, foo, we convert 1724 mov foo@GOTPCREL(%rip), %reg 1725 to 1726 lea foo(%rip), %reg 1727 and convert 1728 call/jmp *foo@GOTPCREL(%rip) 1729 to 1730 nop call foo/jmp foo nop 1731 When PIC is false, convert 1732 test %reg, foo@GOTPCREL(%rip) 1733 to 1734 test $foo, %reg 1735 and convert 1736 binop foo@GOTPCREL(%rip), %reg 1737 to 1738 binop $foo, %reg 1739 where binop is one of adc, add, and, cmp, or, sbb, sub, xor 1740 instructions. */ 1741 1742static bfd_boolean 1743elf_x86_64_convert_load_reloc (bfd *abfd, asection *sec, 1744 bfd_byte *contents, 1745 Elf_Internal_Rela *irel, 1746 struct elf_link_hash_entry *h, 1747 bfd_boolean *converted, 1748 struct bfd_link_info *link_info) 1749{ 1750 struct elf_x86_64_link_hash_table *htab; 1751 bfd_boolean is_pic; 1752 bfd_boolean require_reloc_pc32; 1753 bfd_boolean relocx; 1754 bfd_boolean to_reloc_pc32; 1755 asection *tsec; 1756 char symtype; 1757 bfd_signed_vma raddend; 1758 unsigned int opcode; 1759 unsigned int modrm; 1760 unsigned int r_type = ELF32_R_TYPE (irel->r_info); 1761 unsigned int r_symndx; 1762 bfd_vma toff; 1763 bfd_vma roff = irel->r_offset; 1764 1765 if (roff < (r_type == R_X86_64_REX_GOTPCRELX ? 3 : 2)) 1766 return TRUE; 1767 1768 raddend = irel->r_addend; 1769 /* Addend for 32-bit PC-relative relocation must be -4. */ 1770 if (raddend != -4) 1771 return TRUE; 1772 1773 htab = elf_x86_64_hash_table (link_info); 1774 is_pic = bfd_link_pic (link_info); 1775 1776 relocx = (r_type == R_X86_64_GOTPCRELX 1777 || r_type == R_X86_64_REX_GOTPCRELX); 1778 1779 /* TRUE if we can convert only to R_X86_64_PC32. Enable it for 1780 --no-relax. */ 1781 require_reloc_pc32 1782 = link_info->disable_target_specific_optimizations > 1; 1783 1784 r_symndx = htab->r_sym (irel->r_info); 1785 1786 opcode = bfd_get_8 (abfd, contents + roff - 2); 1787 1788 /* Convert mov to lea since it has been done for a while. */ 1789 if (opcode != 0x8b) 1790 { 1791 /* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX 1792 for call, jmp or one of adc, add, and, cmp, or, sbb, sub, 1793 test, xor instructions. */ 1794 if (!relocx) 1795 return TRUE; 1796 } 1797 1798 /* We convert only to R_X86_64_PC32: 1799 1. Branch. 1800 2. R_X86_64_GOTPCREL since we can't modify REX byte. 1801 3. require_reloc_pc32 is true. 1802 4. PIC. 1803 */ 1804 to_reloc_pc32 = (opcode == 0xff 1805 || !relocx 1806 || require_reloc_pc32 1807 || is_pic); 1808 1809 /* Get the symbol referred to by the reloc. */ 1810 if (h == NULL) 1811 { 1812 Elf_Internal_Sym *isym 1813 = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx); 1814 1815 /* Skip relocation against undefined symbols. */ 1816 if (isym->st_shndx == SHN_UNDEF) 1817 return TRUE; 1818 1819 symtype = ELF_ST_TYPE (isym->st_info); 1820 1821 if (isym->st_shndx == SHN_ABS) 1822 tsec = bfd_abs_section_ptr; 1823 else if (isym->st_shndx == SHN_COMMON) 1824 tsec = bfd_com_section_ptr; 1825 else if (isym->st_shndx == SHN_X86_64_LCOMMON) 1826 tsec = &_bfd_elf_large_com_section; 1827 else 1828 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx); 1829 1830 toff = isym->st_value; 1831 } 1832 else 1833 { 1834 /* Undefined weak symbol is only bound locally in executable 1835 and its reference is resolved as 0 without relocation 1836 overflow. We can only perform this optimization for 1837 GOTPCRELX relocations since we need to modify REX byte. 1838 It is OK convert mov with R_X86_64_GOTPCREL to 1839 R_X86_64_PC32. */ 1840 if ((relocx || opcode == 0x8b) 1841 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info, 1842 TRUE, 1843 elf_x86_64_hash_entry (h))) 1844 { 1845 if (opcode == 0xff) 1846 { 1847 /* Skip for branch instructions since R_X86_64_PC32 1848 may overflow. */ 1849 if (require_reloc_pc32) 1850 return TRUE; 1851 } 1852 else if (relocx) 1853 { 1854 /* For non-branch instructions, we can convert to 1855 R_X86_64_32/R_X86_64_32S since we know if there 1856 is a REX byte. */ 1857 to_reloc_pc32 = FALSE; 1858 } 1859 1860 /* Since we don't know the current PC when PIC is true, 1861 we can't convert to R_X86_64_PC32. */ 1862 if (to_reloc_pc32 && is_pic) 1863 return TRUE; 1864 1865 goto convert; 1866 } 1867 /* Avoid optimizing GOTPCREL relocations againt _DYNAMIC since 1868 ld.so may use its link-time address. */ 1869 else if ((h->def_regular 1870 || h->root.type == bfd_link_hash_defined 1871 || h->root.type == bfd_link_hash_defweak) 1872 && h != htab->elf.hdynamic 1873 && SYMBOL_REFERENCES_LOCAL (link_info, h)) 1874 { 1875 /* bfd_link_hash_new or bfd_link_hash_undefined is 1876 set by an assignment in a linker script in 1877 bfd_elf_record_link_assignment. */ 1878 if (h->def_regular 1879 && (h->root.type == bfd_link_hash_new 1880 || h->root.type == bfd_link_hash_undefined)) 1881 { 1882 /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */ 1883 if (require_reloc_pc32) 1884 return TRUE; 1885 goto convert; 1886 } 1887 tsec = h->root.u.def.section; 1888 toff = h->root.u.def.value; 1889 symtype = h->type; 1890 } 1891 else 1892 return TRUE; 1893 } 1894 1895 /* Don't convert GOTPCREL relocation against large section. */ 1896 if (elf_section_data (tsec) != NULL 1897 && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0) 1898 return TRUE; 1899 1900 /* We can only estimate relocation overflow for R_X86_64_PC32. */ 1901 if (!to_reloc_pc32) 1902 goto convert; 1903 1904 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE) 1905 { 1906 /* At this stage in linking, no SEC_MERGE symbol has been 1907 adjusted, so all references to such symbols need to be 1908 passed through _bfd_merged_section_offset. (Later, in 1909 relocate_section, all SEC_MERGE symbols *except* for 1910 section symbols have been adjusted.) 1911 1912 gas may reduce relocations against symbols in SEC_MERGE 1913 sections to a relocation against the section symbol when 1914 the original addend was zero. When the reloc is against 1915 a section symbol we should include the addend in the 1916 offset passed to _bfd_merged_section_offset, since the 1917 location of interest is the original symbol. On the 1918 other hand, an access to "sym+addend" where "sym" is not 1919 a section symbol should not include the addend; Such an 1920 access is presumed to be an offset from "sym"; The 1921 location of interest is just "sym". */ 1922 if (symtype == STT_SECTION) 1923 toff += raddend; 1924 1925 toff = _bfd_merged_section_offset (abfd, &tsec, 1926 elf_section_data (tsec)->sec_info, 1927 toff); 1928 1929 if (symtype != STT_SECTION) 1930 toff += raddend; 1931 } 1932 else 1933 toff += raddend; 1934 1935 /* Don't convert if R_X86_64_PC32 relocation overflows. */ 1936 if (tsec->output_section == sec->output_section) 1937 { 1938 if ((toff - roff + 0x80000000) > 0xffffffff) 1939 return TRUE; 1940 } 1941 else 1942 { 1943 bfd_signed_vma distance; 1944 1945 /* At this point, we don't know the load addresses of TSEC 1946 section nor SEC section. We estimate the distrance between 1947 SEC and TSEC. We store the estimated distances in the 1948 compressed_size field of the output section, which is only 1949 used to decompress the compressed input section. */ 1950 if (sec->output_section->compressed_size == 0) 1951 { 1952 asection *asect; 1953 bfd_size_type size = 0; 1954 for (asect = link_info->output_bfd->sections; 1955 asect != NULL; 1956 asect = asect->next) 1957 /* Skip debug sections since compressed_size is used to 1958 compress debug sections. */ 1959 if ((asect->flags & SEC_DEBUGGING) == 0) 1960 { 1961 asection *i; 1962 for (i = asect->map_head.s; 1963 i != NULL; 1964 i = i->map_head.s) 1965 { 1966 size = align_power (size, i->alignment_power); 1967 size += i->size; 1968 } 1969 asect->compressed_size = size; 1970 } 1971 } 1972 1973 /* Don't convert GOTPCREL relocations if TSEC isn't placed 1974 after SEC. */ 1975 distance = (tsec->output_section->compressed_size 1976 - sec->output_section->compressed_size); 1977 if (distance < 0) 1978 return TRUE; 1979 1980 /* Take PT_GNU_RELRO segment into account by adding 1981 maxpagesize. */ 1982 if ((toff + distance + get_elf_backend_data (abfd)->maxpagesize 1983 - roff + 0x80000000) > 0xffffffff) 1984 return TRUE; 1985 } 1986 1987convert: 1988 if (opcode == 0xff) 1989 { 1990 /* We have "call/jmp *foo@GOTPCREL(%rip)". */ 1991 unsigned int nop; 1992 unsigned int disp; 1993 bfd_vma nop_offset; 1994 1995 /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to 1996 R_X86_64_PC32. */ 1997 modrm = bfd_get_8 (abfd, contents + roff - 1); 1998 if (modrm == 0x25) 1999 { 2000 /* Convert to "jmp foo nop". */ 2001 modrm = 0xe9; 2002 nop = NOP_OPCODE; 2003 nop_offset = irel->r_offset + 3; 2004 disp = bfd_get_32 (abfd, contents + irel->r_offset); 2005 irel->r_offset -= 1; 2006 bfd_put_32 (abfd, disp, contents + irel->r_offset); 2007 } 2008 else 2009 { 2010 struct elf_x86_64_link_hash_entry *eh 2011 = (struct elf_x86_64_link_hash_entry *) h; 2012 2013 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE 2014 is a nop prefix. */ 2015 modrm = 0xe8; 2016 /* To support TLS optimization, always use addr32 prefix for 2017 "call *__tls_get_addr@GOTPCREL(%rip)". */ 2018 if (eh && eh->tls_get_addr == 1) 2019 { 2020 nop = 0x67; 2021 nop_offset = irel->r_offset - 2; 2022 } 2023 else 2024 { 2025 nop = link_info->call_nop_byte; 2026 if (link_info->call_nop_as_suffix) 2027 { 2028 nop_offset = irel->r_offset + 3; 2029 disp = bfd_get_32 (abfd, contents + irel->r_offset); 2030 irel->r_offset -= 1; 2031 bfd_put_32 (abfd, disp, contents + irel->r_offset); 2032 } 2033 else 2034 nop_offset = irel->r_offset - 2; 2035 } 2036 } 2037 bfd_put_8 (abfd, nop, contents + nop_offset); 2038 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1); 2039 r_type = R_X86_64_PC32; 2040 } 2041 else 2042 { 2043 unsigned int rex; 2044 unsigned int rex_mask = REX_R; 2045 2046 if (r_type == R_X86_64_REX_GOTPCRELX) 2047 rex = bfd_get_8 (abfd, contents + roff - 3); 2048 else 2049 rex = 0; 2050 2051 if (opcode == 0x8b) 2052 { 2053 if (to_reloc_pc32) 2054 { 2055 /* Convert "mov foo@GOTPCREL(%rip), %reg" to 2056 "lea foo(%rip), %reg". */ 2057 opcode = 0x8d; 2058 r_type = R_X86_64_PC32; 2059 } 2060 else 2061 { 2062 /* Convert "mov foo@GOTPCREL(%rip), %reg" to 2063 "mov $foo, %reg". */ 2064 opcode = 0xc7; 2065 modrm = bfd_get_8 (abfd, contents + roff - 1); 2066 modrm = 0xc0 | (modrm & 0x38) >> 3; 2067 if ((rex & REX_W) != 0 2068 && ABI_64_P (link_info->output_bfd)) 2069 { 2070 /* Keep the REX_W bit in REX byte for LP64. */ 2071 r_type = R_X86_64_32S; 2072 goto rewrite_modrm_rex; 2073 } 2074 else 2075 { 2076 /* If the REX_W bit in REX byte isn't needed, 2077 use R_X86_64_32 and clear the W bit to avoid 2078 sign-extend imm32 to imm64. */ 2079 r_type = R_X86_64_32; 2080 /* Clear the W bit in REX byte. */ 2081 rex_mask |= REX_W; 2082 goto rewrite_modrm_rex; 2083 } 2084 } 2085 } 2086 else 2087 { 2088 /* R_X86_64_PC32 isn't supported. */ 2089 if (to_reloc_pc32) 2090 return TRUE; 2091 2092 modrm = bfd_get_8 (abfd, contents + roff - 1); 2093 if (opcode == 0x85) 2094 { 2095 /* Convert "test %reg, foo@GOTPCREL(%rip)" to 2096 "test $foo, %reg". */ 2097 modrm = 0xc0 | (modrm & 0x38) >> 3; 2098 opcode = 0xf7; 2099 } 2100 else 2101 { 2102 /* Convert "binop foo@GOTPCREL(%rip), %reg" to 2103 "binop $foo, %reg". */ 2104 modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c); 2105 opcode = 0x81; 2106 } 2107 2108 /* Use R_X86_64_32 with 32-bit operand to avoid relocation 2109 overflow when sign-extending imm32 to imm64. */ 2110 r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32; 2111 2112rewrite_modrm_rex: 2113 bfd_put_8 (abfd, modrm, contents + roff - 1); 2114 2115 if (rex) 2116 { 2117 /* Move the R bit to the B bit in REX byte. */ 2118 rex = (rex & ~rex_mask) | (rex & REX_R) >> 2; 2119 bfd_put_8 (abfd, rex, contents + roff - 3); 2120 } 2121 2122 /* No addend for R_X86_64_32/R_X86_64_32S relocations. */ 2123 irel->r_addend = 0; 2124 } 2125 2126 bfd_put_8 (abfd, opcode, contents + roff - 2); 2127 } 2128 2129 irel->r_info = htab->r_info (r_symndx, r_type); 2130 2131 *converted = TRUE; 2132 2133 return TRUE; 2134} 2135 2136/* Look through the relocs for a section during the first phase, and 2137 calculate needed space in the global offset table, procedure 2138 linkage table, and dynamic reloc sections. */ 2139 2140static bfd_boolean 2141elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, 2142 asection *sec, 2143 const Elf_Internal_Rela *relocs) 2144{ 2145 struct elf_x86_64_link_hash_table *htab; 2146 Elf_Internal_Shdr *symtab_hdr; 2147 struct elf_link_hash_entry **sym_hashes; 2148 const Elf_Internal_Rela *rel; 2149 const Elf_Internal_Rela *rel_end; 2150 asection *sreloc; 2151 bfd_byte *contents; 2152 bfd_boolean use_plt_got; 2153 2154 if (bfd_link_relocatable (info)) 2155 return TRUE; 2156 2157 /* Don't do anything special with non-loaded, non-alloced sections. 2158 In particular, any relocs in such sections should not affect GOT 2159 and PLT reference counting (ie. we don't allow them to create GOT 2160 or PLT entries), there's no possibility or desire to optimize TLS 2161 relocs, and there's not much point in propagating relocs to shared 2162 libs that the dynamic linker won't relocate. */ 2163 if ((sec->flags & SEC_ALLOC) == 0) 2164 return TRUE; 2165 2166 BFD_ASSERT (is_x86_64_elf (abfd)); 2167 2168 htab = elf_x86_64_hash_table (info); 2169 if (htab == NULL) 2170 { 2171 sec->check_relocs_failed = 1; 2172 return FALSE; 2173 } 2174 2175 /* Get the section contents. */ 2176 if (elf_section_data (sec)->this_hdr.contents != NULL) 2177 contents = elf_section_data (sec)->this_hdr.contents; 2178 else if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 2179 { 2180 sec->check_relocs_failed = 1; 2181 return FALSE; 2182 } 2183 2184 use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed; 2185 2186 symtab_hdr = &elf_symtab_hdr (abfd); 2187 sym_hashes = elf_sym_hashes (abfd); 2188 2189 sreloc = NULL; 2190 2191 rel_end = relocs + sec->reloc_count; 2192 for (rel = relocs; rel < rel_end; rel++) 2193 { 2194 unsigned int r_type; 2195 unsigned long r_symndx; 2196 struct elf_link_hash_entry *h; 2197 struct elf_x86_64_link_hash_entry *eh; 2198 Elf_Internal_Sym *isym; 2199 const char *name; 2200 bfd_boolean size_reloc; 2201 2202 r_symndx = htab->r_sym (rel->r_info); 2203 r_type = ELF32_R_TYPE (rel->r_info); 2204 2205 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) 2206 { 2207 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), 2208 abfd, r_symndx); 2209 goto error_return; 2210 } 2211 2212 if (r_symndx < symtab_hdr->sh_info) 2213 { 2214 /* A local symbol. */ 2215 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 2216 abfd, r_symndx); 2217 if (isym == NULL) 2218 goto error_return; 2219 2220 /* Check relocation against local STT_GNU_IFUNC symbol. */ 2221 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) 2222 { 2223 h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, 2224 TRUE); 2225 if (h == NULL) 2226 goto error_return; 2227 2228 /* Fake a STT_GNU_IFUNC symbol. */ 2229 h->type = STT_GNU_IFUNC; 2230 h->def_regular = 1; 2231 h->ref_regular = 1; 2232 h->forced_local = 1; 2233 h->root.type = bfd_link_hash_defined; 2234 } 2235 else 2236 h = NULL; 2237 } 2238 else 2239 { 2240 isym = NULL; 2241 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2242 while (h->root.type == bfd_link_hash_indirect 2243 || h->root.type == bfd_link_hash_warning) 2244 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2245 } 2246 2247 /* Check invalid x32 relocations. */ 2248 if (!ABI_64_P (abfd)) 2249 switch (r_type) 2250 { 2251 default: 2252 break; 2253 2254 case R_X86_64_DTPOFF64: 2255 case R_X86_64_TPOFF64: 2256 case R_X86_64_PC64: 2257 case R_X86_64_GOTOFF64: 2258 case R_X86_64_GOT64: 2259 case R_X86_64_GOTPCREL64: 2260 case R_X86_64_GOTPC64: 2261 case R_X86_64_GOTPLT64: 2262 case R_X86_64_PLTOFF64: 2263 { 2264 if (h) 2265 name = h->root.root.string; 2266 else 2267 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, 2268 NULL); 2269 (*_bfd_error_handler) 2270 (_("%B: relocation %s against symbol `%s' isn't " 2271 "supported in x32 mode"), abfd, 2272 x86_64_elf_howto_table[r_type].name, name); 2273 bfd_set_error (bfd_error_bad_value); 2274 goto error_return; 2275 } 2276 break; 2277 } 2278 2279 if (h != NULL) 2280 { 2281 switch (r_type) 2282 { 2283 default: 2284 break; 2285 2286 case R_X86_64_PC32_BND: 2287 case R_X86_64_PLT32_BND: 2288 case R_X86_64_PC32: 2289 case R_X86_64_PLT32: 2290 case R_X86_64_32: 2291 case R_X86_64_64: 2292 /* MPX PLT is supported only if elf_x86_64_arch_bed 2293 is used in 64-bit mode. */ 2294 if (ABI_64_P (abfd) 2295 && info->bndplt 2296 && (get_elf_x86_64_backend_data (abfd) 2297 == &elf_x86_64_arch_bed)) 2298 { 2299 elf_x86_64_hash_entry (h)->has_bnd_reloc = 1; 2300 2301 /* Create the second PLT for Intel MPX support. */ 2302 if (htab->plt_bnd == NULL) 2303 { 2304 unsigned int plt_bnd_align; 2305 const struct elf_backend_data *bed; 2306 2307 bed = get_elf_backend_data (info->output_bfd); 2308 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8 2309 && (sizeof (elf_x86_64_bnd_plt2_entry) 2310 == sizeof (elf_x86_64_legacy_plt2_entry))); 2311 plt_bnd_align = 3; 2312 2313 if (htab->elf.dynobj == NULL) 2314 htab->elf.dynobj = abfd; 2315 htab->plt_bnd 2316 = bfd_make_section_anyway_with_flags (htab->elf.dynobj, 2317 ".plt.bnd", 2318 (bed->dynamic_sec_flags 2319 | SEC_ALLOC 2320 | SEC_CODE 2321 | SEC_LOAD 2322 | SEC_READONLY)); 2323 if (htab->plt_bnd == NULL 2324 || !bfd_set_section_alignment (htab->elf.dynobj, 2325 htab->plt_bnd, 2326 plt_bnd_align)) 2327 goto error_return; 2328 } 2329 } 2330 2331 case R_X86_64_32S: 2332 case R_X86_64_PC64: 2333 case R_X86_64_GOTPCREL: 2334 case R_X86_64_GOTPCRELX: 2335 case R_X86_64_REX_GOTPCRELX: 2336 case R_X86_64_GOTPCREL64: 2337 if (htab->elf.dynobj == NULL) 2338 htab->elf.dynobj = abfd; 2339 /* Create the ifunc sections for static executables. */ 2340 if (h->type == STT_GNU_IFUNC 2341 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj, 2342 info)) 2343 goto error_return; 2344 break; 2345 } 2346 2347 /* It is referenced by a non-shared object. */ 2348 h->ref_regular = 1; 2349 h->root.non_ir_ref = 1; 2350 2351 if (h->type == STT_GNU_IFUNC) 2352 elf_tdata (info->output_bfd)->has_gnu_symbols 2353 |= elf_gnu_symbol_ifunc; 2354 } 2355 2356 if (! elf_x86_64_tls_transition (info, abfd, sec, contents, 2357 symtab_hdr, sym_hashes, 2358 &r_type, GOT_UNKNOWN, 2359 rel, rel_end, h, r_symndx, FALSE)) 2360 goto error_return; 2361 2362 eh = (struct elf_x86_64_link_hash_entry *) h; 2363 switch (r_type) 2364 { 2365 case R_X86_64_TLSLD: 2366 htab->tls_ld_got.refcount += 1; 2367 goto create_got; 2368 2369 case R_X86_64_TPOFF32: 2370 if (!bfd_link_executable (info) && ABI_64_P (abfd)) 2371 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym, 2372 &x86_64_elf_howto_table[r_type]); 2373 if (eh != NULL) 2374 eh->has_got_reloc = 1; 2375 break; 2376 2377 case R_X86_64_GOTTPOFF: 2378 if (!bfd_link_executable (info)) 2379 info->flags |= DF_STATIC_TLS; 2380 /* Fall through */ 2381 2382 case R_X86_64_GOT32: 2383 case R_X86_64_GOTPCREL: 2384 case R_X86_64_GOTPCRELX: 2385 case R_X86_64_REX_GOTPCRELX: 2386 case R_X86_64_TLSGD: 2387 case R_X86_64_GOT64: 2388 case R_X86_64_GOTPCREL64: 2389 case R_X86_64_GOTPLT64: 2390 case R_X86_64_GOTPC32_TLSDESC: 2391 case R_X86_64_TLSDESC_CALL: 2392 /* This symbol requires a global offset table entry. */ 2393 { 2394 int tls_type, old_tls_type; 2395 2396 switch (r_type) 2397 { 2398 default: tls_type = GOT_NORMAL; break; 2399 case R_X86_64_TLSGD: tls_type = GOT_TLS_GD; break; 2400 case R_X86_64_GOTTPOFF: tls_type = GOT_TLS_IE; break; 2401 case R_X86_64_GOTPC32_TLSDESC: 2402 case R_X86_64_TLSDESC_CALL: 2403 tls_type = GOT_TLS_GDESC; break; 2404 } 2405 2406 if (h != NULL) 2407 { 2408 h->got.refcount += 1; 2409 old_tls_type = eh->tls_type; 2410 } 2411 else 2412 { 2413 bfd_signed_vma *local_got_refcounts; 2414 2415 /* This is a global offset table entry for a local symbol. */ 2416 local_got_refcounts = elf_local_got_refcounts (abfd); 2417 if (local_got_refcounts == NULL) 2418 { 2419 bfd_size_type size; 2420 2421 size = symtab_hdr->sh_info; 2422 size *= sizeof (bfd_signed_vma) 2423 + sizeof (bfd_vma) + sizeof (char); 2424 local_got_refcounts = ((bfd_signed_vma *) 2425 bfd_zalloc (abfd, size)); 2426 if (local_got_refcounts == NULL) 2427 goto error_return; 2428 elf_local_got_refcounts (abfd) = local_got_refcounts; 2429 elf_x86_64_local_tlsdesc_gotent (abfd) 2430 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info); 2431 elf_x86_64_local_got_tls_type (abfd) 2432 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info); 2433 } 2434 local_got_refcounts[r_symndx] += 1; 2435 old_tls_type 2436 = elf_x86_64_local_got_tls_type (abfd) [r_symndx]; 2437 } 2438 2439 /* If a TLS symbol is accessed using IE at least once, 2440 there is no point to use dynamic model for it. */ 2441 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN 2442 && (! GOT_TLS_GD_ANY_P (old_tls_type) 2443 || tls_type != GOT_TLS_IE)) 2444 { 2445 if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type)) 2446 tls_type = old_tls_type; 2447 else if (GOT_TLS_GD_ANY_P (old_tls_type) 2448 && GOT_TLS_GD_ANY_P (tls_type)) 2449 tls_type |= old_tls_type; 2450 else 2451 { 2452 if (h) 2453 name = h->root.root.string; 2454 else 2455 name = bfd_elf_sym_name (abfd, symtab_hdr, 2456 isym, NULL); 2457 (*_bfd_error_handler) 2458 (_("%B: '%s' accessed both as normal and thread local symbol"), 2459 abfd, name); 2460 bfd_set_error (bfd_error_bad_value); 2461 goto error_return; 2462 } 2463 } 2464 2465 if (old_tls_type != tls_type) 2466 { 2467 if (eh != NULL) 2468 eh->tls_type = tls_type; 2469 else 2470 elf_x86_64_local_got_tls_type (abfd) [r_symndx] = tls_type; 2471 } 2472 } 2473 /* Fall through */ 2474 2475 case R_X86_64_GOTOFF64: 2476 case R_X86_64_GOTPC32: 2477 case R_X86_64_GOTPC64: 2478 create_got: 2479 if (eh != NULL) 2480 eh->has_got_reloc = 1; 2481 if (htab->elf.sgot == NULL) 2482 { 2483 if (htab->elf.dynobj == NULL) 2484 htab->elf.dynobj = abfd; 2485 if (!_bfd_elf_create_got_section (htab->elf.dynobj, 2486 info)) 2487 goto error_return; 2488 } 2489 break; 2490 2491 case R_X86_64_PLT32: 2492 case R_X86_64_PLT32_BND: 2493 /* This symbol requires a procedure linkage table entry. We 2494 actually build the entry in adjust_dynamic_symbol, 2495 because this might be a case of linking PIC code which is 2496 never referenced by a dynamic object, in which case we 2497 don't need to generate a procedure linkage table entry 2498 after all. */ 2499 2500 /* If this is a local symbol, we resolve it directly without 2501 creating a procedure linkage table entry. */ 2502 if (h == NULL) 2503 continue; 2504 2505 eh->has_got_reloc = 1; 2506 h->needs_plt = 1; 2507 h->plt.refcount += 1; 2508 break; 2509 2510 case R_X86_64_PLTOFF64: 2511 /* This tries to form the 'address' of a function relative 2512 to GOT. For global symbols we need a PLT entry. */ 2513 if (h != NULL) 2514 { 2515 h->needs_plt = 1; 2516 h->plt.refcount += 1; 2517 } 2518 goto create_got; 2519 2520 case R_X86_64_SIZE32: 2521 case R_X86_64_SIZE64: 2522 size_reloc = TRUE; 2523 goto do_size; 2524 2525 case R_X86_64_32: 2526 if (!ABI_64_P (abfd)) 2527 goto pointer; 2528 case R_X86_64_8: 2529 case R_X86_64_16: 2530 case R_X86_64_32S: 2531 /* Check relocation overflow as these relocs may lead to 2532 run-time relocation overflow. Don't error out for 2533 sections we don't care about, such as debug sections or 2534 when relocation overflow check is disabled. */ 2535 if (!info->no_reloc_overflow_check 2536 && (bfd_link_pic (info) 2537 || (bfd_link_executable (info) 2538 && h != NULL 2539 && !h->def_regular 2540 && h->def_dynamic 2541 && (sec->flags & SEC_READONLY) == 0))) 2542 return elf_x86_64_need_pic (abfd, sec, h, symtab_hdr, isym, 2543 &x86_64_elf_howto_table[r_type]); 2544 /* Fall through. */ 2545 2546 case R_X86_64_PC8: 2547 case R_X86_64_PC16: 2548 case R_X86_64_PC32: 2549 case R_X86_64_PC32_BND: 2550 case R_X86_64_PC64: 2551 case R_X86_64_64: 2552pointer: 2553 if (eh != NULL && (sec->flags & SEC_CODE) != 0) 2554 eh->has_non_got_reloc = 1; 2555 /* We are called after all symbols have been resolved. Only 2556 relocation against STT_GNU_IFUNC symbol must go through 2557 PLT. */ 2558 if (h != NULL 2559 && (bfd_link_executable (info) 2560 || h->type == STT_GNU_IFUNC)) 2561 { 2562 /* If this reloc is in a read-only section, we might 2563 need a copy reloc. We can't check reliably at this 2564 stage whether the section is read-only, as input 2565 sections have not yet been mapped to output sections. 2566 Tentatively set the flag for now, and correct in 2567 adjust_dynamic_symbol. */ 2568 h->non_got_ref = 1; 2569 2570 /* We may need a .plt entry if the symbol is a function 2571 defined in a shared lib or is a STT_GNU_IFUNC function 2572 referenced from the code or read-only section. */ 2573 if (!h->def_regular 2574 || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0) 2575 h->plt.refcount += 1; 2576 2577 if (r_type == R_X86_64_PC32) 2578 { 2579 /* Since something like ".long foo - ." may be used 2580 as pointer, make sure that PLT is used if foo is 2581 a function defined in a shared library. */ 2582 if ((sec->flags & SEC_CODE) == 0) 2583 h->pointer_equality_needed = 1; 2584 } 2585 else if (r_type != R_X86_64_PC32_BND 2586 && r_type != R_X86_64_PC64) 2587 { 2588 h->pointer_equality_needed = 1; 2589 /* At run-time, R_X86_64_64 can be resolved for both 2590 x86-64 and x32. But R_X86_64_32 and R_X86_64_32S 2591 can only be resolved for x32. */ 2592 if ((sec->flags & SEC_READONLY) == 0 2593 && (r_type == R_X86_64_64 2594 || (!ABI_64_P (abfd) 2595 && (r_type == R_X86_64_32 2596 || r_type == R_X86_64_32S)))) 2597 eh->func_pointer_refcount += 1; 2598 } 2599 } 2600 2601 size_reloc = FALSE; 2602do_size: 2603 /* If we are creating a shared library, and this is a reloc 2604 against a global symbol, or a non PC relative reloc 2605 against a local symbol, then we need to copy the reloc 2606 into the shared library. However, if we are linking with 2607 -Bsymbolic, we do not need to copy a reloc against a 2608 global symbol which is defined in an object we are 2609 including in the link (i.e., DEF_REGULAR is set). At 2610 this point we have not seen all the input files, so it is 2611 possible that DEF_REGULAR is not set now but will be set 2612 later (it is never cleared). In case of a weak definition, 2613 DEF_REGULAR may be cleared later by a strong definition in 2614 a shared library. We account for that possibility below by 2615 storing information in the relocs_copied field of the hash 2616 table entry. A similar situation occurs when creating 2617 shared libraries and symbol visibility changes render the 2618 symbol local. 2619 2620 If on the other hand, we are creating an executable, we 2621 may need to keep relocations for symbols satisfied by a 2622 dynamic library if we manage to avoid copy relocs for the 2623 symbol. 2624 2625 Generate dynamic pointer relocation against STT_GNU_IFUNC 2626 symbol in the non-code section. */ 2627 if ((bfd_link_pic (info) 2628 && (! IS_X86_64_PCREL_TYPE (r_type) 2629 || (h != NULL 2630 && (! (bfd_link_pie (info) 2631 || SYMBOLIC_BIND (info, h)) 2632 || h->root.type == bfd_link_hash_defweak 2633 || !h->def_regular)))) 2634 || (h != NULL 2635 && h->type == STT_GNU_IFUNC 2636 && r_type == htab->pointer_r_type 2637 && (sec->flags & SEC_CODE) == 0) 2638 || (ELIMINATE_COPY_RELOCS 2639 && !bfd_link_pic (info) 2640 && h != NULL 2641 && (h->root.type == bfd_link_hash_defweak 2642 || !h->def_regular))) 2643 { 2644 struct elf_dyn_relocs *p; 2645 struct elf_dyn_relocs **head; 2646 2647 /* We must copy these reloc types into the output file. 2648 Create a reloc section in dynobj and make room for 2649 this reloc. */ 2650 if (sreloc == NULL) 2651 { 2652 if (htab->elf.dynobj == NULL) 2653 htab->elf.dynobj = abfd; 2654 2655 sreloc = _bfd_elf_make_dynamic_reloc_section 2656 (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2, 2657 abfd, /*rela?*/ TRUE); 2658 2659 if (sreloc == NULL) 2660 goto error_return; 2661 } 2662 2663 /* If this is a global symbol, we count the number of 2664 relocations we need for this symbol. */ 2665 if (h != NULL) 2666 head = &eh->dyn_relocs; 2667 else 2668 { 2669 /* Track dynamic relocs needed for local syms too. 2670 We really need local syms available to do this 2671 easily. Oh well. */ 2672 asection *s; 2673 void **vpp; 2674 2675 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 2676 abfd, r_symndx); 2677 if (isym == NULL) 2678 goto error_return; 2679 2680 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 2681 if (s == NULL) 2682 s = sec; 2683 2684 /* Beware of type punned pointers vs strict aliasing 2685 rules. */ 2686 vpp = &(elf_section_data (s)->local_dynrel); 2687 head = (struct elf_dyn_relocs **)vpp; 2688 } 2689 2690 p = *head; 2691 if (p == NULL || p->sec != sec) 2692 { 2693 bfd_size_type amt = sizeof *p; 2694 2695 p = ((struct elf_dyn_relocs *) 2696 bfd_alloc (htab->elf.dynobj, amt)); 2697 if (p == NULL) 2698 goto error_return; 2699 p->next = *head; 2700 *head = p; 2701 p->sec = sec; 2702 p->count = 0; 2703 p->pc_count = 0; 2704 } 2705 2706 p->count += 1; 2707 /* Count size relocation as PC-relative relocation. */ 2708 if (IS_X86_64_PCREL_TYPE (r_type) || size_reloc) 2709 p->pc_count += 1; 2710 } 2711 break; 2712 2713 /* This relocation describes the C++ object vtable hierarchy. 2714 Reconstruct it for later use during GC. */ 2715 case R_X86_64_GNU_VTINHERIT: 2716 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 2717 goto error_return; 2718 break; 2719 2720 /* This relocation describes which C++ vtable entries are actually 2721 used. Record for later use during GC. */ 2722 case R_X86_64_GNU_VTENTRY: 2723 BFD_ASSERT (h != NULL); 2724 if (h != NULL 2725 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 2726 goto error_return; 2727 break; 2728 2729 default: 2730 break; 2731 } 2732 2733 if (use_plt_got 2734 && h != NULL 2735 && h->plt.refcount > 0 2736 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) 2737 || h->got.refcount > 0) 2738 && htab->plt_got == NULL) 2739 { 2740 /* Create the GOT procedure linkage table. */ 2741 unsigned int plt_got_align; 2742 const struct elf_backend_data *bed; 2743 2744 bed = get_elf_backend_data (info->output_bfd); 2745 BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8 2746 && (sizeof (elf_x86_64_bnd_plt2_entry) 2747 == sizeof (elf_x86_64_legacy_plt2_entry))); 2748 plt_got_align = 3; 2749 2750 if (htab->elf.dynobj == NULL) 2751 htab->elf.dynobj = abfd; 2752 htab->plt_got 2753 = bfd_make_section_anyway_with_flags (htab->elf.dynobj, 2754 ".plt.got", 2755 (bed->dynamic_sec_flags 2756 | SEC_ALLOC 2757 | SEC_CODE 2758 | SEC_LOAD 2759 | SEC_READONLY)); 2760 if (htab->plt_got == NULL 2761 || !bfd_set_section_alignment (htab->elf.dynobj, 2762 htab->plt_got, 2763 plt_got_align)) 2764 goto error_return; 2765 } 2766 2767 if ((r_type == R_X86_64_GOTPCREL 2768 || r_type == R_X86_64_GOTPCRELX 2769 || r_type == R_X86_64_REX_GOTPCRELX) 2770 && (h == NULL || h->type != STT_GNU_IFUNC)) 2771 sec->need_convert_load = 1; 2772 } 2773 2774 if (elf_section_data (sec)->this_hdr.contents != contents) 2775 { 2776 if (!info->keep_memory) 2777 free (contents); 2778 else 2779 { 2780 /* Cache the section contents for elf_link_input_bfd. */ 2781 elf_section_data (sec)->this_hdr.contents = contents; 2782 } 2783 } 2784 2785 return TRUE; 2786 2787error_return: 2788 if (elf_section_data (sec)->this_hdr.contents != contents) 2789 free (contents); 2790 sec->check_relocs_failed = 1; 2791 return FALSE; 2792} 2793 2794/* Return the section that should be marked against GC for a given 2795 relocation. */ 2796 2797static asection * 2798elf_x86_64_gc_mark_hook (asection *sec, 2799 struct bfd_link_info *info, 2800 Elf_Internal_Rela *rel, 2801 struct elf_link_hash_entry *h, 2802 Elf_Internal_Sym *sym) 2803{ 2804 if (h != NULL) 2805 switch (ELF32_R_TYPE (rel->r_info)) 2806 { 2807 case R_X86_64_GNU_VTINHERIT: 2808 case R_X86_64_GNU_VTENTRY: 2809 return NULL; 2810 } 2811 2812 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 2813} 2814 2815/* Remove undefined weak symbol from the dynamic symbol table if it 2816 is resolved to 0. */ 2817 2818static bfd_boolean 2819elf_x86_64_fixup_symbol (struct bfd_link_info *info, 2820 struct elf_link_hash_entry *h) 2821{ 2822 if (h->dynindx != -1 2823 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, 2824 elf_x86_64_hash_entry (h)->has_got_reloc, 2825 elf_x86_64_hash_entry (h))) 2826 { 2827 h->dynindx = -1; 2828 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, 2829 h->dynstr_index); 2830 } 2831 return TRUE; 2832} 2833 2834/* Adjust a symbol defined by a dynamic object and referenced by a 2835 regular object. The current definition is in some section of the 2836 dynamic object, but we're not including those sections. We have to 2837 change the definition to something the rest of the link can 2838 understand. */ 2839 2840static bfd_boolean 2841elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info, 2842 struct elf_link_hash_entry *h) 2843{ 2844 struct elf_x86_64_link_hash_table *htab; 2845 asection *s; 2846 struct elf_x86_64_link_hash_entry *eh; 2847 struct elf_dyn_relocs *p; 2848 2849 /* STT_GNU_IFUNC symbol must go through PLT. */ 2850 if (h->type == STT_GNU_IFUNC) 2851 { 2852 /* All local STT_GNU_IFUNC references must be treate as local 2853 calls via local PLT. */ 2854 if (h->ref_regular 2855 && SYMBOL_CALLS_LOCAL (info, h)) 2856 { 2857 bfd_size_type pc_count = 0, count = 0; 2858 struct elf_dyn_relocs **pp; 2859 2860 eh = (struct elf_x86_64_link_hash_entry *) h; 2861 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 2862 { 2863 pc_count += p->pc_count; 2864 p->count -= p->pc_count; 2865 p->pc_count = 0; 2866 count += p->count; 2867 if (p->count == 0) 2868 *pp = p->next; 2869 else 2870 pp = &p->next; 2871 } 2872 2873 if (pc_count || count) 2874 { 2875 h->non_got_ref = 1; 2876 if (pc_count) 2877 { 2878 /* Increment PLT reference count only for PC-relative 2879 references. */ 2880 h->needs_plt = 1; 2881 if (h->plt.refcount <= 0) 2882 h->plt.refcount = 1; 2883 else 2884 h->plt.refcount += 1; 2885 } 2886 } 2887 } 2888 2889 if (h->plt.refcount <= 0) 2890 { 2891 h->plt.offset = (bfd_vma) -1; 2892 h->needs_plt = 0; 2893 } 2894 return TRUE; 2895 } 2896 2897 /* If this is a function, put it in the procedure linkage table. We 2898 will fill in the contents of the procedure linkage table later, 2899 when we know the address of the .got section. */ 2900 if (h->type == STT_FUNC 2901 || h->needs_plt) 2902 { 2903 if (h->plt.refcount <= 0 2904 || SYMBOL_CALLS_LOCAL (info, h) 2905 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 2906 && h->root.type == bfd_link_hash_undefweak)) 2907 { 2908 /* This case can occur if we saw a PLT32 reloc in an input 2909 file, but the symbol was never referred to by a dynamic 2910 object, or if all references were garbage collected. In 2911 such a case, we don't actually need to build a procedure 2912 linkage table, and we can just do a PC32 reloc instead. */ 2913 h->plt.offset = (bfd_vma) -1; 2914 h->needs_plt = 0; 2915 } 2916 2917 return TRUE; 2918 } 2919 else 2920 /* It's possible that we incorrectly decided a .plt reloc was 2921 needed for an R_X86_64_PC32 reloc to a non-function sym in 2922 check_relocs. We can't decide accurately between function and 2923 non-function syms in check-relocs; Objects loaded later in 2924 the link may change h->type. So fix it now. */ 2925 h->plt.offset = (bfd_vma) -1; 2926 2927 /* If this is a weak symbol, and there is a real definition, the 2928 processor independent code will have arranged for us to see the 2929 real definition first, and we can just use the same value. */ 2930 if (h->u.weakdef != NULL) 2931 { 2932 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 2933 || h->u.weakdef->root.type == bfd_link_hash_defweak); 2934 h->root.u.def.section = h->u.weakdef->root.u.def.section; 2935 h->root.u.def.value = h->u.weakdef->root.u.def.value; 2936 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc) 2937 { 2938 eh = (struct elf_x86_64_link_hash_entry *) h; 2939 h->non_got_ref = h->u.weakdef->non_got_ref; 2940 eh->needs_copy = h->u.weakdef->needs_copy; 2941 } 2942 return TRUE; 2943 } 2944 2945 /* This is a reference to a symbol defined by a dynamic object which 2946 is not a function. */ 2947 2948 /* If we are creating a shared library, we must presume that the 2949 only references to the symbol are via the global offset table. 2950 For such cases we need not do anything here; the relocations will 2951 be handled correctly by relocate_section. */ 2952 if (!bfd_link_executable (info)) 2953 return TRUE; 2954 2955 /* If there are no references to this symbol that do not use the 2956 GOT, we don't need to generate a copy reloc. */ 2957 if (!h->non_got_ref) 2958 return TRUE; 2959 2960 /* If -z nocopyreloc was given, we won't generate them either. */ 2961 if (info->nocopyreloc) 2962 { 2963 h->non_got_ref = 0; 2964 return TRUE; 2965 } 2966 2967 if (ELIMINATE_COPY_RELOCS) 2968 { 2969 eh = (struct elf_x86_64_link_hash_entry *) h; 2970 for (p = eh->dyn_relocs; p != NULL; p = p->next) 2971 { 2972 s = p->sec->output_section; 2973 if (s != NULL && (s->flags & SEC_READONLY) != 0) 2974 break; 2975 } 2976 2977 /* If we didn't find any dynamic relocs in read-only sections, then 2978 we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 2979 if (p == NULL) 2980 { 2981 h->non_got_ref = 0; 2982 return TRUE; 2983 } 2984 } 2985 2986 /* We must allocate the symbol in our .dynbss section, which will 2987 become part of the .bss section of the executable. There will be 2988 an entry for this symbol in the .dynsym section. The dynamic 2989 object will contain position independent code, so all references 2990 from the dynamic object to this symbol will go through the global 2991 offset table. The dynamic linker will use the .dynsym entry to 2992 determine the address it must put in the global offset table, so 2993 both the dynamic object and the regular object will refer to the 2994 same memory location for the variable. */ 2995 2996 htab = elf_x86_64_hash_table (info); 2997 if (htab == NULL) 2998 return FALSE; 2999 3000 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker 3001 to copy the initial value out of the dynamic object and into the 3002 runtime process image. */ 3003 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 3004 { 3005 const struct elf_backend_data *bed; 3006 bed = get_elf_backend_data (info->output_bfd); 3007 htab->srelbss->size += bed->s->sizeof_rela; 3008 h->needs_copy = 1; 3009 } 3010 3011 s = htab->sdynbss; 3012 3013 return _bfd_elf_adjust_dynamic_copy (info, h, s); 3014} 3015 3016/* Allocate space in .plt, .got and associated reloc sections for 3017 dynamic relocs. */ 3018 3019static bfd_boolean 3020elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) 3021{ 3022 struct bfd_link_info *info; 3023 struct elf_x86_64_link_hash_table *htab; 3024 struct elf_x86_64_link_hash_entry *eh; 3025 struct elf_dyn_relocs *p; 3026 const struct elf_backend_data *bed; 3027 unsigned int plt_entry_size; 3028 bfd_boolean resolved_to_zero; 3029 3030 if (h->root.type == bfd_link_hash_indirect) 3031 return TRUE; 3032 3033 eh = (struct elf_x86_64_link_hash_entry *) h; 3034 3035 info = (struct bfd_link_info *) inf; 3036 htab = elf_x86_64_hash_table (info); 3037 if (htab == NULL) 3038 return FALSE; 3039 bed = get_elf_backend_data (info->output_bfd); 3040 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd); 3041 3042 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, 3043 eh->has_got_reloc, 3044 eh); 3045 3046 /* We can't use the GOT PLT if pointer equality is needed since 3047 finish_dynamic_symbol won't clear symbol value and the dynamic 3048 linker won't update the GOT slot. We will get into an infinite 3049 loop at run-time. */ 3050 if (htab->plt_got != NULL 3051 && h->type != STT_GNU_IFUNC 3052 && !h->pointer_equality_needed 3053 && h->plt.refcount > 0 3054 && h->got.refcount > 0) 3055 { 3056 /* Don't use the regular PLT if there are both GOT and GOTPLT 3057 reloctions. */ 3058 h->plt.offset = (bfd_vma) -1; 3059 3060 /* Use the GOT PLT. */ 3061 eh->plt_got.refcount = 1; 3062 } 3063 3064 /* Clear the reference count of function pointer relocations if 3065 symbol isn't a normal function. */ 3066 if (h->type != STT_FUNC) 3067 eh->func_pointer_refcount = 0; 3068 3069 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it 3070 here if it is defined and referenced in a non-shared object. */ 3071 if (h->type == STT_GNU_IFUNC 3072 && h->def_regular) 3073 { 3074 if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, 3075 &eh->dyn_relocs, 3076 &htab->readonly_dynrelocs_against_ifunc, 3077 plt_entry_size, 3078 plt_entry_size, 3079 GOT_ENTRY_SIZE, TRUE)) 3080 { 3081 asection *s = htab->plt_bnd; 3082 if (h->plt.offset != (bfd_vma) -1 && s != NULL) 3083 { 3084 /* Use the .plt.bnd section if it is created. */ 3085 eh->plt_bnd.offset = s->size; 3086 3087 /* Make room for this entry in the .plt.bnd section. */ 3088 s->size += sizeof (elf_x86_64_legacy_plt2_entry); 3089 } 3090 3091 return TRUE; 3092 } 3093 else 3094 return FALSE; 3095 } 3096 /* Don't create the PLT entry if there are only function pointer 3097 relocations which can be resolved at run-time. */ 3098 else if (htab->elf.dynamic_sections_created 3099 && (h->plt.refcount > eh->func_pointer_refcount 3100 || eh->plt_got.refcount > 0)) 3101 { 3102 bfd_boolean use_plt_got; 3103 3104 /* Clear the reference count of function pointer relocations 3105 if PLT is used. */ 3106 eh->func_pointer_refcount = 0; 3107 3108 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) 3109 { 3110 /* Don't use the regular PLT for DF_BIND_NOW. */ 3111 h->plt.offset = (bfd_vma) -1; 3112 3113 /* Use the GOT PLT. */ 3114 h->got.refcount = 1; 3115 eh->plt_got.refcount = 1; 3116 } 3117 3118 use_plt_got = eh->plt_got.refcount > 0; 3119 3120 /* Make sure this symbol is output as a dynamic symbol. 3121 Undefined weak syms won't yet be marked as dynamic. */ 3122 if (h->dynindx == -1 3123 && !h->forced_local 3124 && !resolved_to_zero) 3125 { 3126 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3127 return FALSE; 3128 } 3129 3130 if (bfd_link_pic (info) 3131 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h)) 3132 { 3133 asection *s = htab->elf.splt; 3134 asection *bnd_s = htab->plt_bnd; 3135 asection *got_s = htab->plt_got; 3136 3137 /* If this is the first .plt entry, make room for the special 3138 first entry. The .plt section is used by prelink to undo 3139 prelinking for dynamic relocations. */ 3140 if (s->size == 0) 3141 s->size = plt_entry_size; 3142 3143 if (use_plt_got) 3144 eh->plt_got.offset = got_s->size; 3145 else 3146 { 3147 h->plt.offset = s->size; 3148 if (bnd_s) 3149 eh->plt_bnd.offset = bnd_s->size; 3150 } 3151 3152 /* If this symbol is not defined in a regular file, and we are 3153 not generating a shared library, then set the symbol to this 3154 location in the .plt. This is required to make function 3155 pointers compare as equal between the normal executable and 3156 the shared library. */ 3157 if (! bfd_link_pic (info) 3158 && !h->def_regular) 3159 { 3160 if (use_plt_got) 3161 { 3162 /* We need to make a call to the entry of the GOT PLT 3163 instead of regular PLT entry. */ 3164 h->root.u.def.section = got_s; 3165 h->root.u.def.value = eh->plt_got.offset; 3166 } 3167 else 3168 { 3169 if (bnd_s) 3170 { 3171 /* We need to make a call to the entry of the second 3172 PLT instead of regular PLT entry. */ 3173 h->root.u.def.section = bnd_s; 3174 h->root.u.def.value = eh->plt_bnd.offset; 3175 } 3176 else 3177 { 3178 h->root.u.def.section = s; 3179 h->root.u.def.value = h->plt.offset; 3180 } 3181 } 3182 } 3183 3184 /* Make room for this entry. */ 3185 if (use_plt_got) 3186 got_s->size += sizeof (elf_x86_64_legacy_plt2_entry); 3187 else 3188 { 3189 s->size += plt_entry_size; 3190 if (bnd_s) 3191 bnd_s->size += sizeof (elf_x86_64_legacy_plt2_entry); 3192 3193 /* We also need to make an entry in the .got.plt section, 3194 which will be placed in the .got section by the linker 3195 script. */ 3196 htab->elf.sgotplt->size += GOT_ENTRY_SIZE; 3197 3198 /* There should be no PLT relocation against resolved 3199 undefined weak symbol in executable. */ 3200 if (!resolved_to_zero) 3201 { 3202 /* We also need to make an entry in the .rela.plt 3203 section. */ 3204 htab->elf.srelplt->size += bed->s->sizeof_rela; 3205 htab->elf.srelplt->reloc_count++; 3206 } 3207 } 3208 } 3209 else 3210 { 3211 eh->plt_got.offset = (bfd_vma) -1; 3212 h->plt.offset = (bfd_vma) -1; 3213 h->needs_plt = 0; 3214 } 3215 } 3216 else 3217 { 3218 eh->plt_got.offset = (bfd_vma) -1; 3219 h->plt.offset = (bfd_vma) -1; 3220 h->needs_plt = 0; 3221 } 3222 3223 eh->tlsdesc_got = (bfd_vma) -1; 3224 3225 /* If R_X86_64_GOTTPOFF symbol is now local to the binary, 3226 make it a R_X86_64_TPOFF32 requiring no GOT entry. */ 3227 if (h->got.refcount > 0 3228 && bfd_link_executable (info) 3229 && h->dynindx == -1 3230 && elf_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE) 3231 { 3232 h->got.offset = (bfd_vma) -1; 3233 } 3234 else if (h->got.refcount > 0) 3235 { 3236 asection *s; 3237 bfd_boolean dyn; 3238 int tls_type = elf_x86_64_hash_entry (h)->tls_type; 3239 3240 /* Make sure this symbol is output as a dynamic symbol. 3241 Undefined weak syms won't yet be marked as dynamic. */ 3242 if (h->dynindx == -1 3243 && !h->forced_local 3244 && !resolved_to_zero) 3245 { 3246 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3247 return FALSE; 3248 } 3249 3250 if (GOT_TLS_GDESC_P (tls_type)) 3251 { 3252 eh->tlsdesc_got = htab->elf.sgotplt->size 3253 - elf_x86_64_compute_jump_table_size (htab); 3254 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE; 3255 h->got.offset = (bfd_vma) -2; 3256 } 3257 if (! GOT_TLS_GDESC_P (tls_type) 3258 || GOT_TLS_GD_P (tls_type)) 3259 { 3260 s = htab->elf.sgot; 3261 h->got.offset = s->size; 3262 s->size += GOT_ENTRY_SIZE; 3263 if (GOT_TLS_GD_P (tls_type)) 3264 s->size += GOT_ENTRY_SIZE; 3265 } 3266 dyn = htab->elf.dynamic_sections_created; 3267 /* R_X86_64_TLSGD needs one dynamic relocation if local symbol 3268 and two if global. R_X86_64_GOTTPOFF needs one dynamic 3269 relocation. No dynamic relocation against resolved undefined 3270 weak symbol in executable. */ 3271 if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1) 3272 || tls_type == GOT_TLS_IE) 3273 htab->elf.srelgot->size += bed->s->sizeof_rela; 3274 else if (GOT_TLS_GD_P (tls_type)) 3275 htab->elf.srelgot->size += 2 * bed->s->sizeof_rela; 3276 else if (! GOT_TLS_GDESC_P (tls_type) 3277 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 3278 && !resolved_to_zero) 3279 || h->root.type != bfd_link_hash_undefweak) 3280 && (bfd_link_pic (info) 3281 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 3282 htab->elf.srelgot->size += bed->s->sizeof_rela; 3283 if (GOT_TLS_GDESC_P (tls_type)) 3284 { 3285 htab->elf.srelplt->size += bed->s->sizeof_rela; 3286 htab->tlsdesc_plt = (bfd_vma) -1; 3287 } 3288 } 3289 else 3290 h->got.offset = (bfd_vma) -1; 3291 3292 if (eh->dyn_relocs == NULL) 3293 return TRUE; 3294 3295 /* In the shared -Bsymbolic case, discard space allocated for 3296 dynamic pc-relative relocs against symbols which turn out to be 3297 defined in regular objects. For the normal shared case, discard 3298 space for pc-relative relocs that have become local due to symbol 3299 visibility changes. */ 3300 3301 if (bfd_link_pic (info)) 3302 { 3303 /* Relocs that use pc_count are those that appear on a call 3304 insn, or certain REL relocs that can generated via assembly. 3305 We want calls to protected symbols to resolve directly to the 3306 function rather than going via the plt. If people want 3307 function pointer comparisons to work as expected then they 3308 should avoid writing weird assembly. */ 3309 if (SYMBOL_CALLS_LOCAL (info, h)) 3310 { 3311 struct elf_dyn_relocs **pp; 3312 3313 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 3314 { 3315 p->count -= p->pc_count; 3316 p->pc_count = 0; 3317 if (p->count == 0) 3318 *pp = p->next; 3319 else 3320 pp = &p->next; 3321 } 3322 } 3323 3324 /* Also discard relocs on undefined weak syms with non-default 3325 visibility or in PIE. */ 3326 if (eh->dyn_relocs != NULL) 3327 { 3328 if (h->root.type == bfd_link_hash_undefweak) 3329 { 3330 /* Undefined weak symbol is never bound locally in shared 3331 library. */ 3332 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 3333 || resolved_to_zero) 3334 eh->dyn_relocs = NULL; 3335 else if (h->dynindx == -1 3336 && ! h->forced_local 3337 && ! bfd_elf_link_record_dynamic_symbol (info, h)) 3338 return FALSE; 3339 } 3340 /* For PIE, discard space for pc-relative relocs against 3341 symbols which turn out to need copy relocs. */ 3342 else if (bfd_link_executable (info) 3343 && (h->needs_copy || eh->needs_copy) 3344 && h->def_dynamic 3345 && !h->def_regular) 3346 { 3347 struct elf_dyn_relocs **pp; 3348 3349 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 3350 { 3351 if (p->pc_count != 0) 3352 *pp = p->next; 3353 else 3354 pp = &p->next; 3355 } 3356 } 3357 } 3358 } 3359 else if (ELIMINATE_COPY_RELOCS) 3360 { 3361 /* For the non-shared case, discard space for relocs against 3362 symbols which turn out to need copy relocs or are not 3363 dynamic. Keep dynamic relocations for run-time function 3364 pointer initialization. */ 3365 3366 if ((!h->non_got_ref 3367 || eh->func_pointer_refcount > 0 3368 || (h->root.type == bfd_link_hash_undefweak 3369 && !resolved_to_zero)) 3370 && ((h->def_dynamic 3371 && !h->def_regular) 3372 || (htab->elf.dynamic_sections_created 3373 && (h->root.type == bfd_link_hash_undefweak 3374 || h->root.type == bfd_link_hash_undefined)))) 3375 { 3376 /* Make sure this symbol is output as a dynamic symbol. 3377 Undefined weak syms won't yet be marked as dynamic. */ 3378 if (h->dynindx == -1 3379 && ! h->forced_local 3380 && ! resolved_to_zero 3381 && ! bfd_elf_link_record_dynamic_symbol (info, h)) 3382 return FALSE; 3383 3384 /* If that succeeded, we know we'll be keeping all the 3385 relocs. */ 3386 if (h->dynindx != -1) 3387 goto keep; 3388 } 3389 3390 eh->dyn_relocs = NULL; 3391 eh->func_pointer_refcount = 0; 3392 3393 keep: ; 3394 } 3395 3396 /* Finally, allocate space. */ 3397 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3398 { 3399 asection * sreloc; 3400 3401 sreloc = elf_section_data (p->sec)->sreloc; 3402 3403 BFD_ASSERT (sreloc != NULL); 3404 3405 sreloc->size += p->count * bed->s->sizeof_rela; 3406 } 3407 3408 return TRUE; 3409} 3410 3411/* Allocate space in .plt, .got and associated reloc sections for 3412 local dynamic relocs. */ 3413 3414static bfd_boolean 3415elf_x86_64_allocate_local_dynrelocs (void **slot, void *inf) 3416{ 3417 struct elf_link_hash_entry *h 3418 = (struct elf_link_hash_entry *) *slot; 3419 3420 if (h->type != STT_GNU_IFUNC 3421 || !h->def_regular 3422 || !h->ref_regular 3423 || !h->forced_local 3424 || h->root.type != bfd_link_hash_defined) 3425 abort (); 3426 3427 return elf_x86_64_allocate_dynrelocs (h, inf); 3428} 3429 3430/* Find any dynamic relocs that apply to read-only sections. */ 3431 3432static bfd_boolean 3433elf_x86_64_readonly_dynrelocs (struct elf_link_hash_entry *h, 3434 void * inf) 3435{ 3436 struct elf_x86_64_link_hash_entry *eh; 3437 struct elf_dyn_relocs *p; 3438 3439 /* Skip local IFUNC symbols. */ 3440 if (h->forced_local && h->type == STT_GNU_IFUNC) 3441 return TRUE; 3442 3443 eh = (struct elf_x86_64_link_hash_entry *) h; 3444 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3445 { 3446 asection *s = p->sec->output_section; 3447 3448 if (s != NULL && (s->flags & SEC_READONLY) != 0) 3449 { 3450 struct bfd_link_info *info = (struct bfd_link_info *) inf; 3451 3452 info->flags |= DF_TEXTREL; 3453 3454 if ((info->warn_shared_textrel && bfd_link_pic (info)) 3455 || info->error_textrel) 3456 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"), 3457 p->sec->owner, h->root.root.string, 3458 p->sec); 3459 3460 /* Not an error, just cut short the traversal. */ 3461 return FALSE; 3462 } 3463 } 3464 return TRUE; 3465} 3466 3467/* Convert load via the GOT slot to load immediate. */ 3468 3469static bfd_boolean 3470elf_x86_64_convert_load (bfd *abfd, asection *sec, 3471 struct bfd_link_info *link_info) 3472{ 3473 Elf_Internal_Shdr *symtab_hdr; 3474 Elf_Internal_Rela *internal_relocs; 3475 Elf_Internal_Rela *irel, *irelend; 3476 bfd_byte *contents; 3477 struct elf_x86_64_link_hash_table *htab; 3478 bfd_boolean changed; 3479 bfd_signed_vma *local_got_refcounts; 3480 3481 /* Don't even try to convert non-ELF outputs. */ 3482 if (!is_elf_hash_table (link_info->hash)) 3483 return FALSE; 3484 3485 /* Nothing to do if there is no need or no output. */ 3486 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC) 3487 || sec->need_convert_load == 0 3488 || bfd_is_abs_section (sec->output_section)) 3489 return TRUE; 3490 3491 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 3492 3493 /* Load the relocations for this section. */ 3494 internal_relocs = (_bfd_elf_link_read_relocs 3495 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, 3496 link_info->keep_memory)); 3497 if (internal_relocs == NULL) 3498 return FALSE; 3499 3500 changed = FALSE; 3501 htab = elf_x86_64_hash_table (link_info); 3502 local_got_refcounts = elf_local_got_refcounts (abfd); 3503 3504 /* Get the section contents. */ 3505 if (elf_section_data (sec)->this_hdr.contents != NULL) 3506 contents = elf_section_data (sec)->this_hdr.contents; 3507 else 3508 { 3509 if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 3510 goto error_return; 3511 } 3512 3513 irelend = internal_relocs + sec->reloc_count; 3514 for (irel = internal_relocs; irel < irelend; irel++) 3515 { 3516 unsigned int r_type = ELF32_R_TYPE (irel->r_info); 3517 unsigned int r_symndx; 3518 struct elf_link_hash_entry *h; 3519 bfd_boolean converted; 3520 3521 if (r_type != R_X86_64_GOTPCRELX 3522 && r_type != R_X86_64_REX_GOTPCRELX 3523 && r_type != R_X86_64_GOTPCREL) 3524 continue; 3525 3526 r_symndx = htab->r_sym (irel->r_info); 3527 if (r_symndx < symtab_hdr->sh_info) 3528 h = elf_x86_64_get_local_sym_hash (htab, sec->owner, 3529 (const Elf_Internal_Rela *) irel, 3530 FALSE); 3531 else 3532 { 3533 h = elf_sym_hashes (abfd)[r_symndx - symtab_hdr->sh_info]; 3534 while (h->root.type == bfd_link_hash_indirect 3535 || h->root.type == bfd_link_hash_warning) 3536 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3537 } 3538 3539 /* STT_GNU_IFUNC must keep GOTPCREL relocations. */ 3540 if (h != NULL && h->type == STT_GNU_IFUNC) 3541 continue; 3542 3543 converted = FALSE; 3544 if (!elf_x86_64_convert_load_reloc (abfd, sec, contents, irel, h, 3545 &converted, link_info)) 3546 goto error_return; 3547 3548 if (converted) 3549 { 3550 changed = converted; 3551 if (h) 3552 { 3553 if (h->got.refcount > 0) 3554 h->got.refcount -= 1; 3555 } 3556 else 3557 { 3558 if (local_got_refcounts != NULL 3559 && local_got_refcounts[r_symndx] > 0) 3560 local_got_refcounts[r_symndx] -= 1; 3561 } 3562 } 3563 } 3564 3565 if (contents != NULL 3566 && elf_section_data (sec)->this_hdr.contents != contents) 3567 { 3568 if (!changed && !link_info->keep_memory) 3569 free (contents); 3570 else 3571 { 3572 /* Cache the section contents for elf_link_input_bfd. */ 3573 elf_section_data (sec)->this_hdr.contents = contents; 3574 } 3575 } 3576 3577 if (elf_section_data (sec)->relocs != internal_relocs) 3578 { 3579 if (!changed) 3580 free (internal_relocs); 3581 else 3582 elf_section_data (sec)->relocs = internal_relocs; 3583 } 3584 3585 return TRUE; 3586 3587 error_return: 3588 if (contents != NULL 3589 && elf_section_data (sec)->this_hdr.contents != contents) 3590 free (contents); 3591 if (internal_relocs != NULL 3592 && elf_section_data (sec)->relocs != internal_relocs) 3593 free (internal_relocs); 3594 return FALSE; 3595} 3596 3597/* Set the sizes of the dynamic sections. */ 3598 3599static bfd_boolean 3600elf_x86_64_size_dynamic_sections (bfd *output_bfd, 3601 struct bfd_link_info *info) 3602{ 3603 struct elf_x86_64_link_hash_table *htab; 3604 bfd *dynobj; 3605 asection *s; 3606 bfd_boolean relocs; 3607 bfd *ibfd; 3608 const struct elf_backend_data *bed; 3609 3610 htab = elf_x86_64_hash_table (info); 3611 if (htab == NULL) 3612 return FALSE; 3613 bed = get_elf_backend_data (output_bfd); 3614 3615 dynobj = htab->elf.dynobj; 3616 if (dynobj == NULL) 3617 abort (); 3618 3619 /* Set up .got offsets for local syms, and space for local dynamic 3620 relocs. */ 3621 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 3622 { 3623 bfd_signed_vma *local_got; 3624 bfd_signed_vma *end_local_got; 3625 char *local_tls_type; 3626 bfd_vma *local_tlsdesc_gotent; 3627 bfd_size_type locsymcount; 3628 Elf_Internal_Shdr *symtab_hdr; 3629 asection *srel; 3630 3631 if (! is_x86_64_elf (ibfd)) 3632 continue; 3633 3634 for (s = ibfd->sections; s != NULL; s = s->next) 3635 { 3636 struct elf_dyn_relocs *p; 3637 3638 if (!elf_x86_64_convert_load (ibfd, s, info)) 3639 return FALSE; 3640 3641 for (p = (struct elf_dyn_relocs *) 3642 (elf_section_data (s)->local_dynrel); 3643 p != NULL; 3644 p = p->next) 3645 { 3646 if (!bfd_is_abs_section (p->sec) 3647 && bfd_is_abs_section (p->sec->output_section)) 3648 { 3649 /* Input section has been discarded, either because 3650 it is a copy of a linkonce section or due to 3651 linker script /DISCARD/, so we'll be discarding 3652 the relocs too. */ 3653 } 3654 else if (p->count != 0) 3655 { 3656 srel = elf_section_data (p->sec)->sreloc; 3657 srel->size += p->count * bed->s->sizeof_rela; 3658 if ((p->sec->output_section->flags & SEC_READONLY) != 0 3659 && (info->flags & DF_TEXTREL) == 0) 3660 { 3661 info->flags |= DF_TEXTREL; 3662 if ((info->warn_shared_textrel && bfd_link_pic (info)) 3663 || info->error_textrel) 3664 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"), 3665 p->sec->owner, p->sec); 3666 } 3667 } 3668 } 3669 } 3670 3671 local_got = elf_local_got_refcounts (ibfd); 3672 if (!local_got) 3673 continue; 3674 3675 symtab_hdr = &elf_symtab_hdr (ibfd); 3676 locsymcount = symtab_hdr->sh_info; 3677 end_local_got = local_got + locsymcount; 3678 local_tls_type = elf_x86_64_local_got_tls_type (ibfd); 3679 local_tlsdesc_gotent = elf_x86_64_local_tlsdesc_gotent (ibfd); 3680 s = htab->elf.sgot; 3681 srel = htab->elf.srelgot; 3682 for (; local_got < end_local_got; 3683 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent) 3684 { 3685 *local_tlsdesc_gotent = (bfd_vma) -1; 3686 if (*local_got > 0) 3687 { 3688 if (GOT_TLS_GDESC_P (*local_tls_type)) 3689 { 3690 *local_tlsdesc_gotent = htab->elf.sgotplt->size 3691 - elf_x86_64_compute_jump_table_size (htab); 3692 htab->elf.sgotplt->size += 2 * GOT_ENTRY_SIZE; 3693 *local_got = (bfd_vma) -2; 3694 } 3695 if (! GOT_TLS_GDESC_P (*local_tls_type) 3696 || GOT_TLS_GD_P (*local_tls_type)) 3697 { 3698 *local_got = s->size; 3699 s->size += GOT_ENTRY_SIZE; 3700 if (GOT_TLS_GD_P (*local_tls_type)) 3701 s->size += GOT_ENTRY_SIZE; 3702 } 3703 if (bfd_link_pic (info) 3704 || GOT_TLS_GD_ANY_P (*local_tls_type) 3705 || *local_tls_type == GOT_TLS_IE) 3706 { 3707 if (GOT_TLS_GDESC_P (*local_tls_type)) 3708 { 3709 htab->elf.srelplt->size 3710 += bed->s->sizeof_rela; 3711 htab->tlsdesc_plt = (bfd_vma) -1; 3712 } 3713 if (! GOT_TLS_GDESC_P (*local_tls_type) 3714 || GOT_TLS_GD_P (*local_tls_type)) 3715 srel->size += bed->s->sizeof_rela; 3716 } 3717 } 3718 else 3719 *local_got = (bfd_vma) -1; 3720 } 3721 } 3722 3723 if (htab->tls_ld_got.refcount > 0) 3724 { 3725 /* Allocate 2 got entries and 1 dynamic reloc for R_X86_64_TLSLD 3726 relocs. */ 3727 htab->tls_ld_got.offset = htab->elf.sgot->size; 3728 htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE; 3729 htab->elf.srelgot->size += bed->s->sizeof_rela; 3730 } 3731 else 3732 htab->tls_ld_got.offset = -1; 3733 3734 /* Allocate global sym .plt and .got entries, and space for global 3735 sym dynamic relocs. */ 3736 elf_link_hash_traverse (&htab->elf, elf_x86_64_allocate_dynrelocs, 3737 info); 3738 3739 /* Allocate .plt and .got entries, and space for local symbols. */ 3740 htab_traverse (htab->loc_hash_table, 3741 elf_x86_64_allocate_local_dynrelocs, 3742 info); 3743 3744 /* For every jump slot reserved in the sgotplt, reloc_count is 3745 incremented. However, when we reserve space for TLS descriptors, 3746 it's not incremented, so in order to compute the space reserved 3747 for them, it suffices to multiply the reloc count by the jump 3748 slot size. 3749 3750 PR ld/13302: We start next_irelative_index at the end of .rela.plt 3751 so that R_X86_64_IRELATIVE entries come last. */ 3752 if (htab->elf.srelplt) 3753 { 3754 htab->sgotplt_jump_table_size 3755 = elf_x86_64_compute_jump_table_size (htab); 3756 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1; 3757 } 3758 else if (htab->elf.irelplt) 3759 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1; 3760 3761 if (htab->tlsdesc_plt) 3762 { 3763 /* If we're not using lazy TLS relocations, don't generate the 3764 PLT and GOT entries they require. */ 3765 if ((info->flags & DF_BIND_NOW)) 3766 htab->tlsdesc_plt = 0; 3767 else 3768 { 3769 htab->tlsdesc_got = htab->elf.sgot->size; 3770 htab->elf.sgot->size += GOT_ENTRY_SIZE; 3771 /* Reserve room for the initial entry. 3772 FIXME: we could probably do away with it in this case. */ 3773 if (htab->elf.splt->size == 0) 3774 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd); 3775 htab->tlsdesc_plt = htab->elf.splt->size; 3776 htab->elf.splt->size += GET_PLT_ENTRY_SIZE (output_bfd); 3777 } 3778 } 3779 3780 if (htab->elf.sgotplt) 3781 { 3782 /* Don't allocate .got.plt section if there are no GOT nor PLT 3783 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */ 3784 if ((htab->elf.hgot == NULL 3785 || !htab->elf.hgot->ref_regular_nonweak) 3786 && (htab->elf.sgotplt->size 3787 == get_elf_backend_data (output_bfd)->got_header_size) 3788 && (htab->elf.splt == NULL 3789 || htab->elf.splt->size == 0) 3790 && (htab->elf.sgot == NULL 3791 || htab->elf.sgot->size == 0) 3792 && (htab->elf.iplt == NULL 3793 || htab->elf.iplt->size == 0) 3794 && (htab->elf.igotplt == NULL 3795 || htab->elf.igotplt->size == 0)) 3796 htab->elf.sgotplt->size = 0; 3797 } 3798 3799 if (htab->plt_eh_frame != NULL 3800 && htab->elf.splt != NULL 3801 && htab->elf.splt->size != 0 3802 && !bfd_is_abs_section (htab->elf.splt->output_section) 3803 && _bfd_elf_eh_frame_present (info)) 3804 { 3805 const struct elf_x86_64_backend_data *arch_data 3806 = get_elf_x86_64_arch_data (bed); 3807 htab->plt_eh_frame->size = arch_data->eh_frame_plt_size; 3808 } 3809 3810 /* We now have determined the sizes of the various dynamic sections. 3811 Allocate memory for them. */ 3812 relocs = FALSE; 3813 for (s = dynobj->sections; s != NULL; s = s->next) 3814 { 3815 if ((s->flags & SEC_LINKER_CREATED) == 0) 3816 continue; 3817 3818 if (s == htab->elf.splt 3819 || s == htab->elf.sgot 3820 || s == htab->elf.sgotplt 3821 || s == htab->elf.iplt 3822 || s == htab->elf.igotplt 3823 || s == htab->plt_bnd 3824 || s == htab->plt_got 3825 || s == htab->plt_eh_frame 3826 || s == htab->sdynbss) 3827 { 3828 /* Strip this section if we don't need it; see the 3829 comment below. */ 3830 } 3831 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela")) 3832 { 3833 if (s->size != 0 && s != htab->elf.srelplt) 3834 relocs = TRUE; 3835 3836 /* We use the reloc_count field as a counter if we need 3837 to copy relocs into the output file. */ 3838 if (s != htab->elf.srelplt) 3839 s->reloc_count = 0; 3840 } 3841 else 3842 { 3843 /* It's not one of our sections, so don't allocate space. */ 3844 continue; 3845 } 3846 3847 if (s->size == 0) 3848 { 3849 /* If we don't need this section, strip it from the 3850 output file. This is mostly to handle .rela.bss and 3851 .rela.plt. We must create both sections in 3852 create_dynamic_sections, because they must be created 3853 before the linker maps input sections to output 3854 sections. The linker does that before 3855 adjust_dynamic_symbol is called, and it is that 3856 function which decides whether anything needs to go 3857 into these sections. */ 3858 3859 s->flags |= SEC_EXCLUDE; 3860 continue; 3861 } 3862 3863 if ((s->flags & SEC_HAS_CONTENTS) == 0) 3864 continue; 3865 3866 /* Allocate memory for the section contents. We use bfd_zalloc 3867 here in case unused entries are not reclaimed before the 3868 section's contents are written out. This should not happen, 3869 but this way if it does, we get a R_X86_64_NONE reloc instead 3870 of garbage. */ 3871 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 3872 if (s->contents == NULL) 3873 return FALSE; 3874 } 3875 3876 if (htab->plt_eh_frame != NULL 3877 && htab->plt_eh_frame->contents != NULL) 3878 { 3879 const struct elf_x86_64_backend_data *arch_data 3880 = get_elf_x86_64_arch_data (bed); 3881 3882 memcpy (htab->plt_eh_frame->contents, 3883 arch_data->eh_frame_plt, htab->plt_eh_frame->size); 3884 bfd_put_32 (dynobj, htab->elf.splt->size, 3885 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET); 3886 } 3887 3888 if (htab->elf.dynamic_sections_created) 3889 { 3890 /* Add some entries to the .dynamic section. We fill in the 3891 values later, in elf_x86_64_finish_dynamic_sections, but we 3892 must add the entries now so that we get the correct size for 3893 the .dynamic section. The DT_DEBUG entry is filled in by the 3894 dynamic linker and used by the debugger. */ 3895#define add_dynamic_entry(TAG, VAL) \ 3896 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 3897 3898 if (bfd_link_executable (info)) 3899 { 3900 if (!add_dynamic_entry (DT_DEBUG, 0)) 3901 return FALSE; 3902 } 3903 3904 if (htab->elf.splt->size != 0) 3905 { 3906 /* DT_PLTGOT is used by prelink even if there is no PLT 3907 relocation. */ 3908 if (!add_dynamic_entry (DT_PLTGOT, 0)) 3909 return FALSE; 3910 3911 if (htab->elf.srelplt->size != 0) 3912 { 3913 if (!add_dynamic_entry (DT_PLTRELSZ, 0) 3914 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 3915 || !add_dynamic_entry (DT_JMPREL, 0)) 3916 return FALSE; 3917 } 3918 3919 if (htab->tlsdesc_plt 3920 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0) 3921 || !add_dynamic_entry (DT_TLSDESC_GOT, 0))) 3922 return FALSE; 3923 } 3924 3925 if (relocs) 3926 { 3927 if (!add_dynamic_entry (DT_RELA, 0) 3928 || !add_dynamic_entry (DT_RELASZ, 0) 3929 || !add_dynamic_entry (DT_RELAENT, bed->s->sizeof_rela)) 3930 return FALSE; 3931 3932 /* If any dynamic relocs apply to a read-only section, 3933 then we need a DT_TEXTREL entry. */ 3934 if ((info->flags & DF_TEXTREL) == 0) 3935 elf_link_hash_traverse (&htab->elf, 3936 elf_x86_64_readonly_dynrelocs, 3937 info); 3938 3939 if ((info->flags & DF_TEXTREL) != 0) 3940 { 3941 if (htab->readonly_dynrelocs_against_ifunc) 3942 { 3943 info->callbacks->einfo 3944 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n")); 3945 bfd_set_error (bfd_error_bad_value); 3946 return FALSE; 3947 } 3948 3949 if (!add_dynamic_entry (DT_TEXTREL, 0)) 3950 return FALSE; 3951 } 3952 } 3953 } 3954#undef add_dynamic_entry 3955 3956 return TRUE; 3957} 3958 3959static bfd_boolean 3960elf_x86_64_always_size_sections (bfd *output_bfd, 3961 struct bfd_link_info *info) 3962{ 3963 asection *tls_sec = elf_hash_table (info)->tls_sec; 3964 3965 if (tls_sec) 3966 { 3967 struct elf_link_hash_entry *tlsbase; 3968 3969 tlsbase = elf_link_hash_lookup (elf_hash_table (info), 3970 "_TLS_MODULE_BASE_", 3971 FALSE, FALSE, FALSE); 3972 3973 if (tlsbase && tlsbase->type == STT_TLS) 3974 { 3975 struct elf_x86_64_link_hash_table *htab; 3976 struct bfd_link_hash_entry *bh = NULL; 3977 const struct elf_backend_data *bed 3978 = get_elf_backend_data (output_bfd); 3979 3980 htab = elf_x86_64_hash_table (info); 3981 if (htab == NULL) 3982 return FALSE; 3983 3984 if (!(_bfd_generic_link_add_one_symbol 3985 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL, 3986 tls_sec, 0, NULL, FALSE, 3987 bed->collect, &bh))) 3988 return FALSE; 3989 3990 htab->tls_module_base = bh; 3991 3992 tlsbase = (struct elf_link_hash_entry *)bh; 3993 tlsbase->def_regular = 1; 3994 tlsbase->other = STV_HIDDEN; 3995 tlsbase->root.linker_def = 1; 3996 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE); 3997 } 3998 } 3999 4000 return TRUE; 4001} 4002 4003/* _TLS_MODULE_BASE_ needs to be treated especially when linking 4004 executables. Rather than setting it to the beginning of the TLS 4005 section, we have to set it to the end. This function may be called 4006 multiple times, it is idempotent. */ 4007 4008static void 4009elf_x86_64_set_tls_module_base (struct bfd_link_info *info) 4010{ 4011 struct elf_x86_64_link_hash_table *htab; 4012 struct bfd_link_hash_entry *base; 4013 4014 if (!bfd_link_executable (info)) 4015 return; 4016 4017 htab = elf_x86_64_hash_table (info); 4018 if (htab == NULL) 4019 return; 4020 4021 base = htab->tls_module_base; 4022 if (base == NULL) 4023 return; 4024 4025 base->u.def.value = htab->elf.tls_size; 4026} 4027 4028/* Return the base VMA address which should be subtracted from real addresses 4029 when resolving @dtpoff relocation. 4030 This is PT_TLS segment p_vaddr. */ 4031 4032static bfd_vma 4033elf_x86_64_dtpoff_base (struct bfd_link_info *info) 4034{ 4035 /* If tls_sec is NULL, we should have signalled an error already. */ 4036 if (elf_hash_table (info)->tls_sec == NULL) 4037 return 0; 4038 return elf_hash_table (info)->tls_sec->vma; 4039} 4040 4041/* Return the relocation value for @tpoff relocation 4042 if STT_TLS virtual address is ADDRESS. */ 4043 4044static bfd_vma 4045elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address) 4046{ 4047 struct elf_link_hash_table *htab = elf_hash_table (info); 4048 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd); 4049 bfd_vma static_tls_size; 4050 4051 /* If tls_segment is NULL, we should have signalled an error already. */ 4052 if (htab->tls_sec == NULL) 4053 return 0; 4054 4055 /* Consider special static TLS alignment requirements. */ 4056 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment); 4057 return address - static_tls_size - htab->tls_sec->vma; 4058} 4059 4060/* Is the instruction before OFFSET in CONTENTS a 32bit relative 4061 branch? */ 4062 4063static bfd_boolean 4064is_32bit_relative_branch (bfd_byte *contents, bfd_vma offset) 4065{ 4066 /* Opcode Instruction 4067 0xe8 call 4068 0xe9 jump 4069 0x0f 0x8x conditional jump */ 4070 return ((offset > 0 4071 && (contents [offset - 1] == 0xe8 4072 || contents [offset - 1] == 0xe9)) 4073 || (offset > 1 4074 && contents [offset - 2] == 0x0f 4075 && (contents [offset - 1] & 0xf0) == 0x80)); 4076} 4077 4078/* Relocate an x86_64 ELF section. */ 4079 4080static bfd_boolean 4081elf_x86_64_relocate_section (bfd *output_bfd, 4082 struct bfd_link_info *info, 4083 bfd *input_bfd, 4084 asection *input_section, 4085 bfd_byte *contents, 4086 Elf_Internal_Rela *relocs, 4087 Elf_Internal_Sym *local_syms, 4088 asection **local_sections) 4089{ 4090 struct elf_x86_64_link_hash_table *htab; 4091 Elf_Internal_Shdr *symtab_hdr; 4092 struct elf_link_hash_entry **sym_hashes; 4093 bfd_vma *local_got_offsets; 4094 bfd_vma *local_tlsdesc_gotents; 4095 Elf_Internal_Rela *rel; 4096 Elf_Internal_Rela *wrel; 4097 Elf_Internal_Rela *relend; 4098 const unsigned int plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd); 4099 4100 BFD_ASSERT (is_x86_64_elf (input_bfd)); 4101 4102 /* Skip if check_relocs failed. */ 4103 if (input_section->check_relocs_failed) 4104 return FALSE; 4105 4106 htab = elf_x86_64_hash_table (info); 4107 if (htab == NULL) 4108 return FALSE; 4109 symtab_hdr = &elf_symtab_hdr (input_bfd); 4110 sym_hashes = elf_sym_hashes (input_bfd); 4111 local_got_offsets = elf_local_got_offsets (input_bfd); 4112 local_tlsdesc_gotents = elf_x86_64_local_tlsdesc_gotent (input_bfd); 4113 4114 elf_x86_64_set_tls_module_base (info); 4115 4116 rel = wrel = relocs; 4117 relend = relocs + input_section->reloc_count; 4118 for (; rel < relend; wrel++, rel++) 4119 { 4120 unsigned int r_type; 4121 reloc_howto_type *howto; 4122 unsigned long r_symndx; 4123 struct elf_link_hash_entry *h; 4124 struct elf_x86_64_link_hash_entry *eh; 4125 Elf_Internal_Sym *sym; 4126 asection *sec; 4127 bfd_vma off, offplt, plt_offset; 4128 bfd_vma relocation; 4129 bfd_boolean unresolved_reloc; 4130 bfd_reloc_status_type r; 4131 int tls_type; 4132 asection *base_got, *resolved_plt; 4133 bfd_vma st_size; 4134 bfd_boolean resolved_to_zero; 4135 4136 r_type = ELF32_R_TYPE (rel->r_info); 4137 if (r_type == (int) R_X86_64_GNU_VTINHERIT 4138 || r_type == (int) R_X86_64_GNU_VTENTRY) 4139 { 4140 if (wrel != rel) 4141 *wrel = *rel; 4142 continue; 4143 } 4144 4145 if (r_type >= (int) R_X86_64_standard) 4146 { 4147 (*_bfd_error_handler) 4148 (_("%B: unrecognized relocation (0x%x) in section `%A'"), 4149 input_bfd, input_section, r_type); 4150 bfd_set_error (bfd_error_bad_value); 4151 return FALSE; 4152 } 4153 4154 if (r_type != (int) R_X86_64_32 4155 || ABI_64_P (output_bfd)) 4156 howto = x86_64_elf_howto_table + r_type; 4157 else 4158 howto = (x86_64_elf_howto_table 4159 + ARRAY_SIZE (x86_64_elf_howto_table) - 1); 4160 r_symndx = htab->r_sym (rel->r_info); 4161 h = NULL; 4162 sym = NULL; 4163 sec = NULL; 4164 unresolved_reloc = FALSE; 4165 if (r_symndx < symtab_hdr->sh_info) 4166 { 4167 sym = local_syms + r_symndx; 4168 sec = local_sections[r_symndx]; 4169 4170 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, 4171 &sec, rel); 4172 st_size = sym->st_size; 4173 4174 /* Relocate against local STT_GNU_IFUNC symbol. */ 4175 if (!bfd_link_relocatable (info) 4176 && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 4177 { 4178 h = elf_x86_64_get_local_sym_hash (htab, input_bfd, 4179 rel, FALSE); 4180 if (h == NULL) 4181 abort (); 4182 4183 /* Set STT_GNU_IFUNC symbol value. */ 4184 h->root.u.def.value = sym->st_value; 4185 h->root.u.def.section = sec; 4186 } 4187 } 4188 else 4189 { 4190 bfd_boolean warned ATTRIBUTE_UNUSED; 4191 bfd_boolean ignored ATTRIBUTE_UNUSED; 4192 4193 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 4194 r_symndx, symtab_hdr, sym_hashes, 4195 h, sec, relocation, 4196 unresolved_reloc, warned, ignored); 4197 st_size = h->size; 4198 } 4199 4200 if (sec != NULL && discarded_section (sec)) 4201 { 4202 _bfd_clear_contents (howto, input_bfd, input_section, 4203 contents + rel->r_offset); 4204 wrel->r_offset = rel->r_offset; 4205 wrel->r_info = 0; 4206 wrel->r_addend = 0; 4207 4208 /* For ld -r, remove relocations in debug sections against 4209 sections defined in discarded sections. Not done for 4210 eh_frame editing code expects to be present. */ 4211 if (bfd_link_relocatable (info) 4212 && (input_section->flags & SEC_DEBUGGING)) 4213 wrel--; 4214 4215 continue; 4216 } 4217 4218 if (bfd_link_relocatable (info)) 4219 { 4220 if (wrel != rel) 4221 *wrel = *rel; 4222 continue; 4223 } 4224 4225 if (rel->r_addend == 0 && !ABI_64_P (output_bfd)) 4226 { 4227 if (r_type == R_X86_64_64) 4228 { 4229 /* For x32, treat R_X86_64_64 like R_X86_64_32 and 4230 zero-extend it to 64bit if addend is zero. */ 4231 r_type = R_X86_64_32; 4232 memset (contents + rel->r_offset + 4, 0, 4); 4233 } 4234 else if (r_type == R_X86_64_SIZE64) 4235 { 4236 /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and 4237 zero-extend it to 64bit if addend is zero. */ 4238 r_type = R_X86_64_SIZE32; 4239 memset (contents + rel->r_offset + 4, 0, 4); 4240 } 4241 } 4242 4243 eh = (struct elf_x86_64_link_hash_entry *) h; 4244 4245 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle 4246 it here if it is defined in a non-shared object. */ 4247 if (h != NULL 4248 && h->type == STT_GNU_IFUNC 4249 && h->def_regular) 4250 { 4251 bfd_vma plt_index; 4252 const char *name; 4253 4254 if ((input_section->flags & SEC_ALLOC) == 0) 4255 { 4256 /* Dynamic relocs are not propagated for SEC_DEBUGGING 4257 sections because such sections are not SEC_ALLOC and 4258 thus ld.so will not process them. */ 4259 if ((input_section->flags & SEC_DEBUGGING) != 0) 4260 continue; 4261 abort (); 4262 } 4263 4264 switch (r_type) 4265 { 4266 default: 4267 break; 4268 4269 case R_X86_64_GOTPCREL: 4270 case R_X86_64_GOTPCRELX: 4271 case R_X86_64_REX_GOTPCRELX: 4272 case R_X86_64_GOTPCREL64: 4273 base_got = htab->elf.sgot; 4274 off = h->got.offset; 4275 4276 if (base_got == NULL) 4277 abort (); 4278 4279 if (off == (bfd_vma) -1) 4280 { 4281 /* We can't use h->got.offset here to save state, or 4282 even just remember the offset, as finish_dynamic_symbol 4283 would use that as offset into .got. */ 4284 4285 if (h->plt.offset == (bfd_vma) -1) 4286 abort (); 4287 4288 if (htab->elf.splt != NULL) 4289 { 4290 plt_index = h->plt.offset / plt_entry_size - 1; 4291 off = (plt_index + 3) * GOT_ENTRY_SIZE; 4292 base_got = htab->elf.sgotplt; 4293 } 4294 else 4295 { 4296 plt_index = h->plt.offset / plt_entry_size; 4297 off = plt_index * GOT_ENTRY_SIZE; 4298 base_got = htab->elf.igotplt; 4299 } 4300 4301 if (h->dynindx == -1 4302 || h->forced_local 4303 || info->symbolic) 4304 { 4305 /* This references the local defitionion. We must 4306 initialize this entry in the global offset table. 4307 Since the offset must always be a multiple of 8, 4308 we use the least significant bit to record 4309 whether we have initialized it already. 4310 4311 When doing a dynamic link, we create a .rela.got 4312 relocation entry to initialize the value. This 4313 is done in the finish_dynamic_symbol routine. */ 4314 if ((off & 1) != 0) 4315 off &= ~1; 4316 else 4317 { 4318 bfd_put_64 (output_bfd, relocation, 4319 base_got->contents + off); 4320 /* Note that this is harmless for the GOTPLT64 4321 case, as -1 | 1 still is -1. */ 4322 h->got.offset |= 1; 4323 } 4324 } 4325 } 4326 4327 relocation = (base_got->output_section->vma 4328 + base_got->output_offset + off); 4329 4330 goto do_relocation; 4331 } 4332 4333 if (h->plt.offset == (bfd_vma) -1) 4334 { 4335 /* Handle static pointers of STT_GNU_IFUNC symbols. */ 4336 if (r_type == htab->pointer_r_type 4337 && (input_section->flags & SEC_CODE) == 0) 4338 goto do_ifunc_pointer; 4339 goto bad_ifunc_reloc; 4340 } 4341 4342 /* STT_GNU_IFUNC symbol must go through PLT. */ 4343 if (htab->elf.splt != NULL) 4344 { 4345 if (htab->plt_bnd != NULL) 4346 { 4347 resolved_plt = htab->plt_bnd; 4348 plt_offset = eh->plt_bnd.offset; 4349 } 4350 else 4351 { 4352 resolved_plt = htab->elf.splt; 4353 plt_offset = h->plt.offset; 4354 } 4355 } 4356 else 4357 { 4358 resolved_plt = htab->elf.iplt; 4359 plt_offset = h->plt.offset; 4360 } 4361 4362 relocation = (resolved_plt->output_section->vma 4363 + resolved_plt->output_offset + plt_offset); 4364 4365 switch (r_type) 4366 { 4367 default: 4368bad_ifunc_reloc: 4369 if (h->root.root.string) 4370 name = h->root.root.string; 4371 else 4372 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 4373 NULL); 4374 (*_bfd_error_handler) 4375 (_("%B: relocation %s against STT_GNU_IFUNC " 4376 "symbol `%s' isn't supported"), input_bfd, 4377 howto->name, name); 4378 bfd_set_error (bfd_error_bad_value); 4379 return FALSE; 4380 4381 case R_X86_64_32S: 4382 if (bfd_link_pic (info)) 4383 abort (); 4384 goto do_relocation; 4385 4386 case R_X86_64_32: 4387 if (ABI_64_P (output_bfd)) 4388 goto do_relocation; 4389 /* FALLTHROUGH */ 4390 case R_X86_64_64: 4391do_ifunc_pointer: 4392 if (rel->r_addend != 0) 4393 { 4394 if (h->root.root.string) 4395 name = h->root.root.string; 4396 else 4397 name = bfd_elf_sym_name (input_bfd, symtab_hdr, 4398 sym, NULL); 4399 (*_bfd_error_handler) 4400 (_("%B: relocation %s against STT_GNU_IFUNC " 4401 "symbol `%s' has non-zero addend: %d"), 4402 input_bfd, howto->name, name, rel->r_addend); 4403 bfd_set_error (bfd_error_bad_value); 4404 return FALSE; 4405 } 4406 4407 /* Generate dynamic relcoation only when there is a 4408 non-GOT reference in a shared object or there is no 4409 PLT. */ 4410 if ((bfd_link_pic (info) && h->non_got_ref) 4411 || h->plt.offset == (bfd_vma) -1) 4412 { 4413 Elf_Internal_Rela outrel; 4414 asection *sreloc; 4415 4416 /* Need a dynamic relocation to get the real function 4417 address. */ 4418 outrel.r_offset = _bfd_elf_section_offset (output_bfd, 4419 info, 4420 input_section, 4421 rel->r_offset); 4422 if (outrel.r_offset == (bfd_vma) -1 4423 || outrel.r_offset == (bfd_vma) -2) 4424 abort (); 4425 4426 outrel.r_offset += (input_section->output_section->vma 4427 + input_section->output_offset); 4428 4429 if (h->dynindx == -1 4430 || h->forced_local 4431 || bfd_link_executable (info)) 4432 { 4433 /* This symbol is resolved locally. */ 4434 outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE); 4435 outrel.r_addend = (h->root.u.def.value 4436 + h->root.u.def.section->output_section->vma 4437 + h->root.u.def.section->output_offset); 4438 } 4439 else 4440 { 4441 outrel.r_info = htab->r_info (h->dynindx, r_type); 4442 outrel.r_addend = 0; 4443 } 4444 4445 /* Dynamic relocations are stored in 4446 1. .rela.ifunc section in PIC object. 4447 2. .rela.got section in dynamic executable. 4448 3. .rela.iplt section in static executable. */ 4449 if (bfd_link_pic (info)) 4450 sreloc = htab->elf.irelifunc; 4451 else if (htab->elf.splt != NULL) 4452 sreloc = htab->elf.srelgot; 4453 else 4454 sreloc = htab->elf.irelplt; 4455 elf_append_rela (output_bfd, sreloc, &outrel); 4456 4457 /* If this reloc is against an external symbol, we 4458 do not want to fiddle with the addend. Otherwise, 4459 we need to include the symbol value so that it 4460 becomes an addend for the dynamic reloc. For an 4461 internal symbol, we have updated addend. */ 4462 continue; 4463 } 4464 /* FALLTHROUGH */ 4465 case R_X86_64_PC32: 4466 case R_X86_64_PC32_BND: 4467 case R_X86_64_PC64: 4468 case R_X86_64_PLT32: 4469 case R_X86_64_PLT32_BND: 4470 goto do_relocation; 4471 } 4472 } 4473 4474 resolved_to_zero = (eh != NULL 4475 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, 4476 eh->has_got_reloc, 4477 eh)); 4478 4479 /* When generating a shared object, the relocations handled here are 4480 copied into the output file to be resolved at run time. */ 4481 switch (r_type) 4482 { 4483 case R_X86_64_GOT32: 4484 case R_X86_64_GOT64: 4485 /* Relocation is to the entry for this symbol in the global 4486 offset table. */ 4487 case R_X86_64_GOTPCREL: 4488 case R_X86_64_GOTPCRELX: 4489 case R_X86_64_REX_GOTPCRELX: 4490 case R_X86_64_GOTPCREL64: 4491 /* Use global offset table entry as symbol value. */ 4492 case R_X86_64_GOTPLT64: 4493 /* This is obsolete and treated the the same as GOT64. */ 4494 base_got = htab->elf.sgot; 4495 4496 if (htab->elf.sgot == NULL) 4497 abort (); 4498 4499 if (h != NULL) 4500 { 4501 bfd_boolean dyn; 4502 4503 off = h->got.offset; 4504 if (h->needs_plt 4505 && h->plt.offset != (bfd_vma)-1 4506 && off == (bfd_vma)-1) 4507 { 4508 /* We can't use h->got.offset here to save 4509 state, or even just remember the offset, as 4510 finish_dynamic_symbol would use that as offset into 4511 .got. */ 4512 bfd_vma plt_index = h->plt.offset / plt_entry_size - 1; 4513 off = (plt_index + 3) * GOT_ENTRY_SIZE; 4514 base_got = htab->elf.sgotplt; 4515 } 4516 4517 dyn = htab->elf.dynamic_sections_created; 4518 4519 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) 4520 || (bfd_link_pic (info) 4521 && SYMBOL_REFERENCES_LOCAL (info, h)) 4522 || (ELF_ST_VISIBILITY (h->other) 4523 && h->root.type == bfd_link_hash_undefweak)) 4524 { 4525 /* This is actually a static link, or it is a -Bsymbolic 4526 link and the symbol is defined locally, or the symbol 4527 was forced to be local because of a version file. We 4528 must initialize this entry in the global offset table. 4529 Since the offset must always be a multiple of 8, we 4530 use the least significant bit to record whether we 4531 have initialized it already. 4532 4533 When doing a dynamic link, we create a .rela.got 4534 relocation entry to initialize the value. This is 4535 done in the finish_dynamic_symbol routine. */ 4536 if ((off & 1) != 0) 4537 off &= ~1; 4538 else 4539 { 4540 bfd_put_64 (output_bfd, relocation, 4541 base_got->contents + off); 4542 /* Note that this is harmless for the GOTPLT64 case, 4543 as -1 | 1 still is -1. */ 4544 h->got.offset |= 1; 4545 } 4546 } 4547 else 4548 unresolved_reloc = FALSE; 4549 } 4550 else 4551 { 4552 if (local_got_offsets == NULL) 4553 abort (); 4554 4555 off = local_got_offsets[r_symndx]; 4556 4557 /* The offset must always be a multiple of 8. We use 4558 the least significant bit to record whether we have 4559 already generated the necessary reloc. */ 4560 if ((off & 1) != 0) 4561 off &= ~1; 4562 else 4563 { 4564 bfd_put_64 (output_bfd, relocation, 4565 base_got->contents + off); 4566 4567 if (bfd_link_pic (info)) 4568 { 4569 asection *s; 4570 Elf_Internal_Rela outrel; 4571 4572 /* We need to generate a R_X86_64_RELATIVE reloc 4573 for the dynamic linker. */ 4574 s = htab->elf.srelgot; 4575 if (s == NULL) 4576 abort (); 4577 4578 outrel.r_offset = (base_got->output_section->vma 4579 + base_got->output_offset 4580 + off); 4581 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE); 4582 outrel.r_addend = relocation; 4583 elf_append_rela (output_bfd, s, &outrel); 4584 } 4585 4586 local_got_offsets[r_symndx] |= 1; 4587 } 4588 } 4589 4590 if (off >= (bfd_vma) -2) 4591 abort (); 4592 4593 relocation = base_got->output_section->vma 4594 + base_got->output_offset + off; 4595 if (r_type != R_X86_64_GOTPCREL 4596 && r_type != R_X86_64_GOTPCRELX 4597 && r_type != R_X86_64_REX_GOTPCRELX 4598 && r_type != R_X86_64_GOTPCREL64) 4599 relocation -= htab->elf.sgotplt->output_section->vma 4600 - htab->elf.sgotplt->output_offset; 4601 4602 break; 4603 4604 case R_X86_64_GOTOFF64: 4605 /* Relocation is relative to the start of the global offset 4606 table. */ 4607 4608 /* Check to make sure it isn't a protected function or data 4609 symbol for shared library since it may not be local when 4610 used as function address or with copy relocation. We also 4611 need to make sure that a symbol is referenced locally. */ 4612 if (bfd_link_pic (info) && h) 4613 { 4614 if (!h->def_regular) 4615 { 4616 const char *v; 4617 4618 switch (ELF_ST_VISIBILITY (h->other)) 4619 { 4620 case STV_HIDDEN: 4621 v = _("hidden symbol"); 4622 break; 4623 case STV_INTERNAL: 4624 v = _("internal symbol"); 4625 break; 4626 case STV_PROTECTED: 4627 v = _("protected symbol"); 4628 break; 4629 default: 4630 v = _("symbol"); 4631 break; 4632 } 4633 4634 (*_bfd_error_handler) 4635 (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"), 4636 input_bfd, v, h->root.root.string); 4637 bfd_set_error (bfd_error_bad_value); 4638 return FALSE; 4639 } 4640 else if (!bfd_link_executable (info) 4641 && !SYMBOL_REFERENCES_LOCAL (info, h) 4642 && (h->type == STT_FUNC 4643 || h->type == STT_OBJECT) 4644 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) 4645 { 4646 (*_bfd_error_handler) 4647 (_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"), 4648 input_bfd, 4649 h->type == STT_FUNC ? "function" : "data", 4650 h->root.root.string); 4651 bfd_set_error (bfd_error_bad_value); 4652 return FALSE; 4653 } 4654 } 4655 4656 /* Note that sgot is not involved in this 4657 calculation. We always want the start of .got.plt. If we 4658 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is 4659 permitted by the ABI, we might have to change this 4660 calculation. */ 4661 relocation -= htab->elf.sgotplt->output_section->vma 4662 + htab->elf.sgotplt->output_offset; 4663 break; 4664 4665 case R_X86_64_GOTPC32: 4666 case R_X86_64_GOTPC64: 4667 /* Use global offset table as symbol value. */ 4668 relocation = htab->elf.sgotplt->output_section->vma 4669 + htab->elf.sgotplt->output_offset; 4670 unresolved_reloc = FALSE; 4671 break; 4672 4673 case R_X86_64_PLTOFF64: 4674 /* Relocation is PLT entry relative to GOT. For local 4675 symbols it's the symbol itself relative to GOT. */ 4676 if (h != NULL 4677 /* See PLT32 handling. */ 4678 && h->plt.offset != (bfd_vma) -1 4679 && htab->elf.splt != NULL) 4680 { 4681 if (htab->plt_bnd != NULL) 4682 { 4683 resolved_plt = htab->plt_bnd; 4684 plt_offset = eh->plt_bnd.offset; 4685 } 4686 else 4687 { 4688 resolved_plt = htab->elf.splt; 4689 plt_offset = h->plt.offset; 4690 } 4691 4692 relocation = (resolved_plt->output_section->vma 4693 + resolved_plt->output_offset 4694 + plt_offset); 4695 unresolved_reloc = FALSE; 4696 } 4697 4698 relocation -= htab->elf.sgotplt->output_section->vma 4699 + htab->elf.sgotplt->output_offset; 4700 break; 4701 4702 case R_X86_64_PLT32: 4703 case R_X86_64_PLT32_BND: 4704 /* Relocation is to the entry for this symbol in the 4705 procedure linkage table. */ 4706 4707 /* Resolve a PLT32 reloc against a local symbol directly, 4708 without using the procedure linkage table. */ 4709 if (h == NULL) 4710 break; 4711 4712 if ((h->plt.offset == (bfd_vma) -1 4713 && eh->plt_got.offset == (bfd_vma) -1) 4714 || htab->elf.splt == NULL) 4715 { 4716 /* We didn't make a PLT entry for this symbol. This 4717 happens when statically linking PIC code, or when 4718 using -Bsymbolic. */ 4719 break; 4720 } 4721 4722 if (h->plt.offset != (bfd_vma) -1) 4723 { 4724 if (htab->plt_bnd != NULL) 4725 { 4726 resolved_plt = htab->plt_bnd; 4727 plt_offset = eh->plt_bnd.offset; 4728 } 4729 else 4730 { 4731 resolved_plt = htab->elf.splt; 4732 plt_offset = h->plt.offset; 4733 } 4734 } 4735 else 4736 { 4737 /* Use the GOT PLT. */ 4738 resolved_plt = htab->plt_got; 4739 plt_offset = eh->plt_got.offset; 4740 } 4741 4742 relocation = (resolved_plt->output_section->vma 4743 + resolved_plt->output_offset 4744 + plt_offset); 4745 unresolved_reloc = FALSE; 4746 break; 4747 4748 case R_X86_64_SIZE32: 4749 case R_X86_64_SIZE64: 4750 /* Set to symbol size. */ 4751 relocation = st_size; 4752 goto direct; 4753 4754 case R_X86_64_PC8: 4755 case R_X86_64_PC16: 4756 case R_X86_64_PC32: 4757 case R_X86_64_PC32_BND: 4758 /* Don't complain about -fPIC if the symbol is undefined when 4759 building executable unless it is unresolved weak symbol. */ 4760 if ((input_section->flags & SEC_ALLOC) != 0 4761 && (input_section->flags & SEC_READONLY) != 0 4762 && h != NULL 4763 && ((bfd_link_executable (info) 4764 && h->root.type == bfd_link_hash_undefweak 4765 && !resolved_to_zero) 4766 || (bfd_link_pic (info) 4767 && !(bfd_link_pie (info) 4768 && h->root.type == bfd_link_hash_undefined)))) 4769 { 4770 bfd_boolean fail = FALSE; 4771 bfd_boolean branch 4772 = ((r_type == R_X86_64_PC32 4773 || r_type == R_X86_64_PC32_BND) 4774 && is_32bit_relative_branch (contents, rel->r_offset)); 4775 4776 if (SYMBOL_REFERENCES_LOCAL (info, h)) 4777 { 4778 /* Symbol is referenced locally. Make sure it is 4779 defined locally or for a branch. */ 4780 fail = !h->def_regular && !branch; 4781 } 4782 else if (!(bfd_link_pie (info) 4783 && (h->needs_copy || eh->needs_copy))) 4784 { 4785 /* Symbol doesn't need copy reloc and isn't referenced 4786 locally. We only allow branch to symbol with 4787 non-default visibility. */ 4788 fail = (!branch 4789 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT); 4790 } 4791 4792 if (fail) 4793 return elf_x86_64_need_pic (input_bfd, input_section, 4794 h, NULL, NULL, howto); 4795 } 4796 /* Fall through. */ 4797 4798 case R_X86_64_8: 4799 case R_X86_64_16: 4800 case R_X86_64_32: 4801 case R_X86_64_PC64: 4802 case R_X86_64_64: 4803 /* FIXME: The ABI says the linker should make sure the value is 4804 the same when it's zeroextended to 64 bit. */ 4805 4806direct: 4807 if ((input_section->flags & SEC_ALLOC) == 0) 4808 break; 4809 4810 /* Don't copy a pc-relative relocation into the output file 4811 if the symbol needs copy reloc or the symbol is undefined 4812 when building executable. Copy dynamic function pointer 4813 relocations. Don't generate dynamic relocations against 4814 resolved undefined weak symbols in PIE. */ 4815 if ((bfd_link_pic (info) 4816 && !(bfd_link_pie (info) 4817 && h != NULL 4818 && (h->needs_copy 4819 || eh->needs_copy 4820 || h->root.type == bfd_link_hash_undefined) 4821 && IS_X86_64_PCREL_TYPE (r_type)) 4822 && (h == NULL 4823 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4824 && !resolved_to_zero) 4825 || h->root.type != bfd_link_hash_undefweak)) 4826 && ((! IS_X86_64_PCREL_TYPE (r_type) 4827 && r_type != R_X86_64_SIZE32 4828 && r_type != R_X86_64_SIZE64) 4829 || ! SYMBOL_CALLS_LOCAL (info, h))) 4830 || (ELIMINATE_COPY_RELOCS 4831 && !bfd_link_pic (info) 4832 && h != NULL 4833 && h->dynindx != -1 4834 && (!h->non_got_ref 4835 || eh->func_pointer_refcount > 0 4836 || (h->root.type == bfd_link_hash_undefweak 4837 && !resolved_to_zero)) 4838 && ((h->def_dynamic && !h->def_regular) 4839 /* Undefined weak symbol is bound locally when 4840 PIC is false. */ 4841 || h->root.type == bfd_link_hash_undefined))) 4842 { 4843 Elf_Internal_Rela outrel; 4844 bfd_boolean skip, relocate; 4845 asection *sreloc; 4846 4847 /* When generating a shared object, these relocations 4848 are copied into the output file to be resolved at run 4849 time. */ 4850 skip = FALSE; 4851 relocate = FALSE; 4852 4853 outrel.r_offset = 4854 _bfd_elf_section_offset (output_bfd, info, input_section, 4855 rel->r_offset); 4856 if (outrel.r_offset == (bfd_vma) -1) 4857 skip = TRUE; 4858 else if (outrel.r_offset == (bfd_vma) -2) 4859 skip = TRUE, relocate = TRUE; 4860 4861 outrel.r_offset += (input_section->output_section->vma 4862 + input_section->output_offset); 4863 4864 if (skip) 4865 memset (&outrel, 0, sizeof outrel); 4866 4867 /* h->dynindx may be -1 if this symbol was marked to 4868 become local. */ 4869 else if (h != NULL 4870 && h->dynindx != -1 4871 && (IS_X86_64_PCREL_TYPE (r_type) 4872 || !(bfd_link_executable (info) 4873 || SYMBOLIC_BIND (info, h)) 4874 || ! h->def_regular)) 4875 { 4876 outrel.r_info = htab->r_info (h->dynindx, r_type); 4877 outrel.r_addend = rel->r_addend; 4878 } 4879 else 4880 { 4881 /* This symbol is local, or marked to become local. 4882 When relocation overflow check is disabled, we 4883 convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */ 4884 if (r_type == htab->pointer_r_type 4885 || (r_type == R_X86_64_32 4886 && info->no_reloc_overflow_check)) 4887 { 4888 relocate = TRUE; 4889 outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE); 4890 outrel.r_addend = relocation + rel->r_addend; 4891 } 4892 else if (r_type == R_X86_64_64 4893 && !ABI_64_P (output_bfd)) 4894 { 4895 relocate = TRUE; 4896 outrel.r_info = htab->r_info (0, 4897 R_X86_64_RELATIVE64); 4898 outrel.r_addend = relocation + rel->r_addend; 4899 /* Check addend overflow. */ 4900 if ((outrel.r_addend & 0x80000000) 4901 != (rel->r_addend & 0x80000000)) 4902 { 4903 const char *name; 4904 int addend = rel->r_addend; 4905 if (h && h->root.root.string) 4906 name = h->root.root.string; 4907 else 4908 name = bfd_elf_sym_name (input_bfd, symtab_hdr, 4909 sym, NULL); 4910 if (addend < 0) 4911 (*_bfd_error_handler) 4912 (_("%B: addend -0x%x in relocation %s against " 4913 "symbol `%s' at 0x%lx in section `%A' is " 4914 "out of range"), 4915 input_bfd, input_section, addend, 4916 howto->name, name, 4917 (unsigned long) rel->r_offset); 4918 else 4919 (*_bfd_error_handler) 4920 (_("%B: addend 0x%x in relocation %s against " 4921 "symbol `%s' at 0x%lx in section `%A' is " 4922 "out of range"), 4923 input_bfd, input_section, addend, 4924 howto->name, name, 4925 (unsigned long) rel->r_offset); 4926 bfd_set_error (bfd_error_bad_value); 4927 return FALSE; 4928 } 4929 } 4930 else 4931 { 4932 long sindx; 4933 4934 if (bfd_is_abs_section (sec)) 4935 sindx = 0; 4936 else if (sec == NULL || sec->owner == NULL) 4937 { 4938 bfd_set_error (bfd_error_bad_value); 4939 return FALSE; 4940 } 4941 else 4942 { 4943 asection *osec; 4944 4945 /* We are turning this relocation into one 4946 against a section symbol. It would be 4947 proper to subtract the symbol's value, 4948 osec->vma, from the emitted reloc addend, 4949 but ld.so expects buggy relocs. */ 4950 osec = sec->output_section; 4951 sindx = elf_section_data (osec)->dynindx; 4952 if (sindx == 0) 4953 { 4954 asection *oi = htab->elf.text_index_section; 4955 sindx = elf_section_data (oi)->dynindx; 4956 } 4957 BFD_ASSERT (sindx != 0); 4958 } 4959 4960 outrel.r_info = htab->r_info (sindx, r_type); 4961 outrel.r_addend = relocation + rel->r_addend; 4962 } 4963 } 4964 4965 sreloc = elf_section_data (input_section)->sreloc; 4966 4967 if (sreloc == NULL || sreloc->contents == NULL) 4968 { 4969 r = bfd_reloc_notsupported; 4970 goto check_relocation_error; 4971 } 4972 4973 elf_append_rela (output_bfd, sreloc, &outrel); 4974 4975 /* If this reloc is against an external symbol, we do 4976 not want to fiddle with the addend. Otherwise, we 4977 need to include the symbol value so that it becomes 4978 an addend for the dynamic reloc. */ 4979 if (! relocate) 4980 continue; 4981 } 4982 4983 break; 4984 4985 case R_X86_64_TLSGD: 4986 case R_X86_64_GOTPC32_TLSDESC: 4987 case R_X86_64_TLSDESC_CALL: 4988 case R_X86_64_GOTTPOFF: 4989 tls_type = GOT_UNKNOWN; 4990 if (h == NULL && local_got_offsets) 4991 tls_type = elf_x86_64_local_got_tls_type (input_bfd) [r_symndx]; 4992 else if (h != NULL) 4993 tls_type = elf_x86_64_hash_entry (h)->tls_type; 4994 4995 if (! elf_x86_64_tls_transition (info, input_bfd, 4996 input_section, contents, 4997 symtab_hdr, sym_hashes, 4998 &r_type, tls_type, rel, 4999 relend, h, r_symndx, TRUE)) 5000 return FALSE; 5001 5002 if (r_type == R_X86_64_TPOFF32) 5003 { 5004 bfd_vma roff = rel->r_offset; 5005 5006 BFD_ASSERT (! unresolved_reloc); 5007 5008 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD) 5009 { 5010 /* GD->LE transition. For 64bit, change 5011 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 5012 .word 0x6666; rex64; call __tls_get_addr@PLT 5013 or 5014 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 5015 .byte 0x66; rex64 5016 call *__tls_get_addr@GOTPCREL(%rip) 5017 which may be converted to 5018 addr32 call __tls_get_addr 5019 into: 5020 movq %fs:0, %rax 5021 leaq foo@tpoff(%rax), %rax 5022 For 32bit, change 5023 leaq foo@tlsgd(%rip), %rdi 5024 .word 0x6666; rex64; call __tls_get_addr@PLT 5025 or 5026 leaq foo@tlsgd(%rip), %rdi 5027 .byte 0x66; rex64 5028 call *__tls_get_addr@GOTPCREL(%rip) 5029 which may be converted to 5030 addr32 call __tls_get_addr 5031 into: 5032 movl %fs:0, %eax 5033 leaq foo@tpoff(%rax), %rax 5034 For largepic, change: 5035 leaq foo@tlsgd(%rip), %rdi 5036 movabsq $__tls_get_addr@pltoff, %rax 5037 addq %r15, %rax 5038 call *%rax 5039 into: 5040 movq %fs:0, %rax 5041 leaq foo@tpoff(%rax), %rax 5042 nopw 0x0(%rax,%rax,1) */ 5043 int largepic = 0; 5044 if (ABI_64_P (output_bfd)) 5045 { 5046 if (contents[roff + 5] == 0xb8) 5047 { 5048 memcpy (contents + roff - 3, 5049 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80" 5050 "\0\0\0\0\x66\x0f\x1f\x44\0", 22); 5051 largepic = 1; 5052 } 5053 else 5054 memcpy (contents + roff - 4, 5055 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0", 5056 16); 5057 } 5058 else 5059 memcpy (contents + roff - 3, 5060 "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0", 5061 15); 5062 bfd_put_32 (output_bfd, 5063 elf_x86_64_tpoff (info, relocation), 5064 contents + roff + 8 + largepic); 5065 /* Skip R_X86_64_PC32, R_X86_64_PLT32, 5066 R_X86_64_GOTPCRELX and R_X86_64_PLTOFF64. */ 5067 rel++; 5068 wrel++; 5069 continue; 5070 } 5071 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC) 5072 { 5073 /* GDesc -> LE transition. 5074 It's originally something like: 5075 leaq x@tlsdesc(%rip), %rax 5076 5077 Change it to: 5078 movl $x@tpoff, %rax. */ 5079 5080 unsigned int val, type; 5081 5082 type = bfd_get_8 (input_bfd, contents + roff - 3); 5083 val = bfd_get_8 (input_bfd, contents + roff - 1); 5084 bfd_put_8 (output_bfd, 0x48 | ((type >> 2) & 1), 5085 contents + roff - 3); 5086 bfd_put_8 (output_bfd, 0xc7, contents + roff - 2); 5087 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7), 5088 contents + roff - 1); 5089 bfd_put_32 (output_bfd, 5090 elf_x86_64_tpoff (info, relocation), 5091 contents + roff); 5092 continue; 5093 } 5094 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL) 5095 { 5096 /* GDesc -> LE transition. 5097 It's originally: 5098 call *(%rax) 5099 Turn it into: 5100 xchg %ax,%ax. */ 5101 bfd_put_8 (output_bfd, 0x66, contents + roff); 5102 bfd_put_8 (output_bfd, 0x90, contents + roff + 1); 5103 continue; 5104 } 5105 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF) 5106 { 5107 /* IE->LE transition: 5108 For 64bit, originally it can be one of: 5109 movq foo@gottpoff(%rip), %reg 5110 addq foo@gottpoff(%rip), %reg 5111 We change it into: 5112 movq $foo, %reg 5113 leaq foo(%reg), %reg 5114 addq $foo, %reg. 5115 For 32bit, originally it can be one of: 5116 movq foo@gottpoff(%rip), %reg 5117 addl foo@gottpoff(%rip), %reg 5118 We change it into: 5119 movq $foo, %reg 5120 leal foo(%reg), %reg 5121 addl $foo, %reg. */ 5122 5123 unsigned int val, type, reg; 5124 5125 if (roff >= 3) 5126 val = bfd_get_8 (input_bfd, contents + roff - 3); 5127 else 5128 val = 0; 5129 type = bfd_get_8 (input_bfd, contents + roff - 2); 5130 reg = bfd_get_8 (input_bfd, contents + roff - 1); 5131 reg >>= 3; 5132 if (type == 0x8b) 5133 { 5134 /* movq */ 5135 if (val == 0x4c) 5136 bfd_put_8 (output_bfd, 0x49, 5137 contents + roff - 3); 5138 else if (!ABI_64_P (output_bfd) && val == 0x44) 5139 bfd_put_8 (output_bfd, 0x41, 5140 contents + roff - 3); 5141 bfd_put_8 (output_bfd, 0xc7, 5142 contents + roff - 2); 5143 bfd_put_8 (output_bfd, 0xc0 | reg, 5144 contents + roff - 1); 5145 } 5146 else if (reg == 4) 5147 { 5148 /* addq/addl -> addq/addl - addressing with %rsp/%r12 5149 is special */ 5150 if (val == 0x4c) 5151 bfd_put_8 (output_bfd, 0x49, 5152 contents + roff - 3); 5153 else if (!ABI_64_P (output_bfd) && val == 0x44) 5154 bfd_put_8 (output_bfd, 0x41, 5155 contents + roff - 3); 5156 bfd_put_8 (output_bfd, 0x81, 5157 contents + roff - 2); 5158 bfd_put_8 (output_bfd, 0xc0 | reg, 5159 contents + roff - 1); 5160 } 5161 else 5162 { 5163 /* addq/addl -> leaq/leal */ 5164 if (val == 0x4c) 5165 bfd_put_8 (output_bfd, 0x4d, 5166 contents + roff - 3); 5167 else if (!ABI_64_P (output_bfd) && val == 0x44) 5168 bfd_put_8 (output_bfd, 0x45, 5169 contents + roff - 3); 5170 bfd_put_8 (output_bfd, 0x8d, 5171 contents + roff - 2); 5172 bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3), 5173 contents + roff - 1); 5174 } 5175 bfd_put_32 (output_bfd, 5176 elf_x86_64_tpoff (info, relocation), 5177 contents + roff); 5178 continue; 5179 } 5180 else 5181 BFD_ASSERT (FALSE); 5182 } 5183 5184 if (htab->elf.sgot == NULL) 5185 abort (); 5186 5187 if (h != NULL) 5188 { 5189 off = h->got.offset; 5190 offplt = elf_x86_64_hash_entry (h)->tlsdesc_got; 5191 } 5192 else 5193 { 5194 if (local_got_offsets == NULL) 5195 abort (); 5196 5197 off = local_got_offsets[r_symndx]; 5198 offplt = local_tlsdesc_gotents[r_symndx]; 5199 } 5200 5201 if ((off & 1) != 0) 5202 off &= ~1; 5203 else 5204 { 5205 Elf_Internal_Rela outrel; 5206 int dr_type, indx; 5207 asection *sreloc; 5208 5209 if (htab->elf.srelgot == NULL) 5210 abort (); 5211 5212 indx = h && h->dynindx != -1 ? h->dynindx : 0; 5213 5214 if (GOT_TLS_GDESC_P (tls_type)) 5215 { 5216 outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC); 5217 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt 5218 + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size); 5219 outrel.r_offset = (htab->elf.sgotplt->output_section->vma 5220 + htab->elf.sgotplt->output_offset 5221 + offplt 5222 + htab->sgotplt_jump_table_size); 5223 sreloc = htab->elf.srelplt; 5224 if (indx == 0) 5225 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info); 5226 else 5227 outrel.r_addend = 0; 5228 elf_append_rela (output_bfd, sreloc, &outrel); 5229 } 5230 5231 sreloc = htab->elf.srelgot; 5232 5233 outrel.r_offset = (htab->elf.sgot->output_section->vma 5234 + htab->elf.sgot->output_offset + off); 5235 5236 if (GOT_TLS_GD_P (tls_type)) 5237 dr_type = R_X86_64_DTPMOD64; 5238 else if (GOT_TLS_GDESC_P (tls_type)) 5239 goto dr_done; 5240 else 5241 dr_type = R_X86_64_TPOFF64; 5242 5243 bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off); 5244 outrel.r_addend = 0; 5245 if ((dr_type == R_X86_64_TPOFF64 5246 || dr_type == R_X86_64_TLSDESC) && indx == 0) 5247 outrel.r_addend = relocation - elf_x86_64_dtpoff_base (info); 5248 outrel.r_info = htab->r_info (indx, dr_type); 5249 5250 elf_append_rela (output_bfd, sreloc, &outrel); 5251 5252 if (GOT_TLS_GD_P (tls_type)) 5253 { 5254 if (indx == 0) 5255 { 5256 BFD_ASSERT (! unresolved_reloc); 5257 bfd_put_64 (output_bfd, 5258 relocation - elf_x86_64_dtpoff_base (info), 5259 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE); 5260 } 5261 else 5262 { 5263 bfd_put_64 (output_bfd, 0, 5264 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE); 5265 outrel.r_info = htab->r_info (indx, 5266 R_X86_64_DTPOFF64); 5267 outrel.r_offset += GOT_ENTRY_SIZE; 5268 elf_append_rela (output_bfd, sreloc, 5269 &outrel); 5270 } 5271 } 5272 5273 dr_done: 5274 if (h != NULL) 5275 h->got.offset |= 1; 5276 else 5277 local_got_offsets[r_symndx] |= 1; 5278 } 5279 5280 if (off >= (bfd_vma) -2 5281 && ! GOT_TLS_GDESC_P (tls_type)) 5282 abort (); 5283 if (r_type == ELF32_R_TYPE (rel->r_info)) 5284 { 5285 if (r_type == R_X86_64_GOTPC32_TLSDESC 5286 || r_type == R_X86_64_TLSDESC_CALL) 5287 relocation = htab->elf.sgotplt->output_section->vma 5288 + htab->elf.sgotplt->output_offset 5289 + offplt + htab->sgotplt_jump_table_size; 5290 else 5291 relocation = htab->elf.sgot->output_section->vma 5292 + htab->elf.sgot->output_offset + off; 5293 unresolved_reloc = FALSE; 5294 } 5295 else 5296 { 5297 bfd_vma roff = rel->r_offset; 5298 5299 if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSGD) 5300 { 5301 /* GD->IE transition. For 64bit, change 5302 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 5303 .word 0x6666; rex64; call __tls_get_addr@PLT 5304 or 5305 .byte 0x66; leaq foo@tlsgd(%rip), %rdi 5306 .byte 0x66; rex64 5307 call *__tls_get_addr@GOTPCREL(%rip 5308 which may be converted to 5309 addr32 call __tls_get_addr 5310 into: 5311 movq %fs:0, %rax 5312 addq foo@gottpoff(%rip), %rax 5313 For 32bit, change 5314 leaq foo@tlsgd(%rip), %rdi 5315 .word 0x6666; rex64; call __tls_get_addr@PLT 5316 or 5317 leaq foo@tlsgd(%rip), %rdi 5318 .byte 0x66; rex64; 5319 call *__tls_get_addr@GOTPCREL(%rip) 5320 which may be converted to 5321 addr32 call __tls_get_addr 5322 into: 5323 movl %fs:0, %eax 5324 addq foo@gottpoff(%rip), %rax 5325 For largepic, change: 5326 leaq foo@tlsgd(%rip), %rdi 5327 movabsq $__tls_get_addr@pltoff, %rax 5328 addq %r15, %rax 5329 call *%rax 5330 into: 5331 movq %fs:0, %rax 5332 addq foo@gottpoff(%rax), %rax 5333 nopw 0x0(%rax,%rax,1) */ 5334 int largepic = 0; 5335 if (ABI_64_P (output_bfd)) 5336 { 5337 if (contents[roff + 5] == 0xb8) 5338 { 5339 memcpy (contents + roff - 3, 5340 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05" 5341 "\0\0\0\0\x66\x0f\x1f\x44\0", 22); 5342 largepic = 1; 5343 } 5344 else 5345 memcpy (contents + roff - 4, 5346 "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0", 5347 16); 5348 } 5349 else 5350 memcpy (contents + roff - 3, 5351 "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0", 5352 15); 5353 5354 relocation = (htab->elf.sgot->output_section->vma 5355 + htab->elf.sgot->output_offset + off 5356 - roff 5357 - largepic 5358 - input_section->output_section->vma 5359 - input_section->output_offset 5360 - 12); 5361 bfd_put_32 (output_bfd, relocation, 5362 contents + roff + 8 + largepic); 5363 /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */ 5364 rel++; 5365 wrel++; 5366 continue; 5367 } 5368 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTPC32_TLSDESC) 5369 { 5370 /* GDesc -> IE transition. 5371 It's originally something like: 5372 leaq x@tlsdesc(%rip), %rax 5373 5374 Change it to: 5375 movq x@gottpoff(%rip), %rax # before xchg %ax,%ax. */ 5376 5377 /* Now modify the instruction as appropriate. To 5378 turn a leaq into a movq in the form we use it, it 5379 suffices to change the second byte from 0x8d to 5380 0x8b. */ 5381 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2); 5382 5383 bfd_put_32 (output_bfd, 5384 htab->elf.sgot->output_section->vma 5385 + htab->elf.sgot->output_offset + off 5386 - rel->r_offset 5387 - input_section->output_section->vma 5388 - input_section->output_offset 5389 - 4, 5390 contents + roff); 5391 continue; 5392 } 5393 else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_TLSDESC_CALL) 5394 { 5395 /* GDesc -> IE transition. 5396 It's originally: 5397 call *(%rax) 5398 5399 Change it to: 5400 xchg %ax, %ax. */ 5401 5402 bfd_put_8 (output_bfd, 0x66, contents + roff); 5403 bfd_put_8 (output_bfd, 0x90, contents + roff + 1); 5404 continue; 5405 } 5406 else 5407 BFD_ASSERT (FALSE); 5408 } 5409 break; 5410 5411 case R_X86_64_TLSLD: 5412 if (! elf_x86_64_tls_transition (info, input_bfd, 5413 input_section, contents, 5414 symtab_hdr, sym_hashes, 5415 &r_type, GOT_UNKNOWN, rel, 5416 relend, h, r_symndx, TRUE)) 5417 return FALSE; 5418 5419 if (r_type != R_X86_64_TLSLD) 5420 { 5421 /* LD->LE transition: 5422 leaq foo@tlsld(%rip), %rdi 5423 call __tls_get_addr@PLT 5424 For 64bit, we change it into: 5425 .word 0x6666; .byte 0x66; movq %fs:0, %rax 5426 For 32bit, we change it into: 5427 nopl 0x0(%rax); movl %fs:0, %eax 5428 Or 5429 leaq foo@tlsld(%rip), %rdi; 5430 call *__tls_get_addr@GOTPCREL(%rip) 5431 which may be converted to 5432 addr32 call __tls_get_addr 5433 For 64bit, we change it into: 5434 .word 0x6666; .word 0x6666; movq %fs:0, %rax 5435 For 32bit, we change it into: 5436 nopw 0x0(%rax); movl %fs:0, %eax 5437 For largepic, change: 5438 leaq foo@tlsgd(%rip), %rdi 5439 movabsq $__tls_get_addr@pltoff, %rax 5440 addq %rbx, %rax 5441 call *%rax 5442 into 5443 data16 data16 data16 nopw %cs:0x0(%rax,%rax,1) 5444 movq %fs:0, %eax */ 5445 5446 BFD_ASSERT (r_type == R_X86_64_TPOFF32); 5447 if (ABI_64_P (output_bfd)) 5448 { 5449 if (contents[rel->r_offset + 5] == 0xb8) 5450 memcpy (contents + rel->r_offset - 3, 5451 "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0" 5452 "\x64\x48\x8b\x04\x25\0\0\0", 22); 5453 else if (contents[rel->r_offset + 4] == 0xff 5454 || contents[rel->r_offset + 4] == 0x67) 5455 memcpy (contents + rel->r_offset - 3, 5456 "\x66\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 5457 13); 5458 else 5459 memcpy (contents + rel->r_offset - 3, 5460 "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12); 5461 } 5462 else 5463 { 5464 if (contents[rel->r_offset + 4] == 0xff) 5465 memcpy (contents + rel->r_offset - 3, 5466 "\x66\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 5467 13); 5468 else 5469 memcpy (contents + rel->r_offset - 3, 5470 "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12); 5471 } 5472 /* Skip R_X86_64_PC32, R_X86_64_PLT32, R_X86_64_GOTPCRELX 5473 and R_X86_64_PLTOFF64. */ 5474 rel++; 5475 wrel++; 5476 continue; 5477 } 5478 5479 if (htab->elf.sgot == NULL) 5480 abort (); 5481 5482 off = htab->tls_ld_got.offset; 5483 if (off & 1) 5484 off &= ~1; 5485 else 5486 { 5487 Elf_Internal_Rela outrel; 5488 5489 if (htab->elf.srelgot == NULL) 5490 abort (); 5491 5492 outrel.r_offset = (htab->elf.sgot->output_section->vma 5493 + htab->elf.sgot->output_offset + off); 5494 5495 bfd_put_64 (output_bfd, 0, 5496 htab->elf.sgot->contents + off); 5497 bfd_put_64 (output_bfd, 0, 5498 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE); 5499 outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64); 5500 outrel.r_addend = 0; 5501 elf_append_rela (output_bfd, htab->elf.srelgot, 5502 &outrel); 5503 htab->tls_ld_got.offset |= 1; 5504 } 5505 relocation = htab->elf.sgot->output_section->vma 5506 + htab->elf.sgot->output_offset + off; 5507 unresolved_reloc = FALSE; 5508 break; 5509 5510 case R_X86_64_DTPOFF32: 5511 if (!bfd_link_executable (info) 5512 || (input_section->flags & SEC_CODE) == 0) 5513 relocation -= elf_x86_64_dtpoff_base (info); 5514 else 5515 relocation = elf_x86_64_tpoff (info, relocation); 5516 break; 5517 5518 case R_X86_64_TPOFF32: 5519 case R_X86_64_TPOFF64: 5520 BFD_ASSERT (bfd_link_executable (info)); 5521 relocation = elf_x86_64_tpoff (info, relocation); 5522 break; 5523 5524 case R_X86_64_DTPOFF64: 5525 BFD_ASSERT ((input_section->flags & SEC_CODE) == 0); 5526 relocation -= elf_x86_64_dtpoff_base (info); 5527 break; 5528 5529 default: 5530 break; 5531 } 5532 5533 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 5534 because such sections are not SEC_ALLOC and thus ld.so will 5535 not process them. */ 5536 if (unresolved_reloc 5537 && !((input_section->flags & SEC_DEBUGGING) != 0 5538 && h->def_dynamic) 5539 && _bfd_elf_section_offset (output_bfd, info, input_section, 5540 rel->r_offset) != (bfd_vma) -1) 5541 { 5542 (*_bfd_error_handler) 5543 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), 5544 input_bfd, 5545 input_section, 5546 (long) rel->r_offset, 5547 howto->name, 5548 h->root.root.string); 5549 return FALSE; 5550 } 5551 5552do_relocation: 5553 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 5554 contents, rel->r_offset, 5555 relocation, rel->r_addend); 5556 5557check_relocation_error: 5558 if (r != bfd_reloc_ok) 5559 { 5560 const char *name; 5561 5562 if (h != NULL) 5563 name = h->root.root.string; 5564 else 5565 { 5566 name = bfd_elf_string_from_elf_section (input_bfd, 5567 symtab_hdr->sh_link, 5568 sym->st_name); 5569 if (name == NULL) 5570 return FALSE; 5571 if (*name == '\0') 5572 name = bfd_section_name (input_bfd, sec); 5573 } 5574 5575 if (r == bfd_reloc_overflow) 5576 (*info->callbacks->reloc_overflow) 5577 (info, (h ? &h->root : NULL), name, howto->name, 5578 (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 5579 else 5580 { 5581 (*_bfd_error_handler) 5582 (_("%B(%A+0x%lx): reloc against `%s': error %d"), 5583 input_bfd, input_section, 5584 (long) rel->r_offset, name, (int) r); 5585 return FALSE; 5586 } 5587 } 5588 5589 if (wrel != rel) 5590 *wrel = *rel; 5591 } 5592 5593 if (wrel != rel) 5594 { 5595 Elf_Internal_Shdr *rel_hdr; 5596 size_t deleted = rel - wrel; 5597 5598 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); 5599 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted; 5600 if (rel_hdr->sh_size == 0) 5601 { 5602 /* It is too late to remove an empty reloc section. Leave 5603 one NONE reloc. 5604 ??? What is wrong with an empty section??? */ 5605 rel_hdr->sh_size = rel_hdr->sh_entsize; 5606 deleted -= 1; 5607 } 5608 rel_hdr = _bfd_elf_single_rel_hdr (input_section); 5609 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted; 5610 input_section->reloc_count -= deleted; 5611 } 5612 5613 return TRUE; 5614} 5615 5616/* Finish up dynamic symbol handling. We set the contents of various 5617 dynamic sections here. */ 5618 5619static bfd_boolean 5620elf_x86_64_finish_dynamic_symbol (bfd *output_bfd, 5621 struct bfd_link_info *info, 5622 struct elf_link_hash_entry *h, 5623 Elf_Internal_Sym *sym) 5624{ 5625 struct elf_x86_64_link_hash_table *htab; 5626 const struct elf_x86_64_backend_data *abed; 5627 bfd_boolean use_plt_bnd; 5628 struct elf_x86_64_link_hash_entry *eh; 5629 bfd_boolean local_undefweak; 5630 5631 htab = elf_x86_64_hash_table (info); 5632 if (htab == NULL) 5633 return FALSE; 5634 5635 /* Use MPX backend data in case of BND relocation. Use .plt_bnd 5636 section only if there is .plt section. */ 5637 use_plt_bnd = htab->elf.splt != NULL && htab->plt_bnd != NULL; 5638 abed = (use_plt_bnd 5639 ? &elf_x86_64_bnd_arch_bed 5640 : get_elf_x86_64_backend_data (output_bfd)); 5641 5642 eh = (struct elf_x86_64_link_hash_entry *) h; 5643 5644 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for 5645 resolved undefined weak symbols in executable so that their 5646 references have value 0 at run-time. */ 5647 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, 5648 eh->has_got_reloc, 5649 eh); 5650 5651 if (h->plt.offset != (bfd_vma) -1) 5652 { 5653 bfd_vma plt_index; 5654 bfd_vma got_offset, plt_offset, plt_plt_offset, plt_got_offset; 5655 bfd_vma plt_plt_insn_end, plt_got_insn_size; 5656 Elf_Internal_Rela rela; 5657 bfd_byte *loc; 5658 asection *plt, *gotplt, *relplt, *resolved_plt; 5659 const struct elf_backend_data *bed; 5660 bfd_vma plt_got_pcrel_offset; 5661 5662 /* When building a static executable, use .iplt, .igot.plt and 5663 .rela.iplt sections for STT_GNU_IFUNC symbols. */ 5664 if (htab->elf.splt != NULL) 5665 { 5666 plt = htab->elf.splt; 5667 gotplt = htab->elf.sgotplt; 5668 relplt = htab->elf.srelplt; 5669 } 5670 else 5671 { 5672 plt = htab->elf.iplt; 5673 gotplt = htab->elf.igotplt; 5674 relplt = htab->elf.irelplt; 5675 } 5676 5677 /* This symbol has an entry in the procedure linkage table. Set 5678 it up. */ 5679 if ((h->dynindx == -1 5680 && !local_undefweak 5681 && !((h->forced_local || bfd_link_executable (info)) 5682 && h->def_regular 5683 && h->type == STT_GNU_IFUNC)) 5684 || plt == NULL 5685 || gotplt == NULL 5686 || relplt == NULL) 5687 abort (); 5688 5689 /* Get the index in the procedure linkage table which 5690 corresponds to this symbol. This is the index of this symbol 5691 in all the symbols for which we are making plt entries. The 5692 first entry in the procedure linkage table is reserved. 5693 5694 Get the offset into the .got table of the entry that 5695 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE 5696 bytes. The first three are reserved for the dynamic linker. 5697 5698 For static executables, we don't reserve anything. */ 5699 5700 if (plt == htab->elf.splt) 5701 { 5702 got_offset = h->plt.offset / abed->plt_entry_size - 1; 5703 got_offset = (got_offset + 3) * GOT_ENTRY_SIZE; 5704 } 5705 else 5706 { 5707 got_offset = h->plt.offset / abed->plt_entry_size; 5708 got_offset = got_offset * GOT_ENTRY_SIZE; 5709 } 5710 5711 plt_plt_insn_end = abed->plt_plt_insn_end; 5712 plt_plt_offset = abed->plt_plt_offset; 5713 plt_got_insn_size = abed->plt_got_insn_size; 5714 plt_got_offset = abed->plt_got_offset; 5715 if (use_plt_bnd) 5716 { 5717 /* Use the second PLT with BND relocations. */ 5718 const bfd_byte *plt_entry, *plt2_entry; 5719 5720 if (eh->has_bnd_reloc) 5721 { 5722 plt_entry = elf_x86_64_bnd_plt_entry; 5723 plt2_entry = elf_x86_64_bnd_plt2_entry; 5724 } 5725 else 5726 { 5727 plt_entry = elf_x86_64_legacy_plt_entry; 5728 plt2_entry = elf_x86_64_legacy_plt2_entry; 5729 5730 /* Subtract 1 since there is no BND prefix. */ 5731 plt_plt_insn_end -= 1; 5732 plt_plt_offset -= 1; 5733 plt_got_insn_size -= 1; 5734 plt_got_offset -= 1; 5735 } 5736 5737 BFD_ASSERT (sizeof (elf_x86_64_bnd_plt_entry) 5738 == sizeof (elf_x86_64_legacy_plt_entry)); 5739 5740 /* Fill in the entry in the procedure linkage table. */ 5741 memcpy (plt->contents + h->plt.offset, 5742 plt_entry, sizeof (elf_x86_64_legacy_plt_entry)); 5743 /* Fill in the entry in the second PLT. */ 5744 memcpy (htab->plt_bnd->contents + eh->plt_bnd.offset, 5745 plt2_entry, sizeof (elf_x86_64_legacy_plt2_entry)); 5746 5747 resolved_plt = htab->plt_bnd; 5748 plt_offset = eh->plt_bnd.offset; 5749 } 5750 else 5751 { 5752 /* Fill in the entry in the procedure linkage table. */ 5753 memcpy (plt->contents + h->plt.offset, abed->plt_entry, 5754 abed->plt_entry_size); 5755 5756 resolved_plt = plt; 5757 plt_offset = h->plt.offset; 5758 } 5759 5760 /* Insert the relocation positions of the plt section. */ 5761 5762 /* Put offset the PC-relative instruction referring to the GOT entry, 5763 subtracting the size of that instruction. */ 5764 plt_got_pcrel_offset = (gotplt->output_section->vma 5765 + gotplt->output_offset 5766 + got_offset 5767 - resolved_plt->output_section->vma 5768 - resolved_plt->output_offset 5769 - plt_offset 5770 - plt_got_insn_size); 5771 5772 /* Check PC-relative offset overflow in PLT entry. */ 5773 if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff) 5774 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"), 5775 output_bfd, h->root.root.string); 5776 5777 bfd_put_32 (output_bfd, plt_got_pcrel_offset, 5778 resolved_plt->contents + plt_offset + plt_got_offset); 5779 5780 /* Fill in the entry in the global offset table, initially this 5781 points to the second part of the PLT entry. Leave the entry 5782 as zero for undefined weak symbol in PIE. No PLT relocation 5783 against undefined weak symbol in PIE. */ 5784 if (!local_undefweak) 5785 { 5786 bfd_put_64 (output_bfd, (plt->output_section->vma 5787 + plt->output_offset 5788 + h->plt.offset 5789 + abed->plt_lazy_offset), 5790 gotplt->contents + got_offset); 5791 5792 /* Fill in the entry in the .rela.plt section. */ 5793 rela.r_offset = (gotplt->output_section->vma 5794 + gotplt->output_offset 5795 + got_offset); 5796 if (h->dynindx == -1 5797 || ((bfd_link_executable (info) 5798 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 5799 && h->def_regular 5800 && h->type == STT_GNU_IFUNC)) 5801 { 5802 /* If an STT_GNU_IFUNC symbol is locally defined, generate 5803 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */ 5804 rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE); 5805 rela.r_addend = (h->root.u.def.value 5806 + h->root.u.def.section->output_section->vma 5807 + h->root.u.def.section->output_offset); 5808 /* R_X86_64_IRELATIVE comes last. */ 5809 plt_index = htab->next_irelative_index--; 5810 } 5811 else 5812 { 5813 rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT); 5814 rela.r_addend = 0; 5815 plt_index = htab->next_jump_slot_index++; 5816 } 5817 5818 /* Don't fill PLT entry for static executables. */ 5819 if (plt == htab->elf.splt) 5820 { 5821 bfd_vma plt0_offset = h->plt.offset + plt_plt_insn_end; 5822 5823 /* Put relocation index. */ 5824 bfd_put_32 (output_bfd, plt_index, 5825 (plt->contents + h->plt.offset 5826 + abed->plt_reloc_offset)); 5827 5828 /* Put offset for jmp .PLT0 and check for overflow. We don't 5829 check relocation index for overflow since branch displacement 5830 will overflow first. */ 5831 if (plt0_offset > 0x80000000) 5832 info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"), 5833 output_bfd, h->root.root.string); 5834 bfd_put_32 (output_bfd, - plt0_offset, 5835 plt->contents + h->plt.offset + plt_plt_offset); 5836 } 5837 5838 bed = get_elf_backend_data (output_bfd); 5839 loc = relplt->contents + plt_index * bed->s->sizeof_rela; 5840 bed->s->swap_reloca_out (output_bfd, &rela, loc); 5841 } 5842 } 5843 else if (eh->plt_got.offset != (bfd_vma) -1) 5844 { 5845 bfd_vma got_offset, plt_offset, plt_got_offset, plt_got_insn_size; 5846 asection *plt, *got; 5847 bfd_boolean got_after_plt; 5848 int32_t got_pcrel_offset; 5849 const bfd_byte *got_plt_entry; 5850 5851 /* Set the entry in the GOT procedure linkage table. */ 5852 plt = htab->plt_got; 5853 got = htab->elf.sgot; 5854 got_offset = h->got.offset; 5855 5856 if (got_offset == (bfd_vma) -1 5857 || h->type == STT_GNU_IFUNC 5858 || plt == NULL 5859 || got == NULL) 5860 abort (); 5861 5862 /* Use the second PLT entry template for the GOT PLT since they 5863 are the identical. */ 5864 plt_got_insn_size = elf_x86_64_bnd_arch_bed.plt_got_insn_size; 5865 plt_got_offset = elf_x86_64_bnd_arch_bed.plt_got_offset; 5866 if (eh->has_bnd_reloc) 5867 got_plt_entry = elf_x86_64_bnd_plt2_entry; 5868 else 5869 { 5870 got_plt_entry = elf_x86_64_legacy_plt2_entry; 5871 5872 /* Subtract 1 since there is no BND prefix. */ 5873 plt_got_insn_size -= 1; 5874 plt_got_offset -= 1; 5875 } 5876 5877 /* Fill in the entry in the GOT procedure linkage table. */ 5878 plt_offset = eh->plt_got.offset; 5879 memcpy (plt->contents + plt_offset, 5880 got_plt_entry, sizeof (elf_x86_64_legacy_plt2_entry)); 5881 5882 /* Put offset the PC-relative instruction referring to the GOT 5883 entry, subtracting the size of that instruction. */ 5884 got_pcrel_offset = (got->output_section->vma 5885 + got->output_offset 5886 + got_offset 5887 - plt->output_section->vma 5888 - plt->output_offset 5889 - plt_offset 5890 - plt_got_insn_size); 5891 5892 /* Check PC-relative offset overflow in GOT PLT entry. */ 5893 got_after_plt = got->output_section->vma > plt->output_section->vma; 5894 if ((got_after_plt && got_pcrel_offset < 0) 5895 || (!got_after_plt && got_pcrel_offset > 0)) 5896 info->callbacks->einfo (_("%F%B: PC-relative offset overflow in GOT PLT entry for `%s'\n"), 5897 output_bfd, h->root.root.string); 5898 5899 bfd_put_32 (output_bfd, got_pcrel_offset, 5900 plt->contents + plt_offset + plt_got_offset); 5901 } 5902 5903 if (!local_undefweak 5904 && !h->def_regular 5905 && (h->plt.offset != (bfd_vma) -1 5906 || eh->plt_got.offset != (bfd_vma) -1)) 5907 { 5908 /* Mark the symbol as undefined, rather than as defined in 5909 the .plt section. Leave the value if there were any 5910 relocations where pointer equality matters (this is a clue 5911 for the dynamic linker, to make function pointer 5912 comparisons work between an application and shared 5913 library), otherwise set it to zero. If a function is only 5914 called from a binary, there is no need to slow down 5915 shared libraries because of that. */ 5916 sym->st_shndx = SHN_UNDEF; 5917 if (!h->pointer_equality_needed) 5918 sym->st_value = 0; 5919 } 5920 5921 /* Don't generate dynamic GOT relocation against undefined weak 5922 symbol in executable. */ 5923 if (h->got.offset != (bfd_vma) -1 5924 && ! GOT_TLS_GD_ANY_P (elf_x86_64_hash_entry (h)->tls_type) 5925 && elf_x86_64_hash_entry (h)->tls_type != GOT_TLS_IE 5926 && !local_undefweak) 5927 { 5928 Elf_Internal_Rela rela; 5929 asection *relgot = htab->elf.srelgot; 5930 5931 /* This symbol has an entry in the global offset table. Set it 5932 up. */ 5933 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL) 5934 abort (); 5935 5936 rela.r_offset = (htab->elf.sgot->output_section->vma 5937 + htab->elf.sgot->output_offset 5938 + (h->got.offset &~ (bfd_vma) 1)); 5939 5940 /* If this is a static link, or it is a -Bsymbolic link and the 5941 symbol is defined locally or was forced to be local because 5942 of a version file, we just want to emit a RELATIVE reloc. 5943 The entry in the global offset table will already have been 5944 initialized in the relocate_section function. */ 5945 if (h->def_regular 5946 && h->type == STT_GNU_IFUNC) 5947 { 5948 if (h->plt.offset == (bfd_vma) -1) 5949 { 5950 /* STT_GNU_IFUNC is referenced without PLT. */ 5951 if (htab->elf.splt == NULL) 5952 { 5953 /* use .rel[a].iplt section to store .got relocations 5954 in static executable. */ 5955 relgot = htab->elf.irelplt; 5956 } 5957 if (SYMBOL_REFERENCES_LOCAL (info, h)) 5958 { 5959 rela.r_info = htab->r_info (0, 5960 R_X86_64_IRELATIVE); 5961 rela.r_addend = (h->root.u.def.value 5962 + h->root.u.def.section->output_section->vma 5963 + h->root.u.def.section->output_offset); 5964 } 5965 else 5966 goto do_glob_dat; 5967 } 5968 else if (bfd_link_pic (info)) 5969 { 5970 /* Generate R_X86_64_GLOB_DAT. */ 5971 goto do_glob_dat; 5972 } 5973 else 5974 { 5975 asection *plt; 5976 5977 if (!h->pointer_equality_needed) 5978 abort (); 5979 5980 /* For non-shared object, we can't use .got.plt, which 5981 contains the real function addres if we need pointer 5982 equality. We load the GOT entry with the PLT entry. */ 5983 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt; 5984 bfd_put_64 (output_bfd, (plt->output_section->vma 5985 + plt->output_offset 5986 + h->plt.offset), 5987 htab->elf.sgot->contents + h->got.offset); 5988 return TRUE; 5989 } 5990 } 5991 else if (bfd_link_pic (info) 5992 && SYMBOL_REFERENCES_LOCAL (info, h)) 5993 { 5994 if (!h->def_regular) 5995 return FALSE; 5996 BFD_ASSERT((h->got.offset & 1) != 0); 5997 rela.r_info = htab->r_info (0, R_X86_64_RELATIVE); 5998 rela.r_addend = (h->root.u.def.value 5999 + h->root.u.def.section->output_section->vma 6000 + h->root.u.def.section->output_offset); 6001 } 6002 else 6003 { 6004 BFD_ASSERT((h->got.offset & 1) == 0); 6005do_glob_dat: 6006 bfd_put_64 (output_bfd, (bfd_vma) 0, 6007 htab->elf.sgot->contents + h->got.offset); 6008 rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT); 6009 rela.r_addend = 0; 6010 } 6011 6012 elf_append_rela (output_bfd, relgot, &rela); 6013 } 6014 6015 if (h->needs_copy) 6016 { 6017 Elf_Internal_Rela rela; 6018 6019 /* This symbol needs a copy reloc. Set it up. */ 6020 6021 if (h->dynindx == -1 6022 || (h->root.type != bfd_link_hash_defined 6023 && h->root.type != bfd_link_hash_defweak) 6024 || htab->srelbss == NULL) 6025 abort (); 6026 6027 rela.r_offset = (h->root.u.def.value 6028 + h->root.u.def.section->output_section->vma 6029 + h->root.u.def.section->output_offset); 6030 rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY); 6031 rela.r_addend = 0; 6032 elf_append_rela (output_bfd, htab->srelbss, &rela); 6033 } 6034 6035 return TRUE; 6036} 6037 6038/* Finish up local dynamic symbol handling. We set the contents of 6039 various dynamic sections here. */ 6040 6041static bfd_boolean 6042elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf) 6043{ 6044 struct elf_link_hash_entry *h 6045 = (struct elf_link_hash_entry *) *slot; 6046 struct bfd_link_info *info 6047 = (struct bfd_link_info *) inf; 6048 6049 return elf_x86_64_finish_dynamic_symbol (info->output_bfd, 6050 info, h, NULL); 6051} 6052 6053/* Finish up undefined weak symbol handling in PIE. Fill its PLT entry 6054 here since undefined weak symbol may not be dynamic and may not be 6055 called for elf_x86_64_finish_dynamic_symbol. */ 6056 6057static bfd_boolean 6058elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh, 6059 void *inf) 6060{ 6061 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh; 6062 struct bfd_link_info *info = (struct bfd_link_info *) inf; 6063 6064 if (h->root.type != bfd_link_hash_undefweak 6065 || h->dynindx != -1) 6066 return TRUE; 6067 6068 return elf_x86_64_finish_dynamic_symbol (info->output_bfd, 6069 info, h, NULL); 6070} 6071 6072/* Used to decide how to sort relocs in an optimal manner for the 6073 dynamic linker, before writing them out. */ 6074 6075static enum elf_reloc_type_class 6076elf_x86_64_reloc_type_class (const struct bfd_link_info *info, 6077 const asection *rel_sec ATTRIBUTE_UNUSED, 6078 const Elf_Internal_Rela *rela) 6079{ 6080 bfd *abfd = info->output_bfd; 6081 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 6082 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info); 6083 6084 if (htab->elf.dynsym != NULL 6085 && htab->elf.dynsym->contents != NULL) 6086 { 6087 /* Check relocation against STT_GNU_IFUNC symbol if there are 6088 dynamic symbols. */ 6089 unsigned long r_symndx = htab->r_sym (rela->r_info); 6090 if (r_symndx != STN_UNDEF) 6091 { 6092 Elf_Internal_Sym sym; 6093 if (!bed->s->swap_symbol_in (abfd, 6094 (htab->elf.dynsym->contents 6095 + r_symndx * bed->s->sizeof_sym), 6096 0, &sym)) 6097 abort (); 6098 6099 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) 6100 return reloc_class_ifunc; 6101 } 6102 } 6103 6104 switch ((int) ELF32_R_TYPE (rela->r_info)) 6105 { 6106 case R_X86_64_IRELATIVE: 6107 return reloc_class_ifunc; 6108 case R_X86_64_RELATIVE: 6109 case R_X86_64_RELATIVE64: 6110 return reloc_class_relative; 6111 case R_X86_64_JUMP_SLOT: 6112 return reloc_class_plt; 6113 case R_X86_64_COPY: 6114 return reloc_class_copy; 6115 default: 6116 return reloc_class_normal; 6117 } 6118} 6119 6120/* Finish up the dynamic sections. */ 6121 6122static bfd_boolean 6123elf_x86_64_finish_dynamic_sections (bfd *output_bfd, 6124 struct bfd_link_info *info) 6125{ 6126 struct elf_x86_64_link_hash_table *htab; 6127 bfd *dynobj; 6128 asection *sdyn; 6129 const struct elf_x86_64_backend_data *abed; 6130 6131 htab = elf_x86_64_hash_table (info); 6132 if (htab == NULL) 6133 return FALSE; 6134 6135 /* Use MPX backend data in case of BND relocation. Use .plt_bnd 6136 section only if there is .plt section. */ 6137 abed = (htab->elf.splt != NULL && htab->plt_bnd != NULL 6138 ? &elf_x86_64_bnd_arch_bed 6139 : get_elf_x86_64_backend_data (output_bfd)); 6140 6141 dynobj = htab->elf.dynobj; 6142 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 6143 6144 if (htab->elf.dynamic_sections_created) 6145 { 6146 bfd_byte *dyncon, *dynconend; 6147 const struct elf_backend_data *bed; 6148 bfd_size_type sizeof_dyn; 6149 6150 if (sdyn == NULL || htab->elf.sgot == NULL) 6151 abort (); 6152 6153 bed = get_elf_backend_data (dynobj); 6154 sizeof_dyn = bed->s->sizeof_dyn; 6155 dyncon = sdyn->contents; 6156 dynconend = sdyn->contents + sdyn->size; 6157 for (; dyncon < dynconend; dyncon += sizeof_dyn) 6158 { 6159 Elf_Internal_Dyn dyn; 6160 asection *s; 6161 6162 (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn); 6163 6164 switch (dyn.d_tag) 6165 { 6166 default: 6167 continue; 6168 6169 case DT_PLTGOT: 6170 s = htab->elf.sgotplt; 6171 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 6172 break; 6173 6174 case DT_JMPREL: 6175 dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma; 6176 break; 6177 6178 case DT_PLTRELSZ: 6179 s = htab->elf.srelplt->output_section; 6180 dyn.d_un.d_val = s->size; 6181 break; 6182 6183 case DT_RELASZ: 6184 /* The procedure linkage table relocs (DT_JMPREL) should 6185 not be included in the overall relocs (DT_RELA). 6186 Therefore, we override the DT_RELASZ entry here to 6187 make it not include the JMPREL relocs. Since the 6188 linker script arranges for .rela.plt to follow all 6189 other relocation sections, we don't have to worry 6190 about changing the DT_RELA entry. */ 6191 if (htab->elf.srelplt != NULL) 6192 { 6193 s = htab->elf.srelplt->output_section; 6194 dyn.d_un.d_val -= s->size; 6195 } 6196 break; 6197 6198 case DT_TLSDESC_PLT: 6199 s = htab->elf.splt; 6200 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset 6201 + htab->tlsdesc_plt; 6202 break; 6203 6204 case DT_TLSDESC_GOT: 6205 s = htab->elf.sgot; 6206 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset 6207 + htab->tlsdesc_got; 6208 break; 6209 } 6210 6211 (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon); 6212 } 6213 6214 /* Fill in the special first entry in the procedure linkage table. */ 6215 if (htab->elf.splt && htab->elf.splt->size > 0) 6216 { 6217 /* Fill in the first entry in the procedure linkage table. */ 6218 memcpy (htab->elf.splt->contents, 6219 abed->plt0_entry, abed->plt_entry_size); 6220 /* Add offset for pushq GOT+8(%rip), since the instruction 6221 uses 6 bytes subtract this value. */ 6222 bfd_put_32 (output_bfd, 6223 (htab->elf.sgotplt->output_section->vma 6224 + htab->elf.sgotplt->output_offset 6225 + 8 6226 - htab->elf.splt->output_section->vma 6227 - htab->elf.splt->output_offset 6228 - 6), 6229 htab->elf.splt->contents + abed->plt0_got1_offset); 6230 /* Add offset for the PC-relative instruction accessing GOT+16, 6231 subtracting the offset to the end of that instruction. */ 6232 bfd_put_32 (output_bfd, 6233 (htab->elf.sgotplt->output_section->vma 6234 + htab->elf.sgotplt->output_offset 6235 + 16 6236 - htab->elf.splt->output_section->vma 6237 - htab->elf.splt->output_offset 6238 - abed->plt0_got2_insn_end), 6239 htab->elf.splt->contents + abed->plt0_got2_offset); 6240 6241 elf_section_data (htab->elf.splt->output_section) 6242 ->this_hdr.sh_entsize = abed->plt_entry_size; 6243 6244 if (htab->tlsdesc_plt) 6245 { 6246 bfd_put_64 (output_bfd, (bfd_vma) 0, 6247 htab->elf.sgot->contents + htab->tlsdesc_got); 6248 6249 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt, 6250 abed->plt0_entry, abed->plt_entry_size); 6251 6252 /* Add offset for pushq GOT+8(%rip), since the 6253 instruction uses 6 bytes subtract this value. */ 6254 bfd_put_32 (output_bfd, 6255 (htab->elf.sgotplt->output_section->vma 6256 + htab->elf.sgotplt->output_offset 6257 + 8 6258 - htab->elf.splt->output_section->vma 6259 - htab->elf.splt->output_offset 6260 - htab->tlsdesc_plt 6261 - 6), 6262 htab->elf.splt->contents 6263 + htab->tlsdesc_plt + abed->plt0_got1_offset); 6264 /* Add offset for the PC-relative instruction accessing GOT+TDG, 6265 where TGD stands for htab->tlsdesc_got, subtracting the offset 6266 to the end of that instruction. */ 6267 bfd_put_32 (output_bfd, 6268 (htab->elf.sgot->output_section->vma 6269 + htab->elf.sgot->output_offset 6270 + htab->tlsdesc_got 6271 - htab->elf.splt->output_section->vma 6272 - htab->elf.splt->output_offset 6273 - htab->tlsdesc_plt 6274 - abed->plt0_got2_insn_end), 6275 htab->elf.splt->contents 6276 + htab->tlsdesc_plt + abed->plt0_got2_offset); 6277 } 6278 } 6279 } 6280 6281 if (htab->plt_bnd != NULL) 6282 elf_section_data (htab->plt_bnd->output_section) 6283 ->this_hdr.sh_entsize = sizeof (elf_x86_64_bnd_plt2_entry); 6284 6285 if (htab->elf.sgotplt) 6286 { 6287 if (bfd_is_abs_section (htab->elf.sgotplt->output_section)) 6288 { 6289 (*_bfd_error_handler) 6290 (_("discarded output section: `%A'"), htab->elf.sgotplt); 6291 return FALSE; 6292 } 6293 6294 /* Fill in the first three entries in the global offset table. */ 6295 if (htab->elf.sgotplt->size > 0) 6296 { 6297 /* Set the first entry in the global offset table to the address of 6298 the dynamic section. */ 6299 if (sdyn == NULL) 6300 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents); 6301 else 6302 bfd_put_64 (output_bfd, 6303 sdyn->output_section->vma + sdyn->output_offset, 6304 htab->elf.sgotplt->contents); 6305 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */ 6306 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE); 6307 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + GOT_ENTRY_SIZE*2); 6308 } 6309 6310 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 6311 GOT_ENTRY_SIZE; 6312 } 6313 6314 /* Adjust .eh_frame for .plt section. */ 6315 if (htab->plt_eh_frame != NULL 6316 && htab->plt_eh_frame->contents != NULL) 6317 { 6318 if (htab->elf.splt != NULL 6319 && htab->elf.splt->size != 0 6320 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0 6321 && htab->elf.splt->output_section != NULL 6322 && htab->plt_eh_frame->output_section != NULL) 6323 { 6324 bfd_vma plt_start = htab->elf.splt->output_section->vma; 6325 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma 6326 + htab->plt_eh_frame->output_offset 6327 + PLT_FDE_START_OFFSET; 6328 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start, 6329 htab->plt_eh_frame->contents 6330 + PLT_FDE_START_OFFSET); 6331 } 6332 if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME) 6333 { 6334 if (! _bfd_elf_write_section_eh_frame (output_bfd, info, 6335 htab->plt_eh_frame, 6336 htab->plt_eh_frame->contents)) 6337 return FALSE; 6338 } 6339 } 6340 6341 if (htab->elf.sgot && htab->elf.sgot->size > 0) 6342 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize 6343 = GOT_ENTRY_SIZE; 6344 6345 /* Fill PLT entries for undefined weak symbols in PIE. */ 6346 if (bfd_link_pie (info)) 6347 bfd_hash_traverse (&info->hash->table, 6348 elf_x86_64_pie_finish_undefweak_symbol, 6349 info); 6350 6351 return TRUE; 6352} 6353 6354/* Fill PLT/GOT entries and allocate dynamic relocations for local 6355 STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table. 6356 It has to be done before elf_link_sort_relocs is called so that 6357 dynamic relocations are properly sorted. */ 6358 6359static bfd_boolean 6360elf_x86_64_output_arch_local_syms 6361 (bfd *output_bfd ATTRIBUTE_UNUSED, 6362 struct bfd_link_info *info, 6363 void *flaginfo ATTRIBUTE_UNUSED, 6364 int (*func) (void *, const char *, 6365 Elf_Internal_Sym *, 6366 asection *, 6367 struct elf_link_hash_entry *) ATTRIBUTE_UNUSED) 6368{ 6369 struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info); 6370 if (htab == NULL) 6371 return FALSE; 6372 6373 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */ 6374 htab_traverse (htab->loc_hash_table, 6375 elf_x86_64_finish_local_dynamic_symbol, 6376 info); 6377 6378 return TRUE; 6379} 6380 6381/* Return an array of PLT entry symbol values. */ 6382 6383static bfd_vma * 6384elf_x86_64_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt, 6385 asection *relplt) 6386{ 6387 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); 6388 arelent *p; 6389 long count, i; 6390 bfd_vma *plt_sym_val; 6391 bfd_vma plt_offset; 6392 bfd_byte *plt_contents; 6393 const struct elf_x86_64_backend_data *bed; 6394 Elf_Internal_Shdr *hdr; 6395 asection *plt_bnd; 6396 6397 /* Get the .plt section contents. PLT passed down may point to the 6398 .plt.bnd section. Make sure that PLT always points to the .plt 6399 section. */ 6400 plt_bnd = bfd_get_section_by_name (abfd, ".plt.bnd"); 6401 if (plt_bnd) 6402 { 6403 if (plt != plt_bnd) 6404 abort (); 6405 plt = bfd_get_section_by_name (abfd, ".plt"); 6406 if (plt == NULL) 6407 abort (); 6408 bed = &elf_x86_64_bnd_arch_bed; 6409 } 6410 else 6411 bed = get_elf_x86_64_backend_data (abfd); 6412 6413 plt_contents = (bfd_byte *) bfd_malloc (plt->size); 6414 if (plt_contents == NULL) 6415 return NULL; 6416 if (!bfd_get_section_contents (abfd, (asection *) plt, 6417 plt_contents, 0, plt->size)) 6418 { 6419bad_return: 6420 free (plt_contents); 6421 return NULL; 6422 } 6423 6424 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; 6425 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE)) 6426 goto bad_return; 6427 6428 hdr = &elf_section_data (relplt)->this_hdr; 6429 count = relplt->size / hdr->sh_entsize; 6430 6431 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count); 6432 if (plt_sym_val == NULL) 6433 goto bad_return; 6434 6435 for (i = 0; i < count; i++) 6436 plt_sym_val[i] = -1; 6437 6438 plt_offset = bed->plt_entry_size; 6439 p = relplt->relocation; 6440 for (i = 0; i < count; i++, p++) 6441 { 6442 long reloc_index; 6443 6444 /* Skip unknown relocation. */ 6445 if (p->howto == NULL) 6446 continue; 6447 6448 if (p->howto->type != R_X86_64_JUMP_SLOT 6449 && p->howto->type != R_X86_64_IRELATIVE) 6450 continue; 6451 6452 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset 6453 + bed->plt_reloc_offset)); 6454 if (reloc_index < count) 6455 { 6456 if (plt_bnd) 6457 { 6458 /* This is the index in .plt section. */ 6459 long plt_index = plt_offset / bed->plt_entry_size; 6460 /* Store VMA + the offset in .plt.bnd section. */ 6461 plt_sym_val[reloc_index] = 6462 (plt_bnd->vma 6463 + (plt_index - 1) * sizeof (elf_x86_64_legacy_plt2_entry)); 6464 } 6465 else 6466 plt_sym_val[reloc_index] = plt->vma + plt_offset; 6467 } 6468 plt_offset += bed->plt_entry_size; 6469 6470 /* PR binutils/18437: Skip extra relocations in the .rela.plt 6471 section. */ 6472 if (plt_offset >= plt->size) 6473 break; 6474 } 6475 6476 free (plt_contents); 6477 6478 return plt_sym_val; 6479} 6480 6481/* Similar to _bfd_elf_get_synthetic_symtab, with .plt.bnd section 6482 support. */ 6483 6484static long 6485elf_x86_64_get_synthetic_symtab (bfd *abfd, 6486 long symcount, 6487 asymbol **syms, 6488 long dynsymcount, 6489 asymbol **dynsyms, 6490 asymbol **ret) 6491{ 6492 /* Pass the .plt.bnd section to _bfd_elf_ifunc_get_synthetic_symtab 6493 as PLT if it exists. */ 6494 asection *plt = bfd_get_section_by_name (abfd, ".plt.bnd"); 6495 if (plt == NULL) 6496 plt = bfd_get_section_by_name (abfd, ".plt"); 6497 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms, 6498 dynsymcount, dynsyms, ret, 6499 plt, 6500 elf_x86_64_get_plt_sym_val); 6501} 6502 6503/* Handle an x86-64 specific section when reading an object file. This 6504 is called when elfcode.h finds a section with an unknown type. */ 6505 6506static bfd_boolean 6507elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, 6508 const char *name, int shindex) 6509{ 6510 if (hdr->sh_type != SHT_X86_64_UNWIND) 6511 return FALSE; 6512 6513 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex)) 6514 return FALSE; 6515 6516 return TRUE; 6517} 6518 6519/* Hook called by the linker routine which adds symbols from an object 6520 file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead 6521 of .bss. */ 6522 6523static bfd_boolean 6524elf_x86_64_add_symbol_hook (bfd *abfd, 6525 struct bfd_link_info *info ATTRIBUTE_UNUSED, 6526 Elf_Internal_Sym *sym, 6527 const char **namep ATTRIBUTE_UNUSED, 6528 flagword *flagsp ATTRIBUTE_UNUSED, 6529 asection **secp, 6530 bfd_vma *valp) 6531{ 6532 asection *lcomm; 6533 6534 switch (sym->st_shndx) 6535 { 6536 case SHN_X86_64_LCOMMON: 6537 lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON"); 6538 if (lcomm == NULL) 6539 { 6540 lcomm = bfd_make_section_with_flags (abfd, 6541 "LARGE_COMMON", 6542 (SEC_ALLOC 6543 | SEC_IS_COMMON 6544 | SEC_LINKER_CREATED)); 6545 if (lcomm == NULL) 6546 return FALSE; 6547 elf_section_flags (lcomm) |= SHF_X86_64_LARGE; 6548 } 6549 *secp = lcomm; 6550 *valp = sym->st_size; 6551 return TRUE; 6552 } 6553 6554 return TRUE; 6555} 6556 6557 6558/* Given a BFD section, try to locate the corresponding ELF section 6559 index. */ 6560 6561static bfd_boolean 6562elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED, 6563 asection *sec, int *index_return) 6564{ 6565 if (sec == &_bfd_elf_large_com_section) 6566 { 6567 *index_return = SHN_X86_64_LCOMMON; 6568 return TRUE; 6569 } 6570 return FALSE; 6571} 6572 6573/* Process a symbol. */ 6574 6575static void 6576elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, 6577 asymbol *asym) 6578{ 6579 elf_symbol_type *elfsym = (elf_symbol_type *) asym; 6580 6581 switch (elfsym->internal_elf_sym.st_shndx) 6582 { 6583 case SHN_X86_64_LCOMMON: 6584 asym->section = &_bfd_elf_large_com_section; 6585 asym->value = elfsym->internal_elf_sym.st_size; 6586 /* Common symbol doesn't set BSF_GLOBAL. */ 6587 asym->flags &= ~BSF_GLOBAL; 6588 break; 6589 } 6590} 6591 6592static bfd_boolean 6593elf_x86_64_common_definition (Elf_Internal_Sym *sym) 6594{ 6595 return (sym->st_shndx == SHN_COMMON 6596 || sym->st_shndx == SHN_X86_64_LCOMMON); 6597} 6598 6599static unsigned int 6600elf_x86_64_common_section_index (asection *sec) 6601{ 6602 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0) 6603 return SHN_COMMON; 6604 else 6605 return SHN_X86_64_LCOMMON; 6606} 6607 6608static asection * 6609elf_x86_64_common_section (asection *sec) 6610{ 6611 if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0) 6612 return bfd_com_section_ptr; 6613 else 6614 return &_bfd_elf_large_com_section; 6615} 6616 6617static bfd_boolean 6618elf_x86_64_merge_symbol (struct elf_link_hash_entry *h, 6619 const Elf_Internal_Sym *sym, 6620 asection **psec, 6621 bfd_boolean newdef, 6622 bfd_boolean olddef, 6623 bfd *oldbfd, 6624 const asection *oldsec) 6625{ 6626 /* A normal common symbol and a large common symbol result in a 6627 normal common symbol. We turn the large common symbol into a 6628 normal one. */ 6629 if (!olddef 6630 && h->root.type == bfd_link_hash_common 6631 && !newdef 6632 && bfd_is_com_section (*psec) 6633 && oldsec != *psec) 6634 { 6635 if (sym->st_shndx == SHN_COMMON 6636 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0) 6637 { 6638 h->root.u.c.p->section 6639 = bfd_make_section_old_way (oldbfd, "COMMON"); 6640 h->root.u.c.p->section->flags = SEC_ALLOC; 6641 } 6642 else if (sym->st_shndx == SHN_X86_64_LCOMMON 6643 && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0) 6644 *psec = bfd_com_section_ptr; 6645 } 6646 6647 return TRUE; 6648} 6649 6650static int 6651elf_x86_64_additional_program_headers (bfd *abfd, 6652 struct bfd_link_info *info ATTRIBUTE_UNUSED) 6653{ 6654 asection *s; 6655 int count = 0; 6656 6657 /* Check to see if we need a large readonly segment. */ 6658 s = bfd_get_section_by_name (abfd, ".lrodata"); 6659 if (s && (s->flags & SEC_LOAD)) 6660 count++; 6661 6662 /* Check to see if we need a large data segment. Since .lbss sections 6663 is placed right after the .bss section, there should be no need for 6664 a large data segment just because of .lbss. */ 6665 s = bfd_get_section_by_name (abfd, ".ldata"); 6666 if (s && (s->flags & SEC_LOAD)) 6667 count++; 6668 6669 return count; 6670} 6671 6672/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */ 6673 6674static bfd_boolean 6675elf_x86_64_hash_symbol (struct elf_link_hash_entry *h) 6676{ 6677 if (h->plt.offset != (bfd_vma) -1 6678 && !h->def_regular 6679 && !h->pointer_equality_needed) 6680 return FALSE; 6681 6682 return _bfd_elf_hash_symbol (h); 6683} 6684 6685/* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */ 6686 6687static bfd_boolean 6688elf_x86_64_relocs_compatible (const bfd_target *input, 6689 const bfd_target *output) 6690{ 6691 return ((xvec_get_elf_backend_data (input)->s->elfclass 6692 == xvec_get_elf_backend_data (output)->s->elfclass) 6693 && _bfd_elf_relocs_compatible (input, output)); 6694} 6695 6696static const struct bfd_elf_special_section 6697 elf_x86_64_special_sections[]= 6698{ 6699 { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE}, 6700 { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE}, 6701 { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE}, 6702 { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE}, 6703 { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE}, 6704 { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE}, 6705 { NULL, 0, 0, 0, 0 } 6706}; 6707 6708#define TARGET_LITTLE_SYM x86_64_elf64_vec 6709#define TARGET_LITTLE_NAME "elf64-x86-64" 6710#define ELF_ARCH bfd_arch_i386 6711#define ELF_TARGET_ID X86_64_ELF_DATA 6712#define ELF_MACHINE_CODE EM_X86_64 6713#define ELF_MAXPAGESIZE 0x200000 6714#define ELF_MINPAGESIZE 0x1000 6715#define ELF_COMMONPAGESIZE 0x1000 6716 6717#define elf_backend_can_gc_sections 1 6718#define elf_backend_can_refcount 1 6719#define elf_backend_want_got_plt 1 6720#define elf_backend_plt_readonly 1 6721#define elf_backend_want_plt_sym 0 6722#define elf_backend_got_header_size (GOT_ENTRY_SIZE*3) 6723#define elf_backend_rela_normal 1 6724#define elf_backend_plt_alignment 4 6725#define elf_backend_extern_protected_data 1 6726#define elf_backend_caches_rawsize 1 6727 6728#define elf_info_to_howto elf_x86_64_info_to_howto 6729 6730#define bfd_elf64_bfd_link_hash_table_create \ 6731 elf_x86_64_link_hash_table_create 6732#define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup 6733#define bfd_elf64_bfd_reloc_name_lookup \ 6734 elf_x86_64_reloc_name_lookup 6735 6736#define elf_backend_adjust_dynamic_symbol elf_x86_64_adjust_dynamic_symbol 6737#define elf_backend_relocs_compatible elf_x86_64_relocs_compatible 6738#define elf_backend_check_relocs elf_x86_64_check_relocs 6739#define elf_backend_copy_indirect_symbol elf_x86_64_copy_indirect_symbol 6740#define elf_backend_create_dynamic_sections elf_x86_64_create_dynamic_sections 6741#define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections 6742#define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol 6743#define elf_backend_output_arch_local_syms elf_x86_64_output_arch_local_syms 6744#define elf_backend_gc_mark_hook elf_x86_64_gc_mark_hook 6745#define elf_backend_grok_prstatus elf_x86_64_grok_prstatus 6746#define elf_backend_grok_psinfo elf_x86_64_grok_psinfo 6747#ifdef CORE_HEADER 6748#define elf_backend_write_core_note elf_x86_64_write_core_note 6749#endif 6750#define elf_backend_reloc_type_class elf_x86_64_reloc_type_class 6751#define elf_backend_relocate_section elf_x86_64_relocate_section 6752#define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections 6753#define elf_backend_always_size_sections elf_x86_64_always_size_sections 6754#define elf_backend_init_index_section _bfd_elf_init_1_index_section 6755#define elf_backend_object_p elf64_x86_64_elf_object_p 6756#define bfd_elf64_mkobject elf_x86_64_mkobject 6757#define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab 6758 6759#define elf_backend_section_from_shdr \ 6760 elf_x86_64_section_from_shdr 6761 6762#define elf_backend_section_from_bfd_section \ 6763 elf_x86_64_elf_section_from_bfd_section 6764#define elf_backend_add_symbol_hook \ 6765 elf_x86_64_add_symbol_hook 6766#define elf_backend_symbol_processing \ 6767 elf_x86_64_symbol_processing 6768#define elf_backend_common_section_index \ 6769 elf_x86_64_common_section_index 6770#define elf_backend_common_section \ 6771 elf_x86_64_common_section 6772#define elf_backend_common_definition \ 6773 elf_x86_64_common_definition 6774#define elf_backend_merge_symbol \ 6775 elf_x86_64_merge_symbol 6776#define elf_backend_special_sections \ 6777 elf_x86_64_special_sections 6778#define elf_backend_additional_program_headers \ 6779 elf_x86_64_additional_program_headers 6780#define elf_backend_hash_symbol \ 6781 elf_x86_64_hash_symbol 6782#define elf_backend_omit_section_dynsym \ 6783 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true) 6784#define elf_backend_fixup_symbol \ 6785 elf_x86_64_fixup_symbol 6786 6787#include "elf64-target.h" 6788 6789/* CloudABI support. */ 6790 6791#undef TARGET_LITTLE_SYM 6792#define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec 6793#undef TARGET_LITTLE_NAME 6794#define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi" 6795 6796#undef ELF_OSABI 6797#define ELF_OSABI ELFOSABI_CLOUDABI 6798 6799#undef elf64_bed 6800#define elf64_bed elf64_x86_64_cloudabi_bed 6801 6802#include "elf64-target.h" 6803 6804/* FreeBSD support. */ 6805 6806#undef TARGET_LITTLE_SYM 6807#define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec 6808#undef TARGET_LITTLE_NAME 6809#define TARGET_LITTLE_NAME "elf64-x86-64-freebsd" 6810 6811#undef ELF_OSABI 6812#define ELF_OSABI ELFOSABI_FREEBSD 6813 6814#undef elf64_bed 6815#define elf64_bed elf64_x86_64_fbsd_bed 6816 6817#include "elf64-target.h" 6818 6819/* Solaris 2 support. */ 6820 6821#undef TARGET_LITTLE_SYM 6822#define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec 6823#undef TARGET_LITTLE_NAME 6824#define TARGET_LITTLE_NAME "elf64-x86-64-sol2" 6825 6826/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE 6827 objects won't be recognized. */ 6828#undef ELF_OSABI 6829 6830#undef elf64_bed 6831#define elf64_bed elf64_x86_64_sol2_bed 6832 6833/* The 64-bit static TLS arena size is rounded to the nearest 16-byte 6834 boundary. */ 6835#undef elf_backend_static_tls_alignment 6836#define elf_backend_static_tls_alignment 16 6837 6838/* The Solaris 2 ABI requires a plt symbol on all platforms. 6839 6840 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output 6841 File, p.63. */ 6842#undef elf_backend_want_plt_sym 6843#define elf_backend_want_plt_sym 1 6844 6845#undef elf_backend_strtab_flags 6846#define elf_backend_strtab_flags SHF_STRINGS 6847 6848static bfd_boolean 6849elf64_x86_64_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED, 6850 bfd *obfd ATTRIBUTE_UNUSED, 6851 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED, 6852 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED) 6853{ 6854 /* PR 19938: FIXME: Need to add code for setting the sh_info 6855 and sh_link fields of Solaris specific section types. */ 6856 return FALSE; 6857} 6858 6859#undef elf_backend_copy_special_section_fields 6860#define elf_backend_copy_special_section_fields elf64_x86_64_copy_solaris_special_section_fields 6861 6862#include "elf64-target.h" 6863 6864/* Native Client support. */ 6865 6866static bfd_boolean 6867elf64_x86_64_nacl_elf_object_p (bfd *abfd) 6868{ 6869 /* Set the right machine number for a NaCl x86-64 ELF64 file. */ 6870 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64_nacl); 6871 return TRUE; 6872} 6873 6874#undef TARGET_LITTLE_SYM 6875#define TARGET_LITTLE_SYM x86_64_elf64_nacl_vec 6876#undef TARGET_LITTLE_NAME 6877#define TARGET_LITTLE_NAME "elf64-x86-64-nacl" 6878#undef elf64_bed 6879#define elf64_bed elf64_x86_64_nacl_bed 6880 6881#undef ELF_MAXPAGESIZE 6882#undef ELF_MINPAGESIZE 6883#undef ELF_COMMONPAGESIZE 6884#define ELF_MAXPAGESIZE 0x10000 6885#define ELF_MINPAGESIZE 0x10000 6886#define ELF_COMMONPAGESIZE 0x10000 6887 6888/* Restore defaults. */ 6889#undef ELF_OSABI 6890#undef elf_backend_static_tls_alignment 6891#undef elf_backend_want_plt_sym 6892#define elf_backend_want_plt_sym 0 6893#undef elf_backend_strtab_flags 6894#undef elf_backend_copy_special_section_fields 6895 6896/* NaCl uses substantially different PLT entries for the same effects. */ 6897 6898#undef elf_backend_plt_alignment 6899#define elf_backend_plt_alignment 5 6900#define NACL_PLT_ENTRY_SIZE 64 6901#define NACLMASK 0xe0 /* 32-byte alignment mask. */ 6902 6903static const bfd_byte elf_x86_64_nacl_plt0_entry[NACL_PLT_ENTRY_SIZE] = 6904 { 6905 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */ 6906 0x4c, 0x8b, 0x1d, 16, 0, 0, 0, /* mov GOT+16(%rip), %r11 */ 6907 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */ 6908 0x4d, 0x01, 0xfb, /* add %r15, %r11 */ 6909 0x41, 0xff, 0xe3, /* jmpq *%r11 */ 6910 6911 /* 9-byte nop sequence to pad out to the next 32-byte boundary. */ 6912 0x66, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw 0x0(%rax,%rax,1) */ 6913 6914 /* 32 bytes of nop to pad out to the standard size. */ 6915 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */ 6916 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */ 6917 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */ 6918 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */ 6919 0x66, /* excess data16 prefix */ 6920 0x90 /* nop */ 6921 }; 6922 6923static const bfd_byte elf_x86_64_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] = 6924 { 6925 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, /* mov name@GOTPCREL(%rip),%r11 */ 6926 0x41, 0x83, 0xe3, NACLMASK, /* and $-32, %r11d */ 6927 0x4d, 0x01, 0xfb, /* add %r15, %r11 */ 6928 0x41, 0xff, 0xe3, /* jmpq *%r11 */ 6929 6930 /* 15-byte nop sequence to pad out to the next 32-byte boundary. */ 6931 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */ 6932 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */ 6933 6934 /* Lazy GOT entries point here (32-byte aligned). */ 6935 0x68, /* pushq immediate */ 6936 0, 0, 0, 0, /* replaced with index into relocation table. */ 6937 0xe9, /* jmp relative */ 6938 0, 0, 0, 0, /* replaced with offset to start of .plt0. */ 6939 6940 /* 22 bytes of nop to pad out to the standard size. */ 6941 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, /* excess data16 prefixes */ 6942 0x2e, 0x0f, 0x1f, 0x84, 0, 0, 0, 0, 0, /* nopw %cs:0x0(%rax,%rax,1) */ 6943 0x0f, 0x1f, 0x80, 0, 0, 0, 0, /* nopl 0x0(%rax) */ 6944 }; 6945 6946/* .eh_frame covering the .plt section. */ 6947 6948static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] = 6949 { 6950#if (PLT_CIE_LENGTH != 20 \ 6951 || PLT_FDE_LENGTH != 36 \ 6952 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \ 6953 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12) 6954# error "Need elf_x86_64_backend_data parameters for eh_frame_plt offsets!" 6955#endif 6956 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */ 6957 0, 0, 0, 0, /* CIE ID */ 6958 1, /* CIE version */ 6959 'z', 'R', 0, /* Augmentation string */ 6960 1, /* Code alignment factor */ 6961 0x78, /* Data alignment factor */ 6962 16, /* Return address column */ 6963 1, /* Augmentation size */ 6964 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */ 6965 DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */ 6966 DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */ 6967 DW_CFA_nop, DW_CFA_nop, 6968 6969 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */ 6970 PLT_CIE_LENGTH + 8, 0, 0, 0,/* CIE pointer */ 6971 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */ 6972 0, 0, 0, 0, /* .plt size goes here */ 6973 0, /* Augmentation size */ 6974 DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */ 6975 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */ 6976 DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */ 6977 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */ 6978 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */ 6979 13, /* Block length */ 6980 DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */ 6981 DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */ 6982 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge, 6983 DW_OP_lit3, DW_OP_shl, DW_OP_plus, 6984 DW_CFA_nop, DW_CFA_nop 6985 }; 6986 6987static const struct elf_x86_64_backend_data elf_x86_64_nacl_arch_bed = 6988 { 6989 elf_x86_64_nacl_plt0_entry, /* plt0_entry */ 6990 elf_x86_64_nacl_plt_entry, /* plt_entry */ 6991 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */ 6992 2, /* plt0_got1_offset */ 6993 9, /* plt0_got2_offset */ 6994 13, /* plt0_got2_insn_end */ 6995 3, /* plt_got_offset */ 6996 33, /* plt_reloc_offset */ 6997 38, /* plt_plt_offset */ 6998 7, /* plt_got_insn_size */ 6999 42, /* plt_plt_insn_end */ 7000 32, /* plt_lazy_offset */ 7001 elf_x86_64_nacl_eh_frame_plt, /* eh_frame_plt */ 7002 sizeof (elf_x86_64_nacl_eh_frame_plt), /* eh_frame_plt_size */ 7003 }; 7004 7005#undef elf_backend_arch_data 7006#define elf_backend_arch_data &elf_x86_64_nacl_arch_bed 7007 7008#undef elf_backend_object_p 7009#define elf_backend_object_p elf64_x86_64_nacl_elf_object_p 7010#undef elf_backend_modify_segment_map 7011#define elf_backend_modify_segment_map nacl_modify_segment_map 7012#undef elf_backend_modify_program_headers 7013#define elf_backend_modify_program_headers nacl_modify_program_headers 7014#undef elf_backend_final_write_processing 7015#define elf_backend_final_write_processing nacl_final_write_processing 7016 7017#include "elf64-target.h" 7018 7019/* Native Client x32 support. */ 7020 7021static bfd_boolean 7022elf32_x86_64_nacl_elf_object_p (bfd *abfd) 7023{ 7024 /* Set the right machine number for a NaCl x86-64 ELF32 file. */ 7025 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32_nacl); 7026 return TRUE; 7027} 7028 7029#undef TARGET_LITTLE_SYM 7030#define TARGET_LITTLE_SYM x86_64_elf32_nacl_vec 7031#undef TARGET_LITTLE_NAME 7032#define TARGET_LITTLE_NAME "elf32-x86-64-nacl" 7033#undef elf32_bed 7034#define elf32_bed elf32_x86_64_nacl_bed 7035 7036#define bfd_elf32_bfd_link_hash_table_create \ 7037 elf_x86_64_link_hash_table_create 7038#define bfd_elf32_bfd_reloc_type_lookup \ 7039 elf_x86_64_reloc_type_lookup 7040#define bfd_elf32_bfd_reloc_name_lookup \ 7041 elf_x86_64_reloc_name_lookup 7042#define bfd_elf32_mkobject \ 7043 elf_x86_64_mkobject 7044#define bfd_elf32_get_synthetic_symtab \ 7045 elf_x86_64_get_synthetic_symtab 7046 7047#undef elf_backend_object_p 7048#define elf_backend_object_p \ 7049 elf32_x86_64_nacl_elf_object_p 7050 7051#undef elf_backend_bfd_from_remote_memory 7052#define elf_backend_bfd_from_remote_memory \ 7053 _bfd_elf32_bfd_from_remote_memory 7054 7055#undef elf_backend_size_info 7056#define elf_backend_size_info \ 7057 _bfd_elf32_size_info 7058 7059#include "elf32-target.h" 7060 7061/* Restore defaults. */ 7062#undef elf_backend_object_p 7063#define elf_backend_object_p elf64_x86_64_elf_object_p 7064#undef elf_backend_bfd_from_remote_memory 7065#undef elf_backend_size_info 7066#undef elf_backend_modify_segment_map 7067#undef elf_backend_modify_program_headers 7068#undef elf_backend_final_write_processing 7069 7070/* Intel L1OM support. */ 7071 7072static bfd_boolean 7073elf64_l1om_elf_object_p (bfd *abfd) 7074{ 7075 /* Set the right machine number for an L1OM elf64 file. */ 7076 bfd_default_set_arch_mach (abfd, bfd_arch_l1om, bfd_mach_l1om); 7077 return TRUE; 7078} 7079 7080#undef TARGET_LITTLE_SYM 7081#define TARGET_LITTLE_SYM l1om_elf64_vec 7082#undef TARGET_LITTLE_NAME 7083#define TARGET_LITTLE_NAME "elf64-l1om" 7084#undef ELF_ARCH 7085#define ELF_ARCH bfd_arch_l1om 7086 7087#undef ELF_MACHINE_CODE 7088#define ELF_MACHINE_CODE EM_L1OM 7089 7090#undef ELF_OSABI 7091 7092#undef elf64_bed 7093#define elf64_bed elf64_l1om_bed 7094 7095#undef elf_backend_object_p 7096#define elf_backend_object_p elf64_l1om_elf_object_p 7097 7098/* Restore defaults. */ 7099#undef ELF_MAXPAGESIZE 7100#undef ELF_MINPAGESIZE 7101#undef ELF_COMMONPAGESIZE 7102#define ELF_MAXPAGESIZE 0x200000 7103#define ELF_MINPAGESIZE 0x1000 7104#define ELF_COMMONPAGESIZE 0x1000 7105#undef elf_backend_plt_alignment 7106#define elf_backend_plt_alignment 4 7107#undef elf_backend_arch_data 7108#define elf_backend_arch_data &elf_x86_64_arch_bed 7109 7110#include "elf64-target.h" 7111 7112/* FreeBSD L1OM support. */ 7113 7114#undef TARGET_LITTLE_SYM 7115#define TARGET_LITTLE_SYM l1om_elf64_fbsd_vec 7116#undef TARGET_LITTLE_NAME 7117#define TARGET_LITTLE_NAME "elf64-l1om-freebsd" 7118 7119#undef ELF_OSABI 7120#define ELF_OSABI ELFOSABI_FREEBSD 7121 7122#undef elf64_bed 7123#define elf64_bed elf64_l1om_fbsd_bed 7124 7125#include "elf64-target.h" 7126 7127/* Intel K1OM support. */ 7128 7129static bfd_boolean 7130elf64_k1om_elf_object_p (bfd *abfd) 7131{ 7132 /* Set the right machine number for an K1OM elf64 file. */ 7133 bfd_default_set_arch_mach (abfd, bfd_arch_k1om, bfd_mach_k1om); 7134 return TRUE; 7135} 7136 7137#undef TARGET_LITTLE_SYM 7138#define TARGET_LITTLE_SYM k1om_elf64_vec 7139#undef TARGET_LITTLE_NAME 7140#define TARGET_LITTLE_NAME "elf64-k1om" 7141#undef ELF_ARCH 7142#define ELF_ARCH bfd_arch_k1om 7143 7144#undef ELF_MACHINE_CODE 7145#define ELF_MACHINE_CODE EM_K1OM 7146 7147#undef ELF_OSABI 7148 7149#undef elf64_bed 7150#define elf64_bed elf64_k1om_bed 7151 7152#undef elf_backend_object_p 7153#define elf_backend_object_p elf64_k1om_elf_object_p 7154 7155#undef elf_backend_static_tls_alignment 7156 7157#undef elf_backend_want_plt_sym 7158#define elf_backend_want_plt_sym 0 7159 7160#include "elf64-target.h" 7161 7162/* FreeBSD K1OM support. */ 7163 7164#undef TARGET_LITTLE_SYM 7165#define TARGET_LITTLE_SYM k1om_elf64_fbsd_vec 7166#undef TARGET_LITTLE_NAME 7167#define TARGET_LITTLE_NAME "elf64-k1om-freebsd" 7168 7169#undef ELF_OSABI 7170#define ELF_OSABI ELFOSABI_FREEBSD 7171 7172#undef elf64_bed 7173#define elf64_bed elf64_k1om_fbsd_bed 7174 7175#include "elf64-target.h" 7176 7177/* 32bit x86-64 support. */ 7178 7179#undef TARGET_LITTLE_SYM 7180#define TARGET_LITTLE_SYM x86_64_elf32_vec 7181#undef TARGET_LITTLE_NAME 7182#define TARGET_LITTLE_NAME "elf32-x86-64" 7183#undef elf32_bed 7184 7185#undef ELF_ARCH 7186#define ELF_ARCH bfd_arch_i386 7187 7188#undef ELF_MACHINE_CODE 7189#define ELF_MACHINE_CODE EM_X86_64 7190 7191#undef ELF_OSABI 7192 7193#undef elf_backend_object_p 7194#define elf_backend_object_p \ 7195 elf32_x86_64_elf_object_p 7196 7197#undef elf_backend_bfd_from_remote_memory 7198#define elf_backend_bfd_from_remote_memory \ 7199 _bfd_elf32_bfd_from_remote_memory 7200 7201#undef elf_backend_size_info 7202#define elf_backend_size_info \ 7203 _bfd_elf32_size_info 7204 7205#include "elf32-target.h" 7206