readelf: Reset file position to beginning for thin archive members
authorAndrei Homescu <ah@immunant.com>
Thu, 1 Jul 2021 11:01:55 +0000 (12:01 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 1 Jul 2021 11:01:55 +0000 (12:01 +0100)
* readelf.c (process_archive): Reset file position to the
beginning when calling process_object for thin archive members.
* testsuite/binutils-all/readelf.exp: Add test.
* testsuite/binutils-all/readelf.h.thin: New file.

binutils/ChangeLog
binutils/readelf.c
binutils/testsuite/binutils-all/readelf.exp
binutils/testsuite/binutils-all/readelf.h.thin [new file with mode: 0644]

index b22a08110ccdba401def40dc5a589078c3143862..7e1e2970dbd834473f8cde10fa15eae8b088bda0 100644 (file)
@@ -1,3 +1,10 @@
+2021-07-01  Andrei Homescu  <ah@immunant.com>
+
+       * readelf.c (process_archive): Reset file position to the
+       beginning when calling process_object for thin archive members.
+       * testsuite/binutils-all/readelf.exp: Add test.
+       * testsuite/binutils-all/readelf.h.thin: New file.
+
 2021-06-30  Tom Tromey  <tom@tromey.com>
 
        * dwarf.c (read_and_display_attr_value): Handle
index f7c64329f374161c70c83f3c87b206f5de2b4d0a..a6073f7ec8092e9a93542d20a953b9c0e87c301f 100644 (file)
@@ -21792,6 +21792,9 @@ process_archive (Filedata * filedata, bool is_thin_archive)
          filedata->archive_file_offset = arch.nested_member_origin;
          member_filedata->file_name = qualified_name;
 
+         /* The call to process_object() expects the file to be at the beginning.  */
+         rewind (member_filedata->handle);
+
          if (! process_object (member_filedata))
            ret = false;
 
index 4884a5df40f1bdd1a950bfdd9c7bd97a057ead17..cf5fb64d2ac17a40aeb172c711d79c59dbacc645 100644 (file)
@@ -310,6 +310,32 @@ proc readelf_dump_test {} {
     # XXX FIXME: Add test of readelf -x here
 }
 
+# Tests whether readelf can read thin archives
+proc readelf_thin_archive_test {} {
+    global AR
+
+    if ![is_remote host] {
+       set tempfile tmpdir/bintest.o
+        set templib  tmpdir/bintest.thin.a
+        set libname  tmpdir/bintest.thin.a
+    } else {
+       set tempfile [remote_download host tmpdir/bintest.o]
+        set templib  [remote_download host tmpdir/bintest.thin.a]
+        set libname  bintest.thin.a
+    }
+
+    set testname "readelf -h bintest.thin"
+    set got [binutils_run $AR "rcT $libname ${tempfile}"]
+    if ![string match "" $got] {
+        fail $testname
+        return
+    }
+
+    readelf_test -h $templib readelf.h.thin
+
+    pass $testname
+}
+
 if ![is_remote host] {
     if {[which $READELF] == 0} then {
         perror "$READELF does not exist"
@@ -344,6 +370,8 @@ if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
     setup_xfail "mips-*-*irix*"
     readelf_test -s $tempfile readelf.ss
     readelf_test -r $tempfile readelf.r
+
+    readelf_thin_archive_test
 }
 
 # Test demangling symbol names.
diff --git a/binutils/testsuite/binutils-all/readelf.h.thin b/binutils/testsuite/binutils-all/readelf.h.thin
new file mode 100644 (file)
index 0000000..32ea2b7
--- /dev/null
@@ -0,0 +1,22 @@
+
+File: .*bintest\.thin\.a.*
+ELF Header:
+  Magic:   7f 45 4c 46 0[12] 0[12] 01 .. .. 00 00 00 00 00 00 00 
+  Class:                             ELF[36][24]
+  Data:                              2's complement,.* endian
+  Version:                           1 \(current\)
+  OS/ABI:                            .*
+  ABI Version:                       .*
+  Type:                              REL \(Relocatable file\)
+  Machine:                           .*
+  Version:                           0x1
+  Entry point address:               0x0
+  Start of program headers:          0 \(bytes into file\)
+  Start of section headers:          .* \(bytes into file\)
+  Flags:                             .*
+  Size of this header:               .* \(bytes\)
+  Size of program headers:           0 \(bytes\)
+  Number of program headers:         0
+  Size of section headers:           .* \(bytes\)
+  Number of section headers:         .*
+  Section header string table index: .*