c - 为目标文件中的指令分配地址

标签 c linux process ld loader

当我们用 gcc -c 编译任何 c 代码时并做 objdump -d <filename>.o我们看到了

Disassembly of section .text:
0000000000000000 <main>:
 0:   55                      push   %rbp
 1:   48 89 e5                mov    %rsp,%rbp
 4:   48 83 ec 10             sub    $0x10,%rsp
 8:   48 8d 45 fc             lea    -0x4(%rbp),%rax
 c:   48 89 c7                mov    %rax,%rdi
 f:   b8 00 00 00 00          mov    $0x0,%eax
 . . .

但链接后,偏移量变为gcc -o prog -L/library/path -llibrary *.o

0000000000400644 <main>:
400644:       55                      push   %rbp
400645:       48 89 e5                mov    %rsp,%rbp
400648:       48 83 ec 10             sub    $0x10,%rsp
40064c:       48 8d 45 fc             lea    -0x4(%rbp),%rax
400650:       48 89 c7                mov    %rax,%rdi
400653:       b8 00 00 00 00          mov    $0x0,%eax

链接完成后如何计算偏移量?

我们基本上得到了 3 组地址, 1.编译后 2.链接后 3.加载后

上述地址有什么关系?

最佳答案

你必须记住目标文件只包含你的代码,所以它总是在偏移量零处。

当您链接时,您会从其他来源添加模块,例如运行时初始化和库函数。您不知道这些对象的大小,也不知道它们在生成的可执行文件中的位置,因此无法自行计算代码不同部分的偏移量。此外,如果您有多个目标文件,链接器可能会根据需要重新排列它们。

代码在运行时将最终到达的确切虚拟地址,部分取决于链接器,但主要取决于操作系统和地址空间随机化等因素。

关于c - 为目标文件中的指令分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854378/

相关文章:

linux - 磁盘上的 unix 套接字文件与 ubuntu 上的 tmpfs

c - system() 调用行为

c - 检查从其他进程收到的字符串时进程崩溃

python - 从 3 个文本文件输出匹配行以及匹配行下的行

java - 进程卡在 waitFor() 中

c - 我如何读取文件的最后一行?

c - 如何使用C和系统调用模拟bash的 "ulimit -u"命令?

c - 从文件中读取并设置偏移量?

c++ - "fastfwd"文件可以是管道/套接字/fifo

php - fopen() 无法在 Linux 上创建文件