[PATCH] D23621: llvm-objdump: ELF: Handle code and data mix in all scenarios
khemant@codeaurora.org via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 17 12:31:34 PDT 2016
khemant created this revision.
khemant added reviewers: compnerd, echristo, davide.
khemant added subscribers: davide, echristo, compnerd, rafael, llvm-commits.
khemant set the repository for this revision to rL LLVM.
Herald added subscribers: mehdi_amini, aemerson.
The patch handls behavior of the disassembler when code and data are mixed in a text section.
When code an data are mixed in a section, the GNU disassembler acts in an interesting manner.
If told to disassemble text only (-d), it will interpret mixed data as data
$cat 1.c
int myInt = 1;
char myChar = 'b';
float myFloat = 1.2;
double myComm;
int main () {
return myInt;
}
$cat 1.t
SECTIONS {
.text : { *(.text)
*(.data.my* )
*(.bss*) }
}
$clang -c 1.c -fdata-sections
$ld 1.o -T 1.t
$objdump -d a.out
a.out: file format elf64-x86-64
Disassembly of section .text:
0000000000000040 <main>:
40: 55 push %rbp
41: 48 89 e5 mov %rsp,%rbp
44: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
4b: 8b 04 25 54 00 00 00 mov 0x54,%eax
52: 5d pop %rbp
53: c3 retq
0000000000000054 <myInt>:
54: 01 00 00 00 ....
0000000000000058 <myChar>:
58: 62 0f 1f 00 b...
000000000000005c <myFloat>:
5c: 9a 99 99 3f ...?
ARM variant has one more twist to it. When told to disassemble text only, it will interpret data if data is a standalone symbol, if it is part of a function, it marks it as a word/short etc.
$arm-none-eabi-gcc -c 1.c -fdata-sections
$arm-none-eabi-ld 1.o -t 1.t
$arm-none-eabi-objdump -d a.out
a.out: file format elf32-littlearm
Disassembly of section .text:
00008000 <main>:
8000: e52db004 push {fp} ; (str fp, [sp, #-4]!)
8004: e28db000 add fp, sp, #0
8008: e59f3010 ldr r3, [pc, #16] ; 8020 <main+0x20>
800c: e5933000 ldr r3, [r3]
8010: e1a00003 mov r0, r3
8014: e24bd000 sub sp, fp, #0
8018: e49db004 pop {fp} ; (ldr fp, [sp], #4)
801c: e12fff1e bx lr
8020: 00008024 .word 0x00008024 <=====marked as data
00008024 <myInt>:
8024: 00000001 .... <====interpreted as data
00008028 <myChar>:
8028: 00000062 b...
0000802c <myFloat>:
802c: 3f99999a ...?
If told to disassemble all - all objdump variants really disassemble the data as instructions:
$arm-none-eabi-objdump -D a.out
a.out: file format elf32-littlearm
Disassembly of section .text:
00008000 <main>:
8000: e52db004 push {fp} ; (str fp, [sp, #-4]!)
8004: e28db000 add fp, sp, #0
8008: e59f3010 ldr r3, [pc, #16] ; 8020 <main+0x20>
800c: e5933000 ldr r3, [r3]
8010: e1a00003 mov r0, r3
8014: e24bd000 sub sp, fp, #0
8018: e49db004 pop {fp} ; (ldr fp, [sp], #4)
801c: e12fff1e bx lr
8020: 00008024 andeq r8, r0, r4, lsr #32
00008024 <myInt>:
8024: 00000001 andeq r0, r0, r1
00008028 <myChar>:
8028: 00000062 andeq r0, r0, r2, rrx
0000802c <myFloat>:
802c: 3f99999a svccc 0x0099999a
Disassembly of section .bss:
00010030 <__bss_start>:
...
Repository:
rL LLVM
https://reviews.llvm.org/D23621
Files:
test/tools/llvm-objdump/X86/disassemble-code-data-mix.test
tools/llvm-objdump/llvm-objdump.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23621.68398.patch
Type: text/x-patch
Size: 10434 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160817/66279434/attachment.bin>
More information about the llvm-commits
mailing list