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"
28 #include "libiberty.h"
30 #include "lto-streamer.h"
32 /* Cater to hosts with half-backed <elf.h> file like HP-UX. */
37 #ifndef EM_SPARC32PLUS
38 # define EM_SPARC32PLUS 18
42 /* Handle opening elf files on hosts, such as Windows, that may use
43 text file handling that will break binary access. */
49 /* Initialize FILE, an LTO file object for FILENAME. */
51 lto_file_init (lto_file
*file
, const char *filename
, off_t offset
)
53 file
->filename
= filename
;
54 file
->offset
= offset
;
60 /* The base information. */
63 /* The system file descriptor for the file. */
66 /* The libelf descriptor for the file. */
69 /* Section number of string table used for section names. */
72 /* Writable file members. */
74 /* The currently active section. */
77 /* The output stream for section header names. */
78 struct lto_output_stream
*shstrtab_stream
;
80 /* Linked list of data which must be freed *after* the file has been
81 closed. This is an annoying limitation of libelf. */
82 struct lto_char_ptr_base
*data
;
84 typedef struct lto_elf_file lto_elf_file
;
86 /* Stores executable header attributes which must be shared by all ELF files.
87 This is used for validating input files and populating output files. */
92 unsigned char elf_ident
[EI_NIDENT
];
93 Elf64_Half elf_machine
;
97 /* Return the section header for SECTION. The return value is never
98 NULL. Call lto_elf_free_shdr to release the memory allocated. */
101 lto_elf_get_shdr (Elf_Scn
*section
)
105 switch (cached_file_attrs
.bits
)
111 /* Read the 32-bit section header. */
112 shdr32
= elf32_getshdr (section
);
114 fatal_error ("could not read section header: %s", elf_errmsg (0));
116 /* Transform it into a 64-bit section header. */
117 shdr
= XNEW (Elf64_Shdr
);
118 shdr
->sh_name
= shdr32
->sh_name
;
119 shdr
->sh_type
= shdr32
->sh_type
;
120 shdr
->sh_flags
= shdr32
->sh_flags
;
121 shdr
->sh_addr
= shdr32
->sh_addr
;
122 shdr
->sh_offset
= shdr32
->sh_offset
;
123 shdr
->sh_size
= shdr32
->sh_size
;
124 shdr
->sh_link
= shdr32
->sh_link
;
125 shdr
->sh_info
= shdr32
->sh_info
;
126 shdr
->sh_addralign
= shdr32
->sh_addralign
;
127 shdr
->sh_entsize
= shdr32
->sh_entsize
;
133 shdr
= elf64_getshdr (section
);
135 fatal_error ("could not read section header: %s", elf_errmsg (0));
145 /* Free SHDR, previously allocated by lto_elf_get_shdr. */
147 lto_elf_free_shdr (Elf64_Shdr
*shdr
)
149 if (cached_file_attrs
.bits
!= 64)
154 /* Returns a hash code for P. */
157 hash_name (const void *p
)
159 const struct lto_section_slot
*ds
= (const struct lto_section_slot
*) p
;
160 return (hashval_t
) htab_hash_string (ds
->name
);
164 /* Returns nonzero if P1 and P2 are equal. */
167 eq_name (const void *p1
, const void *p2
)
169 const struct lto_section_slot
*s1
=
170 (const struct lto_section_slot
*) p1
;
171 const struct lto_section_slot
*s2
=
172 (const struct lto_section_slot
*) p2
;
174 return strcmp (s1
->name
, s2
->name
) == 0;
178 /* Build a hash table whose key is the section names and whose data is
179 the start and size of each section in the .o file. */
182 lto_elf_build_section_table (lto_file
*lto_file
)
184 lto_elf_file
*elf_file
= (lto_elf_file
*)lto_file
;
185 htab_t section_hash_table
;
189 section_hash_table
= htab_create (37, hash_name
, eq_name
, free
);
191 base_offset
= elf_getbase (elf_file
->elf
);
192 for (section
= elf_getscn (elf_file
->elf
, 0);
194 section
= elf_nextscn (elf_file
->elf
, section
))
201 struct lto_section_slot s_slot
;
203 /* Get the name of this section. */
204 shdr
= lto_elf_get_shdr (section
);
205 offset
= shdr
->sh_name
;
206 name
= elf_strptr (elf_file
->elf
,
207 elf_file
->sec_strtab
,
210 /* Only put lto stuff into the symtab. */
211 if (strncmp (name
, LTO_SECTION_NAME_PREFIX
,
212 strlen (LTO_SECTION_NAME_PREFIX
)) != 0)
214 lto_elf_free_shdr (shdr
);
218 new_name
= XNEWVEC (char, strlen (name
) + 1);
219 strcpy (new_name
, name
);
220 s_slot
.name
= new_name
;
221 slot
= htab_find_slot (section_hash_table
, &s_slot
, INSERT
);
224 struct lto_section_slot
*new_slot
= XNEW (struct lto_section_slot
);
226 new_slot
->name
= new_name
;
227 /* The offset into the file for this section. */
228 new_slot
->start
= base_offset
+ shdr
->sh_offset
;
229 new_slot
->len
= shdr
->sh_size
;
234 error ("two or more sections for %s:", new_name
);
238 lto_elf_free_shdr (shdr
);
241 return section_hash_table
;
245 /* Initialize the section header of section SCN. SH_NAME is the section name
246 as an index into the section header string table. SH_TYPE is the section
247 type, an SHT_* macro from libelf headers. */
249 #define DEFINE_INIT_SHDR(BITS) \
251 init_shdr##BITS (Elf_Scn *scn, size_t sh_name, size_t sh_type) \
253 Elf##BITS##_Shdr *shdr; \
255 shdr = elf##BITS##_getshdr (scn); \
259 fatal_error ("elf32_getshdr() failed: %s", elf_errmsg (-1)); \
261 fatal_error ("elf64_getshdr() failed: %s", elf_errmsg (-1)); \
264 shdr->sh_name = sh_name; \
265 shdr->sh_type = sh_type; \
266 shdr->sh_addralign = POINTER_SIZE / BITS_PER_UNIT; \
267 shdr->sh_flags = 0; \
268 shdr->sh_entsize = 0; \
271 DEFINE_INIT_SHDR (32)
272 DEFINE_INIT_SHDR (64)
274 static bool first_data_block
;
276 /* Begin a new ELF section named NAME with type TYPE in the current output
277 file. TYPE is an SHT_* macro from the libelf headers. */
280 lto_elf_begin_section_with_type (const char *name
, size_t type
)
286 /* Grab the current output file and do some basic assertion checking. */
287 file
= (lto_elf_file
*) lto_get_current_out_file (),
289 gcc_assert (file
->elf
);
290 gcc_assert (!file
->scn
);
292 /* Create a new section. */
293 scn
= elf_newscn (file
->elf
);
295 fatal_error ("could not create a new ELF section: %s", elf_errmsg (-1));
298 /* Add a string table entry and record the offset. */
299 gcc_assert (file
->shstrtab_stream
);
300 sh_name
= file
->shstrtab_stream
->total_size
;
301 lto_output_data_stream (file
->shstrtab_stream
, name
, strlen (name
) + 1);
303 /* Initialize the section header. */
304 switch (cached_file_attrs
.bits
)
307 init_shdr32 (scn
, sh_name
, type
);
311 init_shdr64 (scn
, sh_name
, type
);
318 first_data_block
= true;
322 /* Begin a new ELF section named NAME in the current output file. */
325 lto_elf_begin_section (const char *name
)
327 lto_elf_begin_section_with_type (name
, SHT_PROGBITS
);
331 /* Append DATA of length LEN to the current output section. BASE is a pointer
332 to the output page containing DATA. It is freed once the output file has
336 lto_elf_append_data (const void *data
, size_t len
, void *block
)
340 struct lto_char_ptr_base
*base
= (struct lto_char_ptr_base
*) block
;
342 /* Grab the current output file and do some basic assertion checking. */
343 file
= (lto_elf_file
*) lto_get_current_out_file ();
345 gcc_assert (file
->scn
);
347 elf_data
= elf_newdata (file
->scn
);
349 fatal_error ("could not append data to ELF section: %s", elf_errmsg (-1));
351 if (first_data_block
)
353 elf_data
->d_align
= POINTER_SIZE
/ BITS_PER_UNIT
;
354 first_data_block
= false;
357 elf_data
->d_align
= 1;
358 elf_data
->d_buf
= CONST_CAST (void *, data
);
359 elf_data
->d_off
= 0LL;
360 elf_data
->d_size
= len
;
361 elf_data
->d_type
= ELF_T_BYTE
;
362 elf_data
->d_version
= EV_CURRENT
;
364 base
->ptr
= (char *)file
->data
;
369 /* End the current output section. This just does some assertion checking
370 and sets the current output file's scn member to NULL. */
373 lto_elf_end_section (void)
377 /* Grab the current output file and validate some basic assertions. */
378 file
= (lto_elf_file
*) lto_get_current_out_file ();
380 gcc_assert (file
->scn
);
386 /* Return true if ELF_MACHINE is compatible with the cached value of the
387 architecture and possibly update the latter. Return false otherwise.
389 Note: if you want to add more EM_* cases, you'll need to provide the
390 corresponding definitions at the beginning of the file. */
393 is_compatible_architecture (Elf64_Half elf_machine
)
395 if (cached_file_attrs
.elf_machine
== elf_machine
)
398 switch (cached_file_attrs
.elf_machine
)
401 if (elf_machine
== EM_SPARC32PLUS
)
403 cached_file_attrs
.elf_machine
= elf_machine
;
409 if (elf_machine
== EM_SPARC
)
421 /* Validate's ELF_FILE's executable header and, if cached_file_attrs is
422 uninitialized, caches the architecture. */
424 #define DEFINE_VALIDATE_EHDR(BITS) \
426 validate_ehdr##BITS (lto_elf_file *elf_file) \
428 Elf##BITS##_Ehdr *elf_header; \
430 elf_header = elf##BITS##_getehdr (elf_file->elf); \
433 error ("could not read ELF header: %s", elf_errmsg (0)); \
437 if (elf_header->e_type != ET_REL) \
439 error ("not a relocatable ELF object file"); \
443 if (!cached_file_attrs.initialized) \
444 cached_file_attrs.elf_machine = elf_header->e_machine; \
445 else if (!is_compatible_architecture (elf_header->e_machine)) \
447 error ("inconsistent file architecture detected"); \
454 DEFINE_VALIDATE_EHDR (32)
455 DEFINE_VALIDATE_EHDR (64)
458 /* Validate's ELF_FILE's executable header and, if cached_file_attrs is
459 uninitialized, caches the results. Also records the section header string
460 table's section index. Returns true on success or false on failure. */
463 validate_file (lto_elf_file
*elf_file
)
465 const char *elf_ident
;
467 /* Some aspects of the libelf API are dependent on whether the
468 object file is a 32-bit or 64-bit file. Determine which kind of
470 elf_ident
= elf_getident (elf_file
->elf
, NULL
);
473 error ("could not read ELF identification information: %s",
479 if (!cached_file_attrs
.initialized
)
481 switch (elf_ident
[EI_CLASS
])
484 cached_file_attrs
.bits
= 32;
488 cached_file_attrs
.bits
= 64;
492 error ("unsupported ELF file class");
496 memcpy (cached_file_attrs
.elf_ident
, elf_ident
,
497 sizeof cached_file_attrs
.elf_ident
);
500 if (memcmp (elf_ident
, cached_file_attrs
.elf_ident
,
501 sizeof cached_file_attrs
.elf_ident
))
504 /* Check that the input file is a relocatable object file with the correct
506 switch (cached_file_attrs
.bits
)
509 if (!validate_ehdr32 (elf_file
))
514 if (!validate_ehdr64 (elf_file
))
522 /* Read the string table used for section header names. */
523 if (elf_getshdrstrndx (elf_file
->elf
, &elf_file
->sec_strtab
) == -1)
525 error ("could not locate ELF string table: %s", elf_errmsg (0));
529 cached_file_attrs
.initialized
= true;
534 /* Helper functions used by init_ehdr. Initialize ELF_FILE's executable
535 header using cached data from previously read files. */
537 #define DEFINE_INIT_EHDR(BITS) \
539 init_ehdr##BITS (lto_elf_file *elf_file) \
541 Elf##BITS##_Ehdr *ehdr; \
543 gcc_assert (cached_file_attrs.bits); \
545 ehdr = elf##BITS##_newehdr (elf_file->elf); \
549 fatal_error ("elf32_newehdr() failed: %s", elf_errmsg (-1)); \
551 fatal_error ("elf64_newehdr() failed: %s", elf_errmsg (-1)); \
554 memcpy (ehdr->e_ident, cached_file_attrs.elf_ident, \
555 sizeof cached_file_attrs.elf_ident); \
556 ehdr->e_type = ET_REL; \
557 ehdr->e_version = EV_CURRENT; \
558 ehdr->e_machine = cached_file_attrs.elf_machine; \
561 DEFINE_INIT_EHDR (32)
562 DEFINE_INIT_EHDR (64)
565 /* Initialize ELF_FILE's executable header using cached data from previously
569 init_ehdr (lto_elf_file
*elf_file
)
571 switch (cached_file_attrs
.bits
)
574 init_ehdr32 (elf_file
);
578 init_ehdr64 (elf_file
);
586 /* Open ELF file FILENAME. If WRITABLE is true, the file is opened for write
587 and, if necessary, created. Otherwise, the file is opened for reading.
588 Returns the opened file. */
591 lto_elf_file_open (const char *filename
, bool writable
)
593 lto_elf_file
*elf_file
;
594 lto_file
*result
= NULL
;
598 const char *offset_p
;
602 offset_p
= strrchr (filename
, '@');
604 && offset_p
!= filename
605 && sscanf (offset_p
, "@%li%n", &loffset
, &consumed
) >= 1
606 && strlen (offset_p
) == (unsigned int)consumed
)
608 fname
= (char *) xmalloc (offset_p
- filename
+ 1);
609 memcpy (fname
, filename
, offset_p
- filename
);
610 fname
[offset_p
- filename
] = '\0';
611 offset
= (off_t
)loffset
;
612 /* elf_rand expects the offset to point to the ar header, not the
613 object itself. Subtract the size of the ar header (60 bytes).
614 We don't uses sizeof (struct ar_hd) to avoid including ar.h */
615 header_offset
= offset
- 60;
619 fname
= xstrdup (filename
);
625 elf_file
= XCNEW (lto_elf_file
);
626 result
= (lto_file
*) elf_file
;
627 lto_file_init (result
, fname
, offset
);
631 elf_file
->fd
= open (fname
, writable
? O_WRONLY
|O_CREAT
|O_BINARY
632 : O_RDONLY
|O_BINARY
, 0666);
633 if (elf_file
->fd
== -1)
635 error ("could not open file %s", fname
);
639 /* Initialize the ELF library. */
640 if (elf_version (EV_CURRENT
) == EV_NONE
)
642 error ("ELF library is older than that used when building GCC");
646 /* Open the ELF file descriptor. */
647 elf_file
->elf
= elf_begin (elf_file
->fd
, writable
? ELF_C_WRITE
: ELF_C_READ
,
651 error ("could not open ELF file: %s", elf_errmsg (0));
658 off_t t
= elf_rand (elf_file
->elf
, header_offset
);
659 if (t
!= header_offset
)
661 error ("could not seek in archive");
665 e
= elf_begin (elf_file
->fd
, ELF_C_READ
, elf_file
->elf
);
668 error("could not find archive member");
671 elf_end (elf_file
->elf
);
677 init_ehdr (elf_file
);
678 elf_file
->shstrtab_stream
= XCNEW (struct lto_output_stream
);
679 /* Output an empty string to the section header table. This becomes the
680 name of the initial NULL section. */
681 lto_output_1_stream (elf_file
->shstrtab_stream
, '\0');
684 if (!validate_file (elf_file
))
691 lto_elf_file_close (result
);
696 /* Close ELF file FILE and clean up any associated data structures. If FILE
697 was opened for writing, the file's ELF data is written at this time, and
698 any cached data buffers are freed. */
701 lto_elf_file_close (lto_file
*file
)
703 lto_elf_file
*elf_file
= (lto_elf_file
*) file
;
704 struct lto_char_ptr_base
*cur
, *tmp
;
706 /* Write the ELF section header string table. */
707 if (elf_file
->shstrtab_stream
)
710 GElf_Ehdr
*ehdr_p
, ehdr_buf
;
711 lto_file
*old_file
= lto_set_current_out_file (file
);
713 lto_elf_begin_section_with_type (".shstrtab", SHT_STRTAB
);
714 ehdr_p
= gelf_getehdr (elf_file
->elf
, &ehdr_buf
);
716 fatal_error ("gelf_getehdr() failed: %s", elf_errmsg (-1));
717 strtab
= elf_ndxscn (elf_file
->scn
);
718 if (strtab
< SHN_LORESERVE
)
719 ehdr_p
->e_shstrndx
= strtab
;
722 GElf_Shdr
*shdr_p
, shdr_buf
;
723 Elf_Scn
*scn_p
= elf_getscn (elf_file
->elf
, 0);
725 fatal_error ("elf_getscn() failed: %s", elf_errmsg (-1));
726 shdr_p
= gelf_getshdr (scn_p
, &shdr_buf
);
728 fatal_error ("gelf_getshdr() failed: %s", elf_errmsg (-1));
729 shdr_p
->sh_link
= strtab
;
730 if (gelf_update_shdr (scn_p
, shdr_p
) == 0)
731 fatal_error ("gelf_update_shdr() failed: %s", elf_errmsg (-1));
732 ehdr_p
->e_shstrndx
= SHN_XINDEX
;
734 if (gelf_update_ehdr (elf_file
->elf
, ehdr_p
) == 0)
735 fatal_error ("gelf_update_ehdr() failed: %s", elf_errmsg (-1));
736 lto_write_stream (elf_file
->shstrtab_stream
);
737 lto_elf_end_section ();
739 lto_set_current_out_file (old_file
);
740 free (elf_file
->shstrtab_stream
);
742 if (elf_update (elf_file
->elf
, ELF_C_WRITE
) < 0)
743 fatal_error ("elf_update() failed: %s", elf_errmsg (-1));
747 elf_end (elf_file
->elf
);
748 if (elf_file
->fd
!= -1)
749 close (elf_file
->fd
);
751 /* Free any ELF data buffers. */
752 cur
= elf_file
->data
;
756 cur
= (struct lto_char_ptr_base
*) cur
->ptr
;
764 /* The current output file. */
765 static lto_file
*current_out_file
;
768 /* Sets the current output file to FILE. Returns the old output file or
772 lto_set_current_out_file (lto_file
*file
)
774 lto_file
*old_file
= current_out_file
;
775 current_out_file
= file
;
780 /* Returns the current output file. */
783 lto_get_current_out_file (void)
785 return current_out_file
;