如何更改函数在运行时加载的库?例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译到共享库中,然后将“LD_PRELOAD=/my/library.so"在运行我的可执行文件之前在环境中。但是,我想从程序本身内部更改该链接。这肯定是可能的……对吧?编辑不,以下内容不起作用(但如果你能告诉我如何让它起作用,那就足够了)。void*mylib=dlopen("/path/to/library.so",RTLD_NOW);printf=dlsym(mylib,"printf"); 最佳答案 据我所知,这是不可
在下面的最小示例中,通过LD_PRELOAD加载的库具有拦截fopen和openat的函数显然在其初始化之前运行。(Linux是CentOS7.3)。为什么??库文件comm.c:#define_GNU_SOURCE#include#include#include#includetypedefFILE*(*fopen_type)(constchar*,constchar*);//initializetoinvalidvalue(non-NULL)//init()shouldinitializethiscorrectlyfopen_typeg_orig_fopen=(fopen_type
在下面的最小示例中,通过LD_PRELOAD加载的库具有拦截fopen和openat的函数显然在其初始化之前运行。(Linux是CentOS7.3)。为什么??库文件comm.c:#define_GNU_SOURCE#include#include#include#includetypedefFILE*(*fopen_type)(constchar*,constchar*);//initializetoinvalidvalue(non-NULL)//init()shouldinitializethiscorrectlyfopen_typeg_orig_fopen=(fopen_type
我的应用程序具有函数f1voidf1()此外,我还有一个使用LD_PRELOAD加载的库。库有几个代码文件和几个头文件,编译成.so文件。其中一个头文件还使用了一个名为f1的函数,其签名与上述相同。最新的f1仅在库中使用。(我无法将其更改为静态方法)问题是,当我加载库(使用LD_PRELOAD)时,库中的f1会覆盖应用程序的f1。有没有办法将库的f1配置为仅对库可见? 最佳答案 如果您完全可以修改头文件,请将函数设置为static,使其仅在该编译单元中可见,或者用__attribute__((visibility("hidden")
我的应用程序具有函数f1voidf1()此外,我还有一个使用LD_PRELOAD加载的库。库有几个代码文件和几个头文件,编译成.so文件。其中一个头文件还使用了一个名为f1的函数,其签名与上述相同。最新的f1仅在库中使用。(我无法将其更改为静态方法)问题是,当我加载库(使用LD_PRELOAD)时,库中的f1会覆盖应用程序的f1。有没有办法将库的f1配置为仅对库可见? 最佳答案 如果您完全可以修改头文件,请将函数设置为static,使其仅在该编译单元中可见,或者用__attribute__((visibility("hidden")
我正在试验Linux共享库并向$LD_LIBRARY_PATH添加了一个条目(exportLD_LIBRARY_PATH=/path/to/library:${LD_LIBRARY_PATH})。现在我希望它消失了。我该怎么做?附言。在我添加条目之前键入echo$LD_LIBRARY_PATH给我一个空行。现在它说:path/to/library: 最佳答案 如果之前它给你空行(很可能)意味着变量没有设置(默认情况下它没有设置),所以你可以取消设置它:unsetLD_LIBRARY_PATH一些其他的实验选项:exportMY_PA
我正在试验Linux共享库并向$LD_LIBRARY_PATH添加了一个条目(exportLD_LIBRARY_PATH=/path/to/library:${LD_LIBRARY_PATH})。现在我希望它消失了。我该怎么做?附言。在我添加条目之前键入echo$LD_LIBRARY_PATH给我一个空行。现在它说:path/to/library: 最佳答案 如果之前它给你空行(很可能)意味着变量没有设置(默认情况下它没有设置),所以你可以取消设置它:unsetLD_LIBRARY_PATH一些其他的实验选项:exportMY_PA
我正在尝试将SO注入(inject)到开始使用systemdinit系统(使用LD_PRELOAD)的进程中,但它没有加载到新进程中。我编写了一个基本的SO(unrandom.c):intrand(){return42;//themostrandomnumberintheuniverse}使用命令行:gcc-shared-fPICunrandom.c-ounrandom.so我更改了.service文件以包含:Environment="LD_PRELOAD=/tmp/unrandom.so"服务启动后进程中存在LD_PRELOAD环境变量,但SO没有注入(inject)cat/proc
我正在尝试将SO注入(inject)到开始使用systemdinit系统(使用LD_PRELOAD)的进程中,但它没有加载到新进程中。我编写了一个基本的SO(unrandom.c):intrand(){return42;//themostrandomnumberintheuniverse}使用命令行:gcc-shared-fPICunrandom.c-ounrandom.so我更改了.service文件以包含:Environment="LD_PRELOAD=/tmp/unrandom.so"服务启动后进程中存在LD_PRELOAD环境变量,但SO没有注入(inject)cat/proc
当我在linux中构建我的源代码时,我遇到了类似这样的错误qstring.cpp:(.text+0x2c01):undefinedreferenceto`terminate(void)'collect2:ldreturned1exitstatus如何解决这个问题? 最佳答案 terminate是在C++标准库中定义的,因此请确保将其链接到其中。假设您正在使用gcc进行编译,则应使用g++编译源代码的可执行文件,不是gcc可执行文件:g++source.cc-ooutput当作为g++执行时,链接器会自动为您链接C++标准库(libs