aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Homescu <ah@immunant.com>2021-07-01 12:01:55 +0100
committerNick Clifton <nickc@redhat.com>2021-07-01 12:01:55 +0100
commit75a2da57a1bbff8686f56a43aabe1d7e55147894 (patch)
treedf54a4d3cdd1241fff656831cd238b4ee0e8b73f
parent417f991f08cb869e8274e0a6af6c88b14413e0ec (diff)
downloadgdb-75a2da57a1bbff8686f56a43aabe1d7e55147894.zip
gdb-75a2da57a1bbff8686f56a43aabe1d7e55147894.tar.gz
gdb-75a2da57a1bbff8686f56a43aabe1d7e55147894.tar.bz2
readelf: Reset file position to beginning for thin archive members
* 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.
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/readelf.c3
-rw-r--r--binutils/testsuite/binutils-all/readelf.exp28
-rw-r--r--binutils/testsuite/binutils-all/readelf.h.thin22
4 files changed, 60 insertions, 0 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index b22a081..7e1e297 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/readelf.c b/binutils/readelf.c
index f7c6432..a6073f7 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -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;
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 4884a5d..cf5fb64 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -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
index 0000000..32ea2b7
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.h.thin
@@ -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: .*