forked from Imagelibrary/binutils-gdb
Update objdump's --disassemble=<symbol> feature so that if <symbol> is a function, the entire function will be disassembled, regardless of the presence of interveening symbols.
* objdump.c (disassemble_section): When disassembling from a symbol only stop at the next symbol if the original symbol was not a function symbol. Otherwise continue disassembling until a new function is reached. * testsuite/binutils-all/objdump.exp: Add tests of extended functionality. * testsuite/binutils-all/disasm.s: New test source file.
This commit is contained in:
24
binutils/testsuite/binutils-all/disasm.s
Normal file
24
binutils/testsuite/binutils-all/disasm.s
Normal file
@@ -0,0 +1,24 @@
|
||||
.text
|
||||
|
||||
.globl start_of_text
|
||||
start_of_text:
|
||||
.type start_of_text, "function"
|
||||
.long 1
|
||||
.size start_of_text, . - start_of_text
|
||||
|
||||
.globl func
|
||||
func:
|
||||
.type func, "function"
|
||||
.long 2
|
||||
.global global_non_func_sym
|
||||
global_non_func_sym:
|
||||
.long 3
|
||||
local_non_func_sym:
|
||||
.long 4
|
||||
.size func, . - func
|
||||
|
||||
.globl next_func
|
||||
next_func:
|
||||
.type next_func, "function"
|
||||
.long 5
|
||||
.size next_func, . - next_func
|
||||
@@ -62,7 +62,7 @@ if [regexp $want $got] then {
|
||||
|
||||
|
||||
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
|
||||
fail "objdump (assembling)"
|
||||
fail "objdump (assembling bintest.s)"
|
||||
return
|
||||
}
|
||||
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest2.o]} then {
|
||||
@@ -280,8 +280,95 @@ proc test_objdump_d_sym { testfile dumpfile } {
|
||||
}
|
||||
|
||||
test_objdump_d_sym $testfile $testfile
|
||||
if { [ remote_file host exists $testarchive ] } then {
|
||||
test_objdump_d_sym $testarchive bintest2.o
|
||||
|
||||
proc test_objdump_d_func_sym { testfile dumpfile } {
|
||||
global OBJDUMP
|
||||
global OBJDUMPFLAGS
|
||||
|
||||
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble=func --disassemble-zeroes $testfile"]
|
||||
|
||||
set want "$dumpfile:.*Disassembly of section"
|
||||
if ![regexp $want $got] then {
|
||||
fail "objdump --disassemble=func $testfile: No disassembly title"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+0 <start_of_text>"
|
||||
if [regexp $want $got] then {
|
||||
fail "objdump --disassemble=func $testfile: First symbol displayed, when it should be absent"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+. <func>"
|
||||
if ![regexp $want $got] then {
|
||||
fail "objdump --disassemble=func $testfile: Disassembly does not start at function symbol"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+. <global_non_func_sym>"
|
||||
if ![regexp $want $got] then {
|
||||
fail "objdump --disassemble=func $testfile: Non function symbol not displayed"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+. <next_func>"
|
||||
if [regexp $want $got] then {
|
||||
fail "objdump --disassemble=func $testfile: Disassembly did not stop at the next function"
|
||||
return
|
||||
}
|
||||
|
||||
pass "objdump --disassemble=func $testfile"
|
||||
}
|
||||
|
||||
proc test_objdump_d_non_func_sym { testfile dumpfile } {
|
||||
global OBJDUMP
|
||||
global OBJDUMPFLAGS
|
||||
|
||||
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble=global_non_func_sym $testfile"]
|
||||
|
||||
set want "$dumpfile:.*Disassembly of section"
|
||||
if ![regexp $want $got] then {
|
||||
fail "objdump --disassemble=non_func $testfile: No disassembly title"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+0 <start_of_text>"
|
||||
if [regexp $want $got] then {
|
||||
fail "objdump --disassemble=non_func $testfile: First symbol displayed, when it should be absent"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+. <global_non_func_sym>"
|
||||
if ![regexp $want $got] then {
|
||||
fail "objdump --disassemble=non_func $testfile: Non function symbol not displayed"
|
||||
return
|
||||
}
|
||||
|
||||
set want "$dumpfile:.*00+. <local_non_func_sym>"
|
||||
if [regexp $want $got] then {
|
||||
fail "objdump --disassemble=non_func $testfile: Disassembly did not stop at the next symbol"
|
||||
return
|
||||
}
|
||||
|
||||
pass "objdump --disassemble=non_func $testfile"
|
||||
}
|
||||
|
||||
# Extra test for ELF format - check that --disassemble=func disassembles
|
||||
# all of func, and does not stop at the next symbol.
|
||||
if { [is_elf_format] } then {
|
||||
|
||||
if {![binutils_assemble $srcdir/$subdir/disasm.s tmpdir/disasm.o]} then {
|
||||
fail "objdump --disassemble=func (assembling disasm.s)"
|
||||
} else {
|
||||
if [is_remote host] {
|
||||
set elftestfile [remote_download host tmpdir/disasm.o]
|
||||
} else {
|
||||
set elftestfile tmpdir/disasm.o
|
||||
}
|
||||
|
||||
test_objdump_d_func_sym $elftestfile $elftestfile
|
||||
test_objdump_d_non_func_sym $elftestfile $elftestfile
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user