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 的原始定义。

查看 fakerootcwrap 等项目以了解它们如何处理此问题可能会有所启发。

关于链接动态符号的详细算法可以在man ld.so中找到。

ELF 格式允许插入一个符号open@@VERSION。这对于同时保留不同版本的 libc 很有用。可能您想在 LD_LIBRARY_PATH.

中保留自己的 .so 库

See here for details.