]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Do not choose a non-ELF format input file to hold the linker created GOT sections.
authorNick Clifton <nickc@redhat.com>
Mon, 7 Aug 2017 09:09:51 +0000 (10:09 +0100)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 11 Aug 2017 15:17:01 +0000 (08:17 -0700)
bfd/

PR 21884
* elf32-i386.c (elf_i386_link_setup_gnu_properties): If the dynobj
has not been set then use the bfd returned by
_bfd_elf_link_setup_gnu_properties.  If that is null then search
through all the input bfds selecting the first normal, ELF format
one.
* elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties): Likewise.

ld/

PR ld/21884
* testsuite/ld-i386/i386.exp: Run pr21884.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr21884.d: New file.
* testsuite/ld-i386/pr21884.t: Likewise.
* testsuite/ld-x86-64/pr21884.d: Likewise.
* testsuite/ld-x86-64/pr21884.t: Likewise.

(cherry picked from commit b7a18930e3925c4092bd975e95bc3603aa1418d9 and
 9593aade74f0da0c08a4ab55e4c59173b07b1f63)

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr21884.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr21884.t [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr21884.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr21884.t [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 211e34016f39782c8258aea3a2e0662a8e5f784e..078dc43acd3c4a24418ceaa366219a4c930afa28 100644 (file)
@@ -1,3 +1,13 @@
+2017-08-11  Nick Clifton  <nickc@redhat.com>
+
+       PR 21884
+       * elf32-i386.c (elf_i386_link_setup_gnu_properties): If the dynobj
+       has not been set then use the bfd returned by
+       _bfd_elf_link_setup_gnu_properties.  If that is null then search
+       through all the input bfds selecting the first normal, ELF format
+       one.
+       * elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties): Likewise.
+
 2017-08-08  Alan Modra  <amodra@gmail.com>
 
        PR 21017
index df16775d54aba83aeb3df279c18e989f3055d1ec..b46ed2dd134f57ea958dc138f3fbf90928bd5b95 100644 (file)
@@ -6914,20 +6914,29 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
      set it in check_relocs.  */
   if (dynobj == NULL)
     {
-      bfd *abfd;
-
-      /* Find a normal input file to hold linker created
-        sections.  */
-      for (abfd = info->input_bfds;
-          abfd != NULL;
-          abfd = abfd->link.next)
-       if ((abfd->flags
-            & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
-         {
-           htab->elf.dynobj = abfd;
-           dynobj = abfd;
-           break;
-         }
+      if (pbfd != NULL)
+       {
+         htab->elf.dynobj = pbfd;
+         dynobj = pbfd;
+       }
+      else
+       {
+         bfd *abfd;
+
+         /* Find a normal input file to hold linker created
+            sections.  */
+         for (abfd = info->input_bfds;
+              abfd != NULL;
+              abfd = abfd->link.next)
+           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+               && (abfd->flags
+                   & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
+             {
+               htab->elf.dynobj = abfd;
+               dynobj = abfd;
+               break;
+             }
+       }
     }
 
   /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
@@ -7019,7 +7028,7 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
     return pbfd;
 
   /* Since create_dynamic_sections isn't always called, but GOT
-     relocations need GOT relocations, create them here so that we
+     relocations need GOT sections, create them here so that we
      don't need to do it in check_relocs.  */
   if (htab->elf.sgot == NULL
       && !_bfd_elf_create_got_section (dynobj, info))
index c80a9caaa6dcea8e6e6f0f92a6b3f209804bc477..821a7d9cbedf8fccda602b8d9b49e32e972eeed4 100644 (file)
@@ -7466,8 +7466,9 @@ error_alignment:
          for (abfd = info->input_bfds;
               abfd != NULL;
               abfd = abfd->link.next)
-           if ((abfd->flags
-                & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
+           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+               && (abfd->flags
+                   & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0)
              {
                htab->elf.dynobj = abfd;
                dynobj = abfd;
index 8c374e3d844c895e7276969d1f28c83b2ee737ec..96e7a6aed1db83b74c37c08ef9896a8ddcb95a96 100644 (file)
@@ -1,3 +1,13 @@
+2017-08-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21884
+       * testsuite/ld-i386/i386.exp: Run pr21884.
+       * testsuite/ld-x86-64/x86-64.exp: Likewise.
+       * testsuite/ld-i386/pr21884.d: New file.
+       * testsuite/ld-i386/pr21884.t: Likewise.
+       * testsuite/ld-x86-64/pr21884.d: Likewise.
+       * testsuite/ld-x86-64/pr21884.t: Likewise.
+
 2017-08-03  Alan Modra  <amodra@gmail.com>
 
        PR ld/21884
index 6c53046193ae75f9ecee484900bc7e05838d1fcc..fe490a7486b18ccd57f1cdfab075f172fa0cc696 100644 (file)
@@ -434,6 +434,7 @@ run_dump_test "property-x86-shstk3a"
 run_dump_test "property-x86-shstk3b"
 run_dump_test "property-x86-shstk4"
 run_dump_test "property-x86-shstk5"
+run_dump_test "pr21884"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr21884.d b/ld/testsuite/ld-i386/pr21884.d
new file mode 100644 (file)
index 0000000..dc212d3
--- /dev/null
@@ -0,0 +1,9 @@
+#source: dummy.s
+#as: --32
+#ld: -m elf_i386 -T pr21884.t -b binary
+#objdump: -b binary -s
+
+.*:     file format binary
+
+Contents of section .data:
+#pass
diff --git a/ld/testsuite/ld-i386/pr21884.t b/ld/testsuite/ld-i386/pr21884.t
new file mode 100644 (file)
index 0000000..9ec7dc8
--- /dev/null
@@ -0,0 +1,11 @@
+OUTPUT_FORMAT("elf32-i386");
+OUTPUT_ARCH(i386);
+
+ENTRY(_start); 
+SECTIONS {
+        . = 0x10000;
+        _start = . ;
+        .data : {
+                *(.data)
+        }
+}
diff --git a/ld/testsuite/ld-x86-64/pr21884.d b/ld/testsuite/ld-x86-64/pr21884.d
new file mode 100644 (file)
index 0000000..a62d8bc
--- /dev/null
@@ -0,0 +1,9 @@
+#source: dummy.s
+#as: --64
+#ld: -m elf_x86_64 -T pr21884.t -b binary
+#objdump: -b binary -s
+
+.*:     file format binary
+
+Contents of section .data:
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr21884.t b/ld/testsuite/ld-x86-64/pr21884.t
new file mode 100644 (file)
index 0000000..f57cb3a
--- /dev/null
@@ -0,0 +1,11 @@
+OUTPUT_FORMAT("elf64-x86-64");
+OUTPUT_ARCH(i386:x86-64);
+
+ENTRY(_start); 
+SECTIONS {
+        . = 0x10000;
+        _start = . ;
+        .data : {
+                *(.data)
+        }
+}
index c582582297862de40954c7a6e0931a51e98ed0ac..38009a811b4d6d6be417afc2fddb46db77f1a0ba 100644 (file)
@@ -365,6 +365,7 @@ run_dump_test "property-x86-shstk4"
 run_dump_test "property-x86-shstk4-x32"
 run_dump_test "property-x86-shstk5"
 run_dump_test "property-x86-shstk5-x32"
+run_dump_test "pr21884"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return