Как загрузить библиотеку определенных символов в указанное место?
Тест на Ubuntu 12.04, 32-битный, сgcc
4.6.3.
По сути, я выполняю некоторые бинарные манипуляции с бинарными файлами ELF, и теперь мне нужно собрать программу сборки и гарантировать, что символы libc загружены мной по заранее определенному адресу.
Позвольте мне развить это на простом примере.
Предположим, в исходном коде символы libcstdout@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
, но он не может скомпилировать ...)
Кажется, что, как я не сделал, начальный адрес.bss
раздел также изменился, что делает адресstdout
символ в области без сечения. Во время выполнения выдает ошибку сегментации при загрузке из0x804a024
.
Может ли кто-нибудь помочь мне, как успешно загрузить символ библиотеки по заранее определенному адресу? Спасибо!