0

これはおそらく恥ずかしいでしょう:

私は他のプロジェクトでライブラリのプリロードを使用していますが、この最小限の例を機能させることができません:

弱参照.h:

void f_weak() __attribute__((weak));

弱いref.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()

私は何が欠けていますか?

4

2 に答える 2

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()
于 2013-08-14T11:54:05.270 に答える