[PATCH v4 5/5] objdump: Add test on option --map-global-vars display global variable information
Guillaume VACHERIAS
guillaume.vacherias@foss.st.com
Tue Sep 9 12:43:45 GMT 2025
Add test for the display of global variable information.
Single generic test that takes into account the data model
conventions (ILP32, LP64, ILP64, ILP64 and LLP64).
binutils/testsuite/binutils-all
* objdump-map-global-vars.c: New test.
* objdump.map-global-vars: New test.
* objdump.exp: Add new test.
Signed-off-by: Guillaume VACHERIAS <guillaume.vacherias@foss.st.com>
---
.../binutils-all/objdump-map-global-vars.c | 48 +++++++++++
binutils/testsuite/binutils-all/objdump.exp | 63 ++++++++++++++
.../binutils-all/objdump.map-global-vars | 86 +++++++++++++++++++
3 files changed, 197 insertions(+)
create mode 100644 binutils/testsuite/binutils-all/objdump-map-global-vars.c
create mode 100644 binutils/testsuite/binutils-all/objdump.map-global-vars
diff --git a/binutils/testsuite/binutils-all/objdump-map-global-vars.c b/binutils/testsuite/binutils-all/objdump-map-global-vars.c
new file mode 100644
index 00000000000..4ae0d3b007c
--- /dev/null
+++ b/binutils/testsuite/binutils-all/objdump-map-global-vars.c
@@ -0,0 +1,48 @@
+char a;
+int b;
+long c;
+void *d;
+
+volatile int e;
+const int f;
+
+enum _enum {
+ E1,
+ E2,
+ E3
+};
+
+enum _enum g;
+
+struct _struct {
+ char m1;
+ enum _enum m2;
+};
+
+struct _struct h;
+
+union _union {
+ char u1;
+ const char *u2;
+};
+
+union _union i;
+
+struct _node {
+ int value;
+ struct _node *next;
+};
+
+typedef struct _node node;
+
+node j;
+
+node k[4][2];
+
+char *l[2];
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index f3142b10442..9627c1a0876 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -959,6 +959,69 @@ proc test_objdump_S { } {
test_objdump_S
+# Test objdump --map-global-vars on file containing dwarf-2 encoding information.
+
+proc test_objdump_map_global_vars { } {
+ global srcdir
+ global subdir
+ global OBJDUMP
+ global OBJDUMPFLAGS
+ global exe
+
+ set test "objdump --map-global-vars"
+
+ if { [target_compile $srcdir/$subdir/objdump-map-global-vars.c tmpdir/objdump-map-global-vars${exe} executable debug] != "" } {
+ unsupported "$test (build)"
+ return
+ }
+
+ if [is_remote host] {
+ set testfile [remote_download host tmpdir/objdump-map-global-vars${exe}]
+ } else {
+ set testfile tmpdir/objdump-map-global-vars${exe}
+ }
+
+ set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --dwarf=info $testfile"]
+ if { [regexp -line {^ *Version: *([0-9]+)} $got -> dwarf_version] } then {
+ if {$dwarf_version < 2} then {
+ unsupported "$test (DWARF2 at least is required)"
+ return
+ }
+ }
+
+ set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --map-global-vars $testfile"]
+
+ if [is_remote host] {
+ set pattern_file [remote_download host $srcdir/$subdir/objdump.map-global-vars]
+ } else {
+ set pattern_file $srcdir/$subdir/objdump.map-global-vars
+ }
+
+ set pattern_file [open $pattern_file r]
+ set patterns [read $pattern_file]
+ close $pattern_file
+
+ set got_block [split $got "\n\n"]
+ set pattern_list [split $patterns "\n\n"]
+
+ foreach block $got_block {
+ set matched 0
+ foreach pattern $pattern_list {
+ if {[regexp $pattern $block match]} {
+ set matched 1
+ break
+ }
+ }
+ if (!$matched) {
+ fail "objdump --map-global-vars"
+ }
+ }
+
+ pass "objdump --map-global-vars"
+}
+
+test_objdump_map_global_vars
+
# Test objdump --private
proc test_objdump_P {} {
global srcdir
diff --git a/binutils/testsuite/binutils-all/objdump.map-global-vars b/binutils/testsuite/binutils-all/objdump.map-global-vars
new file mode 100644
index 00000000000..d6fed23edda
--- /dev/null
+++ b/binutils/testsuite/binutils-all/objdump.map-global-vars
@@ -0,0 +1,86 @@
+.*objdump-map-global-vars: file format .*
+
+a @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: char, size: 0x1
+
+b @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: int, size: 0x(2|4|8)
+
+c @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: long .*, size: 0x(4|8)
+
+d @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: ptr, size: 0x(4|8)
+
+e @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: volatile
+ type: int, size: 0x(2|4|8)
+
+f @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: const
+ type: int, size: 0x(2|4|8)
+
+g @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: enum _enum, size: 0x(2|4)
+ {
+ value: E1 = 0
+ value: E2 = 1
+ value: E3 = 2
+ }
+
+h @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: struct _struct, size: 0x(4|8)
+ {
+ member: m1, offset: 0x0
+ type: char, size: 0x1
+ member: m2, offset: 0x(4|8)
+ type: enum _enum, size: 0x(2|4)
+ {
+ value: E1 = 0
+ value: E2 = 1
+ value: E3 = 2
+ }
+ }
+
+i @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: union _union, size: 0x(2|4|8)
+ {
+ member: u1, offset: 0x0
+ type: char, size: 0x1
+ member: u2, offset: 0x0
+ type: ptr, size: 0x(2|4|8)
+ type: const
+ type: char, size: 0x1
+ }
+
+j @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: typedef node
+ {
+ type: struct _node, size: 0x(4|8|10)
+ {
+ member: value, offset: 0x0
+ type: int, size: 0x(2|4|8)
+ member: next, offset: 0x(4|8)
+ type: ptr, size: 0x(2|4|8)
+ nested: struct _node
+ }
+ }
+
+k @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: array\[4\]\[2\]
+ type: typedef node
+ {
+ type: struct _node, size: 0x(4|8|10)
+ {
+ member: value, offset: 0x0
+ type: int, size: 0x(2|4|8)
+ member: next, offset: 0x8
+ type: ptr, size: 0x(2|4|8)
+ nested: struct _node
+ }
+ }
+
+l @ 0x([0-9a-fA-F]{8}) 0x([0-9a-fA-F]{8})
+ type: array\[2\]
+ type: ptr, size: 0x(2|4|8)
+ type: char, size: 0x1
--
2.25.1
More information about the Binutils
mailing list