/* simple-object.c -- simple routines to read and write object files.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
+ Copyright (C) 2010-2019 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
This program is free software; you can redistribute it and/or modify it
#define SEEK_SET 0
#endif
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
#include "simple-object-common.h"
/* The known object file formats. */
}
/* Callback to identify and rename LTO debug sections by name.
- Returns 1 if NAME is a LTO debug section, 0 if not. */
+ Returns non-NULL if NAME is a LTO debug section, NULL if not.
+ If RENAME is true it will rename LTO debug sections to non-LTO
+ ones. */
-static int
-handle_lto_debug_sections (const char **name)
+static char *
+handle_lto_debug_sections (const char *name, int rename)
{
+ char *newname = rename ? XCNEWVEC (char, strlen (name) + 1)
+ : xstrdup (name);
+
/* ??? So we can't use .gnu.lto_ prefixed sections as the assembler
complains about bogus section flags. Which means we need to arrange
for that to be fixed or .gnu.debuglto_ marked as SHF_EXCLUDE (to make
fat lto object tooling work for the fat part). */
- /* ??? For now this handles both .gnu.lto_ and .gnu.debuglto_ prefixed
- sections. */
- /* Copy LTO debug sections and rename them to their non-LTO name. */
- if (strncmp (*name, ".gnu.debuglto_", sizeof (".gnu.debuglto_") - 1) == 0)
+ /* Also include corresponding reloc sections. */
+ if (strncmp (name, ".rela", sizeof (".rela") - 1) == 0)
{
- *name = *name + sizeof (".gnu.debuglto_") - 1;
- return 1;
+ if (rename)
+ strncpy (newname, name, sizeof (".rela") - 1);
+ name += sizeof (".rela") - 1;
}
- else if (strncmp (*name, ".gnu.lto_.debug_", sizeof (".gnu.lto_.debug_") -1) == 0)
+ else if (strncmp (name, ".rel", sizeof (".rel") - 1) == 0)
{
- *name = *name + sizeof (".gnu.lto_") - 1;
- return 1;
+ if (rename)
+ strncpy (newname, name, sizeof (".rel") - 1);
+ name += sizeof (".rel") - 1;
}
- return 0;
+ /* ??? For now this handles both .gnu.lto_ and .gnu.debuglto_ prefixed
+ sections. */
+ /* Copy LTO debug sections and rename them to their non-LTO name. */
+ if (strncmp (name, ".gnu.debuglto_", sizeof (".gnu.debuglto_") - 1) == 0)
+ return rename ? strcat (newname, name + sizeof (".gnu.debuglto_") - 1) : newname;
+ else if (strncmp (name, ".gnu.lto_.debug_",
+ sizeof (".gnu.lto_.debug_") -1) == 0)
+ return rename ? strcat (newname, name + sizeof (".gnu.lto_") - 1) : newname;
+ /* Copy over .note.GNU-stack section under the same name if present. */
+ else if (strcmp (name, ".note.GNU-stack") == 0)
+ return strcpy (newname, name);
+ /* Copy over .comment section under the same name if present. Solaris
+ ld uses them to relax its checking of ELF gABI access rules for
+ COMDAT sections in objects produced by GCC. */
+ else if (strcmp (name, ".comment") == 0)
+ return strcpy (newname, name);
+ free (newname);
+ return NULL;
+}
+
+/* Wrapper for handle_lto_debug_sections. */
+
+static char *
+handle_lto_debug_sections_rename (const char *name)
+{
+ return handle_lto_debug_sections (name, 1);
+}
+
+/* Wrapper for handle_lto_debug_sections. */
+
+static char *
+handle_lto_debug_sections_norename (const char *name)
+{
+ return handle_lto_debug_sections (name, 0);
}
/* Copy LTO debug sections. */
const char *
simple_object_copy_lto_debug_sections (simple_object_read *sobj,
- const char *dest, int *err)
+ const char *dest, int *err, int rename)
{
const char *errmsg;
simple_object_write *dest_sobj;
if (! dest_sobj)
return errmsg;
- errmsg = sobj->functions->copy_lto_debug_sections (sobj, dest_sobj,
- handle_lto_debug_sections,
- err);
+ errmsg = sobj->functions->copy_lto_debug_sections
+ (sobj, dest_sobj,
+ rename ? handle_lto_debug_sections_rename
+ : handle_lto_debug_sections_norename, err);
if (errmsg)
{
simple_object_release_write (dest_sobj);
return errmsg;
}
- outfd = creat (dest, 00777);
+ outfd = open (dest, O_CREAT|O_WRONLY|O_TRUNC|O_BINARY, 00777);
if (outfd == -1)
{
*err = errno;