PR4694
authorAlan Modra <amodra@gmail.com>
Wed, 1 Aug 2007 07:43:36 +0000 (07:43 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 1 Aug 2007 07:43:36 +0000 (07:43 +0000)
* aoutx.h (final_link): Write a zero in first word of
stringtab if no symbols rather than corrupting last byte
of text/data.

bfd/ChangeLog
bfd/aoutx.h

index f51aa26c77c65b5d29803b8289e748ff3fa8ae90..0ebb3d1c0e30333b6f24e1679e40ffbadf2aec83 100644 (file)
@@ -1,3 +1,10 @@
+2007-08-01  Alan Modra  <amodra@bigpond.net.au>
+
+       PR4694
+       * aoutx.h (final_link): Write a zero in first word of
+       stringtab if no symbols rather than corrupting last byte
+       of text/data.
+
 2007-07-31  Jakub Jelinek  <jakub@redhat.com>
 
        * elf.c (get_program_header_size): Adjacent loadable .note*
index af7d45be3a7b10254f1426aad3ff3db106dfc8dc..2b5507e100259e291e569be20506e9344f8d7525 100644 (file)
@@ -5557,22 +5557,19 @@ NAME (aout, final_link) (bfd *abfd,
     exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
 
   /* Write out the string table, unless there are no symbols.  */
+  if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0)
+    goto error_return;
   if (abfd->symcount > 0)
     {
-      if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
-         || ! emit_stringtab (abfd, aout_info.strtab))
+      if (!emit_stringtab (abfd, aout_info.strtab))
        goto error_return;
     }
-  else if (obj_textsec (abfd)->reloc_count == 0
-          && obj_datasec (abfd)->reloc_count == 0)
+  else
     {
-      bfd_byte b;
-      file_ptr pos;
+      bfd_byte b[BYTES_IN_WORD];
 
-      b = 0;
-      pos = obj_datasec (abfd)->filepos + exec_hdr (abfd)->a_data - 1;
-      if (bfd_seek (abfd, pos, SEEK_SET) != 0
-         || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
+      memset (b, 0, BYTES_IN_WORD);
+      if (bfd_bwrite (b, (bfd_size_type) BYTES_IN_WORD, abfd) != BYTES_IN_WORD)
        goto error_return;
     }