gpt4 book ai didi

c - LD_PRELOAD 和弱引用最小示例不起作用

转载 作者:行者123 更新时间:2023-11-30 17:48:55 25 4
gpt4 key购买 nike

这可能会很尴尬:

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

weakref.h:

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()

我错过了什么?

最佳答案

据我所知,外部函数只有在调用时才会被解析。所以,你的测试 if (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

关于c - LD_PRELOAD 和弱引用最小示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18227575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com