【发布时间】:2015-02-07 22:19:34
【问题描述】:
测试在 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 错误。
所以我的问题是,如何设置符号固定位置的节号?
【问题讨论】:
标签: c linux assembly linker elf