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
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. */
21 #include "libiberty.h"
22 #include "simple-object.h"
39 #ifdef HAVE_INTTYPES_H
43 #include "simple-object-common.h"
45 /* ELF structures and constants. */
47 /* 32-bit ELF file header. */
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. */
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. */
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. */
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 */
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. */
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. */
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
;
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
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, \
321 ELF_FETCH_STRUCT_FIELD (TYPEFUNCS, \
322 Elf ## SIZE ## _External_ ## STRUCTTYPE, \
325 /* Like ELF_FETCH_SIZED_FIELD but taking an ELFCLASS value. */
327 #define ELF_FETCH_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, \
329 ((CLASS) == ELFCLASS32 \
330 ? ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \
332 : ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \
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
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, \
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, \
361 ((CLASS) == ELFCLASS32 \
362 ? ELF_SET_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \
364 : ELF_SET_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \
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
;
374 unsigned char ei_data
;
376 unsigned char ei_class
;
378 unsigned char ei_osabi
;
379 /* Elf machine number. */
380 unsigned short machine
;
381 /* Processor specific flags. */
383 /* File offset of section headers. */
385 /* Number of sections. */
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
;
398 unsigned char ei_data
;
400 unsigned char ei_class
;
402 unsigned char ei_osabi
;
403 /* Elf machine number. */
404 unsigned short machine
;
405 /* Processor specific 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. */
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
)
442 ei_data
= header
[EI_DATA
];
443 if (ei_data
!= ELFDATA2LSB
&& ei_data
!= ELFDATA2MSB
)
445 *errmsg
= "unknown ELF endianness";
450 ei_class
= header
[EI_CLASS
];
454 type_functions
= (ei_data
== ELFDATA2LSB
455 ? &elf_little_32_functions
456 : &elf_big_32_functions
);
460 #ifndef UNSIGNED_64BIT_TYPE
461 *errmsg
= "64-bit ELF objects not supported";
465 type_functions
= (ei_data
== ELFDATA2LSB
466 ? &elf_little_64_functions
467 : &elf_big_64_functions
);
472 *errmsg
= "unrecognized ELF size";
477 if (!simple_object_internal_read (descriptor
, offset
, ehdr
, sizeof ehdr
,
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
,
490 eor
->shoff
= ELF_FETCH_FIELD (type_functions
, ei_class
, Ehdr
, ehdr
,
492 eor
->shnum
= ELF_FETCH_FIELD (type_functions
, ei_class
, Ehdr
, ehdr
,
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
)
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
)),
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";
551 /* Find all sections in an ELF file. */
554 simple_object_elf_find_sections (simple_object_read
*sobj
,
555 int (*pfn
) (void *, const char *,
556 off_t offset
, off_t length
),
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
;
566 unsigned char *shdrs
;
568 unsigned char *shstrhdr
;
571 unsigned char *names
;
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
582 shdrs
= XNEWVEC (unsigned char, shdr_size
* (shnum
- 1));
584 if (!simple_object_internal_read (sobj
->descriptor
,
585 sobj
->offset
+ eor
->shoff
+ shdr_size
,
587 shdr_size
* (shnum
- 1),
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
))
611 for (i
= 1; i
< shnum
; ++i
)
614 unsigned int sh_name
;
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
)
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
))
646 /* Fetch the attributes for an simple_object_read. */
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
;
667 /* Release the privata data for an simple_object_read. */
670 simple_object_elf_release_read (void *data
)
675 /* Compare two attributes structures. */
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
)
688 return "ELF object format mismatch";
691 if (to
->machine
!= from
->machine
)
695 /* EM_SPARC and EM_SPARC32PLUS are compatible and force an
696 output of EM_SPARC32PLUS. */
701 if (from
->machine
== EM_SPARC32PLUS
)
703 to
->machine
= from
->machine
;
709 if (from
->machine
== EM_SPARC
)
720 return "ELF machine number mismatch";
727 /* Release the private data for an attributes structure. */
730 simple_object_elf_release_attributes (void *data
)
735 /* Prepare to write out a file. */
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
);
754 /* Write out an ELF ehdr. */
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
;
765 unsigned char buf
[sizeof (Elf64_External_Ehdr
)];
766 simple_object_write_section
*section
;
768 unsigned int shstrndx
;
770 fns
= attrs
->type_functions
;
771 cl
= attrs
->ei_class
;
774 for (section
= sobj
->sections
; section
!= NULL
; section
= section
->next
)
778 /* Add a section header for the dummy section and one for
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
;
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
,
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
,
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
);
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
,
830 /* Write out an ELF shdr. */
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
,
837 unsigned int sh_offset
, unsigned int sh_size
,
838 unsigned int sh_link
, unsigned int sh_info
,
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
;
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
,
873 /* Write out a complete ELF file.
878 user-created section data
882 simple_object_elf_write_to_file (simple_object_write
*sobj
, int descriptor
,
885 struct simple_object_elf_write
*eow
=
886 (struct simple_object_elf_write
*) sobj
->data
;
887 struct simple_object_elf_attributes
*attrs
= &eow
->attrs
;
892 simple_object_write_section
*section
;
896 unsigned int first_sh_size
;
897 unsigned int first_sh_link
;
902 if (!simple_object_elf_write_ehdr (sobj
, descriptor
, &errmsg
, err
))
905 cl
= attrs
->ei_class
;
906 if (cl
== ELFCLASS32
)
908 ehdr_size
= sizeof (Elf32_External_Ehdr
);
909 shdr_size
= sizeof (Elf32_External_Shdr
);
913 ehdr_size
= sizeof (Elf64_External_Ehdr
);
914 shdr_size
= sizeof (Elf64_External_Shdr
);
918 for (section
= sobj
->sections
; section
!= NULL
; section
= section
->next
)
923 /* Add initial dummy Shdr and .shstrtab. */
926 shdr_offset
= ehdr_size
;
927 sh_offset
= shdr_offset
+ shnum
* shdr_size
;
929 if (shnum
< SHN_LORESERVE
)
932 first_sh_size
= shnum
;
933 if (shnum
- 1 < SHN_LORESERVE
)
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
))
942 shdr_offset
+= shdr_size
;
946 for (section
= sobj
->sections
; section
!= NULL
; section
= section
->next
)
949 size_t new_sh_offset
;
951 struct simple_object_write_section_buffer
*buffer
;
952 unsigned int sh_type
= SHT_PROGBITS
;
953 unsigned int sh_flags
= 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;
961 sh_type
= ELF_FETCH_FIELD (attrs
->type_functions
, attrs
->ei_class
, Shdr
,
962 eow
->shdrs
+ secnum
* shdr_size
,
964 sh_flags
= ELF_FETCH_FIELD (attrs
->type_functions
, attrs
->ei_class
, Shdr
,
965 eow
->shdrs
+ secnum
* shdr_size
,
967 sh_addr
= ELF_FETCH_FIELD (attrs
->type_functions
, attrs
->ei_class
, Shdr
,
968 eow
->shdrs
+ secnum
* shdr_size
,
970 sh_link
= ELF_FETCH_FIELD (attrs
->type_functions
, attrs
->ei_class
, Shdr
,
971 eow
->shdrs
+ secnum
* shdr_size
,
973 sh_info
= ELF_FETCH_FIELD (attrs
->type_functions
, attrs
->ei_class
, Shdr
,
974 eow
->shdrs
+ secnum
* shdr_size
,
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
);
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];
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
))
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 *)
1009 buffer
->size
, &errmsg
, err
))
1011 sh_size
+= buffer
->size
;
1014 if (!simple_object_elf_write_shdr (sobj
, descriptor
, shdr_offset
,
1015 sh_name
, sh_type
, sh_flags
,
1017 sh_size
, sh_link
, sh_info
,
1018 sh_addralign
, sh_entsize
,
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
))
1033 /* .shstrtab has a leading zero byte. */
1035 if (!simple_object_internal_write (descriptor
, sh_offset
, &zero
, 1,
1040 for (section
= sobj
->sections
; section
!= NULL
; section
= section
->next
)
1044 len
= strlen (section
->name
) + 1;
1045 if (!simple_object_internal_write (descriptor
, sh_offset
,
1046 (const unsigned char *) section
->name
,
1052 if (!simple_object_internal_write (descriptor
, sh_offset
,
1053 (const unsigned char *) ".shstrtab",
1054 strlen (".shstrtab") + 1, &errmsg
, err
))
1060 /* Release the private data for an simple_object_write structure. */
1063 simple_object_elf_release_write (void *data
)
1065 struct simple_object_elf_write
*eow
= (struct simple_object_elf_write
*) data
;
1067 XDELETE (eow
->shdrs
);
1071 /* Copy all sections in an ELF file. */
1074 simple_object_elf_copy_lto_debug_sections (simple_object_read
*sobj
,
1075 simple_object_write
*dobj
,
1076 char *(*pfn
) (const char *),
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
;
1087 unsigned char *shdrs
;
1089 unsigned char *shstrhdr
;
1092 unsigned char *names
;
1096 const char **pfnname
;
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
1110 shdrs
= XNEWVEC (unsigned char, shdr_size
* (shnum
- 1));
1112 if (!simple_object_internal_read (sobj
->descriptor
,
1113 sobj
->offset
+ eor
->shoff
+ shdr_size
,
1115 shdr_size
* (shnum
- 1),
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
))
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
;
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
)
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)
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. */
1191 /* Mark sections as preserved that are required by to be preserved
1196 for (i
= 1; i
< shnum
; ++i
)
1198 unsigned char *shdr
;
1199 unsigned int sh_type
, sh_info
, sh_link
;
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
,
1216 unsigned char *ent
, *buf
;
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
))
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)
1240 changed
|= (pfnret
[sh_link
- 1] == -1
1241 || pfnret
[i
- 1] == -1);
1242 pfnret
[sh_link
- 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;
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;
1271 /* Compute a mapping of old -> new section numbers. */
1272 sh_map
= XNEWVEC (unsigned, shnum
);
1275 for (i
= 1; i
< shnum
; ++i
)
1277 if (pfnret
[i
- 1] == -1)
1280 sh_map
[i
] = new_i
++;
1282 if (new_i
- 1 >= SHN_LORESERVE
)
1285 return "Too many copied sections";
1287 eow
->shdrs
= XNEWVEC (unsigned char, shdr_size
* (new_i
- 1));
1289 /* Then perform the actual copying. */
1291 for (i
= 1; i
< shnum
; ++i
)
1293 unsigned char *shdr
;
1294 unsigned int sh_name
, sh_type
;
1298 simple_object_write_section
*dest
;
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
)
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],
1332 XDELETEVEC (symtab_indices_shndx
);
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
;
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
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
))
1353 XDELETEVEC (symtab_indices_shndx
);
1357 /* If we are processing .symtab purge __gnu_lto_v1 and
1358 __gnu_lto_slim symbols from it and any symbols in discarded
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
;
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)
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
,
1405 st_shndx
, Elf_Half
);
1406 unsigned raw_st_shndx
= st_shndx
;
1407 unsigned char *st_info
;
1408 unsigned char *st_other
;
1410 if (ei_class
== ELFCLASS32
)
1412 st_info
= &((Elf32_External_Sym
*)ent
)->st_info
;
1413 st_other
= &((Elf32_External_Sym
*)ent
)->st_other
;
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
)
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
1435 && pfnret
[st_shndx
- 1] == -1)
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
]);
1456 /* Make discarded global symbols hidden weak
1457 undefined and sharing the gnu_lto_ name. */
1461 ELF_SET_FIELD (type_functions
, ei_class
, Sym
,
1462 ent
, st_name
, Elf_Word
,
1464 ELF_SET_FIELD (type_functions
, ei_class
, Sym
,
1465 ent
, st_shndx
, Elf_Half
, SHN_UNDEF
);
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)
1494 type_functions
->set_Elf_Word (dst
, sh_map
[shndx
]);
1498 /* Adjust the length. */
1502 errmsg
= simple_object_write_add_data (dobj
, dest
,
1503 buf
, length
, 1, err
);
1509 XDELETEVEC (symtab_indices_shndx
);
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
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
);
1549 XDELETEVEC (pfnret
);
1550 XDELETEVEC (pfnname
);
1551 XDELETEVEC (symtab_indices_shndx
);
1552 XDELETEVEC (sh_map
);
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