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] |
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] |