如何在运行时更改函数加载的库?
例如,假设我想用新的东西替换标准的printf函数,我可以编写自己的版本并将其编译成共享库,然后在运行可执行文件之前将“LD_PRELOAD = / my / library.so”放入环境中.
但是,让我们说,我想改变程序本身内部的联系.当然那一定是可能的……对吗?
编辑
不,以下不起作用(但如果你能告诉我如何使它工作,那就足够了).
void* mylib = dlopen("/path/to/library.so",RTLD_NOW); printf = dlsym(mylib,"printf");
解决方法
AFAIK,这是不可能的.一般规则是,如果两个库中出现相同的符号,ld.so将支持首先加载的库. LD_PRELOAD的工作原理是确保在任何隐式加载的库之前加载指定的库.
因此,一旦执行开始,所有隐式加载的库都将被加载,因此在它们之前加载库为时已晚.