Fix /usr/bin/ld: final link failed: File truncated error on hppa.
authorJohn David Anglin <danglin@gcc.gnu.org>
Sun, 31 Jan 2016 16:52:24 +0000 (11:52 -0500)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sun, 31 Jan 2016 16:52:24 +0000 (11:52 -0500)
bfd/ChangeLog
bfd/elf32-hppa.c
bfd/elf64-hppa.c

index d6e4d03dd2b0b3f9d74c5b7a1bc10133152dc63b..83472f4f79418ea05c2297fd4edbb8a08ed6344c 100644 (file)
@@ -1,3 +1,10 @@
+2016-01-31  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR ld/19526
+       * elf32-hppa.c (elf32_hppa_final_link): Don't sort non-regular output
+       files.
+       * elf64-hppa.c (elf32_hppa_final_link): Likewise.  Remove retval.
+
 2016-01-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/19539
index 921706d8ed1d5fbfc6e39056b89d472a1ee14f5c..699d02a58282a4f3edb0f527964c8e0c42c72bf0 100644 (file)
@@ -3245,6 +3245,8 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
 static bfd_boolean
 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
 {
+  struct stat buf;
+
   /* Invoke the regular ELF linker to do all the work.  */
   if (!bfd_elf_final_link (abfd, info))
     return FALSE;
@@ -3254,6 +3256,13 @@ elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
   if (bfd_link_relocatable (info))
     return TRUE;
 
+  /* Do not attempt to sort non-regular files.  This is here
+     especially for configure scripts and kernel builds which run
+     tests with "ld [...] -o /dev/null".  */
+  if (stat (abfd->filename, &buf) != 0
+      || !S_ISREG(buf.st_mode))
+    return TRUE;
+
   return elf_hppa_sort_unwind (abfd);
 }
 
index 5a397b4ad7777c3e4aaeddd2511f3b8a68e7af81..3021ed603d58a3488a0fd607ce393a65737b5fcd 100644 (file)
@@ -2945,7 +2945,7 @@ elf_hppa_record_segment_addrs (bfd *abfd,
 static bfd_boolean
 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
 {
-  bfd_boolean retval;
+  struct stat buf;
   struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
 
   if (hppa_info == NULL)
@@ -3029,7 +3029,8 @@ elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
                          info);
 
   /* Invoke the regular ELF backend linker to do all the work.  */
-  retval = bfd_elf_final_link (abfd, info);
+  if (!bfd_elf_final_link (abfd, info))
+    return FALSE;
 
   elf_link_hash_traverse (elf_hash_table (info),
                          elf_hppa_remark_useless_dynamic_symbols,
@@ -3037,10 +3038,17 @@ elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
 
   /* If we're producing a final executable, sort the contents of the
      unwind section. */
-  if (retval && !bfd_link_relocatable (info))
-    retval = elf_hppa_sort_unwind (abfd);
+  if (bfd_link_relocatable (info))
+    return TRUE;
+
+  /* Do not attempt to sort non-regular files.  This is here
+     especially for configure scripts and kernel builds which run
+     tests with "ld [...] -o /dev/null".  */
+  if (stat (abfd->filename, &buf) != 0
+      || !S_ISREG(buf.st_mode))
+    return TRUE;
 
-  return retval;
+  return elf_hppa_sort_unwind (abfd);
 }
 
 /* Relocate the given INSN.  VALUE should be the actual value we want