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