如何在编译ELF二进制文件时设置符号的节号?

时间:2015-02-07 22:19:35

标签: c linux assembly linker elf

测试是在32位Linux,x86上进行的。

假设在我的汇编程序final.s中,我必须加载一些库符号,比如stdin@@GLIBC_2.0,我想在固定地址中加载这些符号。

所以按照question中的说明,我这样做了:

echo ""stdin@@GLIBC_2.0" = 0x080a7390;" > symbolfile
echo ""stdin@GLIBC_2.0 (4)" = 0x080a7390;" >> symbolfile
gcc -Wl,--just-symbols=symbolfile  final.s -g

当我检查符号表的输出时,我得到了这个:

readelf -s a.out | grep stdin
53: 080a7390     4 OBJECT  GLOBAL DEFAULT  ABS stdin@@GLIBC_2.0
17166: 080a7390     0 NOTYPE  GLOBAL DEFAULT  ABS stdin@GLIBC_2.0 (4)

与需要stdin符号的常见ELF游戏进行比较:

readelf -s hello.out | grep stdin

17199: 0838b8c4     4 OBJECT  GLOBAL DEFAULT   25 stdin@@GLIBC_2.0
52: 0838b8c4     4 OBJECT  GLOBAL DEFAULT   25 stdin@GLIBC_2.0 (4)

因此,我发现明显不同的是Ndx列,例如,我的固定位置符号的部分编号是ABS。请查看参考文献here

执行a.out时,会引发segmentation fault错误。

所以我的问题是,如何设置符号固定位置的节号?

1 个答案:

答案 0 :(得分:0)

  

我想在固定地址加载这些符号。

您正在从GLIBC 导入这些符号。除非你正在进行全静态链接,否则你会得到 no say 这些符号到达的地址。

  

所以我的问题是,如何设置符号的节号

这个问题毫无意义:部分编号本身无意义25可能在一个可执行文件中引用.bss,但在另一个可执行文件中引用.text。< / p>

您的部分25恰好是此特定系统上的.bss 以及此特定版本。尝试构建一个完全静态的二进制文件,您可能会看到24部分。

无论如何,正常的可执行文件会从stdin复制libc.so.6。您最好阅读该过程的this description,并特别注意&#34;额外信用#2:引用可执行文件中的共享库数据&#34;部分。

但首先要了解完全静态的情况可能更容易。