我想知道是否有可能强制链接器在编译/链接时使用某些指定的函数链接。
我正在使用LD_PRELOAD环境变量来挂钩一些指定的函数,但我对链接器并不熟悉,所以有一些麻烦。我正在挂钩标准open()
系统调用以添加一些功能,以便当用户使用open()
系统调用时,我可以收集一些数据。基本上,我正在做这样的事情:
int open(int fd, int flags, ...) //(1)
{
// add some functionalities here
return open(...); // (2), return the original open system call
}
显然,这不起作用,因为它会调用无限循环...所以我想知道我是否可以强制链接器将某些函数链接到某个指定的动态库,这样它就不会导致无限循环。在上面的例子中,它对于" open()"是完美的。系统调用(2)链接到标准库。
至于现在,因为我将LD_PRELOAD设置为:
export LD_PRELOAD=/path/to/my_open.so
每当加载内部具有open()
函数的程序时,动态链接器会将open()
链接到我的 my_open.so 。对于我的open()
来说也是如此:当链接器尝试链接(2)处的open()
时,它也会尝试将其链接到({1)处的open()
,结果在无限循环中。
有什么想法吗?
答案 0 :(得分:2)
关于动态符号链接的详细算法可以在man ld.so
中找到。
ELF格式允许插入符号open@@VERSION
。这对于同时保留不同版本的libc非常有用。您可能希望在LD_LIBRARY_PATH
中保留自己的.so库。
答案 1 :(得分:1)
您可以使用open
检索dlsym (RTLD_NEXT, "open")
的原始实现。没有其他可靠的方法可以从open
库中获得LD_PRELOAD
的原始定义。
查看fakeroot
和cwrap
等项目可能会有所帮助,看看他们如何处理这个问题。