This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] MIPS/opcodes: Correct mixed-mode disassembly


Hi,

 I have come across the issue of mixed-mode relocatables not always being 
disassembled correctly by `objdump'.

 I have tracked it down to is_compressed_mode_p in opcodes not checking 
symbol sections -- while disassemble_section and more specifically 
find_symbol_for_address does ensure the first symbol of the symbol array 
passed down to opcodes is from the section being disassembled, it makes no 
effort to verify any further entries are.  The target backend in opcodes 
therefore must to.

 In practice this triggers for relocatable objects whose sections have no 
specific VMA set and therefore the address zero is used.  As a result all 
the sections overlap and the lone symbol's VMA check is not enough.  This 
is illustrated with the test cases provided.  Without the correction 
applied to is_compressed_mode_p all the binary code is considered using 
the compressed ISA encoding and the resulting disassembly is wrong for the 
standard MIPS functions.

 No regressions in testing for mips-sde-elf or mips-linux-gnu.  OK to 
apply?

2013-03-12  Maciej W. Rozycki  <macro@codesourcery.com>

	opcodes/
	* mips-dis.c (is_compressed_mode_p): Only match symbols from the
	section disassembled.

	binutils/testsuite/
	* binutils-all/mips/mixed-micromips.d: New test.
	* binutils-all/mips/mixed-mips16.d: New test.
	* binutils-all/mips/mixed-micromips.s: New test source.
	* binutils-all/mips/mixed-mips16.s: New test source.
	* binutils-all/mips/mips.exp: New file.

  Maciej

binutils-opcodes-mips-symbol-sec.diff
Index: binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mips.exp
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mips.exp	2013-02-12 22:42:41.495431911 +0000
@@ -0,0 +1,26 @@
+# Copyright 2013
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if ![istarget mips*-*-*] {
+    return
+}
+
+if [is_elf_format] {
+    run_dump_test "mixed-mips16"
+    run_dump_test "mixed-micromips"
+}
Index: binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-micromips.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-micromips.d	2013-02-12 22:42:41.495431911 +0000
@@ -0,0 +1,30 @@
+#PROG: objcopy
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: Mixed MIPS and microMIPS disassembly
+#as: -32 -mips2
+
+# Test mixed-mode disassembly in overlapping sections.
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text\.foo:
+[0-9a-f]+ <[^>]*> 27bdffe0 	addiu	sp,sp,-32
+[0-9a-f]+ <[^>]*> afbf001c 	sw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 0c000000 	jal	00000000 <.*>
+[ 	]*[0-9a-f]+: R_MIPS_26	baz
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 8fbf001c 	lw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 03e00008 	jr	ra
+[0-9a-f]+ <[^>]*> 27bd0020 	addiu	sp,sp,32
+	\.\.\.
+
+Disassembly of section \.text\.bar:
+[0-9a-f]+ <[^>]*> 4ff1      	addiu	sp,sp,-32
+[0-9a-f]+ <[^>]*> cbe7      	sw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 7400 0000 	jals	00000000 <.*>
+[ 	]*[0-9a-f]+: R_MICROMIPS_26_S1	baz
+[0-9a-f]+ <[^>]*> 0c00      	nop
+[0-9a-f]+ <[^>]*> 4be7      	lw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 4708      	jraddiusp	32
+[0-9a-f]+ <[^>]*> 0c00      	nop
+	\.\.\.
Index: binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-micromips.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-micromips.s	2013-02-12 22:42:41.495431911 +0000
@@ -0,0 +1,33 @@
+	.section .text.foo, "ax", @progbits
+	.set	nomicromips
+	.globl	foo
+	.ent	foo
+foo:
+	addiu	$sp, $sp, -32
+	sw	$ra, 28($sp)
+	jal	baz
+	lw	$ra, 28($sp)
+	addiu	$sp, $sp, 32
+	jr	$ra
+	.end	foo
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	2
+	.space	8
+
+
+	.section .text.bar, "ax", @progbits
+	.set	micromips
+	.globl	bar
+	.ent	bar
+bar:
+	addiu	$sp, $sp, -32
+	sw	$ra, 28($sp)
+	jals	baz
+	lw	$ra, 28($sp)
+	jraddiusp 32
+	.end	bar
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	2
+	.space	8
Index: binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-mips16.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-mips16.d	2013-02-12 22:42:41.495431911 +0000
@@ -0,0 +1,30 @@
+#PROG: objcopy
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: Mixed MIPS and MIPS16 disassembly
+#as: -32 -mips2
+
+# Test mixed-mode disassembly in overlapping sections.
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text\.foo:
+[0-9a-f]+ <[^>]*> 27bdffe0 	addiu	sp,sp,-32
+[0-9a-f]+ <[^>]*> afbf001c 	sw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 0c000000 	jal	00000000 <.*>
+[ 	]*[0-9a-f]+: R_MIPS_26	baz
+[0-9a-f]+ <[^>]*> 00000000 	nop
+[0-9a-f]+ <[^>]*> 8fbf001c 	lw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 03e00008 	jr	ra
+[0-9a-f]+ <[^>]*> 27bd0020 	addiu	sp,sp,32
+	\.\.\.
+
+Disassembly of section \.text\.bar:
+[0-9a-f]+ <[^>]*> 63fc      	addiu	sp,-32
+[0-9a-f]+ <[^>]*> 6207      	sw	ra,28\(sp\)
+[0-9a-f]+ <[^>]*> 1800 0000 	jal	00000000 <.*>
+[ 	]*[0-9a-f]+: R_MIPS16_26	baz
+[0-9a-f]+ <[^>]*> 6500      	nop
+[0-9a-f]+ <[^>]*> 9707      	lw	a3,28\(sp\)
+[0-9a-f]+ <[^>]*> ef00      	jr	a3
+[0-9a-f]+ <[^>]*> 6500      	nop
+	\.\.\.
Index: binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-mips16.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/binutils/testsuite/binutils-all/mips/mixed-mips16.s	2013-02-12 22:42:41.495431911 +0000
@@ -0,0 +1,33 @@
+	.section .text.foo, "ax", @progbits
+	.set	nomips16
+	.globl	foo
+	.ent	foo
+foo:
+	addiu	$sp, $sp, -32
+	sw	$ra, 28($sp)
+	jal	baz
+	lw	$ra, 28($sp)
+	addiu	$sp, $sp, 32
+	jr	$ra
+	.end	foo
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	2
+	.space	8
+
+
+	.section .text.bar, "ax", @progbits
+	.set	mips16
+	.globl	bar
+	.ent	bar
+bar:
+	addiu	$sp, -32
+	sw	$ra, 28($sp)
+	jal	baz
+	lw	$a3, 28($sp)
+	jr	$a3
+	.end	bar
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	2
+	.space	8
Index: binutils-fsf-trunk-quilt/opcodes/mips-dis.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/opcodes/mips-dis.c	2013-02-12 20:11:57.000000000 +0000
+++ binutils-fsf-trunk-quilt/opcodes/mips-dis.c	2013-02-12 21:06:46.184395630 +0000
@@ -2940,6 +2940,9 @@ is_compressed_mode_p (struct disassemble
       if (bfd_asymbol_flavour (info->symtab[pos]) != bfd_target_elf_flavour)
 	continue;
 
+      if (info->symtab[pos]->section != info->section)
+	continue;
+
       symbol = (elf_symbol_type *) info->symtab[pos];
       if ((!micromips_ase
 	   && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]