1 /* LTO routines for ELF object files.
2 Copyright 2009, 2010 Free Software Foundation, Inc.
3 Contributed by CodeSourcery, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
24 #include "diagnostic-core.h"
29 #include "libiberty.h"
31 #include "lto-streamer.h"
33 /* Cater to hosts with half-backed <elf.h> file like HP-UX. */
38 #ifndef EM_SPARC32PLUS
39 # define EM_SPARC32PLUS 18
43 # define ELFOSABI_NONE 0
45 #ifndef ELFOSABI_LINUX
46 # define ELFOSABI_LINUX 3
50 /* Handle opening elf files on hosts, such as Windows, that may use
51 text file handling that will break binary access. */
57 /* Initialize FILE, an LTO file object for FILENAME. */
59 lto_file_init (lto_file *file, const char *filename, off_t offset)
61 file->filename = filename;
62 file->offset = offset;
68 /* The base information. */
71 /* The system file descriptor for the file. */
74 /* The libelf descriptor for the file. */
77 /* Section number of string table used for section names. */
80 /* Writable file members. */
82 /* The currently active section. */
85 /* The output stream for section header names. */
86 struct lto_output_stream *shstrtab_stream;
88 /* Linked list of data which must be freed *after* the file has been
89 closed. This is an annoying limitation of libelf. */
90 struct lto_char_ptr_base *data;
92 typedef struct lto_elf_file lto_elf_file;
94 /* Stores executable header attributes which must be shared by all ELF files.
95 This is used for validating input files and populating output files. */
100 unsigned char elf_ident[EI_NIDENT];
101 Elf64_Half elf_machine;
105 /* Return the section header for SECTION. The return value is never
106 NULL. Call lto_elf_free_shdr to release the memory allocated. */
109 lto_elf_get_shdr (Elf_Scn *section)
113 switch (cached_file_attrs.bits)
119 /* Read the 32-bit section header. */
120 shdr32 = elf32_getshdr (section);
122 fatal_error ("could not read section header: %s", elf_errmsg (0));
124 /* Transform it into a 64-bit section header. */
125 shdr = XNEW (Elf64_Shdr);
126 shdr->sh_name = shdr32->sh_name;
127 shdr->sh_type = shdr32->sh_type;
128 shdr->sh_flags = shdr32->sh_flags;
129 shdr->sh_addr = shdr32->sh_addr;
130 shdr->sh_offset = shdr32->sh_offset;
131 shdr->sh_size = shdr32->sh_size;
132 shdr->sh_link = shdr32->sh_link;
133 shdr->sh_info = shdr32->sh_info;
134 shdr->sh_addralign = shdr32->sh_addralign;
135 shdr->sh_entsize = shdr32->sh_entsize;
141 shdr = elf64_getshdr (section);
143 fatal_error ("could not read section header: %s", elf_errmsg (0));
153 /* Free SHDR, previously allocated by lto_elf_get_shdr. */
155 lto_elf_free_shdr (Elf64_Shdr *shdr)
157 if (cached_file_attrs.bits != 64)
162 /* Returns a hash code for P. */
165 hash_name (const void *p)
167 const struct lto_section_slot *ds = (const struct lto_section_slot *) p;
168 return (hashval_t) htab_hash_string (ds->name);
172 /* Returns nonzero if P1 and P2 are equal. */
175 eq_name (const void *p1, const void *p2)
177 const struct lto_section_slot *s1 =
178 (const struct lto_section_slot *) p1;
179 const struct lto_section_slot *s2 =
180 (const struct lto_section_slot *) p2;
182 return strcmp (s1->name, s2->name) == 0;
186 /* Build a hash table whose key is the section names and whose data is
187 the start and size of each section in the .o file. */
190 lto_obj_build_section_table (lto_file *lto_file)
192 lto_elf_file *elf_file = (lto_elf_file *)lto_file;
193 htab_t section_hash_table;
197 section_hash_table = htab_create (37, hash_name, eq_name, free);
199 base_offset = elf_getbase (elf_file->elf);
200 /* We are reasonably sure that elf_getbase does not fail at this
201 point. So assume that we run into the incompatibility with
202 the FreeBSD libelf implementation that has a non-working
203 elf_getbase for non-archive members in which case the offset
205 if (base_offset == (size_t)-1)
207 for (section = elf_getscn (elf_file->elf, 0);
209 section = elf_nextscn (elf_file->elf, section))
216 struct lto_section_slot s_slot;
218 /* Get the name of this section. */
219 shdr = lto_elf_get_shdr (section);
220 offset = shdr->sh_name;
221 name = elf_strptr (elf_file->elf,
222 elf_file->sec_strtab,
225 /* Only put lto stuff into the symtab. */
226 if (strncmp (name, LTO_SECTION_NAME_PREFIX,
227 strlen (LTO_SECTION_NAME_PREFIX)) != 0)
229 lto_elf_free_shdr (shdr);
233 new_name = XNEWVEC (char, strlen (name) + 1);
234 strcpy (new_name, name);
235 s_slot.name = new_name;
236 slot = htab_find_slot (section_hash_table, &s_slot, INSERT);
239 struct lto_section_slot *new_slot = XNEW (struct lto_section_slot);
241 new_slot->name = new_name;
242 /* The offset into the file for this section. */
243 new_slot->start = base_offset + shdr->sh_offset;
244 new_slot->len = shdr->sh_size;
249 error ("two or more sections for %s:", new_name);
253 lto_elf_free_shdr (shdr);
256 return section_hash_table;
260 /* Initialize the section header of section SCN. SH_NAME is the section name
261 as an index into the section header string table. SH_TYPE is the section
262 type, an SHT_* macro from libelf headers. */
264 #define DEFINE_INIT_SHDR(BITS) \
266 init_shdr##BITS (Elf_Scn *scn, size_t sh_name, size_t sh_type) \
268 Elf##BITS##_Shdr *shdr; \
270 shdr = elf##BITS##_getshdr (scn); \
274 fatal_error ("elf32_getshdr() failed: %s", elf_errmsg (-1)); \
276 fatal_error ("elf64_getshdr() failed: %s", elf_errmsg (-1)); \
279 shdr->sh_name = sh_name; \
280 shdr->sh_type = sh_type; \
281 shdr->sh_addralign = POINTER_SIZE / BITS_PER_UNIT; \
282 shdr->sh_flags = 0; \
283 shdr->sh_entsize = 0; \
286 DEFINE_INIT_SHDR (32)
287 DEFINE_INIT_SHDR (64)
289 static bool first_data_block;
291 /* Begin a new ELF section named NAME with type TYPE in the current output
292 file. TYPE is an SHT_* macro from the libelf headers. */
295 lto_elf_begin_section_with_type (const char *name, size_t type)
301 /* Grab the current output file and do some basic assertion checking. */
302 file = (lto_elf_file *) lto_get_current_out_file (),
304 gcc_assert (file->elf);
305 gcc_assert (!file->scn);
307 /* Create a new section. */
308 scn = elf_newscn (file->elf);
310 fatal_error ("could not create a new ELF section: %s", elf_errmsg (-1));
313 /* Add a string table entry and record the offset. */
314 gcc_assert (file->shstrtab_stream);
315 sh_name = file->shstrtab_stream->total_size;
316 lto_output_data_stream (file->shstrtab_stream, name, strlen (name) + 1);
318 /* Initialize the section header. */
319 switch (cached_file_attrs.bits)
322 init_shdr32 (scn, sh_name, type);
326 init_shdr64 (scn, sh_name, type);
333 first_data_block = true;
337 /* Begin a new ELF section named NAME in the current output file. */
340 lto_obj_begin_section (const char *name)
342 lto_elf_begin_section_with_type (name, SHT_PROGBITS);
346 /* Append DATA of length LEN to the current output section. BASE is a pointer
347 to the output page containing DATA. It is freed once the output file has
351 lto_obj_append_data (const void *data, size_t len, void *block)
355 struct lto_char_ptr_base *base = (struct lto_char_ptr_base *) block;
357 /* Grab the current output file and do some basic assertion checking. */
358 file = (lto_elf_file *) lto_get_current_out_file ();
360 gcc_assert (file->scn);
362 elf_data = elf_newdata (file->scn);
364 fatal_error ("could not append data to ELF section: %s", elf_errmsg (-1));
366 if (first_data_block)
368 elf_data->d_align = POINTER_SIZE / BITS_PER_UNIT;
369 first_data_block = false;
372 elf_data->d_align = 1;
373 elf_data->d_buf = CONST_CAST (void *, data);
374 elf_data->d_off = 0LL;
375 elf_data->d_size = len;
376 elf_data->d_type = ELF_T_BYTE;
377 elf_data->d_version = EV_CURRENT;
379 base->ptr = (char *)file->data;
384 /* End the current output section. This just does some assertion checking
385 and sets the current output file's scn member to NULL. */
388 lto_obj_end_section (void)
392 /* Grab the current output file and validate some basic assertions. */
393 file = (lto_elf_file *) lto_get_current_out_file ();
395 gcc_assert (file->scn);
401 /* Return true if ELF_MACHINE is compatible with the cached value of the
402 architecture and possibly update the latter. Return false otherwise.
404 Note: if you want to add more EM_* cases, you'll need to provide the
405 corresponding definitions at the beginning of the file. */
408 is_compatible_architecture (Elf64_Half elf_machine)
410 if (cached_file_attrs.elf_machine == elf_machine)
413 switch (cached_file_attrs.elf_machine)
416 if (elf_machine == EM_SPARC32PLUS)
418 cached_file_attrs.elf_machine = elf_machine;
424 if (elf_machine == EM_SPARC)
436 /* Validate's ELF_FILE's executable header and, if cached_file_attrs is
437 uninitialized, caches the architecture. */
439 #define DEFINE_VALIDATE_EHDR(BITS) \
441 validate_ehdr##BITS (lto_elf_file *elf_file) \
443 Elf##BITS##_Ehdr *elf_header; \
445 elf_header = elf##BITS##_getehdr (elf_file->elf); \
448 error ("could not read ELF header: %s", elf_errmsg (0)); \
452 if (elf_header->e_type != ET_REL) \
454 error ("not a relocatable ELF object file"); \
458 if (!cached_file_attrs.initialized) \
459 cached_file_attrs.elf_machine = elf_header->e_machine; \
460 else if (!is_compatible_architecture (elf_header->e_machine)) \
462 error ("inconsistent file architecture detected"); \
469 DEFINE_VALIDATE_EHDR (32)
470 DEFINE_VALIDATE_EHDR (64)
473 #ifndef HAVE_ELF_GETSHDRSTRNDX
474 /* elf_getshdrstrndx replacement for systems that lack it, but provide
475 either the gABI conformant or Solaris 2 variant of elf_getshstrndx
479 elf_getshdrstrndx (Elf *elf, size_t *dst)
481 #ifdef HAVE_ELF_GETSHSTRNDX_GABI
482 return elf_getshstrndx (elf, dst);
484 return elf_getshstrndx (elf, dst) ? 0 : -1;
489 /* Validate's ELF_FILE's executable header and, if cached_file_attrs is
490 uninitialized, caches the results. Also records the section header string
491 table's section index. Returns true on success or false on failure. */
494 validate_file (lto_elf_file *elf_file)
496 const char *elf_ident;
498 /* Some aspects of the libelf API are dependent on whether the
499 object file is a 32-bit or 64-bit file. Determine which kind of
501 elf_ident = elf_getident (elf_file->elf, NULL);
504 error ("could not read ELF identification information: %s",
510 if (!cached_file_attrs.initialized)
512 switch (elf_ident[EI_CLASS])
515 cached_file_attrs.bits = 32;
519 cached_file_attrs.bits = 64;
523 error ("unsupported ELF file class");
527 memcpy (cached_file_attrs.elf_ident, elf_ident,
528 sizeof cached_file_attrs.elf_ident);
532 char elf_ident_buf[EI_NIDENT];
534 memcpy (elf_ident_buf, elf_ident, sizeof elf_ident_buf);
536 if (elf_ident_buf[EI_OSABI] != cached_file_attrs.elf_ident[EI_OSABI])
538 /* Allow mixing ELFOSABI_NONE with ELFOSABI_LINUX, with the result
540 if (elf_ident_buf[EI_OSABI] == ELFOSABI_NONE
541 && cached_file_attrs.elf_ident[EI_OSABI] == ELFOSABI_LINUX)
542 elf_ident_buf[EI_OSABI] = cached_file_attrs.elf_ident[EI_OSABI];
543 else if (elf_ident_buf[EI_OSABI] == ELFOSABI_LINUX
544 && cached_file_attrs.elf_ident[EI_OSABI] == ELFOSABI_NONE)
545 cached_file_attrs.elf_ident[EI_OSABI] = elf_ident_buf[EI_OSABI];
548 if (memcmp (elf_ident_buf, cached_file_attrs.elf_ident,
549 sizeof cached_file_attrs.elf_ident))
553 /* Check that the input file is a relocatable object file with the correct
555 switch (cached_file_attrs.bits)
558 if (!validate_ehdr32 (elf_file))
563 if (!validate_ehdr64 (elf_file))
571 /* Read the string table used for section header names. */
572 if (elf_getshdrstrndx (elf_file->elf, &elf_file->sec_strtab) == -1)
574 error ("could not locate ELF string table: %s", elf_errmsg (0));
578 cached_file_attrs.initialized = true;
583 /* Helper functions used by init_ehdr. Initialize ELF_FILE's executable
584 header using cached data from previously read files. */
586 #define DEFINE_INIT_EHDR(BITS) \
588 init_ehdr##BITS (lto_elf_file *elf_file) \
590 Elf##BITS##_Ehdr *ehdr; \
592 gcc_assert (cached_file_attrs.bits); \
594 ehdr = elf##BITS##_newehdr (elf_file->elf); \
598 fatal_error ("elf32_newehdr() failed: %s", elf_errmsg (-1)); \
600 fatal_error ("elf64_newehdr() failed: %s", elf_errmsg (-1)); \
603 memcpy (ehdr->e_ident, cached_file_attrs.elf_ident, \
604 sizeof cached_file_attrs.elf_ident); \
605 ehdr->e_type = ET_REL; \
606 ehdr->e_version = EV_CURRENT; \
607 ehdr->e_machine = cached_file_attrs.elf_machine; \
610 DEFINE_INIT_EHDR (32)
611 DEFINE_INIT_EHDR (64)
614 /* Initialize ELF_FILE's executable header using cached data from previously
618 init_ehdr (lto_elf_file *elf_file)
620 switch (cached_file_attrs.bits)
623 init_ehdr32 (elf_file);
627 init_ehdr64 (elf_file);
635 /* Open ELF file FILENAME. If WRITABLE is true, the file is opened for write
636 and, if necessary, created. Otherwise, the file is opened for reading.
637 Returns the opened file. */
640 lto_obj_file_open (const char *filename, bool writable)
642 lto_elf_file *elf_file;
643 lto_file *result = NULL;
647 const char *offset_p;
651 offset_p = strrchr (filename, '@');
653 && offset_p != filename
654 && sscanf (offset_p, "@%li%n", &loffset, &consumed) >= 1
655 && strlen (offset_p) == (unsigned int)consumed)
657 fname = (char *) xmalloc (offset_p - filename + 1);
658 memcpy (fname, filename, offset_p - filename);
659 fname[offset_p - filename] = '\0';
660 offset = (off_t)loffset;
661 /* elf_rand expects the offset to point to the ar header, not the
662 object itself. Subtract the size of the ar header (60 bytes).
663 We don't uses sizeof (struct ar_hd) to avoid including ar.h */
664 header_offset = offset - 60;
668 fname = xstrdup (filename);
674 elf_file = XCNEW (lto_elf_file);
675 result = (lto_file *) elf_file;
676 lto_file_init (result, fname, offset);
680 elf_file->fd = open (fname, writable ? O_WRONLY|O_CREAT|O_BINARY
681 : O_RDONLY|O_BINARY, 0666);
682 if (elf_file->fd == -1)
684 error ("could not open file %s", fname);
688 /* Initialize the ELF library. */
689 if (elf_version (EV_CURRENT) == EV_NONE)
691 error ("ELF library is older than that used when building GCC");
695 /* Open the ELF file descriptor. */
696 elf_file->elf = elf_begin (elf_file->fd, writable ? ELF_C_WRITE : ELF_C_READ,
700 error ("could not open ELF file: %s", elf_errmsg (0));
707 off_t t = elf_rand (elf_file->elf, header_offset);
708 if (t != header_offset)
710 error ("could not seek in archive");
714 e = elf_begin (elf_file->fd, ELF_C_READ, elf_file->elf);
717 error("could not find archive member");
720 elf_end (elf_file->elf);
726 init_ehdr (elf_file);
727 elf_file->shstrtab_stream = XCNEW (struct lto_output_stream);
728 /* Output an empty string to the section header table. This becomes the
729 name of the initial NULL section. */
730 lto_output_1_stream (elf_file->shstrtab_stream, '\0');
733 if (!validate_file (elf_file))
740 lto_obj_file_close (result);
745 /* Close ELF file FILE and clean up any associated data structures. If FILE
746 was opened for writing, the file's ELF data is written at this time, and
747 any cached data buffers are freed. */
750 lto_obj_file_close (lto_file *file)
752 lto_elf_file *elf_file = (lto_elf_file *) file;
753 struct lto_char_ptr_base *cur, *tmp;
755 /* Write the ELF section header string table. */
756 if (elf_file->shstrtab_stream)
759 GElf_Ehdr *ehdr_p, ehdr_buf;
760 lto_file *old_file = lto_set_current_out_file (file);
762 lto_elf_begin_section_with_type (".shstrtab", SHT_STRTAB);
763 ehdr_p = gelf_getehdr (elf_file->elf, &ehdr_buf);
765 fatal_error ("gelf_getehdr() failed: %s", elf_errmsg (-1));
766 strtab = elf_ndxscn (elf_file->scn);
767 if (strtab < SHN_LORESERVE)
768 ehdr_p->e_shstrndx = strtab;
771 GElf_Shdr *shdr_p, shdr_buf;
772 Elf_Scn *scn_p = elf_getscn (elf_file->elf, 0);
774 fatal_error ("elf_getscn() failed: %s", elf_errmsg (-1));
775 shdr_p = gelf_getshdr (scn_p, &shdr_buf);
777 fatal_error ("gelf_getshdr() failed: %s", elf_errmsg (-1));
778 shdr_p->sh_link = strtab;
779 if (gelf_update_shdr (scn_p, shdr_p) == 0)
780 fatal_error ("gelf_update_shdr() failed: %s", elf_errmsg (-1));
781 ehdr_p->e_shstrndx = SHN_XINDEX;
783 if (gelf_update_ehdr (elf_file->elf, ehdr_p) == 0)
784 fatal_error ("gelf_update_ehdr() failed: %s", elf_errmsg (-1));
785 lto_write_stream (elf_file->shstrtab_stream);
786 lto_obj_end_section ();
788 lto_set_current_out_file (old_file);
789 free (elf_file->shstrtab_stream);
791 if (elf_update (elf_file->elf, ELF_C_WRITE) < 0)
792 fatal_error ("elf_update() failed: %s", elf_errmsg (-1));
796 elf_end (elf_file->elf);
797 if (elf_file->fd != -1)
798 close (elf_file->fd);
800 /* Free any ELF data buffers. */
801 cur = elf_file->data;
805 cur = (struct lto_char_ptr_base *) cur->ptr;
813 /* The current output file. */
814 static lto_file *current_out_file;
817 /* Sets the current output file to FILE. Returns the old output file or
821 lto_set_current_out_file (lto_file *file)
823 lto_file *old_file = current_out_file;
824 current_out_file = file;
829 /* Returns the current output file. */
832 lto_get_current_out_file (void)
834 return current_out_file;