1 /* simple-object.c -- simple routines to read and write object files.
2 Copyright (C) 2010-2020 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
51 #include "simple-object-common.h"
53 /* The known object file formats. */
55 static const struct simple_object_functions
* const format_functions
[] =
57 &simple_object_elf_functions
,
58 &simple_object_mach_o_functions
,
59 &simple_object_coff_functions
,
60 &simple_object_xcoff_functions
63 /* Read data from a file using the simple_object error reporting
67 simple_object_internal_read (int descriptor
, off_t offset
,
68 unsigned char *buffer
, size_t size
,
69 const char **errmsg
, int *err
)
71 if (lseek (descriptor
, offset
, SEEK_SET
) < 0)
80 ssize_t got
= read (descriptor
, buffer
, size
);
88 else if (errno
!= EINTR
)
99 *errmsg
= "file too short";
107 /* Write data to a file using the simple_object error reporting
111 simple_object_internal_write (int descriptor
, off_t offset
,
112 const unsigned char *buffer
, size_t size
,
113 const char **errmsg
, int *err
)
115 if (lseek (descriptor
, offset
, SEEK_SET
) < 0)
124 ssize_t wrote
= write (descriptor
, buffer
, size
);
132 else if (errno
!= EINTR
)
143 *errmsg
= "short write";
154 simple_object_start_read (int descriptor
, off_t offset
,
155 const char *segment_name
, const char **errmsg
,
158 unsigned char header
[SIMPLE_OBJECT_MATCH_HEADER_LEN
];
161 if (!simple_object_internal_read (descriptor
, offset
, header
,
162 SIMPLE_OBJECT_MATCH_HEADER_LEN
,
166 len
= sizeof (format_functions
) / sizeof (format_functions
[0]);
167 for (i
= 0; i
< len
; ++i
)
171 data
= format_functions
[i
]->match (header
, descriptor
, offset
,
172 segment_name
, errmsg
, err
);
175 simple_object_read
*ret
;
177 ret
= XNEW (simple_object_read
);
178 ret
->descriptor
= descriptor
;
179 ret
->offset
= offset
;
180 ret
->functions
= format_functions
[i
];
186 *errmsg
= "file not recognized";
191 /* Find all sections. */
194 simple_object_find_sections (simple_object_read
*sobj
,
195 int (*pfn
) (void *, const char *, off_t
, off_t
),
199 return sobj
->functions
->find_sections (sobj
, pfn
, data
, err
);
202 /* Internal data passed to find_one_section. */
204 struct find_one_section_data
206 /* The section we are looking for. */
208 /* Where to store the section offset. */
210 /* Where to store the section length. */
212 /* Set if the name is found. */
216 /* Internal function passed to find_sections. */
219 find_one_section (void *data
, const char *name
, off_t offset
, off_t length
)
221 struct find_one_section_data
*fosd
= (struct find_one_section_data
*) data
;
223 if (strcmp (name
, fosd
->name
) != 0)
226 *fosd
->offset
= offset
;
227 *fosd
->length
= length
;
230 /* Stop iteration. */
234 /* Find a section. */
237 simple_object_find_section (simple_object_read
*sobj
, const char *name
,
238 off_t
*offset
, off_t
*length
,
239 const char **errmsg
, int *err
)
241 struct find_one_section_data fosd
;
244 fosd
.offset
= offset
;
245 fosd
.length
= length
;
248 *errmsg
= simple_object_find_sections (sobj
, find_one_section
,
249 (void *) &fosd
, err
);
257 /* Callback to identify and rename LTO debug sections by name.
258 Returns non-NULL if NAME is a LTO debug section, NULL if not.
259 If RENAME is true it will rename LTO debug sections to non-LTO
263 handle_lto_debug_sections (const char *name
, int rename
)
265 char *newname
= rename
? XCNEWVEC (char, strlen (name
) + 1)
268 /* ??? So we can't use .gnu.lto_ prefixed sections as the assembler
269 complains about bogus section flags. Which means we need to arrange
270 for that to be fixed or .gnu.debuglto_ marked as SHF_EXCLUDE (to make
271 fat lto object tooling work for the fat part). */
272 /* Also include corresponding reloc sections. */
273 if (strncmp (name
, ".rela", sizeof (".rela") - 1) == 0)
276 strncpy (newname
, name
, sizeof (".rela") - 1);
277 name
+= sizeof (".rela") - 1;
279 else if (strncmp (name
, ".rel", sizeof (".rel") - 1) == 0)
282 strncpy (newname
, name
, sizeof (".rel") - 1);
283 name
+= sizeof (".rel") - 1;
285 /* ??? For now this handles both .gnu.lto_ and .gnu.debuglto_ prefixed
287 /* Copy LTO debug sections and rename them to their non-LTO name. */
288 if (strncmp (name
, ".gnu.debuglto_", sizeof (".gnu.debuglto_") - 1) == 0)
289 return rename
? strcat (newname
, name
+ sizeof (".gnu.debuglto_") - 1) : newname
;
290 else if (strncmp (name
, ".gnu.lto_.debug_",
291 sizeof (".gnu.lto_.debug_") -1) == 0)
292 return rename
? strcat (newname
, name
+ sizeof (".gnu.lto_") - 1) : newname
;
293 /* Copy over .note.GNU-stack section under the same name if present. */
294 else if (strcmp (name
, ".note.GNU-stack") == 0)
295 return strcpy (newname
, name
);
296 /* Copy over .note.gnu.property section under the same name if present. */
297 else if (strcmp (name
, ".note.gnu.property") == 0)
298 return strcpy (newname
, name
);
299 /* Copy over .comment section under the same name if present. Solaris
300 ld uses them to relax its checking of ELF gABI access rules for
301 COMDAT sections in objects produced by GCC. */
302 else if (strcmp (name
, ".comment") == 0)
303 return strcpy (newname
, name
);
308 /* Wrapper for handle_lto_debug_sections. */
311 handle_lto_debug_sections_rename (const char *name
)
313 return handle_lto_debug_sections (name
, 1);
316 /* Wrapper for handle_lto_debug_sections. */
319 handle_lto_debug_sections_norename (const char *name
)
321 return handle_lto_debug_sections (name
, 0);
324 /* Copy LTO debug sections. */
327 simple_object_copy_lto_debug_sections (simple_object_read
*sobj
,
328 const char *dest
, int *err
, int rename
)
331 simple_object_write
*dest_sobj
;
332 simple_object_attributes
*attrs
;
335 if (! sobj
->functions
->copy_lto_debug_sections
)
338 return "simple_object_copy_lto_debug_sections not implemented";
341 attrs
= simple_object_fetch_attributes (sobj
, &errmsg
, err
);
344 dest_sobj
= simple_object_start_write (attrs
, NULL
, &errmsg
, err
);
345 simple_object_release_attributes (attrs
);
349 errmsg
= sobj
->functions
->copy_lto_debug_sections
351 rename
? handle_lto_debug_sections_rename
352 : handle_lto_debug_sections_norename
, err
);
355 simple_object_release_write (dest_sobj
);
359 outfd
= open (dest
, O_CREAT
|O_WRONLY
|O_TRUNC
|O_BINARY
, 00777);
363 simple_object_release_write (dest_sobj
);
364 return "open failed";
367 errmsg
= simple_object_write_to_file (dest_sobj
, outfd
, err
);
371 simple_object_release_write (dest_sobj
);
375 simple_object_release_write (dest_sobj
);
379 /* Fetch attributes. */
381 simple_object_attributes
*
382 simple_object_fetch_attributes (simple_object_read
*sobj
, const char **errmsg
,
386 simple_object_attributes
*ret
;
388 data
= sobj
->functions
->fetch_attributes (sobj
, errmsg
, err
);
391 ret
= XNEW (simple_object_attributes
);
392 ret
->functions
= sobj
->functions
;
397 /* Release an simple_object_read. */
400 simple_object_release_read (simple_object_read
*sobj
)
402 sobj
->functions
->release_read (sobj
->data
);
406 /* Merge attributes. */
409 simple_object_attributes_merge (simple_object_attributes
*to
,
410 simple_object_attributes
*from
,
413 if (to
->functions
!= from
->functions
)
416 return "different object file format";
418 return to
->functions
->attributes_merge (to
->data
, from
->data
, err
);
421 /* Release an attributes structure. */
424 simple_object_release_attributes (simple_object_attributes
*attrs
)
426 attrs
->functions
->release_attributes (attrs
->data
);
430 /* Start creating an object file. */
432 simple_object_write
*
433 simple_object_start_write (simple_object_attributes
*attrs
,
434 const char *segment_name
, const char **errmsg
,
438 simple_object_write
*ret
;
440 data
= attrs
->functions
->start_write (attrs
->data
, errmsg
, err
);
443 ret
= XNEW (simple_object_write
);
444 ret
->functions
= attrs
->functions
;
445 ret
->segment_name
= segment_name
? xstrdup (segment_name
) : NULL
;
446 ret
->sections
= NULL
;
447 ret
->last_section
= NULL
;
452 /* Start creating a section. */
454 simple_object_write_section
*
455 simple_object_write_create_section (simple_object_write
*sobj
, const char *name
,
457 const char **errmsg ATTRIBUTE_UNUSED
,
458 int *err ATTRIBUTE_UNUSED
)
460 simple_object_write_section
*ret
;
462 ret
= XNEW (simple_object_write_section
);
464 ret
->name
= xstrdup (name
);
467 ret
->last_buffer
= NULL
;
469 if (sobj
->last_section
== NULL
)
471 sobj
->sections
= ret
;
472 sobj
->last_section
= ret
;
476 sobj
->last_section
->next
= ret
;
477 sobj
->last_section
= ret
;
483 /* Add data to a section. */
486 simple_object_write_add_data (simple_object_write
*sobj ATTRIBUTE_UNUSED
,
487 simple_object_write_section
*section
,
489 size_t size
, int copy
,
490 int *err ATTRIBUTE_UNUSED
)
492 struct simple_object_write_section_buffer
*wsb
;
494 wsb
= XNEW (struct simple_object_write_section_buffer
);
500 wsb
->buffer
= buffer
;
501 wsb
->free_buffer
= NULL
;
505 wsb
->free_buffer
= (void *) XNEWVEC (char, size
);
506 memcpy (wsb
->free_buffer
, buffer
, size
);
507 wsb
->buffer
= wsb
->free_buffer
;
510 if (section
->last_buffer
== NULL
)
512 section
->buffers
= wsb
;
513 section
->last_buffer
= wsb
;
517 section
->last_buffer
->next
= wsb
;
518 section
->last_buffer
= wsb
;
524 /* Write the complete object file. */
527 simple_object_write_to_file (simple_object_write
*sobj
, int descriptor
,
530 return sobj
->functions
->write_to_file (sobj
, descriptor
, err
);
533 /* Release an simple_object_write. */
536 simple_object_release_write (simple_object_write
*sobj
)
538 simple_object_write_section
*section
;
540 free (sobj
->segment_name
);
542 section
= sobj
->sections
;
543 while (section
!= NULL
)
545 struct simple_object_write_section_buffer
*buffer
;
546 simple_object_write_section
*next_section
;
548 buffer
= section
->buffers
;
549 while (buffer
!= NULL
)
551 struct simple_object_write_section_buffer
*next_buffer
;
553 if (buffer
->free_buffer
!= NULL
)
554 XDELETEVEC (buffer
->free_buffer
);
555 next_buffer
= buffer
->next
;
557 buffer
= next_buffer
;
560 next_section
= section
->next
;
561 free (section
->name
);
563 section
= next_section
;
566 sobj
->functions
->release_write (sobj
->data
);