0

这可能会很尴尬:

我在其他项目中使用库预加载,但我无法让这个最小的例子工作:

弱引用.h:

void f_weak() __attribute__((weak));

弱引用.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 回答
0

据我所知,外部函数只有在你调用它们时才会被解析。因此,您的测试 if (f_weak) 将始终失败。如果您按照以下方式执行此操作,您可以看到它有效:

弱引用.c:

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

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

弱2.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
于 2013-08-14T10:37:56.183 回答