// 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)