[gdb/testsuite] Fix gdb.base/include-main.exp with -readnow
[binutils-gdb.git] / libiberty / simple-object.c
index 42aa6ac4e609aad3d3bdf8a92ace3db93d9a73f1..facbf94fd09e1e60cceba0fbdb87c14dd2425386 100644 (file)
@@ -1,5 +1,5 @@
 /* simple-object.c -- simple routines to read and write object files.
-   Copyright (C) 2010-2018 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Google.
 
 This program is free software; you can redistribute it and/or modify it
@@ -44,6 +44,10 @@ Boston, MA 02110-1301, USA.  */
 #define SEEK_SET 0
 #endif
 
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
 #include "simple-object-common.h"
 
 /* The known object file formats.  */
@@ -251,12 +255,15 @@ simple_object_find_section (simple_object_read *sobj, const char *name,
 }
 
 /* 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 char *
-handle_lto_debug_sections (const char *name)
+handle_lto_debug_sections (const char *name, int rename)
 {
-  char *newname = XCNEWVEC (char, strlen (name) + 1);
+  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
@@ -265,38 +272,69 @@ handle_lto_debug_sections (const char *name)
   /* Also include corresponding reloc sections.  */
   if (strncmp (name, ".rela", sizeof (".rela") - 1) == 0)
     {
-      strncpy (newname, name, sizeof (".rela") - 1);
+      if (rename)
+        strncpy (newname, name, sizeof (".rela") - 1);
       name += sizeof (".rela") - 1;
     }
   else if (strncmp (name, ".rel", sizeof (".rel") - 1) == 0)
     {
-      strncpy (newname, name, sizeof (".rel") - 1);
+      if (rename)
+        strncpy (newname, name, sizeof (".rel") - 1);
       name += sizeof (".rel") - 1;
     }
   /* ???  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 strcat (newname, name + sizeof (".gnu.debuglto_") - 1);
+    return rename ? strcat (newname, name + sizeof (".gnu.debuglto_") - 1) : newname;
   else if (strncmp (name, ".gnu.lto_.debug_",
                    sizeof (".gnu.lto_.debug_") -1) == 0)
-    return strcat (newname, name + sizeof (".gnu.lto_") - 1);
+    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 .note.gnu.property section under the same name if present.  */
+  else if (strcmp (name, ".note.gnu.property") == 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);
+  /* Copy over .GCC.command.line section under the same name if present.  */
+  else if (strcmp (name, ".GCC.command.line") == 0)
+    return strcpy (newname, name);
+  /* Copy over .ctf section under the same name if present.  */
+  else if (strcmp (name, ".ctf") == 0)
+    return strcpy (newname, name);
+  /* Copy over .BTF section under the same name if present.  */
+  else if (strcmp (name, ".BTF") == 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;
@@ -317,16 +355,17 @@ simple_object_copy_lto_debug_sections (simple_object_read *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;