小编whu*_*ala的帖子

什么是 *ABS* 部分以及何时使用?

// foo.c
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

当我编译上面的代码时,我注意到一些符号位于*ABS*

$ gcc foo.c
$ objdump -t a.out | grep ABS
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
0000000000000000 l    df *ABS*  0000000000000000              foo.c
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
0000000000000000 l    df *ABS*  0000000000000000              
Run Code Online (Sandbox Code Playgroud)

看起来它们是一些调试符号,但调试信息不​​是存储在类似.debug_info部分的地方吗?

根据man objdump

*ABS* 如果该部分是绝对的(即不与任何部分连接)

我不明白,因为这里没有给出例子。

这里的问题显示了一种有趣的方式来传递一些额外的符号*ABS*by --defsym。但我认为通过传递宏可能会更容易。

那么这个*ABS*部分是什么,什么时候有人会使用它?

编辑

绝对符号不会被重新定位,它们的虚拟地址(在您给出的示例中为 0000000000000000)是固定的。

我写了一个演示,但似乎可以修改绝对符号的地址。

$ gcc foo.c
$ objdump -t a.out | grep ABS
0000000000000000 l …
Run Code Online (Sandbox Code Playgroud)

c binary linker gcc elf

5
推荐指数
1
解决办法
1471
查看次数

标签 统计

binary ×1

c ×1

elf ×1

gcc ×1

linker ×1