tyl*_*erl 7 c linux shared-libraries
如何在运行时更改函数加载的库?
例如,假设我想取代标准的printf新的东西的功能,我可以写我自己的版本,并把它编译成一个共享库,然后把"LD_PRELOAD = /我的/ library.so"的环境中运行的可执行我之前.
但是,让我们说,我想改变程序本身内部的联系.当然那一定是可能的......对吗?
编辑
不,不,以下不起作用(但如果你能告诉我如何使它工作,那就足够了).
void* mylib = dlopen("/path/to/library.so",RTLD_NOW);
printf = dlsym(mylib,"printf");
Run Code Online (Sandbox Code Playgroud)
AFAIK,那是不可能的。一般规则是,如果相同的符号出现在两个库中,ld.so 将优先加载最先加载的库。LD_PRELOAD 的工作原理是确保在任何隐式加载的库之前加载指定的库。
因此,一旦开始执行,所有隐式加载的库都将被加载,因此在它们之前加载库为时已晚。
| 归档时间: |
|
| 查看次数: |
5603 次 |
| 最近记录: |