Move pa.h FUNCTION_ARG_SIZE to pa.c (PR83858)
[official-gcc.git] / libiberty / simple-object-elf.c
blob7468a1adc3dd1da2584d7324d98b9314a18f91ce
1 /* simple-object-elf.c -- routines to manipulate ELF object files.
2 Copyright (C) 2010-2018 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Google.
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.
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.
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. */
20 #include "config.h"
21 #include "libiberty.h"
22 #include "simple-object.h"
24 #include <errno.h>
25 #include <stddef.h>
27 #ifdef HAVE_STDLIB_H
28 #include <stdlib.h>
29 #endif
31 #ifdef HAVE_STDINT_H
32 #include <stdint.h>
33 #endif
35 #ifdef HAVE_STRING_H
36 #include <string.h>
37 #endif
39 #ifdef HAVE_INTTYPES_H
40 #include <inttypes.h>
41 #endif
43 #include "simple-object-common.h"
45 /* ELF structures and constants. */
47 /* 32-bit ELF file header. */
49 typedef struct {
50 unsigned char e_ident[16]; /* ELF "magic number" */
51 unsigned char e_type[2]; /* Identifies object file type */
52 unsigned char e_machine[2]; /* Specifies required architecture */
53 unsigned char e_version[4]; /* Identifies object file version */
54 unsigned char e_entry[4]; /* Entry point virtual address */
55 unsigned char e_phoff[4]; /* Program header table file offset */
56 unsigned char e_shoff[4]; /* Section header table file offset */
57 unsigned char e_flags[4]; /* Processor-specific flags */
58 unsigned char e_ehsize[2]; /* ELF header size in bytes */
59 unsigned char e_phentsize[2]; /* Program header table entry size */
60 unsigned char e_phnum[2]; /* Program header table entry count */
61 unsigned char e_shentsize[2]; /* Section header table entry size */
62 unsigned char e_shnum[2]; /* Section header table entry count */
63 unsigned char e_shstrndx[2]; /* Section header string table index */
64 } Elf32_External_Ehdr;
66 /* 64-bit ELF file header. */
68 typedef struct {
69 unsigned char e_ident[16]; /* ELF "magic number" */
70 unsigned char e_type[2]; /* Identifies object file type */
71 unsigned char e_machine[2]; /* Specifies required architecture */
72 unsigned char e_version[4]; /* Identifies object file version */
73 unsigned char e_entry[8]; /* Entry point virtual address */
74 unsigned char e_phoff[8]; /* Program header table file offset */
75 unsigned char e_shoff[8]; /* Section header table file offset */
76 unsigned char e_flags[4]; /* Processor-specific flags */
77 unsigned char e_ehsize[2]; /* ELF header size in bytes */
78 unsigned char e_phentsize[2]; /* Program header table entry size */
79 unsigned char e_phnum[2]; /* Program header table entry count */
80 unsigned char e_shentsize[2]; /* Section header table entry size */
81 unsigned char e_shnum[2]; /* Section header table entry count */
82 unsigned char e_shstrndx[2]; /* Section header string table index */
83 } Elf64_External_Ehdr;
85 /* Indexes and values in e_ident field of Ehdr. */
87 #define EI_MAG0 0 /* File identification byte 0 index */
88 #define ELFMAG0 0x7F /* Magic number byte 0 */
90 #define EI_MAG1 1 /* File identification byte 1 index */
91 #define ELFMAG1 'E' /* Magic number byte 1 */
93 #define EI_MAG2 2 /* File identification byte 2 index */
94 #define ELFMAG2 'L' /* Magic number byte 2 */
96 #define EI_MAG3 3 /* File identification byte 3 index */
97 #define ELFMAG3 'F' /* Magic number byte 3 */
99 #define EI_CLASS 4 /* File class */
100 #define ELFCLASSNONE 0 /* Invalid class */
101 #define ELFCLASS32 1 /* 32-bit objects */
102 #define ELFCLASS64 2 /* 64-bit objects */
104 #define EI_DATA 5 /* Data encoding */
105 #define ELFDATANONE 0 /* Invalid data encoding */
106 #define ELFDATA2LSB 1 /* 2's complement, little endian */
107 #define ELFDATA2MSB 2 /* 2's complement, big endian */
109 #define EI_VERSION 6 /* File version */
110 #define EV_CURRENT 1 /* Current version */
112 #define EI_OSABI 7 /* Operating System/ABI indication */
114 /* Values for e_type field of Ehdr. */
116 #define ET_REL 1 /* Relocatable file */
118 /* Values for e_machine field of Ehdr. */
120 #define EM_SPARC 2 /* SUN SPARC */
121 #define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
123 /* Special section index values. */
125 #define SHN_UNDEF 0 /* Undefined section */
126 #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
127 #define SHN_COMMON 0xFFF2 /* Associated symbol is in common */
128 #define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */
129 #define SHN_HIRESERVE 0xffff /* End of reserved indices */
132 /* 32-bit ELF program header. */
134 typedef struct {
135 unsigned char p_type[4]; /* Identifies program segment type */
136 unsigned char p_offset[4]; /* Segment file offset */
137 unsigned char p_vaddr[4]; /* Segment virtual address */
138 unsigned char p_paddr[4]; /* Segment physical address */
139 unsigned char p_filesz[4]; /* Segment size in file */
140 unsigned char p_memsz[4]; /* Segment size in memory */
141 unsigned char p_flags[4]; /* Segment flags */
142 unsigned char p_align[4]; /* Segment alignment, file & memory */
143 } Elf32_External_Phdr;
145 /* 64-bit ELF program header. */
147 typedef struct {
148 unsigned char p_type[4]; /* Identifies program segment type */
149 unsigned char p_flags[4]; /* Segment flags */
150 unsigned char p_offset[8]; /* Segment file offset */
151 unsigned char p_vaddr[8]; /* Segment virtual address */
152 unsigned char p_paddr[8]; /* Segment physical address */
153 unsigned char p_filesz[8]; /* Segment size in file */
154 unsigned char p_memsz[8]; /* Segment size in memory */
155 unsigned char p_align[8]; /* Segment alignment, file & memory */
156 } Elf64_External_Phdr;
158 /* 32-bit ELF section header */
160 typedef struct {
161 unsigned char sh_name[4]; /* Section name, index in string tbl */
162 unsigned char sh_type[4]; /* Type of section */
163 unsigned char sh_flags[4]; /* Miscellaneous section attributes */
164 unsigned char sh_addr[4]; /* Section virtual addr at execution */
165 unsigned char sh_offset[4]; /* Section file offset */
166 unsigned char sh_size[4]; /* Size of section in bytes */
167 unsigned char sh_link[4]; /* Index of another section */
168 unsigned char sh_info[4]; /* Additional section information */
169 unsigned char sh_addralign[4]; /* Section alignment */
170 unsigned char sh_entsize[4]; /* Entry size if section holds table */
171 } Elf32_External_Shdr;
173 /* 64-bit ELF section header. */
175 typedef struct {
176 unsigned char sh_name[4]; /* Section name, index in string tbl */
177 unsigned char sh_type[4]; /* Type of section */
178 unsigned char sh_flags[8]; /* Miscellaneous section attributes */
179 unsigned char sh_addr[8]; /* Section virtual addr at execution */
180 unsigned char sh_offset[8]; /* Section file offset */
181 unsigned char sh_size[8]; /* Size of section in bytes */
182 unsigned char sh_link[4]; /* Index of another section */
183 unsigned char sh_info[4]; /* Additional section information */
184 unsigned char sh_addralign[8]; /* Section alignment */
185 unsigned char sh_entsize[8]; /* Entry size if section holds table */
186 } Elf64_External_Shdr;
188 /* Values for sh_type field. */
190 #define SHT_NULL 0 /* Section header table entry unused */
191 #define SHT_PROGBITS 1 /* Program data */
192 #define SHT_SYMTAB 2 /* Link editing symbol table */
193 #define SHT_STRTAB 3 /* A string table */
194 #define SHT_RELA 4 /* Relocation entries with addends */
195 #define SHT_REL 9 /* Relocation entries, no addends */
196 #define SHT_GROUP 17 /* Section contains a section group */
197 #define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
199 /* Values for sh_flags field. */
201 #define SHF_INFO_LINK 0x00000040 /* `sh_info' contains SHT index */
202 #define SHF_EXECINSTR 0x00000004 /* Executable section. */
203 #define SHF_EXCLUDE 0x80000000 /* Link editor is to exclude this
204 section from executable and
205 shared library that it builds
206 when those objects are not to be
207 further relocated. */
208 /* Symbol table entry. */
210 typedef struct
212 unsigned char st_name[4]; /* Symbol name (string tbl index) */
213 unsigned char st_value[4]; /* Symbol value */
214 unsigned char st_size[4]; /* Symbol size */
215 unsigned char st_info; /* Symbol type and binding */
216 unsigned char st_other; /* Symbol visibility */
217 unsigned char st_shndx[2]; /* Section index */
218 } Elf32_External_Sym;
220 typedef struct
222 unsigned char st_name[4]; /* Symbol name (string tbl index) */
223 unsigned char st_info; /* Symbol type and binding */
224 unsigned char st_other; /* Symbol visibility */
225 unsigned char st_shndx[2]; /* Section index */
226 unsigned char st_value[8]; /* Symbol value */
227 unsigned char st_size[8]; /* Symbol size */
228 } Elf64_External_Sym;
230 #define ELF_ST_BIND(val) (((unsigned char) (val)) >> 4)
231 #define ELF_ST_TYPE(val) ((val) & 0xf)
232 #define ELF_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
234 #define STT_NOTYPE 0 /* Symbol type is unspecified */
235 #define STT_OBJECT 1 /* Symbol is a data object */
236 #define STT_FUNC 2 /* Symbol is a code object */
237 #define STT_TLS 6 /* Thread local data object */
238 #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */
240 #define STB_LOCAL 0 /* Local symbol */
241 #define STB_GLOBAL 1 /* Global symbol */
242 #define STB_WEAK 2 /* Weak global */
244 #define STV_DEFAULT 0 /* Visibility is specified by binding type */
245 #define STV_HIDDEN 2 /* Can only be seen inside currect component */
247 /* Functions to fetch and store different ELF types, depending on the
248 endianness and size. */
250 struct elf_type_functions
252 unsigned short (*fetch_Elf_Half) (const unsigned char *);
253 unsigned int (*fetch_Elf_Word) (const unsigned char *);
254 ulong_type (*fetch_Elf_Addr) (const unsigned char *);
255 void (*set_Elf_Half) (unsigned char *, unsigned short);
256 void (*set_Elf_Word) (unsigned char *, unsigned int);
257 void (*set_Elf_Addr) (unsigned char *, ulong_type);
260 static const struct elf_type_functions elf_big_32_functions =
262 simple_object_fetch_big_16,
263 simple_object_fetch_big_32,
264 simple_object_fetch_big_32_ulong,
265 simple_object_set_big_16,
266 simple_object_set_big_32,
267 simple_object_set_big_32_ulong
270 static const struct elf_type_functions elf_little_32_functions =
272 simple_object_fetch_little_16,
273 simple_object_fetch_little_32,
274 simple_object_fetch_little_32_ulong,
275 simple_object_set_little_16,
276 simple_object_set_little_32,
277 simple_object_set_little_32_ulong
280 #ifdef UNSIGNED_64BIT_TYPE
282 static const struct elf_type_functions elf_big_64_functions =
284 simple_object_fetch_big_16,
285 simple_object_fetch_big_32,
286 simple_object_fetch_big_64,
287 simple_object_set_big_16,
288 simple_object_set_big_32,
289 simple_object_set_big_64
292 static const struct elf_type_functions elf_little_64_functions =
294 simple_object_fetch_little_16,
295 simple_object_fetch_little_32,
296 simple_object_fetch_little_64,
297 simple_object_set_little_16,
298 simple_object_set_little_32,
299 simple_object_set_little_64
302 #endif
304 /* Hideous macro to fetch the value of a field from an external ELF
305 struct of some sort. TYPEFUNCS is the set of type functions.
306 BUFFER points to the external data. STRUCTTYPE is the appropriate
307 struct type. FIELD is a field within the struct. TYPE is the type
308 of the field in the struct: Elf_Half, Elf_Word, or Elf_Addr. */
310 #define ELF_FETCH_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE) \
311 ((TYPEFUNCS)->fetch_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD)))
313 /* Even more hideous macro to fetch the value of FIELD from BUFFER.
314 SIZE is 32 or 64. STRUCTTYPE is the name of the struct from
315 elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in
316 the struct. TYPE is the type of the field in the struct: Elf_Half,
317 Elf_Word, or Elf_Addr. */
319 #define ELF_FETCH_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, \
320 FIELD, TYPE) \
321 ELF_FETCH_STRUCT_FIELD (TYPEFUNCS, \
322 Elf ## SIZE ## _External_ ## STRUCTTYPE, \
323 FIELD, BUFFER, TYPE)
325 /* Like ELF_FETCH_SIZED_FIELD but taking an ELFCLASS value. */
327 #define ELF_FETCH_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, \
328 FIELD, TYPE) \
329 ((CLASS) == ELFCLASS32 \
330 ? ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \
331 TYPE) \
332 : ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \
333 TYPE))
335 /* Hideous macro to set the value of a field in an external ELF
336 structure to VAL. TYPEFUNCS is the set of type functions. BUFFER
337 points to the external data. STRUCTTYPE is the appropriate
338 structure type. FIELD is a field within the struct. TYPE is the
339 type of the field in the struct: Elf_Half, Elf_Word, or
340 Elf_Addr. */
342 #define ELF_SET_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE, VAL) \
343 (TYPEFUNCS)->set_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD), (VAL))
345 /* Even more hideous macro to set the value of FIELD in BUFFER to VAL.
346 SIZE is 32 or 64. STRUCTTYPE is the name of the struct from
347 elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in
348 the struct. TYPE is the type of the field in the struct: Elf_Half,
349 Elf_Word, or Elf_Addr. */
351 #define ELF_SET_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, FIELD, \
352 TYPE, VAL) \
353 ELF_SET_STRUCT_FIELD (TYPEFUNCS, \
354 Elf ## SIZE ## _External_ ## STRUCTTYPE, \
355 FIELD, BUFFER, TYPE, VAL)
357 /* Like ELF_SET_SIZED_FIELD but taking an ELFCLASS value. */
359 #define ELF_SET_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, FIELD, \
360 TYPE, VAL) \
361 ((CLASS) == ELFCLASS32 \
362 ? ELF_SET_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \
363 TYPE, VAL) \
364 : ELF_SET_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \
365 TYPE, VAL))
367 /* Private data for an simple_object_read. */
369 struct simple_object_elf_read
371 /* Type functions. */
372 const struct elf_type_functions* type_functions;
373 /* Elf data. */
374 unsigned char ei_data;
375 /* Elf class. */
376 unsigned char ei_class;
377 /* ELF OS ABI. */
378 unsigned char ei_osabi;
379 /* Elf machine number. */
380 unsigned short machine;
381 /* Processor specific flags. */
382 unsigned int flags;
383 /* File offset of section headers. */
384 ulong_type shoff;
385 /* Number of sections. */
386 unsigned int shnum;
387 /* Index of string table section header. */
388 unsigned int shstrndx;
391 /* Private data for an simple_object_attributes. */
393 struct simple_object_elf_attributes
395 /* Type functions. */
396 const struct elf_type_functions* type_functions;
397 /* Elf data. */
398 unsigned char ei_data;
399 /* Elf class. */
400 unsigned char ei_class;
401 /* ELF OS ABI. */
402 unsigned char ei_osabi;
403 /* Elf machine number. */
404 unsigned short machine;
405 /* Processor specific flags. */
406 unsigned int flags;
409 /* Private data for an simple_object_write. */
411 struct simple_object_elf_write
413 struct simple_object_elf_attributes attrs;
414 unsigned char *shdrs;
417 /* See if we have an ELF file. */
419 static void *
420 simple_object_elf_match (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN],
421 int descriptor, off_t offset,
422 const char *segment_name ATTRIBUTE_UNUSED,
423 const char **errmsg, int *err)
425 unsigned char ei_data;
426 unsigned char ei_class;
427 const struct elf_type_functions *type_functions;
428 unsigned char ehdr[sizeof (Elf64_External_Ehdr)];
429 struct simple_object_elf_read *eor;
431 if (header[EI_MAG0] != ELFMAG0
432 || header[EI_MAG1] != ELFMAG1
433 || header[EI_MAG2] != ELFMAG2
434 || header[EI_MAG3] != ELFMAG3
435 || header[EI_VERSION] != EV_CURRENT)
437 *errmsg = NULL;
438 *err = 0;
439 return NULL;
442 ei_data = header[EI_DATA];
443 if (ei_data != ELFDATA2LSB && ei_data != ELFDATA2MSB)
445 *errmsg = "unknown ELF endianness";
446 *err = 0;
447 return NULL;
450 ei_class = header[EI_CLASS];
451 switch (ei_class)
453 case ELFCLASS32:
454 type_functions = (ei_data == ELFDATA2LSB
455 ? &elf_little_32_functions
456 : &elf_big_32_functions);
457 break;
459 case ELFCLASS64:
460 #ifndef UNSIGNED_64BIT_TYPE
461 *errmsg = "64-bit ELF objects not supported";
462 *err = 0;
463 return NULL;
464 #else
465 type_functions = (ei_data == ELFDATA2LSB
466 ? &elf_little_64_functions
467 : &elf_big_64_functions);
468 break;
469 #endif
471 default:
472 *errmsg = "unrecognized ELF size";
473 *err = 0;
474 return NULL;
477 if (!simple_object_internal_read (descriptor, offset, ehdr, sizeof ehdr,
478 errmsg, err))
479 return NULL;
481 eor = XNEW (struct simple_object_elf_read);
482 eor->type_functions = type_functions;
483 eor->ei_data = ei_data;
484 eor->ei_class = ei_class;
485 eor->ei_osabi = header[EI_OSABI];
486 eor->machine = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr,
487 e_machine, Elf_Half);
488 eor->flags = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr,
489 e_flags, Elf_Word);
490 eor->shoff = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr,
491 e_shoff, Elf_Addr);
492 eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr,
493 e_shnum, Elf_Half);
494 eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr,
495 e_shstrndx, Elf_Half);
497 if ((eor->shnum == 0 || eor->shstrndx == SHN_XINDEX)
498 && eor->shoff != 0)
500 unsigned char shdr[sizeof (Elf64_External_Shdr)];
502 /* Object file has more than 0xffff sections. */
504 if (!simple_object_internal_read (descriptor, offset + eor->shoff, shdr,
505 (ei_class == ELFCLASS32
506 ? sizeof (Elf32_External_Shdr)
507 : sizeof (Elf64_External_Shdr)),
508 errmsg, err))
510 XDELETE (eor);
511 return NULL;
514 if (eor->shnum == 0)
515 eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
516 shdr, sh_size, Elf_Addr);
518 if (eor->shstrndx == SHN_XINDEX)
520 eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
521 shdr, sh_link, Elf_Word);
523 /* Versions of the GNU binutils between 2.12 and 2.18 did
524 not handle objects with more than SHN_LORESERVE sections
525 correctly. All large section indexes were offset by
526 0x100. There is more information at
527 http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
528 Fortunately these object files are easy to detect, as the
529 GNU binutils always put the section header string table
530 near the end of the list of sections. Thus if the
531 section header string table index is larger than the
532 number of sections, then we know we have to subtract
533 0x100 to get the real section index. */
534 if (eor->shstrndx >= eor->shnum
535 && eor->shstrndx >= SHN_LORESERVE + 0x100)
536 eor->shstrndx -= 0x100;
540 if (eor->shstrndx >= eor->shnum)
542 *errmsg = "invalid ELF shstrndx >= shnum";
543 *err = 0;
544 XDELETE (eor);
545 return NULL;
548 return (void *) eor;
551 /* Find all sections in an ELF file. */
553 static const char *
554 simple_object_elf_find_sections (simple_object_read *sobj,
555 int (*pfn) (void *, const char *,
556 off_t offset, off_t length),
557 void *data,
558 int *err)
560 struct simple_object_elf_read *eor =
561 (struct simple_object_elf_read *) sobj->data;
562 const struct elf_type_functions *type_functions = eor->type_functions;
563 unsigned char ei_class = eor->ei_class;
564 size_t shdr_size;
565 unsigned int shnum;
566 unsigned char *shdrs;
567 const char *errmsg;
568 unsigned char *shstrhdr;
569 size_t name_size;
570 off_t shstroff;
571 unsigned char *names;
572 unsigned int i;
574 shdr_size = (ei_class == ELFCLASS32
575 ? sizeof (Elf32_External_Shdr)
576 : sizeof (Elf64_External_Shdr));
578 /* Read the section headers. We skip section 0, which is not a
579 useful section. */
581 shnum = eor->shnum;
582 shdrs = XNEWVEC (unsigned char, shdr_size * (shnum - 1));
584 if (!simple_object_internal_read (sobj->descriptor,
585 sobj->offset + eor->shoff + shdr_size,
586 shdrs,
587 shdr_size * (shnum - 1),
588 &errmsg, err))
590 XDELETEVEC (shdrs);
591 return errmsg;
594 /* Read the section names. */
596 shstrhdr = shdrs + (eor->shstrndx - 1) * shdr_size;
597 name_size = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
598 shstrhdr, sh_size, Elf_Addr);
599 shstroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
600 shstrhdr, sh_offset, Elf_Addr);
601 names = XNEWVEC (unsigned char, name_size);
602 if (!simple_object_internal_read (sobj->descriptor,
603 sobj->offset + shstroff,
604 names, name_size, &errmsg, err))
606 XDELETEVEC (names);
607 XDELETEVEC (shdrs);
608 return errmsg;
611 for (i = 1; i < shnum; ++i)
613 unsigned char *shdr;
614 unsigned int sh_name;
615 const char *name;
616 off_t offset;
617 off_t length;
619 shdr = shdrs + (i - 1) * shdr_size;
620 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
621 shdr, sh_name, Elf_Word);
622 if (sh_name >= name_size)
624 *err = 0;
625 XDELETEVEC (names);
626 XDELETEVEC (shdrs);
627 return "ELF section name out of range";
630 name = (const char *) names + sh_name;
631 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
632 shdr, sh_offset, Elf_Addr);
633 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
634 shdr, sh_size, Elf_Addr);
636 if (!(*pfn) (data, name, offset, length))
637 break;
640 XDELETEVEC (names);
641 XDELETEVEC (shdrs);
643 return NULL;
646 /* Fetch the attributes for an simple_object_read. */
648 static void *
649 simple_object_elf_fetch_attributes (simple_object_read *sobj,
650 const char **errmsg ATTRIBUTE_UNUSED,
651 int *err ATTRIBUTE_UNUSED)
653 struct simple_object_elf_read *eor =
654 (struct simple_object_elf_read *) sobj->data;
655 struct simple_object_elf_attributes *ret;
657 ret = XNEW (struct simple_object_elf_attributes);
658 ret->type_functions = eor->type_functions;
659 ret->ei_data = eor->ei_data;
660 ret->ei_class = eor->ei_class;
661 ret->ei_osabi = eor->ei_osabi;
662 ret->machine = eor->machine;
663 ret->flags = eor->flags;
664 return ret;
667 /* Release the privata data for an simple_object_read. */
669 static void
670 simple_object_elf_release_read (void *data)
672 XDELETE (data);
675 /* Compare two attributes structures. */
677 static const char *
678 simple_object_elf_attributes_merge (void *todata, void *fromdata, int *err)
680 struct simple_object_elf_attributes *to =
681 (struct simple_object_elf_attributes *) todata;
682 struct simple_object_elf_attributes *from =
683 (struct simple_object_elf_attributes *) fromdata;
685 if (to->ei_data != from->ei_data || to->ei_class != from->ei_class)
687 *err = 0;
688 return "ELF object format mismatch";
691 if (to->machine != from->machine)
693 int ok;
695 /* EM_SPARC and EM_SPARC32PLUS are compatible and force an
696 output of EM_SPARC32PLUS. */
697 ok = 0;
698 switch (to->machine)
700 case EM_SPARC:
701 if (from->machine == EM_SPARC32PLUS)
703 to->machine = from->machine;
704 ok = 1;
706 break;
708 case EM_SPARC32PLUS:
709 if (from->machine == EM_SPARC)
710 ok = 1;
711 break;
713 default:
714 break;
717 if (!ok)
719 *err = 0;
720 return "ELF machine number mismatch";
724 return NULL;
727 /* Release the private data for an attributes structure. */
729 static void
730 simple_object_elf_release_attributes (void *data)
732 XDELETE (data);
735 /* Prepare to write out a file. */
737 static void *
738 simple_object_elf_start_write (void *attributes_data,
739 const char **errmsg ATTRIBUTE_UNUSED,
740 int *err ATTRIBUTE_UNUSED)
742 struct simple_object_elf_attributes *attrs =
743 (struct simple_object_elf_attributes *) attributes_data;
744 struct simple_object_elf_write *ret;
746 /* We're just going to record the attributes, but we need to make a
747 copy because the user may delete them. */
748 ret = XNEW (struct simple_object_elf_write);
749 ret->attrs = *attrs;
750 ret->shdrs = NULL;
751 return ret;
754 /* Write out an ELF ehdr. */
756 static int
757 simple_object_elf_write_ehdr (simple_object_write *sobj, int descriptor,
758 const char **errmsg, int *err)
760 struct simple_object_elf_attributes *attrs =
761 (struct simple_object_elf_attributes *) sobj->data;
762 const struct elf_type_functions* fns;
763 unsigned char cl;
764 size_t ehdr_size;
765 unsigned char buf[sizeof (Elf64_External_Ehdr)];
766 simple_object_write_section *section;
767 unsigned int shnum;
768 unsigned int shstrndx;
770 fns = attrs->type_functions;
771 cl = attrs->ei_class;
773 shnum = 0;
774 for (section = sobj->sections; section != NULL; section = section->next)
775 ++shnum;
776 if (shnum > 0)
778 /* Add a section header for the dummy section and one for
779 .shstrtab. */
780 shnum += 2;
783 ehdr_size = (cl == ELFCLASS32
784 ? sizeof (Elf32_External_Ehdr)
785 : sizeof (Elf64_External_Ehdr));
786 memset (buf, 0, sizeof (Elf64_External_Ehdr));
788 buf[EI_MAG0] = ELFMAG0;
789 buf[EI_MAG1] = ELFMAG1;
790 buf[EI_MAG2] = ELFMAG2;
791 buf[EI_MAG3] = ELFMAG3;
792 buf[EI_CLASS] = cl;
793 buf[EI_DATA] = attrs->ei_data;
794 buf[EI_VERSION] = EV_CURRENT;
795 buf[EI_OSABI] = attrs->ei_osabi;
797 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_type, Elf_Half, ET_REL);
798 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_machine, Elf_Half, attrs->machine);
799 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_version, Elf_Word, EV_CURRENT);
800 /* e_entry left as zero. */
801 /* e_phoff left as zero. */
802 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shoff, Elf_Addr, ehdr_size);
803 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_flags, Elf_Word, attrs->flags);
804 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_ehsize, Elf_Half, ehdr_size);
805 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_phentsize, Elf_Half,
806 (cl == ELFCLASS32
807 ? sizeof (Elf32_External_Phdr)
808 : sizeof (Elf64_External_Phdr)));
809 /* e_phnum left as zero. */
810 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shentsize, Elf_Half,
811 (cl == ELFCLASS32
812 ? sizeof (Elf32_External_Shdr)
813 : sizeof (Elf64_External_Shdr)));
814 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shnum, Elf_Half,
815 shnum >= SHN_LORESERVE ? 0 : shnum);
816 if (shnum == 0)
817 shstrndx = 0;
818 else
820 shstrndx = shnum - 1;
821 if (shstrndx >= SHN_LORESERVE)
822 shstrndx = SHN_XINDEX;
824 ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shstrndx, Elf_Half, shstrndx);
826 return simple_object_internal_write (descriptor, 0, buf, ehdr_size,
827 errmsg, err);
830 /* Write out an ELF shdr. */
832 static int
833 simple_object_elf_write_shdr (simple_object_write *sobj, int descriptor,
834 off_t offset, unsigned int sh_name,
835 unsigned int sh_type, unsigned int sh_flags,
836 off_t sh_addr,
837 unsigned int sh_offset, unsigned int sh_size,
838 unsigned int sh_link, unsigned int sh_info,
839 size_t sh_addralign,
840 size_t sh_entsize,
841 const char **errmsg, int *err)
843 struct simple_object_elf_attributes *attrs =
844 (struct simple_object_elf_attributes *) sobj->data;
845 const struct elf_type_functions* fns;
846 unsigned char cl;
847 size_t shdr_size;
848 unsigned char buf[sizeof (Elf64_External_Shdr)];
850 fns = attrs->type_functions;
851 cl = attrs->ei_class;
853 shdr_size = (cl == ELFCLASS32
854 ? sizeof (Elf32_External_Shdr)
855 : sizeof (Elf64_External_Shdr));
856 memset (buf, 0, sizeof (Elf64_External_Shdr));
858 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_name, Elf_Word, sh_name);
859 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_type, Elf_Word, sh_type);
860 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_flags, Elf_Addr, sh_flags);
861 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addr, Elf_Addr, sh_addr);
862 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_offset, Elf_Addr, sh_offset);
863 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_size, Elf_Addr, sh_size);
864 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_link, Elf_Word, sh_link);
865 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_info, Elf_Word, sh_info);
866 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addralign, Elf_Addr, sh_addralign);
867 ELF_SET_FIELD (fns, cl, Shdr, buf, sh_entsize, Elf_Addr, sh_entsize);
869 return simple_object_internal_write (descriptor, offset, buf, shdr_size,
870 errmsg, err);
873 /* Write out a complete ELF file.
874 Ehdr
875 initial dummy Shdr
876 user-created Shdrs
877 .shstrtab Shdr
878 user-created section data
879 .shstrtab data */
881 static const char *
882 simple_object_elf_write_to_file (simple_object_write *sobj, int descriptor,
883 int *err)
885 struct simple_object_elf_write *eow =
886 (struct simple_object_elf_write *) sobj->data;
887 struct simple_object_elf_attributes *attrs = &eow->attrs;
888 unsigned char cl;
889 size_t ehdr_size;
890 size_t shdr_size;
891 const char *errmsg;
892 simple_object_write_section *section;
893 unsigned int shnum;
894 size_t shdr_offset;
895 size_t sh_offset;
896 unsigned int first_sh_size;
897 unsigned int first_sh_link;
898 size_t sh_name;
899 unsigned char zero;
900 unsigned secnum;
902 if (!simple_object_elf_write_ehdr (sobj, descriptor, &errmsg, err))
903 return errmsg;
905 cl = attrs->ei_class;
906 if (cl == ELFCLASS32)
908 ehdr_size = sizeof (Elf32_External_Ehdr);
909 shdr_size = sizeof (Elf32_External_Shdr);
911 else
913 ehdr_size = sizeof (Elf64_External_Ehdr);
914 shdr_size = sizeof (Elf64_External_Shdr);
917 shnum = 0;
918 for (section = sobj->sections; section != NULL; section = section->next)
919 ++shnum;
920 if (shnum == 0)
921 return NULL;
923 /* Add initial dummy Shdr and .shstrtab. */
924 shnum += 2;
926 shdr_offset = ehdr_size;
927 sh_offset = shdr_offset + shnum * shdr_size;
929 if (shnum < SHN_LORESERVE)
930 first_sh_size = 0;
931 else
932 first_sh_size = shnum;
933 if (shnum - 1 < SHN_LORESERVE)
934 first_sh_link = 0;
935 else
936 first_sh_link = shnum - 1;
937 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
938 0, 0, 0, 0, 0, first_sh_size, first_sh_link,
939 0, 0, 0, &errmsg, err))
940 return errmsg;
942 shdr_offset += shdr_size;
944 sh_name = 1;
945 secnum = 0;
946 for (section = sobj->sections; section != NULL; section = section->next)
948 size_t mask;
949 size_t new_sh_offset;
950 size_t sh_size;
951 struct simple_object_write_section_buffer *buffer;
952 unsigned int sh_type = SHT_PROGBITS;
953 unsigned int sh_flags = 0;
954 off_t sh_addr = 0;
955 unsigned int sh_link = 0;
956 unsigned int sh_info = 0;
957 size_t sh_addralign = 1U << section->align;
958 size_t sh_entsize = 0;
959 if (eow->shdrs)
961 sh_type = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
962 eow->shdrs + secnum * shdr_size,
963 sh_type, Elf_Word);
964 sh_flags = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
965 eow->shdrs + secnum * shdr_size,
966 sh_flags, Elf_Addr);
967 sh_addr = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
968 eow->shdrs + secnum * shdr_size,
969 sh_addr, Elf_Addr);
970 sh_link = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
971 eow->shdrs + secnum * shdr_size,
972 sh_link, Elf_Word);
973 sh_info = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
974 eow->shdrs + secnum * shdr_size,
975 sh_info, Elf_Word);
976 sh_addralign = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
977 eow->shdrs + secnum * shdr_size,
978 sh_addralign, Elf_Addr);
979 sh_entsize = ELF_FETCH_FIELD (attrs->type_functions, attrs->ei_class, Shdr,
980 eow->shdrs + secnum * shdr_size,
981 sh_entsize, Elf_Addr);
982 secnum++;
985 mask = sh_addralign - 1;
986 new_sh_offset = sh_offset + mask;
987 new_sh_offset &= ~ mask;
988 while (new_sh_offset > sh_offset)
990 unsigned char zeroes[16];
991 size_t write;
993 memset (zeroes, 0, sizeof zeroes);
994 write = new_sh_offset - sh_offset;
995 if (write > sizeof zeroes)
996 write = sizeof zeroes;
997 if (!simple_object_internal_write (descriptor, sh_offset, zeroes,
998 write, &errmsg, err))
999 return errmsg;
1000 sh_offset += write;
1003 sh_size = 0;
1004 for (buffer = section->buffers; buffer != NULL; buffer = buffer->next)
1006 if (!simple_object_internal_write (descriptor, sh_offset + sh_size,
1007 ((const unsigned char *)
1008 buffer->buffer),
1009 buffer->size, &errmsg, err))
1010 return errmsg;
1011 sh_size += buffer->size;
1014 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
1015 sh_name, sh_type, sh_flags,
1016 sh_addr, sh_offset,
1017 sh_size, sh_link, sh_info,
1018 sh_addralign, sh_entsize,
1019 &errmsg, err))
1020 return errmsg;
1022 shdr_offset += shdr_size;
1023 sh_name += strlen (section->name) + 1;
1024 sh_offset += sh_size;
1027 if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
1028 sh_name, SHT_STRTAB, 0, 0, sh_offset,
1029 sh_name + strlen (".shstrtab") + 1, 0, 0,
1030 1, 0, &errmsg, err))
1031 return errmsg;
1033 /* .shstrtab has a leading zero byte. */
1034 zero = 0;
1035 if (!simple_object_internal_write (descriptor, sh_offset, &zero, 1,
1036 &errmsg, err))
1037 return errmsg;
1038 ++sh_offset;
1040 for (section = sobj->sections; section != NULL; section = section->next)
1042 size_t len;
1044 len = strlen (section->name) + 1;
1045 if (!simple_object_internal_write (descriptor, sh_offset,
1046 (const unsigned char *) section->name,
1047 len, &errmsg, err))
1048 return errmsg;
1049 sh_offset += len;
1052 if (!simple_object_internal_write (descriptor, sh_offset,
1053 (const unsigned char *) ".shstrtab",
1054 strlen (".shstrtab") + 1, &errmsg, err))
1055 return errmsg;
1057 return NULL;
1060 /* Release the private data for an simple_object_write structure. */
1062 static void
1063 simple_object_elf_release_write (void *data)
1065 struct simple_object_elf_write *eow = (struct simple_object_elf_write *) data;
1066 if (eow->shdrs)
1067 XDELETE (eow->shdrs);
1068 XDELETE (data);
1071 /* Copy all sections in an ELF file. */
1073 static const char *
1074 simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
1075 simple_object_write *dobj,
1076 char *(*pfn) (const char *),
1077 int *err)
1079 struct simple_object_elf_read *eor =
1080 (struct simple_object_elf_read *) sobj->data;
1081 const struct elf_type_functions *type_functions = eor->type_functions;
1082 struct simple_object_elf_write *eow =
1083 (struct simple_object_elf_write *) dobj->data;
1084 unsigned char ei_class = eor->ei_class;
1085 size_t shdr_size;
1086 unsigned int shnum;
1087 unsigned char *shdrs;
1088 const char *errmsg;
1089 unsigned char *shstrhdr;
1090 size_t name_size;
1091 off_t shstroff;
1092 unsigned char *names;
1093 unsigned int i;
1094 int changed;
1095 int *pfnret;
1096 const char **pfnname;
1097 unsigned new_i;
1098 unsigned *sh_map;
1099 unsigned first_shndx = 0;
1100 unsigned int *symtab_indices_shndx;
1102 shdr_size = (ei_class == ELFCLASS32
1103 ? sizeof (Elf32_External_Shdr)
1104 : sizeof (Elf64_External_Shdr));
1106 /* Read the section headers. We skip section 0, which is not a
1107 useful section. */
1109 shnum = eor->shnum;
1110 shdrs = XNEWVEC (unsigned char, shdr_size * (shnum - 1));
1112 if (!simple_object_internal_read (sobj->descriptor,
1113 sobj->offset + eor->shoff + shdr_size,
1114 shdrs,
1115 shdr_size * (shnum - 1),
1116 &errmsg, err))
1118 XDELETEVEC (shdrs);
1119 return errmsg;
1122 /* Read the section names. */
1124 shstrhdr = shdrs + (eor->shstrndx - 1) * shdr_size;
1125 name_size = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1126 shstrhdr, sh_size, Elf_Addr);
1127 shstroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1128 shstrhdr, sh_offset, Elf_Addr);
1129 names = XNEWVEC (unsigned char, name_size);
1130 if (!simple_object_internal_read (sobj->descriptor,
1131 sobj->offset + shstroff,
1132 names, name_size, &errmsg, err))
1134 XDELETEVEC (names);
1135 XDELETEVEC (shdrs);
1136 return errmsg;
1139 pfnret = XNEWVEC (int, shnum);
1140 pfnname = XNEWVEC (const char *, shnum);
1142 /* Map of symtab to index section. */
1143 symtab_indices_shndx = XCNEWVEC (unsigned int, shnum - 1);
1145 /* First perform the callbacks to know which sections to preserve and
1146 what name to use for those. */
1147 for (i = 1; i < shnum; ++i)
1149 unsigned char *shdr;
1150 unsigned int sh_name, sh_type;
1151 const char *name;
1152 char *ret;
1154 shdr = shdrs + (i - 1) * shdr_size;
1155 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1156 shdr, sh_name, Elf_Word);
1157 if (sh_name >= name_size)
1159 *err = 0;
1160 XDELETEVEC (names);
1161 XDELETEVEC (shdrs);
1162 return "ELF section name out of range";
1165 name = (const char *) names + sh_name;
1167 ret = (*pfn) (name);
1168 pfnret[i - 1] = ret == NULL ? -1 : 0;
1169 pfnname[i - 1] = ret == NULL ? name : ret;
1170 if (first_shndx == 0
1171 && pfnret[i - 1] == 0)
1172 first_shndx = i;
1174 /* Remember the indexes of existing SHT_SYMTAB_SHNDX sections. */
1175 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1176 shdr, sh_type, Elf_Word);
1177 if (sh_type == SHT_SYMTAB_SHNDX)
1179 unsigned int sh_link;
1180 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1181 shdr, sh_link, Elf_Word);
1182 symtab_indices_shndx[sh_link - 1] = i;
1183 /* Always discard the extended index sections, after
1184 copying it will not be needed. This way we don't need to
1185 update it and deal with the ordering constraints of
1186 processing the existing symtab and changing the index. */
1187 pfnret[i - 1] = -1;
1191 /* Mark sections as preserved that are required by to be preserved
1192 sections. */
1195 changed = 0;
1196 for (i = 1; i < shnum; ++i)
1198 unsigned char *shdr;
1199 unsigned int sh_type, sh_info, sh_link;
1200 off_t offset;
1201 off_t length;
1203 shdr = shdrs + (i - 1) * shdr_size;
1204 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1205 shdr, sh_type, Elf_Word);
1206 sh_info = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1207 shdr, sh_info, Elf_Word);
1208 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1209 shdr, sh_link, Elf_Word);
1210 if (sh_type == SHT_GROUP)
1212 /* Mark groups containing copied sections. */
1213 unsigned entsize = ELF_FETCH_FIELD (type_functions, ei_class,
1214 Shdr, shdr, sh_entsize,
1215 Elf_Addr);
1216 unsigned char *ent, *buf;
1217 int keep = 0;
1218 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1219 shdr, sh_offset, Elf_Addr);
1220 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1221 shdr, sh_size, Elf_Addr);
1222 buf = XNEWVEC (unsigned char, length);
1223 if (!simple_object_internal_read (sobj->descriptor,
1224 sobj->offset + offset, buf,
1225 (size_t) length, &errmsg, err))
1227 XDELETEVEC (buf);
1228 XDELETEVEC (names);
1229 XDELETEVEC (shdrs);
1230 return errmsg;
1232 for (ent = buf + entsize; ent < buf + length; ent += entsize)
1234 unsigned sec = type_functions->fetch_Elf_Word (ent);
1235 if (pfnret[sec - 1] == 0)
1236 keep = 1;
1238 if (keep)
1240 changed |= (pfnret[sh_link - 1] == -1
1241 || pfnret[i - 1] == -1);
1242 pfnret[sh_link - 1] = 0;
1243 pfnret[i - 1] = 0;
1246 if (sh_type == SHT_RELA
1247 || sh_type == SHT_REL)
1249 /* Mark relocation sections and symtab of copied sections. */
1250 if (pfnret[sh_info - 1] == 0)
1252 changed |= (pfnret[sh_link - 1] == -1
1253 || pfnret[i - 1] == -1);
1254 pfnret[sh_link - 1] = 0;
1255 pfnret[i - 1] = 0;
1258 if (sh_type == SHT_SYMTAB)
1260 /* Mark strings sections of copied symtabs. */
1261 if (pfnret[i - 1] == 0)
1263 changed |= pfnret[sh_link - 1] == -1;
1264 pfnret[sh_link - 1] = 0;
1269 while (changed);
1271 /* Compute a mapping of old -> new section numbers. */
1272 sh_map = XNEWVEC (unsigned, shnum);
1273 sh_map[0] = 0;
1274 new_i = 1;
1275 for (i = 1; i < shnum; ++i)
1277 if (pfnret[i - 1] == -1)
1278 sh_map[i] = 0;
1279 else
1280 sh_map[i] = new_i++;
1282 if (new_i - 1 >= SHN_LORESERVE)
1284 *err = ENOTSUP;
1285 return "Too many copied sections";
1287 eow->shdrs = XNEWVEC (unsigned char, shdr_size * (new_i - 1));
1289 /* Then perform the actual copying. */
1290 new_i = 0;
1291 for (i = 1; i < shnum; ++i)
1293 unsigned char *shdr;
1294 unsigned int sh_name, sh_type;
1295 const char *name;
1296 off_t offset;
1297 off_t length;
1298 simple_object_write_section *dest;
1299 off_t flags;
1300 unsigned char *buf;
1302 if (pfnret[i - 1])
1303 continue;
1305 new_i++;
1306 shdr = shdrs + (i - 1) * shdr_size;
1307 sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1308 shdr, sh_name, Elf_Word);
1309 if (sh_name >= name_size)
1311 *err = 0;
1312 XDELETEVEC (names);
1313 XDELETEVEC (shdrs);
1314 XDELETEVEC (symtab_indices_shndx);
1315 return "ELF section name out of range";
1318 name = pfnname[i - 1];
1319 offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1320 shdr, sh_offset, Elf_Addr);
1321 length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1322 shdr, sh_size, Elf_Addr);
1323 sh_type = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1324 shdr, sh_type, Elf_Word);
1326 dest = simple_object_write_create_section (dobj, pfnname[i - 1],
1327 0, &errmsg, err);
1328 if (dest == NULL)
1330 XDELETEVEC (names);
1331 XDELETEVEC (shdrs);
1332 XDELETEVEC (symtab_indices_shndx);
1333 return errmsg;
1336 /* Record the SHDR of the source. */
1337 memcpy (eow->shdrs + (new_i - 1) * shdr_size, shdr, shdr_size);
1338 shdr = eow->shdrs + (new_i - 1) * shdr_size;
1340 /* Copy the data.
1341 ??? This is quite wasteful and ideally would be delayed until
1342 write_to_file (). Thus it questions the interfacing
1343 which eventually should contain destination creation plus
1344 writing. */
1345 buf = XNEWVEC (unsigned char, length);
1346 if (!simple_object_internal_read (sobj->descriptor,
1347 sobj->offset + offset, buf,
1348 (size_t) length, &errmsg, err))
1350 XDELETEVEC (buf);
1351 XDELETEVEC (names);
1352 XDELETEVEC (shdrs);
1353 XDELETEVEC (symtab_indices_shndx);
1354 return errmsg;
1357 /* If we are processing .symtab purge __gnu_lto_v1 and
1358 __gnu_lto_slim symbols from it and any symbols in discarded
1359 sections. */
1360 if (sh_type == SHT_SYMTAB)
1362 unsigned entsize = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1363 shdr, sh_entsize, Elf_Addr);
1364 unsigned strtab = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1365 shdr, sh_link, Elf_Word);
1366 unsigned char *strshdr = shdrs + (strtab - 1) * shdr_size;
1367 off_t stroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1368 strshdr, sh_offset, Elf_Addr);
1369 size_t strsz = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1370 strshdr, sh_size, Elf_Addr);
1371 char *strings = XNEWVEC (char, strsz);
1372 char *gnu_lto = strings;
1373 unsigned char *ent;
1374 unsigned *shndx_table = NULL;
1375 simple_object_internal_read (sobj->descriptor,
1376 sobj->offset + stroff,
1377 (unsigned char *)strings,
1378 strsz, &errmsg, err);
1379 /* Find gnu_lto_ in strings. */
1380 while ((gnu_lto = (char *) memchr (gnu_lto, 'g',
1381 strings + strsz - gnu_lto)))
1382 if (strncmp (gnu_lto, "gnu_lto_v1",
1383 strings + strsz - gnu_lto) == 0)
1384 break;
1385 else
1386 gnu_lto++;
1387 /* Read the section index table if present. */
1388 if (symtab_indices_shndx[i - 1] != 0)
1390 unsigned char *sidxhdr = shdrs + (strtab - 1) * shdr_size;
1391 off_t sidxoff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1392 sidxhdr, sh_offset, Elf_Addr);
1393 size_t sidxsz = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1394 sidxhdr, sh_size, Elf_Addr);
1395 shndx_table = (unsigned *)XNEWVEC (char, sidxsz);
1396 simple_object_internal_read (sobj->descriptor,
1397 sobj->offset + sidxoff,
1398 (unsigned char *)shndx_table,
1399 sidxsz, &errmsg, err);
1401 for (ent = buf; ent < buf + length; ent += entsize)
1403 unsigned st_shndx = ELF_FETCH_FIELD (type_functions, ei_class,
1404 Sym, ent,
1405 st_shndx, Elf_Half);
1406 unsigned raw_st_shndx = st_shndx;
1407 unsigned char *st_info;
1408 unsigned char *st_other;
1409 int discard = 0;
1410 if (ei_class == ELFCLASS32)
1412 st_info = &((Elf32_External_Sym *)ent)->st_info;
1413 st_other = &((Elf32_External_Sym *)ent)->st_other;
1415 else
1417 st_info = &((Elf64_External_Sym *)ent)->st_info;
1418 st_other = &((Elf64_External_Sym *)ent)->st_other;
1420 if (st_shndx == SHN_XINDEX)
1421 st_shndx = type_functions->fetch_Elf_Word
1422 ((unsigned char *)(shndx_table + (ent - buf) / entsize));
1423 /* Eliminate all COMMONs - this includes __gnu_lto_v1
1424 and __gnu_lto_slim which otherwise cause endless
1425 LTO plugin invocation. */
1426 if (st_shndx == SHN_COMMON)
1427 discard = 1;
1428 /* We also need to remove symbols refering to sections
1429 we'll eventually remove as with fat LTO objects
1430 we otherwise get duplicate symbols at final link
1431 (with GNU ld, gold is fine and ignores symbols in
1432 sections marked as EXCLUDE). ld/20513 */
1433 else if (st_shndx != SHN_UNDEF
1434 && st_shndx < shnum
1435 && pfnret[st_shndx - 1] == -1)
1436 discard = 1;
1438 if (discard)
1440 /* Make discarded symbols undefined and unnamed
1441 in case it is local. */
1442 int bind = ELF_ST_BIND (*st_info);
1443 int other = STV_DEFAULT;
1444 if (bind == STB_LOCAL)
1446 /* Make discarded local symbols unnamed and
1447 defined in the first prevailing section. */
1448 ELF_SET_FIELD (type_functions, ei_class, Sym,
1449 ent, st_name, Elf_Word, 0);
1450 ELF_SET_FIELD (type_functions, ei_class, Sym,
1451 ent, st_shndx, Elf_Half,
1452 sh_map[first_shndx]);
1454 else
1456 /* Make discarded global symbols hidden weak
1457 undefined and sharing the gnu_lto_ name. */
1458 bind = STB_WEAK;
1459 other = STV_HIDDEN;
1460 if (gnu_lto)
1461 ELF_SET_FIELD (type_functions, ei_class, Sym,
1462 ent, st_name, Elf_Word,
1463 gnu_lto - strings);
1464 ELF_SET_FIELD (type_functions, ei_class, Sym,
1465 ent, st_shndx, Elf_Half, SHN_UNDEF);
1467 *st_other = other;
1468 *st_info = ELF_ST_INFO (bind, STT_NOTYPE);
1469 ELF_SET_FIELD (type_functions, ei_class, Sym,
1470 ent, st_value, Elf_Addr, 0);
1471 ELF_SET_FIELD (type_functions, ei_class, Sym,
1472 ent, st_size, Elf_Word, 0);
1474 else if (raw_st_shndx < SHN_LORESERVE
1475 || raw_st_shndx == SHN_XINDEX)
1476 /* Remap the section reference. */
1477 ELF_SET_FIELD (type_functions, ei_class, Sym,
1478 ent, st_shndx, Elf_Half, sh_map[st_shndx]);
1480 XDELETEVEC (strings);
1481 XDELETEVEC (shndx_table);
1483 else if (sh_type == SHT_GROUP)
1485 /* Remap section indices in groups and remove removed members. */
1486 unsigned char *ent, *dst;
1487 for (dst = ent = buf + 4; ent < buf + length; ent += 4)
1489 unsigned shndx = type_functions->fetch_Elf_Word (ent);
1490 if (pfnret[shndx - 1] == -1)
1492 else
1494 type_functions->set_Elf_Word (dst, sh_map[shndx]);
1495 dst += 4;
1498 /* Adjust the length. */
1499 length = dst - buf;
1502 errmsg = simple_object_write_add_data (dobj, dest,
1503 buf, length, 1, err);
1504 XDELETEVEC (buf);
1505 if (errmsg)
1507 XDELETEVEC (names);
1508 XDELETEVEC (shdrs);
1509 XDELETEVEC (symtab_indices_shndx);
1510 return errmsg;
1513 flags = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1514 shdr, sh_flags, Elf_Addr);
1515 /* Remap the section references. */
1517 unsigned int sh_info, sh_link;
1518 if (flags & SHF_INFO_LINK || sh_type == SHT_REL || sh_type == SHT_RELA)
1520 sh_info = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1521 shdr, sh_info, Elf_Word);
1522 if (sh_info < SHN_LORESERVE
1523 || sh_info > SHN_HIRESERVE)
1524 sh_info = sh_map[sh_info];
1525 ELF_SET_FIELD (type_functions, ei_class, Shdr,
1526 shdr, sh_info, Elf_Word, sh_info);
1528 sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr,
1529 shdr, sh_link, Elf_Word);
1530 if (sh_link < SHN_LORESERVE
1531 || sh_link > SHN_HIRESERVE)
1532 sh_link = sh_map[sh_link];
1533 ELF_SET_FIELD (type_functions, ei_class, Shdr,
1534 shdr, sh_link, Elf_Word, sh_link);
1536 /* The debugobj doesn't contain any code, thus no trampolines.
1537 Even when the original object needs trampolines, debugobj
1538 doesn't. */
1539 if (strcmp (name, ".note.GNU-stack") == 0)
1540 flags &= ~SHF_EXECINSTR;
1541 /* Clear SHF_EXCLUDE on to be preserved sections. */
1542 flags &= ~SHF_EXCLUDE;
1543 ELF_SET_FIELD (type_functions, ei_class, Shdr,
1544 shdr, sh_flags, Elf_Addr, flags);
1547 XDELETEVEC (names);
1548 XDELETEVEC (shdrs);
1549 XDELETEVEC (pfnret);
1550 XDELETEVEC (pfnname);
1551 XDELETEVEC (symtab_indices_shndx);
1552 XDELETEVEC (sh_map);
1554 return NULL;
1558 /* The ELF functions. */
1560 const struct simple_object_functions simple_object_elf_functions =
1562 simple_object_elf_match,
1563 simple_object_elf_find_sections,
1564 simple_object_elf_fetch_attributes,
1565 simple_object_elf_release_read,
1566 simple_object_elf_attributes_merge,
1567 simple_object_elf_release_attributes,
1568 simple_object_elf_start_write,
1569 simple_object_elf_write_to_file,
1570 simple_object_elf_release_write,
1571 simple_object_elf_copy_lto_debug_sections