2013-08-14 5 views
0

Это, вероятно, будет неловко:LD_PRELOAD и слабые ссылки минимальный пример не работает

Я использую библиотеку prelaoding в других проектах, но я не могу получить это минимальный пример работы:

weakref. ч:

void f_weak() __attribute__((weak)); 

weakref.c:

#include <stdio.h> 
#include "weakref.h" 

void f_weak(){ 
    printf("f_weak()\n"); 
    fflush(stdout); 
} 

test_weakref.c:

#include <stdio.h> 
#include "weakref.h" 

int main(void) 
{ 
    if (f_weak) { 
     printf("main: f_weak()\n"); 
    } 
    else { 
     printf("main: ---\n"); 
    } 

    fflush(stdout); 
    return 0; 
} 

Вот что я делаю:

$ gcc weakref.c -shared -fPIC -o libweakref.so 
$ nm libweakref.so | grep f_weak 
0000000000000708 W f_weak 
$ gcc test_weakref.c -o test_weakref 
$ ./test_weakref 
main: --- 
$ LD_PRELOAD=./libweakref.so ./test_weakref 
main: --- 

Ожидаемый вывод последней команды является

main: f_weak() 

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

ответ

0

Насколько я знаю, внешние функции разрешаются только тогда, когда вы их вызываете. Итак, ваш тест, если (f_weak) всегда будет терпеть неудачу. Если вы делаете это следующим образом, вы можете видеть, что это работает:

weakref.c:

#include <stdio.h> 
#include "weakref.h" 

void f_weak(){ 
    printf("original\n"); 
    fflush(stdout); 
} 

weak2.c:

#include <stdio.h> 
#include "weakref.h" 

void f_weak(){ 
    printf("overridden\n"); 
    fflush(stdout); 
} 

test_weakref.c:

#include <stdio.h> 
#include "weakref.h" 

int main(void) 
{ 
    f_weak(); 
    fflush(stdout); 
    return 0; 
} 

и затем:

tmp> gcc weakref.c -shared -fPIC -o libweakref.so 
tmp> gcc weak2.c -shared -fPIC -o libweak2.so 
tmp> gcc -o test_weakref test_weakref.c ./libweakref.so 
tmp> ./test_weakref 
original 
tmp> LD_PRELOAD=./libweak2.so !. 
LD_PRELOAD=./libweak2.so ./test_weakref 
overridden 
+0

Спасибо, но моя проблема возникает, когда я использую __ атрибут __ ((слабый)). – steffen

0

Я нашел решение в старом Makefile: программа также должна быть скомпилирована с флагом -fPIC.

$ gcc weakref.c -shared -fPIC -o libweakref.so 
$ nm libweakref.so | grep f_weak 
0000000000000708 W f_weak 
$ gcc test_weakref.c -o test_weakref -fPIC 
$ ./test_weakref 
main: --- 
$ LD_PRELOAD=./libweakref.so ./test_weakref 
main: f_weak()