测试是在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
错误。
所以我的问题是,如何设置符号固定位置的节号?
答案 0 :(得分:0)
我想在固定地址加载这些符号。
您正在从GLIBC 导入这些符号。除非你正在进行全静态链接,否则你会得到 no say 这些符号到达的地址。
所以我的问题是,如何设置符号的节号
这个问题毫无意义:部分编号本身无意义而25
可能在一个可执行文件中引用.bss
,但在另一个可执行文件中引用.text
。< / p>
您的部分25
恰好是此特定系统上的.bss
以及此特定版本。尝试构建一个完全静态的二进制文件,您可能会看到24
部分。
无论如何,正常的可执行文件会从stdin
复制libc.so.6
。您最好阅读该过程的this description,并特别注意&#34;额外信用#2:引用可执行文件中的共享库数据&#34;部分。
但首先要了解完全静态的情况可能更容易。