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