https://sourceware.org/bugzilla/show_bug.cgi?id=32705
Bug ID: 32705 Summary: RISC-V: objdump prints .insn due to incorrect $x mapping symbol handling Product: binutils Version: unspecified Status: UNCONFIRMED Severity: normal Priority: P2 Component: binutils Assignee: unassigned at sourceware dot org Reporter: andrewoates at gmail dot com Target Milestone: --- Symptom: objdump will fail to decode instructions when disassembling a file generated by LLVM that mixes architecture strings between sections. This can result in many ".insn" lines. Root cause: LLVM emits "$x" mapping symbols to signal transitions from a custom architecture string (such as one that does not include the "c" extension) back to the default. When objdump sees a bare "$x" (as opposed to a "$xrv..." that includes the architecture string), it does not actually reset to the ELF file default. This causes subsequent instructions to be decoded based on whatever the last-seen architecture string was. AFAICT, gas will never emit object files like this, because it always emits a full mapping string ("$xrv...") at the start of each section (see gas/config/tc-riscv.c:624 [1]). LLVM's assembler will, however. Alternatively, it's possible this is a strange interaction between LLVM's output and ld when linking gas-generated and LLVM-generated object files together --- but I think this is really an objdump bug. I have a patch prepared to fix this, but filing the bug for reference. I'm still working on a test case (which has to have a binary object file, unfortunately, as gas won't generate a symbol sequence that triggers this bug). Simple test case: $ cat asm.s .attribute arch, "rv64i" .section .text, "ax" addi a0, zero, 1 # $xrv64i $ cat test.c int func(int x) { return x + 1; } $ ../gas/as-new -o /tmp/test.o asm.s $ clang -c -O1 -target riscv64 -o /tmp/test2.o test.c $ ../ld/ld-new /tmp/test.o /tmp/test2.o -o /tmp/linked.o ../ld/ld-new: warning: cannot find entry symbol _start; defaulting to 00000000000100e8 $ ../binutils/objdump -d /tmp/linked.o| less fix-riscv-objdump () U /tmp/linked.o: file format elf64-littleriscv Disassembly of section .text: 00000000000100e8 <func-0x4>: 100e8: 00100513 li a0,1 00000000000100ec <func>: 100ec: 2505 .insn 2, 0x2505 100ee: 8082 .insn 2, 0x8082 If you alter asm.s to say "rv64ic", then you get the expected disassembly at the end: 00000000000100ec <func>: 100ec: 2505 addiw a0,a0,1 100ee: 8082 ret [1] https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/tc-riscv.c;h=493c393f5b2730fe8f841da074fa106d655ec9a7;hb=HEAD#l624 -- You are receiving this mail because: You are on the CC list for the bug.