标题:[AT&T汇编语言]第三讲 链接目标文件
取消只看楼主
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
结帖率:96.55%
 问题点数:0 回复次数:0 
[AT&T汇编语言]第三讲 链接目标文件
    使用readelf命令查看第二讲中生成的目标文件hello.o

readelf -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编辑过]

搜索更多相关主题的帖子: Magic 
2016-07-01 21:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-466548-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095308 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved