测试在 Ubuntu 12.04、32 位、gcc4.6.3 上进行。
基本上我正在对 ELF 二进制文件做一些二进制操作工作,我现在要做的是组装一个汇编程序并保证 libc 符号由我加载到预定义的地址。
让我用一个简单的例子来详细说明。
假设在原始代码中,使用了 libc 符号stdout@GLIBC_2.0。
#include <stdio.h>
int main() {
FILE* fout = stdout;
fprintf( fout, "hello\n" );
}
当我编译它并使用这些命令检查符号地址时:
gcc main.c
readelf -s a.out | grep stdout
我懂了:
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@GLIBC_2.0 (2)
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@@GLIBC_2.0
该.bss部分是这样的:
readelf -S a.out | grep bss
[25] .bss NOBITS 0804a020 001014 00000c 00 WA 0 0 32
现在我要做的是stdout在预定义的地址中加载符号,所以我这样做了:
echo "stdout = 0x804a024;" > symbolfile
gcc -Wl,--just-symbols=symbolfile main.c
然后当我检查.bss部分和符号时stdout,我得到了这个:
[25] .bss NOBITS 0804a014 001014 000008 00 WA 0 0 4
4: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout
49: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout
似乎我没有成功加载符号
stdout@@GLIBC_2.0,而只是一个有线的stdout. (我试着写stdout@@GLIBC_2.0进去symbolfile,但它不能编译...)好像是我没弄到,
.bsssection的起始地址也变了,这就使得stdoutsymbol的地址在一个非section区。在运行时,从0x804a024.
谁能帮助我如何在预定义的地址成功加载库符号?谢谢!