我想知道是否可以强制链接器在编译/链接时使用一些指定的函数来链接。
我正在使用 LD_PRELOAD 环境变量来挂接一些指定的函数,但我对链接器不太熟悉,所以有一些麻烦。我 Hook 了标准的 open()
系统调用以添加一些功能,以便当用户使用 open()
系统调用时,我可以收集一些数据。基本上,我正在做这样的事情:
int open(int fd, int flags, ...) //(1)
{
// add some functionalities here
return open(...); // (2), return the original open system call
}
显然,这行不通,因为它会调用一个无限循环...所以我想知道我是否可以强制链接器将某些函数链接到某个指定的动态库,这样它就不会导致无限循环。在上面的示例中,将 (2) 处的“open()”系统调用链接到标准库将是完美的。
至于现在,因为我将 LD_PRELOAD 设置为:
export LD_PRELOAD=/path/to/my_open.so
每当加载一个内部有 open()
函数的程序时,动态链接器就会将该 open()
链接到我的 my_open.so。这对于我的 open()
也是一样的:当链接器尝试链接 (2) 处的 open()
时,它也会尝试将其链接到我的 open()
在 (1),导致无限循环。
有什么想法吗?
最佳答案
关于链接动态符号的详细算法可以在man ld.so
中找到。
ELF 格式允许插入一个符号open@@VERSION
。这对于同时保留不同版本的 libc 很有用。可能您想在 LD_LIBRARY_PATH
中保留自己的 .so 库。
关于c - 编译/链接时强制指定函数链接到指定库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230493/