Как загрузить библиотеку определенных символов в указанное место?

Тест на 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.

Может ли кто-нибудь помочь мне, как успешно загрузить символ библиотеки по заранее определенному адресу? Спасибо!

Ответы на вопрос(0)

Ваш ответ на вопрос