This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Fix disassembly of fully-linked --emit-relocs objects on ARM
- From: Richard Sandiford <richard at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Fri, 18 May 2007 16:40:41 +0100
- Subject: Fix disassembly of fully-linked --emit-relocs objects on ARM
objdump -dr doesn't work for fully-linked --emit-relocs objects on ARM;
we treat the final relocation field value as an in-place addend for
the reloc.
Dan pointed out that gdb has a similar problem, and checks for:
if ((bfd_get_file_flags (objfile->obfd) & (EXEC_P | DYNAMIC)) == 0)
This patch does the same in objdump. Tested on arm-eabi, arm-elf
and arm-wrs-vxworks. OK to install?
Richard
binutils/
* objdump.c (disassemble_bytes): Ignore disassembler_needs_relocs
for executables and shared libraries.
ld/testsuite/
* ld-arm/emit-relocs1.d, ld-arm/emit-relocs1.s,
* ld-arm/emit-relocs1-vxworks.d: New tests.
* ld-arm/arm-elf.exp: Run them.
Index: binutils/objdump.c
===================================================================
RCS file: /cvs/src/src/binutils/objdump.c,v
retrieving revision 1.126
diff -u -p -r1.126 objdump.c
--- binutils/objdump.c 17 May 2007 08:39:22 -0000 1.126
+++ binutils/objdump.c 18 May 2007 15:35:00 -0000
@@ -1377,6 +1377,8 @@ disassemble_bytes (struct disassemble_in
info->flags = 0;
if (info->disassembler_needs_relocs
+ && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
+ && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
&& *relppp < relppend)
{
bfd_signed_vma distance_to_rel;
Index: ld/testsuite/ld-arm/arm-elf.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/arm-elf.exp,v
retrieving revision 1.25
diff -u -p -r1.25 arm-elf.exp
--- ld/testsuite/ld-arm/arm-elf.exp 15 May 2007 12:22:33 -0000 1.25
+++ ld/testsuite/ld-arm/arm-elf.exp 18 May 2007 15:35:01 -0000
@@ -41,6 +41,7 @@ if {[istarget "arm-*-vxworks"]} {
}
run_ld_link_tests $armvxworkstests
run_dump_test "vxworks1-static"
+ run_dump_test "emit-relocs1-vxworks"
}
# Exclude non-ARM-ELF targets.
@@ -175,6 +176,7 @@ run_dump_test "group-relocs-ldrs-bad"
run_dump_test "group-relocs-ldc-bad"
run_dump_test "thumb2-bl-as-thumb1-bad"
run_dump_test "thumb2-bl-bad"
+run_dump_test "emit-relocs1"
# Exclude non-ARM-EABI targets.
Index: ld/testsuite/ld-arm/emit-relocs1-vxworks.d
===================================================================
RCS file: ld/testsuite/ld-arm/emit-relocs1-vxworks.d
diff -N ld/testsuite/ld-arm/emit-relocs1-vxworks.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-arm/emit-relocs1-vxworks.d 18 May 2007 15:35:01 -0000
@@ -0,0 +1,12 @@
+#source: emit-relocs1.s
+#ld: -Ttext 0x10000 --defsym target=0xc000 -e0 --emit-relocs
+#objdump: -dr
+#...
+ +10000: e1a00000 nop .*
+ +10004: e1a00000 nop .*
+ +10008: e1a00000 nop .*
+ +1000c: e1a00000 nop .*
+ +10010: eaffeffa b c000 <target>
+ +10010: R_ARM_PC24 target\+0xf+8
+ +10014: eaffeffd b c010 <target\+0x10>
+ +10014: R_ARM_PC24 target\+0x8
Index: ld/testsuite/ld-arm/emit-relocs1.d
===================================================================
RCS file: ld/testsuite/ld-arm/emit-relocs1.d
diff -N ld/testsuite/ld-arm/emit-relocs1.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-arm/emit-relocs1.d 18 May 2007 15:35:01 -0000
@@ -0,0 +1,12 @@
+#source: emit-relocs1.s
+#ld: -Ttext 0x10000 --defsym target=0xc000 -e0 --emit-relocs
+#objdump: -dr
+#...
+ +10000: e1a00000 nop .*
+ +10004: e1a00000 nop .*
+ +10008: e1a00000 nop .*
+ +1000c: e1a00000 nop .*
+ +10010: eaffeffa b c000 <target>
+ +10010: R_ARM_(JUMP|PC)24 target
+ +10014: eaffeffd b c010 <target\+0x10>
+ +10014: R_ARM_(JUMP|PC)24 target
Index: ld/testsuite/ld-arm/emit-relocs1.s
===================================================================
RCS file: ld/testsuite/ld-arm/emit-relocs1.s
diff -N ld/testsuite/ld-arm/emit-relocs1.s
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-arm/emit-relocs1.s 18 May 2007 15:35:01 -0000
@@ -0,0 +1,6 @@
+ nop
+ nop
+ nop
+ nop
+ b target
+ b target+16
Index: ld/testsuite/ld-arm/vxworks1.dd
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/vxworks1.dd,v
retrieving revision 1.2
diff -u -p -r1.2 vxworks1.dd
--- ld/testsuite/ld-arm/vxworks1.dd 10 May 2007 17:00:03 -0000 1.2
+++ ld/testsuite/ld-arm/vxworks1.dd 18 May 2007 15:35:01 -0000
@@ -26,11 +26,11 @@ Disassembly of section \.plt:
Disassembly of section \.text:
00080c00 <_start>:
- 80c00: ebffff08 bl 80428 <.*>
+ 80c00: ebffff08 bl 80828 <.*>
80c00: R_ARM_PC24 \.plt\+0x20
- 80c04: eb000000 bl 80c14 <sexternal\+0x8>
+ 80c04: eb000000 bl 80c0c <sexternal>
80c04: R_ARM_PC24 sexternal\+0xfffffff8
- 80c08: eaffff00 b 80408 <.*>
+ 80c08: eaffff00 b 80810 <.*>
80c08: R_ARM_PC24 \.plt\+0x8
00080c0c <sexternal>: