[AT&T汇编语言]第三讲 链接目标文件
使用readelf命令查看第二讲中生成的目标文件hello.oreadelf -a hello.o
得到如下结果:
程序代码:
ELF 头: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 类别: ELF32 数据: 2 补码,小端序 (little endian) 版本: 1 (current) OS/ABI: UNIX - System V ABI 版本: 0 类型: REL (可重定位文件) 系统架构: Intel 80386 版本: 0x1 入口点地址: 0x0 程序头起点: 0 (bytes into file) Start of section headers: 840 (bytes into file) 标志: 0x0 本头的大小: 52 (字节) 程序头大小: 0 (字节) Number of program headers: 0 节头大小: 40 (字节) 节头数量: 8 字符串表索引节头: 5 节头: [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 000200 00 AX 0 0 1 [ 2] .rel.text REL 00000000 000300 000018 08 I 6 1 4 [ 3] .data PROGBITS 00000000 000234 000000 00 WA 0 0 1 [ 4] .bss NOBITS 00000000 000234 000000 00 WA 0 0 1 [ 5] .shstrtab STRTAB 00000000 000318 000030 00 0 0 1 [ 6] .symtab SYMTAB 00000000 000234 0000a0 10 7 9 4 [ 7] .strtab STRTAB 00000000 0002d4 000029 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) There are no section groups in this file. 本文件中没有程序头。 重定位节 '.rel.text' 位于偏移量 0x300 含有 3 个条目: 偏移量 信息 类型 符号值 符号名称 00000001 00000114 R_386_16 00000000 .text 00000018 00000114 R_386_16 00000000 .text 0000001e 00000114 R_386_16 00000000 .text The decoding of unwind sections for machine type Intel 80386 is not currently supported. Symbol table '.symtab' contains 10 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 SECTION LOCAL DEFAULT 1 2: 00000000 0 SECTION LOCAL DEFAULT 3 3: 00000000 0 SECTION LOCAL DEFAULT 4 4: 000007c0 0 NOTYPE LOCAL DEFAULT ABS BOOT_SECT 5: 00000005 0 NOTYPE LOCAL DEFAULT 1 go 6: 00000032 0 NOTYPE LOCAL DEFAULT 1 msg_len 7: 00000025 0 NOTYPE LOCAL DEFAULT 1 msg 8: 00000022 0 NOTYPE LOCAL DEFAULT 1 cpu_hlt 9: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _start No version information found in this file.
其他的都不用管,在最下面,我们看到有几个很熟悉的几个符号:go、ABS BOOT_SECT、msg_len、msg、cpu_hlt、_start。每行前面的信息告诉我们,_start和其他的符号不同。我们可以猜到,_start是全局符号,而其他的都是局部符号。我们再看看hello.s文件,确实有下面一行:
.global _start
没错,我们在源代码中通过.global伪指令让汇编器生成目标文件时公开_start符号,这样我们就可以在其他目标文件中引用这个符号。未经.global伪指令公开的符号,在其他目标文件中均无法引用。这就如同只有朋友告诉我们他家的地址,我们才能找到他家,否则根本到不了他家。
起始通过上面的内容,还想告诉大家的是,对于计算机来说,不论是函数还是变量,对它们符号的引用起始就是对它们所在内存单元地址的引用。
[此贴子已经被作者于2016-7-1 21:40编辑过]