#cpp #linux #elf
Имеется исполняемый ELF файл «glinkd». Мне необходимо дополнить реализацию некоторых функций, посредством их перехвата. Попался под руку удобный инструмент LD_PRELOAD. Он прекрасно отрабатывает на любых elf файлах, но к несчастью, необходимый для меня файл патчить он отказался. Это выражается в том, что при подгрузки моей библиотеки в «glinkd», попросту ничего не происходит, как будто на этом файле имеется какая то защита. В гугле ничего про защиту от LD_PRELOAD я не нашел. Как я патчу elf файлы: testso.cpp: #includevoid __attribute__ ((constructor)) module_load(void); void __attribute__ ((destructor)) module_unload(void); void module_load(void) { printf("hello from .so!\n"); } void module_unload(void) { } Компилирую: g++ -fPIC -c testso.cpp -o testso.o -m32 -std=c++0x g++ -shared -Wl,-soname,libtestso.so -o libtestso.so testso.o -m32 -std=c++0x test_prog.cpp: #include int main() { printf("Hello from executable!\n"); } Компилирую: g++ -o test_prog test_prog.cpp -m32 Патчим test_prog: root@ubuntu:/home/glinkd# LD_PRELOAD=/home/glinkd/libtestso.so ./test_prog hello from .so! Hello from executable! root@ubuntu:/home/glinkd# Патчим glinkd: root@ubuntu:/home/glinkd# LD_PRELOAD=/home/glinkd/libtestso.so ./glinkd Usage: ./glinkd configurefile section_num root@ubuntu:/home/glinkd# Как видим, наша .so просто игнорируется. Есть идеи что это за защита, и как ее можно снять?
Ответы
Ответ 1
Из комментария пользователя @Mike: Это невозможно. Чтобы LD_PRELOAD сработал, надо, чтобы его кто то задействовал, а его задействует динамический загрузчик. Но он работает только с динамически собранными исполняемыми файлами. Работа при статической компоновке возможна только самостоятельной загрузкой требуемого ELF в свое адресное пространство.
Комментариев нет:
Отправить комментарий