【发布时间】:2017-07-21 06:27:28
【问题描述】:
我想知道是否可以在编译/链接时强制链接器使用某些指定的函数来链接。
我正在使用 LD_PRELOAD 环境变量来挂钩一些指定的函数,但我对链接器不太熟悉,所以有些麻烦。我正在挂钩标准的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() 时,它也会尝试在 (1) 处将其链接到我的 open(),从而导致无限循环。
有什么想法吗?
【问题讨论】:
标签: c compilation linker binutils