gpt4 book ai didi

c - 我在动态库中重新定义了标准C库函数,但无法使用它

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

有一个简单的例子来描述我的问题:

我有 3 个文件,ma​​inlevel1.solevel2.so。 (我的操作系统是solaris11.3,gcc版本是3.4.3)

ma​​in中,它从level1.so调用execute()execute()level2.so 调用 run()run() 调用在 level2.so 中重新定义的 fcloseall()

fcloseall() 被重新定义为不执行任何操作(它将关闭所有打开的 fd,包括最初的 stdout、stdin 和 stderr)。

现在我想在 main 中打印 execute() 周围的内容,但只打印 execute() 之前的消息。

代码如下:

level2.so是由level2.clevel2depend.c编译而成。

level2.c:

#include <stdio.h>
int run()
{
fcloseall();
return 0;
}

level2depend.c:

#include <stdio.h>
int fcloseall() //redefine the std c function fcloseall
{
printf("in redefined fcloseall\n");
return 0;
}

level1.so是从level1.c编译而来的。

level1.c

#include <dlfcn.h>
int execute()
{

int (*sofunc)(void);
void * lib_handle = NULL;
char *errorInfo;
lib_handle = dlopen("./liblevel2.so",RTLD_LAZY);
if(!lib_handle)
{
return 0;
}
sofunc = (int(*)(void))dlsym(lib_handle,"run");
errorInfo = dlerror();
if (errorInfo != NULL){
dlclose(lib_handle);
return 0;
}
int ret = sofunc();
dlclose(lib_handle);
return 0;
}

ma​​in是从main.c编译而来的。

main.c

#include <dlfcn.h>
#include <stdio.h>
int main()
{

int (*sofunc)(void);
void * lib_handle = NULL;
char *errorInfo;
lib_handle = dlopen("./liblevel1.so",RTLD_LAZY);
if(!lib_handle)
{
return 0;
}
sofunc = (int(*)(void))dlsym(lib_handle,"execute");
errorInfo = dlerror();
if (errorInfo != NULL){
dlclose(lib_handle);
return 0;
}
printf("before\n");
int ret = sofunc();
printf("after\n");
dlclose(lib_handle);
return 0;
}

ma​​kefile 是:

all:
gcc level2depend.c -o level2depend.o -c -g -fPIC
gcc level2.c -o level2.o -c -g -fPIC
gcc -shared -g level2.o level2depend.o -o liblevel2.so -fPIC
gcc level1.c -o level1.o -c -g -fPIC
gcc level1.o -o liblevel1.so -shared -fPIC
gcc main.c -o main -g -ldl
clean:
rm level2depend.o level1.o liblevel1.so level2.o liblevel2.so main

我执行main,结果是:

root@solaris#./main
before

如果我将 makefile 更改为 gcc main.c -o main -g -ldl -llevel2,结果是:

root@solaris#./main
before
in redefined fcloseall
after

这就是我想要的。

我想知道为什么会发生这种情况。谢谢!

最佳答案

可以使用ld提供的wrap函数。

gcc -Wl,-wrap,fcloseall ....

在你的源代码中,

int __wrap_fcloseall(void)
{...}

关于c - 我在动态库中重新定义了标准C库函数,但无法使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36113982/

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