1 /* simple-object-elf.c -- routines to manipulate ELF object files. 2 Copyright (C) 2010-2026 Free Software Foundation, Inc. 3 Written by Ian Lance Taylor, Google. 4 5 This program is free software; you can redistribute it and/or modify it 6 under the terms of the GNU General Public License as published by the 7 Free Software Foundation; either version 2, or (at your option) any 8 later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, 51 Franklin Street - Fifth Floor, 18 Boston, MA 02110-1301, USA. */ 19 20 #include "config.h" 21 #include "libiberty.h" 22 #include "simple-object.h" 23 24 #include <errno.h> 25 /* mingw.org's MinGW doesn't have ENOTSUP. */ 26 #ifndef ENOTSUP 27 # define ENOTSUP ENOSYS 28 #endif 29 #include <stddef.h> 30 31 #ifdef HAVE_STDLIB_H 32 #include <stdlib.h> 33 #endif 34 35 #ifdef HAVE_STDINT_H 36 #include <stdint.h> 37 #endif 38 39 #ifdef HAVE_STRING_H 40 #include <string.h> 41 #endif 42 43 #ifdef HAVE_INTTYPES_H 44 #include <inttypes.h> 45 #endif 46 47 #include "simple-object-common.h" 48 49 /* ELF structures and constants. */ 50 51 /* 32-bit ELF file header. */ 52 53 typedef struct { 54 unsigned char e_ident[16]; /* ELF "magic number" */ 55 unsigned char e_type[2]; /* Identifies object file type */ 56 unsigned char e_machine[2]; /* Specifies required architecture */ 57 unsigned char e_version[4]; /* Identifies object file version */ 58 unsigned char e_entry[4]; /* Entry point virtual address */ 59 unsigned char e_phoff[4]; /* Program header table file offset */ 60 unsigned char e_shoff[4]; /* Section header table file offset */ 61 unsigned char e_flags[4]; /* Processor-specific flags */ 62 unsigned char e_ehsize[2]; /* ELF header size in bytes */ 63 unsigned char e_phentsize[2]; /* Program header table entry size */ 64 unsigned char e_phnum[2]; /* Program header table entry count */ 65 unsigned char e_shentsize[2]; /* Section header table entry size */ 66 unsigned char e_shnum[2]; /* Section header table entry count */ 67 unsigned char e_shstrndx[2]; /* Section header string table index */ 68 } Elf32_External_Ehdr; 69 70 /* 64-bit ELF file header. */ 71 72 typedef struct { 73 unsigned char e_ident[16]; /* ELF "magic number" */ 74 unsigned char e_type[2]; /* Identifies object file type */ 75 unsigned char e_machine[2]; /* Specifies required architecture */ 76 unsigned char e_version[4]; /* Identifies object file version */ 77 unsigned char e_entry[8]; /* Entry point virtual address */ 78 unsigned char e_phoff[8]; /* Program header table file offset */ 79 unsigned char e_shoff[8]; /* Section header table file offset */ 80 unsigned char e_flags[4]; /* Processor-specific flags */ 81 unsigned char e_ehsize[2]; /* ELF header size in bytes */ 82 unsigned char e_phentsize[2]; /* Program header table entry size */ 83 unsigned char e_phnum[2]; /* Program header table entry count */ 84 unsigned char e_shentsize[2]; /* Section header table entry size */ 85 unsigned char e_shnum[2]; /* Section header table entry count */ 86 unsigned char e_shstrndx[2]; /* Section header string table index */ 87 } Elf64_External_Ehdr; 88 89 /* Indexes and values in e_ident field of Ehdr. */ 90 91 #define EI_MAG0 0 /* File identification byte 0 index */ 92 #define ELFMAG0 0x7F /* Magic number byte 0 */ 93 94 #define EI_MAG1 1 /* File identification byte 1 index */ 95 #define ELFMAG1 'E' /* Magic number byte 1 */ 96 97 #define EI_MAG2 2 /* File identification byte 2 index */ 98 #define ELFMAG2 'L' /* Magic number byte 2 */ 99 100 #define EI_MAG3 3 /* File identification byte 3 index */ 101 #define ELFMAG3 'F' /* Magic number byte 3 */ 102 103 #define EI_CLASS 4 /* File class */ 104 #define ELFCLASSNONE 0 /* Invalid class */ 105 #define ELFCLASS32 1 /* 32-bit objects */ 106 #define ELFCLASS64 2 /* 64-bit objects */ 107 108 #define EI_DATA 5 /* Data encoding */ 109 #define ELFDATANONE 0 /* Invalid data encoding */ 110 #define ELFDATA2LSB 1 /* 2's complement, little endian */ 111 #define ELFDATA2MSB 2 /* 2's complement, big endian */ 112 113 #define EI_VERSION 6 /* File version */ 114 #define EV_CURRENT 1 /* Current version */ 115 116 #define EI_OSABI 7 /* Operating System/ABI indication */ 117 118 /* Values for e_type field of Ehdr. */ 119 120 #define ET_REL 1 /* Relocatable file */ 121 122 /* Values for e_machine field of Ehdr. */ 123 124 #define EM_SPARC 2 /* SUN SPARC */ 125 #define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ 126 127 /* Special section index values. */ 128 129 #define SHN_UNDEF 0 /* Undefined section */ 130 #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ 131 #define SHN_COMMON 0xFFF2 /* Associated symbol is in common */ 132 #define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */ 133 #define SHN_HIRESERVE 0xFFFF /* End of reserved indices */ 134 135 136 /* 32-bit ELF program header. */ 137 138 typedef struct { 139 unsigned char p_type[4]; /* Identifies program segment type */ 140 unsigned char p_offset[4]; /* Segment file offset */ 141 unsigned char p_vaddr[4]; /* Segment virtual address */ 142 unsigned char p_paddr[4]; /* Segment physical address */ 143 unsigned char p_filesz[4]; /* Segment size in file */ 144 unsigned char p_memsz[4]; /* Segment size in memory */ 145 unsigned char p_flags[4]; /* Segment flags */ 146 unsigned char p_align[4]; /* Segment alignment, file & memory */ 147 } Elf32_External_Phdr; 148 149 /* 64-bit ELF program header. */ 150 151 typedef struct { 152 unsigned char p_type[4]; /* Identifies program segment type */ 153 unsigned char p_flags[4]; /* Segment flags */ 154 unsigned char p_offset[8]; /* Segment file offset */ 155 unsigned char p_vaddr[8]; /* Segment virtual address */ 156 unsigned char p_paddr[8]; /* Segment physical address */ 157 unsigned char p_filesz[8]; /* Segment size in file */ 158 unsigned char p_memsz[8]; /* Segment size in memory */ 159 unsigned char p_align[8]; /* Segment alignment, file & memory */ 160 } Elf64_External_Phdr; 161 162 /* 32-bit ELF section header */ 163 164 typedef struct { 165 unsigned char sh_name[4]; /* Section name, index in string tbl */ 166 unsigned char sh_type[4]; /* Type of section */ 167 unsigned char sh_flags[4]; /* Miscellaneous section attributes */ 168 unsigned char sh_addr[4]; /* Section virtual addr at execution */ 169 unsigned char sh_offset[4]; /* Section file offset */ 170 unsigned char sh_size[4]; /* Size of section in bytes */ 171 unsigned char sh_link[4]; /* Index of another section */ 172 unsigned char sh_info[4]; /* Additional section information */ 173 unsigned char sh_addralign[4]; /* Section alignment */ 174 unsigned char sh_entsize[4]; /* Entry size if section holds table */ 175 } Elf32_External_Shdr; 176 177 /* 64-bit ELF section header. */ 178 179 typedef struct { 180 unsigned char sh_name[4]; /* Section name, index in string tbl */ 181 unsigned char sh_type[4]; /* Type of section */ 182 unsigned char sh_flags[8]; /* Miscellaneous section attributes */ 183 unsigned char sh_addr[8]; /* Section virtual addr at execution */ 184 unsigned char sh_offset[8]; /* Section file offset */ 185 unsigned char sh_size[8]; /* Size of section in bytes */ 186 unsigned char sh_link[4]; /* Index of another section */ 187 unsigned char sh_info[4]; /* Additional section information */ 188 unsigned char sh_addralign[8]; /* Section alignment */ 189 unsigned char sh_entsize[8]; /* Entry size if section holds table */ 190 } Elf64_External_Shdr; 191 192 /* Values for sh_type field. */ 193 194 #define SHT_NULL 0 /* Section header table entry unused */ 195 #define SHT_PROGBITS 1 /* Program data */ 196 #define SHT_SYMTAB 2 /* Link editing symbol table */ 197 #define SHT_STRTAB 3 /* A string table */ 198 #define SHT_RELA 4 /* Relocation entries with addends */ 199 #define SHT_REL 9 /* Relocation entries, no addends */ 200 #define SHT_GROUP 17 /* Section contains a section group */ 201 #define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ 202 203 /* Values for sh_flags field. */ 204 205 #define SHF_INFO_LINK 0x00000040 /* `sh_info' contains SHT index */ 206 #define SHF_EXECINSTR 0x00000004 /* Executable section. */ 207 #define SHF_EXCLUDE 0x80000000 /* Link editor is to exclude this 208 section from executable and 209 shared library that it builds 210 when those objects are not to be 211 further relocated. */ 212 /* Symbol table entry. */ 213 214 typedef struct 215 { 216 unsigned char st_name[4]; /* Symbol name (string tbl index) */ 217 unsigned char st_value[4]; /* Symbol value */ 218 unsigned char st_size[4]; /* Symbol size */ 219 unsigned char st_info; /* Symbol type and binding */ 220 unsigned char st_other; /* Symbol visibility */ 221 unsigned char st_shndx[2]; /* Section index */ 222 } Elf32_External_Sym; 223 224 typedef struct 225 { 226 unsigned char st_name[4]; /* Symbol name (string tbl index) */ 227 unsigned char st_info; /* Symbol type and binding */ 228 unsigned char st_other; /* Symbol visibility */ 229 unsigned char st_shndx[2]; /* Section index */ 230 unsigned char st_value[8]; /* Symbol value */ 231 unsigned char st_size[8]; /* Symbol size */ 232 } Elf64_External_Sym; 233 234 #define ELF_ST_BIND(val) (((unsigned char) (val)) >> 4) 235 #define ELF_ST_TYPE(val) ((val) & 0xf) 236 #define ELF_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) 237 238 #define STT_NOTYPE 0 /* Symbol type is unspecified */ 239 #define STT_OBJECT 1 /* Symbol is a data object */ 240 #define STT_FUNC 2 /* Symbol is a code object */ 241 #define STT_TLS 6 /* Thread local data object */ 242 #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ 243 244 #define STB_LOCAL 0 /* Local symbol */ 245 #define STB_GLOBAL 1 /* Global symbol */ 246 #define STB_WEAK 2 /* Weak global */ 247 248 #define STV_DEFAULT 0 /* Visibility is specified by binding type */ 249 #define STV_HIDDEN 2 /* Can only be seen inside currect component */ 250 251 /* Functions to fetch and store different ELF types, depending on the 252 endianness and size. */ 253 254 struct elf_type_functions 255 { 256 unsigned short (*fetch_Elf_Half) (const unsigned char *); 257 unsigned int (*fetch_Elf_Word) (const unsigned char *); 258 ulong_type (*fetch_Elf_Addr) (const unsigned char *); 259 void (*set_Elf_Half) (unsigned char *, unsigned short); 260 void (*set_Elf_Word) (unsigned char *, unsigned int); 261 void (*set_Elf_Addr) (unsigned char *, ulong_type); 262 }; 263 264 static const struct elf_type_functions elf_big_32_functions = 265 { 266 simple_object_fetch_big_16, 267 simple_object_fetch_big_32, 268 simple_object_fetch_big_32_ulong, 269 simple_object_set_big_16, 270 simple_object_set_big_32, 271 simple_object_set_big_32_ulong 272 }; 273 274 static const struct elf_type_functions elf_little_32_functions = 275 { 276 simple_object_fetch_little_16, 277 simple_object_fetch_little_32, 278 simple_object_fetch_little_32_ulong, 279 simple_object_set_little_16, 280 simple_object_set_little_32, 281 simple_object_set_little_32_ulong 282 }; 283 284 #ifdef UNSIGNED_64BIT_TYPE 285 286 static const struct elf_type_functions elf_big_64_functions = 287 { 288 simple_object_fetch_big_16, 289 simple_object_fetch_big_32, 290 simple_object_fetch_big_64, 291 simple_object_set_big_16, 292 simple_object_set_big_32, 293 simple_object_set_big_64 294 }; 295 296 static const struct elf_type_functions elf_little_64_functions = 297 { 298 simple_object_fetch_little_16, 299 simple_object_fetch_little_32, 300 simple_object_fetch_little_64, 301 simple_object_set_little_16, 302 simple_object_set_little_32, 303 simple_object_set_little_64 304 }; 305 306 #endif 307 308 /* Hideous macro to fetch the value of a field from an external ELF 309 struct of some sort. TYPEFUNCS is the set of type functions. 310 BUFFER points to the external data. STRUCTTYPE is the appropriate 311 struct type. FIELD is a field within the struct. TYPE is the type 312 of the field in the struct: Elf_Half, Elf_Word, or Elf_Addr. */ 313 314 #define ELF_FETCH_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE) \ 315 ((TYPEFUNCS)->fetch_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD))) 316 317 /* Even more hideous macro to fetch the value of FIELD from BUFFER. 318 SIZE is 32 or 64. STRUCTTYPE is the name of the struct from 319 elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in 320 the struct. TYPE is the type of the field in the struct: Elf_Half, 321 Elf_Word, or Elf_Addr. */ 322 323 #define ELF_FETCH_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, \ 324 FIELD, TYPE) \ 325 ELF_FETCH_STRUCT_FIELD (TYPEFUNCS, \ 326 Elf ## SIZE ## _External_ ## STRUCTTYPE, \ 327 FIELD, BUFFER, TYPE) 328 329 /* Like ELF_FETCH_SIZED_FIELD but taking an ELFCLASS value. */ 330 331 #define ELF_FETCH_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, \ 332 FIELD, TYPE) \ 333 ((CLASS) == ELFCLASS32 \ 334 ? ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \ 335 TYPE) \ 336 : ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \ 337 TYPE)) 338 339 /* Hideous macro to set the value of a field in an external ELF 340 structure to VAL. TYPEFUNCS is the set of type functions. BUFFER 341 points to the external data. STRUCTTYPE is the appropriate 342 structure type. FIELD is a field within the struct. TYPE is the 343 type of the field in the struct: Elf_Half, Elf_Word, or 344 Elf_Addr. */ 345 346 #define ELF_SET_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE, VAL) \ 347 (TYPEFUNCS)->set_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD), (VAL)) 348 349 /* Even more hideous macro to set the value of FIELD in BUFFER to VAL. 350 SIZE is 32 or 64. STRUCTTYPE is the name of the struct from 351 elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in 352 the struct. TYPE is the type of the field in the struct: Elf_Half, 353 Elf_Word, or Elf_Addr. */ 354 355 #define ELF_SET_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, FIELD, \ 356 TYPE, VAL) \ 357 ELF_SET_STRUCT_FIELD (TYPEFUNCS, \ 358 Elf ## SIZE ## _External_ ## STRUCTTYPE, \ 359 FIELD, BUFFER, TYPE, VAL) 360 361 /* Like ELF_SET_SIZED_FIELD but taking an ELFCLASS value. */ 362 363 #define ELF_SET_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, FIELD, \ 364 TYPE, VAL) \ 365 ((CLASS) == ELFCLASS32 \ 366 ? ELF_SET_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \ 367 TYPE, VAL) \ 368 : ELF_SET_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \ 369 TYPE, VAL)) 370 371 /* Private data for an simple_object_read. */ 372 373 struct simple_object_elf_read 374 { 375 /* Type functions. */ 376 const struct elf_type_functions* type_functions; 377 /* Elf data. */ 378 unsigned char ei_data; 379 /* Elf class. */ 380 unsigned char ei_class; 381 /* ELF OS ABI. */ 382 unsigned char ei_osabi; 383 /* Elf machine number. */ 384 unsigned short machine; 385 /* Processor specific flags. */ 386 unsigned int flags; 387 /* File offset of section headers. */ 388 ulong_type shoff; 389 /* Number of sections. */ 390 unsigned int shnum; 391 /* Index of string table section header. */ 392 unsigned int shstrndx; 393 }; 394 395 /* Private data for an simple_object_attributes. */ 396 397 struct simple_object_elf_attributes 398 { 399 /* Type functions. */ 400 const struct elf_type_functions* type_functions; 401 /* Elf data. */ 402 unsigned char ei_data; 403 /* Elf class. */ 404 unsigned char ei_class; 405 /* ELF OS ABI. */ 406 unsigned char ei_osabi; 407 /* Elf machine number. */ 408 unsigned short machine; 409 /* Processor specific flags. */ 410 unsigned int flags; 411 }; 412 413 /* Private data for an simple_object_write. */ 414 415 struct simple_object_elf_write 416 { 417 struct simple_object_elf_attributes attrs; 418 unsigned char *shdrs; 419 }; 420 421 /* See if we have an ELF file. */ 422 423 static void * 424 simple_object_elf_match (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], 425 int descriptor, off_t offset, 426 const char *segment_name ATTRIBUTE_UNUSED, 427 const char **errmsg, int *err) 428 { 429 unsigned char ei_data; 430 unsigned char ei_class; 431 const struct elf_type_functions *type_functions; 432 unsigned char ehdr[sizeof (Elf64_External_Ehdr)]; 433 struct simple_object_elf_read *eor; 434 435 if (header[EI_MAG0] != ELFMAG0 436 || header[EI_MAG1] != ELFMAG1 437 || header[EI_MAG2] != ELFMAG2 438 || header[EI_MAG3] != ELFMAG3 439 || header[EI_VERSION] != EV_CURRENT) 440 { 441 *errmsg = NULL; 442 *err = 0; 443 return NULL; 444 } 445 446 ei_data = header[EI_DATA]; 447 if (ei_data != ELFDATA2LSB && ei_data != ELFDATA2MSB) 448 { 449 *errmsg = "unknown ELF endianness"; 450 *err = 0; 451 return NULL; 452 } 453 454 ei_class = header[EI_CLASS]; 455 switch (ei_class) 456 { 457 case ELFCLASS32: 458 type_functions = (ei_data == ELFDATA2LSB 459 ? &elf_little_32_functions 460 : &elf_big_32_functions); 461 break; 462 463 case ELFCLASS64: 464 #ifndef UNSIGNED_64BIT_TYPE 465 *errmsg = "64-bit ELF objects not supported"; 466 *err = 0; 467 return NULL; 468 #else 469 type_functions = (ei_data == ELFDATA2LSB 470 ? &elf_little_64_functions 471 : &elf_big_64_functions); 472 break; 473 #endif 474 475 default: 476 *errmsg = "unrecognized ELF size"; 477 *err = 0; 478 return NULL; 479 } 480 481 if (!simple_object_internal_read (descriptor, offset, ehdr, sizeof ehdr, 482 errmsg, err)) 483 return NULL; 484 485 eor = XNEW (struct simple_object_elf_read); 486 eor->type_functions = type_functions; 487 eor->ei_data = ei_data; 488 eor->ei_class = ei_class; 489 eor->ei_osabi = header[EI_OSABI]; 490 eor->machine = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, 491 e_machine, Elf_Half); 492 eor->flags = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, 493 e_flags, Elf_Word); 494 eor->shoff = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, 495 e_shoff, Elf_Addr); 496 eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, 497 e_shnum, Elf_Half); 498 eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, 499 e_shstrndx, Elf_Half); 500 501 if ((eor->shnum == 0 || eor->shstrndx == SHN_XINDEX) 502 && eor->shoff != 0) 503 { 504 unsigned char shdr[sizeof (Elf64_External_Shdr)]; 505 506 /* Object file has more than 0xffff sections. */ 507 508 if (!simple_object_internal_read (descriptor, offset + eor->shoff, shdr, 509 (ei_class == ELFCLASS32 510 ? sizeof (Elf32_External_Shdr) 511 : sizeof (Elf64_External_Shdr)), 512 errmsg, err)) 513 { 514 XDELETE (eor); 515 return NULL; 516 } 517 518 if (eor->shnum == 0) 519 eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 520 shdr, sh_size, Elf_Addr); 521 522 if (eor->shstrndx == SHN_XINDEX) 523 { 524 eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 525 shdr, sh_link, Elf_Word); 526 527 /* Versions of the GNU binutils between 2.12 and 2.18 did 528 not handle objects with more than SHN_LORESERVE sections 529 correctly. All large section indexes were offset by 530 0x100. There is more information at 531 https://sourceware.org/PR5900 . 532 Fortunately these object files are easy to detect, as the 533 GNU binutils always put the section header string table 534 near the end of the list of sections. Thus if the 535 section header string table index is larger than the 536 number of sections, then we know we have to subtract 537 0x100 to get the real section index. */ 538 if (eor->shstrndx >= eor->shnum 539 && eor->shstrndx >= SHN_LORESERVE + 0x100) 540 eor->shstrndx -= 0x100; 541 } 542 } 543 544 if (eor->shstrndx >= eor->shnum) 545 { 546 *errmsg = "invalid ELF shstrndx >= shnum"; 547 *err = 0; 548 XDELETE (eor); 549 return NULL; 550 } 551 552 if (eor->shstrndx == 0) 553 { 554 *errmsg = "invalid ELF shstrndx == 0"; 555 *err = 0; 556 XDELETE (eor); 557 return NULL; 558 } 559 560 return (void *) eor; 561 } 562 563 /* Find all sections in an ELF file. */ 564 565 static const char * 566 simple_object_elf_find_sections (simple_object_read *sobj, 567 int (*pfn) (void *, const char *, 568 off_t offset, off_t length), 569 void *data, 570 int *err) 571 { 572 struct simple_object_elf_read *eor 573 = (struct simple_object_elf_read *) sobj->data; 574 const struct elf_type_functions *type_functions = eor->type_functions; 575 unsigned char ei_class = eor->ei_class; 576 size_t shdr_size; 577 unsigned int shnum; 578 unsigned char *shdrs; 579 const char *errmsg; 580 unsigned char *shstrhdr; 581 size_t name_size; 582 off_t shstroff; 583 unsigned char *names; 584 unsigned int i; 585 586 shdr_size = (ei_class == ELFCLASS32 587 ? sizeof (Elf32_External_Shdr) 588 : sizeof (Elf64_External_Shdr)); 589 590 /* Read the section headers. We skip section 0, which is not a 591 useful section. */ 592 593 shnum = eor->shnum; 594 shdrs = XNEWVEC (unsigned char, shdr_size * (shnum - 1)); 595 596 if (!simple_object_internal_read (sobj->descriptor, 597 sobj->offset + eor->shoff + shdr_size, 598 shdrs, 599 shdr_size * (shnum - 1), 600 &errmsg, err)) 601 { 602 XDELETEVEC (shdrs); 603 return errmsg; 604 } 605 606 /* Read the section names. */ 607 608 shstrhdr = shdrs + (eor->shstrndx - 1) * shdr_size; 609 name_size = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 610 shstrhdr, sh_size, Elf_Addr); 611 shstroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 612 shstrhdr, sh_offset, Elf_Addr); 613 names = XNEWVEC (unsigned char, name_size); 614 if (!simple_object_internal_read (sobj->descriptor, 615 sobj->offset + shstroff, 616 names, name_size, &errmsg, err)) 617 { 618 XDELETEVEC (names); 619 XDELETEVEC (shdrs); 620 return errmsg; 621 } 622 623 for (i = 1; i < shnum; ++i) 624 { 625 unsigned char *shdr; 626 unsigned int sh_name; 627 const char *name; 628 off_t offset; 629 off_t length; 630 631 shdr = shdrs + (i - 1) * shdr_size; 632 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 633 shdr, sh_name, Elf_Word); 634 if (sh_name >= name_size) 635 { 636 *err = 0; 637 XDELETEVEC (names); 638 XDELETEVEC (shdrs); 639 return "ELF section name out of range"; 640 } 641 642 name = (const char *) names + sh_name; 643 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 644 shdr, sh_offset, Elf_Addr); 645 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 646 shdr, sh_size, Elf_Addr); 647 648 if (!(*pfn) (data, name, offset, length)) 649 break; 650 } 651 652 XDELETEVEC (names); 653 XDELETEVEC (shdrs); 654 655 return NULL; 656 } 657 658 /* Fetch the attributes for an simple_object_read. */ 659 660 static void * 661 simple_object_elf_fetch_attributes (simple_object_read *sobj, 662 const char **errmsg ATTRIBUTE_UNUSED, 663 int *err ATTRIBUTE_UNUSED) 664 { 665 struct simple_object_elf_read *eor 666 = (struct simple_object_elf_read *) sobj->data; 667 struct simple_object_elf_attributes *ret; 668 669 ret = XNEW (struct simple_object_elf_attributes); 670 ret->type_functions = eor->type_functions; 671 ret->ei_data = eor->ei_data; 672 ret->ei_class = eor->ei_class; 673 ret->ei_osabi = eor->ei_osabi; 674 ret->machine = eor->machine; 675 ret->flags = eor->flags; 676 return ret; 677 } 678 679 /* Release the privata data for an simple_object_read. */ 680 681 static void 682 simple_object_elf_release_read (void *data) 683 { 684 XDELETE (data); 685 } 686 687 /* Compare two attributes structures. */ 688 689 static const char * 690 simple_object_elf_attributes_merge (void *todata, void *fromdata, int *err) 691 { 692 struct simple_object_elf_attributes *to 693 = (struct simple_object_elf_attributes *) todata; 694 struct simple_object_elf_attributes *from 695 = (struct simple_object_elf_attributes *) fromdata; 696 697 if (to->ei_data != from->ei_data || to->ei_class != from->ei_class) 698 { 699 *err = 0; 700 return "ELF object format mismatch"; 701 } 702 703 if (to->machine != from->machine) 704 { 705 int ok; 706 707 /* EM_SPARC and EM_SPARC32PLUS are compatible and force an 708 output of EM_SPARC32PLUS. */ 709 ok = 0; 710 switch (to->machine) 711 { 712 case EM_SPARC: 713 if (from->machine == EM_SPARC32PLUS) 714 { 715 to->machine = from->machine; 716 ok = 1; 717 } 718 break; 719 720 case EM_SPARC32PLUS: 721 if (from->machine == EM_SPARC) 722 ok = 1; 723 break; 724 725 default: 726 break; 727 } 728 729 if (!ok) 730 { 731 *err = 0; 732 return "ELF machine number mismatch"; 733 } 734 } 735 736 return NULL; 737 } 738 739 /* Release the private data for an attributes structure. */ 740 741 static void 742 simple_object_elf_release_attributes (void *data) 743 { 744 XDELETE (data); 745 } 746 747 /* Prepare to write out a file. */ 748 749 static void * 750 simple_object_elf_start_write (void *attributes_data, 751 const char **errmsg ATTRIBUTE_UNUSED, 752 int *err ATTRIBUTE_UNUSED) 753 { 754 struct simple_object_elf_attributes *attrs 755 = (struct simple_object_elf_attributes *) attributes_data; 756 struct simple_object_elf_write *ret; 757 758 /* We're just going to record the attributes, but we need to make a 759 copy because the user may delete them. */ 760 ret = XNEW (struct simple_object_elf_write); 761 ret->attrs = *attrs; 762 ret->shdrs = NULL; 763 return ret; 764 } 765 766 /* Write out an ELF ehdr. */ 767 768 static int 769 simple_object_elf_write_ehdr (simple_object_write *sobj, int descriptor, 770 const char **errmsg, int *err) 771 { 772 struct simple_object_elf_attributes *attrs 773 = (struct simple_object_elf_attributes *) sobj->data; 774 const struct elf_type_functions* fns; 775 unsigned char cl; 776 size_t ehdr_size; 777 unsigned char buf[sizeof (Elf64_External_Ehdr)]; 778 simple_object_write_section *section; 779 unsigned int shnum; 780 unsigned int shstrndx; 781 782 fns = attrs->type_functions; 783 cl = attrs->ei_class; 784 785 shnum = 0; 786 for (section = sobj->sections; section != NULL; section = section->next) 787 ++shnum; 788 if (shnum > 0) 789 { 790 /* Add a section header for the dummy section and one for 791 .shstrtab. */ 792 shnum += 2; 793 } 794 795 ehdr_size = (cl == ELFCLASS32 796 ? sizeof (Elf32_External_Ehdr) 797 : sizeof (Elf64_External_Ehdr)); 798 memset (buf, 0, sizeof (Elf64_External_Ehdr)); 799 800 buf[EI_MAG0] = ELFMAG0; 801 buf[EI_MAG1] = ELFMAG1; 802 buf[EI_MAG2] = ELFMAG2; 803 buf[EI_MAG3] = ELFMAG3; 804 buf[EI_CLASS] = cl; 805 buf[EI_DATA] = attrs->ei_data; 806 buf[EI_VERSION] = EV_CURRENT; 807 buf[EI_OSABI] = attrs->ei_osabi; 808 809 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_type, Elf_Half, ET_REL); 810 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_machine, Elf_Half, attrs->machine); 811 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_version, Elf_Word, EV_CURRENT); 812 /* e_entry left as zero. */ 813 /* e_phoff left as zero. */ 814 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shoff, Elf_Addr, ehdr_size); 815 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_flags, Elf_Word, attrs->flags); 816 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_ehsize, Elf_Half, ehdr_size); 817 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_phentsize, Elf_Half, 818 (cl == ELFCLASS32 819 ? sizeof (Elf32_External_Phdr) 820 : sizeof (Elf64_External_Phdr))); 821 /* e_phnum left as zero. */ 822 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shentsize, Elf_Half, 823 (cl == ELFCLASS32 824 ? sizeof (Elf32_External_Shdr) 825 : sizeof (Elf64_External_Shdr))); 826 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shnum, Elf_Half, 827 shnum >= SHN_LORESERVE ? 0 : shnum); 828 if (shnum == 0) 829 shstrndx = 0; 830 else 831 { 832 shstrndx = shnum - 1; 833 if (shstrndx >= SHN_LORESERVE) 834 shstrndx = SHN_XINDEX; 835 } 836 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shstrndx, Elf_Half, shstrndx); 837 838 return simple_object_internal_write (descriptor, 0, buf, ehdr_size, 839 errmsg, err); 840 } 841 842 /* Write out an ELF shdr. */ 843 844 static int 845 simple_object_elf_write_shdr (simple_object_write *sobj, int descriptor, 846 off_t offset, unsigned int sh_name, 847 unsigned int sh_type, unsigned int sh_flags, 848 off_t sh_addr, 849 unsigned int sh_offset, unsigned int sh_size, 850 unsigned int sh_link, unsigned int sh_info, 851 size_t sh_addralign, 852 size_t sh_entsize, 853 const char **errmsg, int *err) 854 { 855 struct simple_object_elf_attributes *attrs 856 = (struct simple_object_elf_attributes *) sobj->data; 857 const struct elf_type_functions* fns; 858 unsigned char cl; 859 size_t shdr_size; 860 unsigned char buf[sizeof (Elf64_External_Shdr)]; 861 862 fns = attrs->type_functions; 863 cl = attrs->ei_class; 864 865 shdr_size = (cl == ELFCLASS32 866 ? sizeof (Elf32_External_Shdr) 867 : sizeof (Elf64_External_Shdr)); 868 memset (buf, 0, sizeof (Elf64_External_Shdr)); 869 870 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_name, Elf_Word, sh_name); 871 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_type, Elf_Word, sh_type); 872 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_flags, Elf_Addr, sh_flags); 873 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addr, Elf_Addr, sh_addr); 874 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_offset, Elf_Addr, sh_offset); 875 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_size, Elf_Addr, sh_size); 876 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_link, Elf_Word, sh_link); 877 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_info, Elf_Word, sh_info); 878 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addralign, Elf_Addr, sh_addralign); 879 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_entsize, Elf_Addr, sh_entsize); 880 881 return simple_object_internal_write (descriptor, offset, buf, shdr_size, 882 errmsg, err); 883 } 884 885 /* Write out a complete ELF file. 886 Ehdr 887 initial dummy Shdr 888 user-created Shdrs 889 .shstrtab Shdr 890 user-created section data 891 .shstrtab data */ 892 893 static const char * 894 simple_object_elf_write_to_file (simple_object_write *sobj, int descriptor, 895 int *err) 896 { 897 struct simple_object_elf_write *eow 898 = (struct simple_object_elf_write *) sobj->data; 899 struct simple_object_elf_attributes *attrs = &eow->attrs; 900 unsigned char cl; 901 size_t ehdr_size; 902 size_t shdr_size; 903 const char *errmsg; 904 simple_object_write_section *section; 905 unsigned int shnum; 906 size_t shdr_offset; 907 size_t sh_offset; 908 unsigned int first_sh_size; 909 unsigned int first_sh_link; 910 size_t sh_name; 911 unsigned char zero; 912 unsigned secnum; 913 914 if (!simple_object_elf_write_ehdr (sobj, descriptor, &errmsg, err)) 915 return errmsg; 916 917 cl = attrs->ei_class; 918 if (cl == ELFCLASS32) 919 { 920 ehdr_size = sizeof (Elf32_External_Ehdr); 921 shdr_size = sizeof (Elf32_External_Shdr); 922 } 923 else 924 { 925 ehdr_size = sizeof (Elf64_External_Ehdr); 926 shdr_size = sizeof (Elf64_External_Shdr); 927 } 928 929 shnum = 0; 930 for (section = sobj->sections; section != NULL; section = section->next) 931 ++shnum; 932 if (shnum == 0) 933 return NULL; 934 935 /* Add initial dummy Shdr and .shstrtab. */ 936 shnum += 2; 937 938 shdr_offset = ehdr_size; 939 sh_offset = shdr_offset + shnum * shdr_size; 940 941 if (shnum < SHN_LORESERVE) 942 first_sh_size = 0; 943 else 944 first_sh_size = shnum; 945 if (shnum - 1 < SHN_LORESERVE) 946 first_sh_link = 0; 947 else 948 first_sh_link = shnum - 1; 949 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, 950 0, 0, 0, 0, 0, first_sh_size, first_sh_link, 951 0, 0, 0, &errmsg, err)) 952 return errmsg; 953 954 shdr_offset += shdr_size; 955 956 sh_name = 1; 957 secnum = 0; 958 for (section = sobj->sections; section != NULL; section = section->next) 959 { 960 size_t mask; 961 size_t new_sh_offset; 962 size_t sh_size; 963 struct simple_object_write_section_buffer *buffer; 964 unsigned int sh_type = SHT_PROGBITS; 965 unsigned int sh_flags = 0; 966 off_t sh_addr = 0; 967 unsigned int sh_link = 0; 968 unsigned int sh_info = 0; 969 size_t sh_addralign = 1U << section->align; 970 size_t sh_entsize = 0; 971 if (eow->shdrs) 972 { 973 sh_type = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 974 eow->shdrs + secnum * shdr_size, 975 sh_type, Elf_Word); 976 sh_flags = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 977 eow->shdrs + secnum * shdr_size, 978 sh_flags, Elf_Addr); 979 sh_addr = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 980 eow->shdrs + secnum * shdr_size, 981 sh_addr, Elf_Addr); 982 sh_link = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 983 eow->shdrs + secnum * shdr_size, 984 sh_link, Elf_Word); 985 sh_info = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 986 eow->shdrs + secnum * shdr_size, 987 sh_info, Elf_Word); 988 sh_addralign = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 989 eow->shdrs + secnum * shdr_size, 990 sh_addralign, Elf_Addr); 991 sh_entsize = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr, 992 eow->shdrs + secnum * shdr_size, 993 sh_entsize, Elf_Addr); 994 secnum++; 995 } 996 997 mask = sh_addralign - 1; 998 new_sh_offset = sh_offset + mask; 999 new_sh_offset &= ~ mask; 1000 while (new_sh_offset > sh_offset) 1001 { 1002 unsigned char zeroes[16]; 1003 size_t write; 1004 1005 memset (zeroes, 0, sizeof zeroes); 1006 write = new_sh_offset - sh_offset; 1007 if (write > sizeof zeroes) 1008 write = sizeof zeroes; 1009 if (!simple_object_internal_write (descriptor, sh_offset, zeroes, 1010 write, &errmsg, err)) 1011 return errmsg; 1012 sh_offset += write; 1013 } 1014 1015 sh_size = 0; 1016 for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) 1017 { 1018 if (!simple_object_internal_write (descriptor, sh_offset + sh_size, 1019 ((const unsigned char *) 1020 buffer->buffer), 1021 buffer->size, &errmsg, err)) 1022 return errmsg; 1023 sh_size += buffer->size; 1024 } 1025 1026 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, 1027 sh_name, sh_type, sh_flags, 1028 sh_addr, sh_offset, 1029 sh_size, sh_link, sh_info, 1030 sh_addralign, sh_entsize, 1031 &errmsg, err)) 1032 return errmsg; 1033 1034 shdr_offset += shdr_size; 1035 sh_name += strlen (section->name) + 1; 1036 sh_offset += sh_size; 1037 } 1038 1039 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, 1040 sh_name, SHT_STRTAB, 0, 0, sh_offset, 1041 sh_name + strlen (".shstrtab") + 1, 0, 0, 1042 1, 0, &errmsg, err)) 1043 return errmsg; 1044 1045 /* .shstrtab has a leading zero byte. */ 1046 zero = 0; 1047 if (!simple_object_internal_write (descriptor, sh_offset, &zero, 1, 1048 &errmsg, err)) 1049 return errmsg; 1050 ++sh_offset; 1051 1052 for (section = sobj->sections; section != NULL; section = section->next) 1053 { 1054 size_t len; 1055 1056 len = strlen (section->name) + 1; 1057 if (!simple_object_internal_write (descriptor, sh_offset, 1058 (const unsigned char *) section->name, 1059 len, &errmsg, err)) 1060 return errmsg; 1061 sh_offset += len; 1062 } 1063 1064 if (!simple_object_internal_write (descriptor, sh_offset, 1065 (const unsigned char *) ".shstrtab", 1066 strlen (".shstrtab") + 1, &errmsg, err)) 1067 return errmsg; 1068 1069 return NULL; 1070 } 1071 1072 /* Release the private data for an simple_object_write structure. */ 1073 1074 static void 1075 simple_object_elf_release_write (void *data) 1076 { 1077 struct simple_object_elf_write *eow = (struct simple_object_elf_write *) data; 1078 if (eow->shdrs) 1079 XDELETE (eow->shdrs); 1080 XDELETE (data); 1081 } 1082 1083 /* Copy all sections in an ELF file. */ 1084 1085 static const char * 1086 simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj, 1087 simple_object_write *dobj, 1088 char *(*pfn) (const char *), 1089 int *err) 1090 { 1091 struct simple_object_elf_read *eor 1092 = (struct simple_object_elf_read *) sobj->data; 1093 const struct elf_type_functions *type_functions = eor->type_functions; 1094 struct simple_object_elf_write *eow 1095 = (struct simple_object_elf_write *) dobj->data; 1096 unsigned char ei_class = eor->ei_class; 1097 size_t shdr_size; 1098 unsigned int shnum; 1099 unsigned char *shdrs; 1100 const char *errmsg; 1101 unsigned char *shstrhdr; 1102 size_t name_size; 1103 off_t shstroff; 1104 unsigned char *names; 1105 unsigned int i; 1106 int changed; 1107 int *pfnret; 1108 const char **pfnname; 1109 unsigned new_i, new_count; 1110 unsigned *sh_map; 1111 unsigned first_shndx = 0; 1112 unsigned int *symtab_indices_shndx; 1113 int pass_symtab_indices_shndx; 1114 unsigned int first_symtab_indices_shndx; 1115 unsigned char **symtab_indices_shndx_buf; 1116 1117 shdr_size = (ei_class == ELFCLASS32 1118 ? sizeof (Elf32_External_Shdr) 1119 : sizeof (Elf64_External_Shdr)); 1120 1121 /* Read the section headers. We skip section 0, which is not a 1122 useful section. */ 1123 1124 shnum = eor->shnum; 1125 shdrs = XNEWVEC (unsigned char, shdr_size * (shnum - 1)); 1126 1127 if (!simple_object_internal_read (sobj->descriptor, 1128 sobj->offset + eor->shoff + shdr_size, 1129 shdrs, 1130 shdr_size * (shnum - 1), 1131 &errmsg, err)) 1132 { 1133 XDELETEVEC (shdrs); 1134 return errmsg; 1135 } 1136 1137 /* Read the section names. */ 1138 1139 shstrhdr = shdrs + (eor->shstrndx - 1) * shdr_size; 1140 name_size = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1141 shstrhdr, sh_size, Elf_Addr); 1142 shstroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1143 shstrhdr, sh_offset, Elf_Addr); 1144 names = XNEWVEC (unsigned char, name_size); 1145 if (!simple_object_internal_read (sobj->descriptor, 1146 sobj->offset + shstroff, 1147 names, name_size, &errmsg, err)) 1148 { 1149 XDELETEVEC (names); 1150 XDELETEVEC (shdrs); 1151 return errmsg; 1152 } 1153 1154 pfnret = XNEWVEC (int, shnum); 1155 pfnname = XNEWVEC (const char *, shnum); 1156 1157 /* Map of symtab to index section. */ 1158 symtab_indices_shndx = XCNEWVEC (unsigned int, shnum - 1); 1159 1160 /* First perform the callbacks to know which sections to preserve and 1161 what name to use for those. */ 1162 for (i = 1; i < shnum; ++i) 1163 { 1164 unsigned char *shdr; 1165 unsigned int sh_name, sh_type; 1166 const char *name; 1167 char *ret; 1168 1169 shdr = shdrs + (i - 1) * shdr_size; 1170 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1171 shdr, sh_name, Elf_Word); 1172 if (sh_name >= name_size) 1173 { 1174 *err = 0; 1175 XDELETEVEC (names); 1176 XDELETEVEC (shdrs); 1177 return "ELF section name out of range"; 1178 } 1179 1180 name = (const char *) names + sh_name; 1181 1182 ret = (*pfn) (name); 1183 pfnret[i - 1] = ret == NULL ? -1 : 0; 1184 pfnname[i - 1] = ret == NULL ? name : ret; 1185 if (first_shndx == 0 && pfnret[i - 1] == 0) 1186 first_shndx = i; 1187 1188 /* Remember the indexes of existing SHT_SYMTAB_SHNDX sections. */ 1189 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1190 shdr, sh_type, Elf_Word); 1191 if (sh_type == SHT_SYMTAB_SHNDX) 1192 { 1193 unsigned int sh_link; 1194 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1195 shdr, sh_link, Elf_Word); 1196 symtab_indices_shndx[sh_link - 1] = i; 1197 /* Discard the extended index sections, after copying it will not 1198 be needed, unless we need more than SHN_LORESERVE - 1 sections 1199 in the output. This way we don't need to update it and deal with 1200 the ordering constraints of processing the existing symtab and 1201 changing the index. */ 1202 pfnret[i - 1] = -1; 1203 } 1204 } 1205 1206 /* Mark sections as preserved that are required by to be preserved 1207 sections. */ 1208 do 1209 { 1210 changed = 0; 1211 for (i = 1; i < shnum; ++i) 1212 { 1213 unsigned char *shdr; 1214 unsigned int sh_type, sh_info, sh_link; 1215 off_t offset; 1216 off_t length; 1217 1218 shdr = shdrs + (i - 1) * shdr_size; 1219 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1220 shdr, sh_type, Elf_Word); 1221 sh_info = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1222 shdr, sh_info, Elf_Word); 1223 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1224 shdr, sh_link, Elf_Word); 1225 if (sh_type == SHT_GROUP) 1226 { 1227 /* Mark groups containing copied sections. */ 1228 unsigned entsize = ELF_FETCH_FIELD (type_functions, ei_class, 1229 Shdr, shdr, sh_entsize, 1230 Elf_Addr); 1231 unsigned char *ent, *buf; 1232 int keep = 0; 1233 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1234 shdr, sh_offset, Elf_Addr); 1235 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1236 shdr, sh_size, Elf_Addr); 1237 buf = XNEWVEC (unsigned char, length); 1238 if (!simple_object_internal_read (sobj->descriptor, 1239 sobj->offset + offset, buf, 1240 (size_t) length, &errmsg, err)) 1241 { 1242 XDELETEVEC (buf); 1243 XDELETEVEC (names); 1244 XDELETEVEC (shdrs); 1245 return errmsg; 1246 } 1247 for (ent = buf + entsize; ent < buf + length; ent += entsize) 1248 { 1249 unsigned sec = type_functions->fetch_Elf_Word (ent); 1250 if (pfnret[sec - 1] == 0) 1251 keep = 1; 1252 } 1253 if (keep) 1254 { 1255 changed |= (pfnret[sh_link - 1] == -1 1256 || pfnret[i - 1] == -1); 1257 pfnret[sh_link - 1] = 0; 1258 pfnret[i - 1] = 0; 1259 } 1260 } 1261 if (sh_type == SHT_RELA 1262 || sh_type == SHT_REL) 1263 { 1264 /* Mark relocation sections and symtab of copied sections. */ 1265 if (pfnret[sh_info - 1] == 0) 1266 { 1267 changed |= (pfnret[sh_link - 1] == -1 1268 || pfnret[i - 1] == -1); 1269 pfnret[sh_link - 1] = 0; 1270 pfnret[i - 1] = 0; 1271 } 1272 } 1273 if (sh_type == SHT_SYMTAB) 1274 { 1275 /* Mark strings sections of copied symtabs. */ 1276 if (pfnret[i - 1] == 0) 1277 { 1278 changed |= pfnret[sh_link - 1] == -1; 1279 pfnret[sh_link - 1] = 0; 1280 } 1281 } 1282 } 1283 } 1284 while (changed); 1285 1286 /* Compute a mapping of old -> new section numbers. */ 1287 sh_map = XNEWVEC (unsigned, shnum); 1288 sh_map[0] = 0; 1289 new_i = 1; 1290 for (i = 1; i < shnum; ++i) 1291 { 1292 if (pfnret[i - 1] == -1) 1293 sh_map[i] = 0; 1294 else 1295 sh_map[i] = new_i++; 1296 } 1297 first_symtab_indices_shndx = new_i; 1298 symtab_indices_shndx_buf = NULL; 1299 if (new_i - 1 >= SHN_LORESERVE) 1300 for (i = 1; i < shnum; ++i) 1301 if (pfnret[i - 1] == 0 && symtab_indices_shndx[i - 1] != 0) 1302 { 1303 pfnret[symtab_indices_shndx[i - 1] - 1] = 0; 1304 sh_map[symtab_indices_shndx[i - 1]] = new_i++; 1305 } 1306 new_count = new_i; 1307 if (new_count != first_symtab_indices_shndx) 1308 symtab_indices_shndx_buf 1309 = XNEWVEC (unsigned char *, new_count - first_symtab_indices_shndx); 1310 eow->shdrs = XNEWVEC (unsigned char, shdr_size * (new_count - 1)); 1311 1312 /* Then perform the actual copying. */ 1313 new_i = 0; 1314 pass_symtab_indices_shndx = 0; 1315 for (i = 1; i <= shnum; ++i) 1316 { 1317 unsigned char *shdr; 1318 unsigned int sh_name, sh_type; 1319 const char *name; 1320 off_t offset; 1321 off_t length; 1322 simple_object_write_section *dest; 1323 off_t flags; 1324 unsigned char *buf; 1325 1326 if (i == shnum) 1327 { 1328 if (new_count - 1 < SHN_LORESERVE || pass_symtab_indices_shndx) 1329 break; 1330 i = 0; 1331 pass_symtab_indices_shndx = 1; 1332 continue; 1333 } 1334 1335 if (pfnret[i - 1]) 1336 continue; 1337 1338 shdr = shdrs + (i - 1) * shdr_size; 1339 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1340 shdr, sh_type, Elf_Word); 1341 if (sh_type == SHT_SYMTAB_SHNDX) 1342 { 1343 if (!pass_symtab_indices_shndx) 1344 continue; 1345 } 1346 else if (pass_symtab_indices_shndx) 1347 continue; 1348 1349 new_i++; 1350 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1351 shdr, sh_name, Elf_Word); 1352 if (sh_name >= name_size) 1353 { 1354 *err = 0; 1355 XDELETEVEC (names); 1356 XDELETEVEC (shdrs); 1357 XDELETEVEC (symtab_indices_shndx); 1358 XDELETEVEC (symtab_indices_shndx_buf); 1359 return "ELF section name out of range"; 1360 } 1361 1362 name = pfnname[i - 1]; 1363 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1364 shdr, sh_offset, Elf_Addr); 1365 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1366 shdr, sh_size, Elf_Addr); 1367 1368 dest = simple_object_write_create_section (dobj, name, 0, &errmsg, err); 1369 if (dest == NULL) 1370 { 1371 XDELETEVEC (names); 1372 XDELETEVEC (shdrs); 1373 XDELETEVEC (symtab_indices_shndx); 1374 XDELETEVEC (symtab_indices_shndx_buf); 1375 return errmsg; 1376 } 1377 1378 /* Record the SHDR of the source. */ 1379 memcpy (eow->shdrs + (new_i - 1) * shdr_size, shdr, shdr_size); 1380 shdr = eow->shdrs + (new_i - 1) * shdr_size; 1381 1382 /* Copy the data. 1383 ??? This is quite wasteful and ideally would be delayed until 1384 write_to_file (). Thus it questions the interfacing 1385 which eventually should contain destination creation plus 1386 writing. */ 1387 buf = XNEWVEC (unsigned char, length); 1388 if (!simple_object_internal_read (sobj->descriptor, 1389 sobj->offset + offset, buf, 1390 (size_t) length, &errmsg, err)) 1391 { 1392 XDELETEVEC (buf); 1393 XDELETEVEC (names); 1394 XDELETEVEC (shdrs); 1395 XDELETEVEC (symtab_indices_shndx); 1396 XDELETEVEC (symtab_indices_shndx_buf); 1397 return errmsg; 1398 } 1399 1400 /* If we are processing .symtab purge any symbols 1401 in discarded sections. */ 1402 if (sh_type == SHT_SYMTAB) 1403 { 1404 unsigned entsize = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1405 shdr, sh_entsize, Elf_Addr); 1406 size_t prevailing_name_idx = 0; 1407 unsigned char *ent; 1408 unsigned *shndx_table = NULL; 1409 /* Read the section index table if present. */ 1410 if (symtab_indices_shndx[i - 1] != 0) 1411 { 1412 unsigned char *sidxhdr 1413 = shdrs + (symtab_indices_shndx[i - 1] - 1) * shdr_size; 1414 off_t sidxoff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1415 sidxhdr, sh_offset, Elf_Addr); 1416 size_t sidxsz = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1417 sidxhdr, sh_size, Elf_Addr); 1418 unsigned int shndx_type 1419 = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1420 sidxhdr, sh_type, Elf_Word); 1421 if (shndx_type != SHT_SYMTAB_SHNDX) 1422 return "Wrong section type of a SYMTAB SECTION INDICES section"; 1423 shndx_table = (unsigned *) XNEWVEC (char, sidxsz); 1424 if (!simple_object_internal_read (sobj->descriptor, 1425 sobj->offset + sidxoff, 1426 (unsigned char *) shndx_table, 1427 sidxsz, &errmsg, err)) 1428 { 1429 XDELETEVEC (buf); 1430 XDELETEVEC (names); 1431 XDELETEVEC (shdrs); 1432 XDELETEVEC (symtab_indices_shndx); 1433 XDELETEVEC (shndx_table); 1434 XDELETEVEC (symtab_indices_shndx_buf); 1435 return errmsg; 1436 } 1437 } 1438 1439 /* Find a WEAK HIDDEN symbol which name we will use for removed 1440 symbols. We know there's a prevailing weak hidden symbol 1441 at the start of the .debug_info section. */ 1442 for (ent = buf; ent < buf + length; ent += entsize) 1443 { 1444 unsigned st_shndx = ELF_FETCH_FIELD (type_functions, ei_class, 1445 Sym, ent, 1446 st_shndx, Elf_Half); 1447 unsigned char *st_info; 1448 unsigned char *st_other; 1449 if (ei_class == ELFCLASS32) 1450 { 1451 st_info = &((Elf32_External_Sym *) ent)->st_info; 1452 st_other = &((Elf32_External_Sym *) ent)->st_other; 1453 } 1454 else 1455 { 1456 st_info = &((Elf64_External_Sym *) ent)->st_info; 1457 st_other = &((Elf64_External_Sym *) ent)->st_other; 1458 } 1459 if (st_shndx == SHN_XINDEX) 1460 { 1461 unsigned char *ndx_ptr 1462 = (unsigned char *) (shndx_table + (ent - buf) / entsize); 1463 st_shndx = type_functions->fetch_Elf_Word (ndx_ptr); 1464 } 1465 1466 if (st_shndx != SHN_COMMON 1467 && !(st_shndx != SHN_UNDEF 1468 && st_shndx < shnum 1469 && pfnret[st_shndx - 1] == -1) 1470 && ELF_ST_BIND (*st_info) == STB_WEAK 1471 && *st_other == STV_HIDDEN) 1472 { 1473 prevailing_name_idx = ELF_FETCH_FIELD (type_functions, 1474 ei_class, Sym, ent, 1475 st_name, Elf_Word); 1476 break; 1477 } 1478 } 1479 1480 for (ent = buf; ent < buf + length; ent += entsize) 1481 { 1482 unsigned st_shndx = ELF_FETCH_FIELD (type_functions, ei_class, 1483 Sym, ent, 1484 st_shndx, Elf_Half); 1485 unsigned raw_st_shndx = st_shndx; 1486 unsigned char *st_info; 1487 unsigned char *st_other; 1488 int discard = 0; 1489 unsigned char *ndx_ptr = NULL; 1490 if (ei_class == ELFCLASS32) 1491 { 1492 st_info = &((Elf32_External_Sym *) ent)->st_info; 1493 st_other = &((Elf32_External_Sym *) ent)->st_other; 1494 } 1495 else 1496 { 1497 st_info = &((Elf64_External_Sym *) ent)->st_info; 1498 st_other = &((Elf64_External_Sym *) ent)->st_other; 1499 } 1500 if (shndx_table) 1501 ndx_ptr 1502 = (unsigned char *) (shndx_table + (ent - buf) / entsize); 1503 1504 if (st_shndx == SHN_XINDEX) 1505 { 1506 st_shndx = type_functions->fetch_Elf_Word (ndx_ptr); 1507 type_functions->set_Elf_Word (ndx_ptr, SHN_UNDEF); 1508 } 1509 /* Eliminate all COMMONs - this includes __gnu_lto_slim 1510 which otherwise cause endless LTO plugin invocation. 1511 FIXME: remove the condition once we remove emission 1512 of __gnu_lto_slim symbol. */ 1513 if (st_shndx == SHN_COMMON) 1514 discard = 1; 1515 /* We also need to remove symbols refering to sections 1516 we'll eventually remove as with fat LTO objects 1517 we otherwise get duplicate symbols at final link 1518 (with GNU ld, gold is fine and ignores symbols in 1519 sections marked as EXCLUDE). ld/20513 */ 1520 else if (st_shndx != SHN_UNDEF 1521 && st_shndx < shnum 1522 && pfnret[st_shndx - 1] == -1) 1523 discard = 1; 1524 /* We also need to remove global UNDEFs which can 1525 cause link fails later. */ 1526 else if (st_shndx == SHN_UNDEF 1527 && ELF_ST_BIND (*st_info) == STB_GLOBAL) 1528 discard = 1; 1529 1530 if (discard) 1531 { 1532 /* Make discarded symbols undefined and unnamed 1533 in case it is local. */ 1534 int bind = ELF_ST_BIND (*st_info); 1535 int other = STV_DEFAULT; 1536 if (bind == STB_LOCAL) 1537 { 1538 /* Make discarded local symbols unnamed and 1539 defined in the first prevailing section. */ 1540 ELF_SET_FIELD (type_functions, ei_class, Sym, 1541 ent, st_name, Elf_Word, 0); 1542 st_shndx = sh_map[first_shndx]; 1543 if (st_shndx >= SHN_LORESERVE) 1544 { 1545 type_functions->set_Elf_Word (ndx_ptr, st_shndx); 1546 st_shndx = SHN_XINDEX; 1547 } 1548 ELF_SET_FIELD (type_functions, ei_class, Sym, 1549 ent, st_shndx, Elf_Half, st_shndx); 1550 } 1551 else 1552 { 1553 /* Make discarded global symbols hidden weak 1554 undefined and sharing a name of a prevailing 1555 symbol. */ 1556 bind = STB_WEAK; 1557 other = STV_HIDDEN; 1558 ELF_SET_FIELD (type_functions, ei_class, Sym, 1559 ent, st_name, Elf_Word, 1560 prevailing_name_idx); 1561 ELF_SET_FIELD (type_functions, ei_class, Sym, 1562 ent, st_shndx, Elf_Half, SHN_UNDEF); 1563 } 1564 *st_other = other; 1565 *st_info = ELF_ST_INFO (bind, STT_NOTYPE); 1566 ELF_SET_FIELD (type_functions, ei_class, Sym, 1567 ent, st_value, Elf_Addr, 0); 1568 ELF_SET_FIELD (type_functions, ei_class, Sym, 1569 ent, st_size, Elf_Word, 0); 1570 } 1571 else if (raw_st_shndx < SHN_LORESERVE 1572 || raw_st_shndx == SHN_XINDEX) 1573 { 1574 /* Remap the section reference. */ 1575 st_shndx = sh_map[st_shndx]; 1576 if (st_shndx >= SHN_LORESERVE) 1577 { 1578 type_functions->set_Elf_Word (ndx_ptr, st_shndx); 1579 st_shndx = SHN_XINDEX; 1580 } 1581 ELF_SET_FIELD (type_functions, ei_class, Sym, 1582 ent, st_shndx, Elf_Half, st_shndx); 1583 } 1584 } 1585 if (symtab_indices_shndx_buf) 1586 symtab_indices_shndx_buf[sh_map[symtab_indices_shndx[i - 1]] 1587 - first_symtab_indices_shndx] 1588 = (unsigned char *) shndx_table; 1589 else 1590 XDELETEVEC (shndx_table); 1591 } 1592 else if (sh_type == SHT_GROUP) 1593 { 1594 /* Remap section indices in groups and remove removed members. */ 1595 unsigned char *ent, *dst; 1596 for (dst = ent = buf + 4; ent < buf + length; ent += 4) 1597 { 1598 unsigned shndx = type_functions->fetch_Elf_Word (ent); 1599 if (pfnret[shndx - 1] == -1) 1600 ; 1601 else 1602 { 1603 type_functions->set_Elf_Word (dst, sh_map[shndx]); 1604 dst += 4; 1605 } 1606 } 1607 /* Adjust the length. */ 1608 length = dst - buf; 1609 } 1610 else if (sh_type == SHT_SYMTAB_SHNDX) 1611 { 1612 XDELETEVEC (buf); 1613 buf = symtab_indices_shndx_buf[new_i - first_symtab_indices_shndx]; 1614 symtab_indices_shndx_buf[new_i - first_symtab_indices_shndx] = NULL; 1615 } 1616 1617 errmsg = simple_object_write_add_data (dobj, dest, buf, length, 1, err); 1618 XDELETEVEC (buf); 1619 if (errmsg) 1620 { 1621 XDELETEVEC (names); 1622 XDELETEVEC (shdrs); 1623 XDELETEVEC (symtab_indices_shndx); 1624 XDELETEVEC (symtab_indices_shndx_buf); 1625 return errmsg; 1626 } 1627 1628 flags = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1629 shdr, sh_flags, Elf_Addr); 1630 /* Remap the section references. */ 1631 { 1632 unsigned int sh_info, sh_link; 1633 if (flags & SHF_INFO_LINK || sh_type == SHT_REL || sh_type == SHT_RELA) 1634 { 1635 sh_info = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1636 shdr, sh_info, Elf_Word); 1637 sh_info = sh_map[sh_info]; 1638 ELF_SET_FIELD (type_functions, ei_class, Shdr, 1639 shdr, sh_info, Elf_Word, sh_info); 1640 } 1641 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, 1642 shdr, sh_link, Elf_Word); 1643 sh_link = sh_map[sh_link]; 1644 ELF_SET_FIELD (type_functions, ei_class, Shdr, 1645 shdr, sh_link, Elf_Word, sh_link); 1646 } 1647 /* The debugobj doesn't contain any code, thus no trampolines. 1648 Even when the original object needs trampolines, debugobj 1649 doesn't. */ 1650 if (strcmp (name, ".note.GNU-stack") == 0) 1651 flags &= ~SHF_EXECINSTR; 1652 /* Clear SHF_EXCLUDE on to be preserved sections. */ 1653 flags &= ~SHF_EXCLUDE; 1654 ELF_SET_FIELD (type_functions, ei_class, Shdr, 1655 shdr, sh_flags, Elf_Addr, flags); 1656 } 1657 1658 XDELETEVEC (names); 1659 XDELETEVEC (shdrs); 1660 XDELETEVEC (pfnret); 1661 XDELETEVEC (pfnname); 1662 XDELETEVEC (symtab_indices_shndx); 1663 XDELETEVEC (sh_map); 1664 XDELETEVEC (symtab_indices_shndx_buf); 1665 1666 return NULL; 1667 } 1668 1669 1670 /* The ELF functions. */ 1671 1672 const struct simple_object_functions simple_object_elf_functions = 1673 { 1674 simple_object_elf_match, 1675 simple_object_elf_find_sections, 1676 simple_object_elf_fetch_attributes, 1677 simple_object_elf_release_read, 1678 simple_object_elf_attributes_merge, 1679 simple_object_elf_release_attributes, 1680 simple_object_elf_start_write, 1681 simple_object_elf_write_to_file, 1682 simple_object_elf_release_write, 1683 simple_object_elf_copy_lto_debug_sections 1684 }; 1685