上QQ阅读APP看书,第一时间看更新
2.3 GNU binutils工具
在分析GCC代码时,尤其是后端代码生成的过程中,经常需要对编译生成的目标文件进行分析,包括编译生成的汇编代码、目标文件等,此时,如果能够熟练使用GNU binutils工具链中的工具,无疑将对分析非常有用。GNU binutils工具的源代码及介绍参见GNU的官网:http://www.gnu.org/software/binutils/,其中主要工具如表2-1所示。
表2-1 GNU binutils中的主要工具
例如,对于如下的源代码:
[GCC@localhost test]$ cat test.c int main(){ int i=0, sum=0; sum = sum + i; return sum; }
可以使用objdump进行目标代码的反汇编:
[GCC@localhost test]$ gcc -c -o test.o test.c [GCC@localhost test]$ objdump -d test.o test.o: file format elf32-i386 Disassembly of section .text: 00000000 <main>: 0: 55 push %ebp 1: 89 e5 mov %esp, %ebp 3: 83 ec 10 sub $0x10, %esp 6: c7 45 f8 00 00 00 00 movl $0x0, -0x8(%ebp) d: c7 45 fc 00 00 00 00 movl $0x0, -0x4(%ebp) 14: 8b 45 f8 mov -0x8(%ebp), %eax 17: 01 45 fc add %eax, -0x4(%ebp) 1a: 8b 45 fc mov -0x4(%ebp), %eax 1d: c9 leave 1e: c3 ret
可以使用nm查看目标文件中的符号信息:
[GCC@localhost test]$ nm test.o 00000000 T main
也可以使用readelf工具查看目标文件的ELF信息。
[GCC@localhost test]$ readelf -a test.o ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x0 Start of program headers: 0 (bytes into file) Start of section headers: 200 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 Size of section headers: 40 (bytes) Number of section headers: 9 Section header string table index: 6 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 00000000 000034 00001f 00 AX 0 0 4 [ 2] .data PROGBITS 00000000 000054 000000 00 WA 0 0 4 [ 3] .bss NOBITS 00000000 000054 000000 00 WA 0 0 4 [ 4] .comment PROGBITS 00000000 000054 00002e 01 MS 0 0 1 [ 5] .note.GNU-stack PROGBITS 00000000 000082 000000 00 0 0 1 [ 6] .shstrtab STRTAB 00000000 000082 000045 00 0 0 1 [ 7] .symtab SYMTAB 00000000 000230 000080 10 8 7 4 [ 8] .strtab STRTAB 00000000 0002b0 00000d 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) There are no section groups in this file. There are no program headers in this file. There are no relocations in this file. There are no unwind sections in this file. Symbol table '.symtab' contains 8 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS test.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 2 4: 00000000 0 SECTION LOCAL DEFAULT 3 5: 00000000 0 SECTION LOCAL DEFAULT 5 6: 00000000 0 SECTION LOCAL DEFAULT 4 7: 00000000 31 FUNC GLOBAL DEFAULT 1 main No version information found in this file.