compiling/linking 时强制指定函数链接到指定库
Force specified function to be linked to a specified lib when compiling/linking
我想知道是否可以强制linker 使用一些指定的函数来link 到compiling/linking。
我正在使用LD_PRELOAD环境变量来hook一些指定的函数,但是我对link不太熟悉所以有一些麻烦。我正在挂钩标准 open()
系统调用以添加一些功能,以便当用户使用 open()
系统调用时,我可以收集一些数据。基本上,我正在做这样的事情:
int open(int fd, int flags, ...) //(1)
{
// add some functionalities here
return open(...); // (2), return the original open system call
}
显然,这行不通,因为它会调用一个无限循环...所以我想知道我是否可以强制 linker link 某个指定动态库的某些函数这样就不会造成无限循环。在上面的示例中,将 (2) 处的 "open()" 系统调用 link 编辑到标准库将是完美的。
至于现在,因为我将 LD_PRELOAD 设置为:
export LD_PRELOAD=/path/to/my_open.so
只要加载了一个内部有 open()
函数的程序,动态 linker 就会 link 那 open()
到我的 my_open.so。这对我的 open()
来说也是一样的:当 linker 试图 link open()
在 (2) 时,它也会尝试 link到我的 open()
(1),导致无限循环。
有什么想法吗?
您可以使用 dlsym (RTLD_NEXT, "open")
检索 open
的原始实现。没有其他可靠的方法可以从 LD_PRELOAD
库中获得 open
的原始定义。
查看 fakeroot
和 cwrap
等项目以了解它们如何处理此问题可能会有所启发。
关于链接动态符号的详细算法可以在man ld.so
中找到。
ELF 格式允许插入一个符号open@@VERSION
。这对于同时保留不同版本的 libc 很有用。可能您想在 LD_LIBRARY_PATH
.
中保留自己的 .so 库
See here for details.
我想知道是否可以强制linker 使用一些指定的函数来link 到compiling/linking。
我正在使用LD_PRELOAD环境变量来hook一些指定的函数,但是我对link不太熟悉所以有一些麻烦。我正在挂钩标准 open()
系统调用以添加一些功能,以便当用户使用 open()
系统调用时,我可以收集一些数据。基本上,我正在做这样的事情:
int open(int fd, int flags, ...) //(1)
{
// add some functionalities here
return open(...); // (2), return the original open system call
}
显然,这行不通,因为它会调用一个无限循环...所以我想知道我是否可以强制 linker link 某个指定动态库的某些函数这样就不会造成无限循环。在上面的示例中,将 (2) 处的 "open()" 系统调用 link 编辑到标准库将是完美的。
至于现在,因为我将 LD_PRELOAD 设置为:
export LD_PRELOAD=/path/to/my_open.so
只要加载了一个内部有 open()
函数的程序,动态 linker 就会 link 那 open()
到我的 my_open.so。这对我的 open()
来说也是一样的:当 linker 试图 link open()
在 (2) 时,它也会尝试 link到我的 open()
(1),导致无限循环。
有什么想法吗?
您可以使用 dlsym (RTLD_NEXT, "open")
检索 open
的原始实现。没有其他可靠的方法可以从 LD_PRELOAD
库中获得 open
的原始定义。
查看 fakeroot
和 cwrap
等项目以了解它们如何处理此问题可能会有所启发。
关于链接动态符号的详细算法可以在man ld.so
中找到。
ELF 格式允许插入一个符号open@@VERSION
。这对于同时保留不同版本的 libc 很有用。可能您想在 LD_LIBRARY_PATH
.
See here for details.