Справка LD_PRELOAD - PullRequest
       10

Справка LD_PRELOAD

3 голосов
/ 03 февраля 2011

Я пытаюсь использовать LD_PRELOAD.

original.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  
int main() {  
    myPuts();  
    return 0;  
}

hacked.cpp

void myPuts() {  
    std::cout >> "Hello hacked myPuts";  
}

Я компилирую original.cpp:

g++ original.cpp

И взломанный .cpp:

g++ -shared -fPIC hacked.cpp

Я пытаюсь:

LD_PRELOAD=./hacked.so ./original.out

Строка «Hello hacked myPuts» должна быть видна, появляется «Hello myPuts» (Если я попытаюсь перезаписать функцию put, она будет работать правильно)

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 03 февраля 2011

От man ld.so

LD_PRELOAD

Список разделенных пробелами дополнительных пользовательских библиотек ELF, загружаемых раньше всех остальных.Это можно использовать для выборочного переопределения функций в других общих библиотеках .

Если myPuts находится в общей библиотеке, связанной с основным приложением, она будет работать, но не тогда, когда myPuts существует в приложении и не разрешается во внешней библиотеке.

3 голосов
/ 03 февраля 2011

Вы должны иметь:

main.cpp

int main() {  
    myPuts();  
    return 0;  
}

original.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  

hacked.cpp

void myPuts() {  
    std::cout << "Hello hacked myPuts";  
}

Компиляция всего:

g++ -shared -fPIC original.cpp -o liboriginal.so
g++ -shared -fPIC hacked.cpp -o libhacked.so
g++ main.cpp -loriginal -o main.out

И использование:

LD_PRELOAD=./libhacked.so ./main.out
...