1 /* simple-object.c -- simple routines to read and write object files.
2 Copyright (C) 2010-2019 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
47 #include "simple-object-common.h"
49 /* The known object file formats. */
51 static const struct simple_object_functions * const format_functions[] =
53 &simple_object_elf_functions,
54 &simple_object_mach_o_functions,
55 &simple_object_coff_functions,
56 &simple_object_xcoff_functions
59 /* Read data from a file using the simple_object error reporting
63 simple_object_internal_read (int descriptor, off_t offset,
64 unsigned char *buffer, size_t size,
65 const char **errmsg, int *err)
67 if (lseek (descriptor, offset, SEEK_SET) < 0)
76 ssize_t got = read (descriptor, buffer, size);
84 else if (errno != EINTR)
95 *errmsg = "file too short";
103 /* Write data to a file using the simple_object error reporting
107 simple_object_internal_write (int descriptor, off_t offset,
108 const unsigned char *buffer, size_t size,
109 const char **errmsg, int *err)
111 if (lseek (descriptor, offset, SEEK_SET) < 0)
120 ssize_t wrote = write (descriptor, buffer, size);
128 else if (errno != EINTR)
139 *errmsg = "short write";
150 simple_object_start_read (int descriptor, off_t offset,
151 const char *segment_name, const char **errmsg,
154 unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN];
157 if (!simple_object_internal_read (descriptor, offset, header,
158 SIMPLE_OBJECT_MATCH_HEADER_LEN,
162 len = sizeof (format_functions) / sizeof (format_functions[0]);
163 for (i = 0; i < len; ++i)
167 data = format_functions[i]->match (header, descriptor, offset,
168 segment_name, errmsg, err);
171 simple_object_read *ret;
173 ret = XNEW (simple_object_read);
174 ret->descriptor = descriptor;
175 ret->offset = offset;
176 ret->functions = format_functions[i];
182 *errmsg = "file not recognized";
187 /* Find all sections. */
190 simple_object_find_sections (simple_object_read *sobj,
191 int (*pfn) (void *, const char *, off_t, off_t),
195 return sobj->functions->find_sections (sobj, pfn, data, err);
198 /* Internal data passed to find_one_section. */
200 struct find_one_section_data
202 /* The section we are looking for. */
204 /* Where to store the section offset. */
206 /* Where to store the section length. */
208 /* Set if the name is found. */
212 /* Internal function passed to find_sections. */
215 find_one_section (void *data, const char *name, off_t offset, off_t length)
217 struct find_one_section_data *fosd = (struct find_one_section_data *) data;
219 if (strcmp (name, fosd->name) != 0)
222 *fosd->offset = offset;
223 *fosd->length = length;
226 /* Stop iteration. */
230 /* Find a section. */
233 simple_object_find_section (simple_object_read *sobj, const char *name,
234 off_t *offset, off_t *length,
235 const char **errmsg, int *err)
237 struct find_one_section_data fosd;
240 fosd.offset = offset;
241 fosd.length = length;
244 *errmsg = simple_object_find_sections (sobj, find_one_section,
245 (void *) &fosd, err);
253 /* Callback to identify and rename LTO debug sections by name.
254 Returns non-NULL if NAME is a LTO debug section, NULL if not.
255 If RENAME is true it will rename LTO debug sections to non-LTO
259 handle_lto_debug_sections (const char *name, int rename)
261 char *newname = rename ? XCNEWVEC (char, strlen (name) + 1)
264 /* ??? So we can't use .gnu.lto_ prefixed sections as the assembler
265 complains about bogus section flags. Which means we need to arrange
266 for that to be fixed or .gnu.debuglto_ marked as SHF_EXCLUDE (to make
267 fat lto object tooling work for the fat part). */
268 /* Also include corresponding reloc sections. */
269 if (strncmp (name, ".rela", sizeof (".rela") - 1) == 0)
272 strncpy (newname, name, sizeof (".rela") - 1);
273 name += sizeof (".rela") - 1;
275 else if (strncmp (name, ".rel", sizeof (".rel") - 1) == 0)
278 strncpy (newname, name, sizeof (".rel") - 1);
279 name += sizeof (".rel") - 1;
281 /* ??? For now this handles both .gnu.lto_ and .gnu.debuglto_ prefixed
283 /* Copy LTO debug sections and rename them to their non-LTO name. */
284 if (strncmp (name, ".gnu.debuglto_", sizeof (".gnu.debuglto_") - 1) == 0)
285 return rename ? strcat (newname, name + sizeof (".gnu.debuglto_") - 1) : newname;
286 else if (strncmp (name, ".gnu.lto_.debug_",
287 sizeof (".gnu.lto_.debug_") -1) == 0)
288 return rename ? strcat (newname, name + sizeof (".gnu.lto_") - 1) : newname;
289 /* Copy over .note.GNU-stack section under the same name if present. */
290 else if (strcmp (name, ".note.GNU-stack") == 0)
291 return strcpy (newname, name);
292 /* Copy over .comment section under the same name if present. Solaris
293 ld uses them to relax its checking of ELF gABI access rules for
294 COMDAT sections in objects produced by GCC. */
295 else if (strcmp (name, ".comment") == 0)
296 return strcpy (newname, name);
301 /* Wrapper for handle_lto_debug_sections. */
304 handle_lto_debug_sections_rename (const char *name)
306 return handle_lto_debug_sections (name, 1);
309 /* Wrapper for handle_lto_debug_sections. */
312 handle_lto_debug_sections_norename (const char *name)
314 return handle_lto_debug_sections (name, 0);
317 /* Copy LTO debug sections. */
320 simple_object_copy_lto_debug_sections (simple_object_read *sobj,
321 const char *dest, int *err, int rename)
324 simple_object_write *dest_sobj;
325 simple_object_attributes *attrs;
328 if (! sobj->functions->copy_lto_debug_sections)
331 return "simple_object_copy_lto_debug_sections not implemented";
334 attrs = simple_object_fetch_attributes (sobj, &errmsg, err);
337 dest_sobj = simple_object_start_write (attrs, NULL, &errmsg, err);
338 simple_object_release_attributes (attrs);
342 errmsg = sobj->functions->copy_lto_debug_sections
344 rename ? handle_lto_debug_sections_rename
345 : handle_lto_debug_sections_norename, err);
348 simple_object_release_write (dest_sobj);
352 outfd = creat (dest, 00777);
356 simple_object_release_write (dest_sobj);
357 return "open failed";
360 errmsg = simple_object_write_to_file (dest_sobj, outfd, err);
364 simple_object_release_write (dest_sobj);
368 simple_object_release_write (dest_sobj);
372 /* Fetch attributes. */
374 simple_object_attributes *
375 simple_object_fetch_attributes (simple_object_read *sobj, const char **errmsg,
379 simple_object_attributes *ret;
381 data = sobj->functions->fetch_attributes (sobj, errmsg, err);
384 ret = XNEW (simple_object_attributes);
385 ret->functions = sobj->functions;
390 /* Release an simple_object_read. */
393 simple_object_release_read (simple_object_read *sobj)
395 sobj->functions->release_read (sobj->data);
399 /* Merge attributes. */
402 simple_object_attributes_merge (simple_object_attributes *to,
403 simple_object_attributes *from,
406 if (to->functions != from->functions)
409 return "different object file format";
411 return to->functions->attributes_merge (to->data, from->data, err);
414 /* Release an attributes structure. */
417 simple_object_release_attributes (simple_object_attributes *attrs)
419 attrs->functions->release_attributes (attrs->data);
423 /* Start creating an object file. */
425 simple_object_write *
426 simple_object_start_write (simple_object_attributes *attrs,
427 const char *segment_name, const char **errmsg,
431 simple_object_write *ret;
433 data = attrs->functions->start_write (attrs->data, errmsg, err);
436 ret = XNEW (simple_object_write);
437 ret->functions = attrs->functions;
438 ret->segment_name = segment_name ? xstrdup (segment_name) : NULL;
439 ret->sections = NULL;
440 ret->last_section = NULL;
445 /* Start creating a section. */
447 simple_object_write_section *
448 simple_object_write_create_section (simple_object_write *sobj, const char *name,
450 const char **errmsg ATTRIBUTE_UNUSED,
451 int *err ATTRIBUTE_UNUSED)
453 simple_object_write_section *ret;
455 ret = XNEW (simple_object_write_section);
457 ret->name = xstrdup (name);
460 ret->last_buffer = NULL;
462 if (sobj->last_section == NULL)
464 sobj->sections = ret;
465 sobj->last_section = ret;
469 sobj->last_section->next = ret;
470 sobj->last_section = ret;
476 /* Add data to a section. */
479 simple_object_write_add_data (simple_object_write *sobj ATTRIBUTE_UNUSED,
480 simple_object_write_section *section,
482 size_t size, int copy,
483 int *err ATTRIBUTE_UNUSED)
485 struct simple_object_write_section_buffer *wsb;
487 wsb = XNEW (struct simple_object_write_section_buffer);
493 wsb->buffer = buffer;
494 wsb->free_buffer = NULL;
498 wsb->free_buffer = (void *) XNEWVEC (char, size);
499 memcpy (wsb->free_buffer, buffer, size);
500 wsb->buffer = wsb->free_buffer;
503 if (section->last_buffer == NULL)
505 section->buffers = wsb;
506 section->last_buffer = wsb;
510 section->last_buffer->next = wsb;
511 section->last_buffer = wsb;
517 /* Write the complete object file. */
520 simple_object_write_to_file (simple_object_write *sobj, int descriptor,
523 return sobj->functions->write_to_file (sobj, descriptor, err);
526 /* Release an simple_object_write. */
529 simple_object_release_write (simple_object_write *sobj)
531 simple_object_write_section *section;
533 free (sobj->segment_name);
535 section = sobj->sections;
536 while (section != NULL)
538 struct simple_object_write_section_buffer *buffer;
539 simple_object_write_section *next_section;
541 buffer = section->buffers;
542 while (buffer != NULL)
544 struct simple_object_write_section_buffer *next_buffer;
546 if (buffer->free_buffer != NULL)
547 XDELETEVEC (buffer->free_buffer);
548 next_buffer = buffer->next;
550 buffer = next_buffer;
553 next_section = section->next;
554 free (section->name);
556 section = next_section;
559 sobj->functions->release_write (sobj->data);