c - 编译/链接时强制指定函数链接到指定库

标签 c compilation linker binutils

我想知道是否可以强制链接器在编译/链接时使用一些指定的函数来链接。

我正在使用 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 库。

See here for details .

关于c - 编译/链接时强制指定函数链接到指定库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230493/

相关文章:

c - 对大型数组进行排序(快速排序)- 段错误

c - 当我用 C 编译时,头文件中出现导入错误

c - Lua liblua5.1.so 无法打开共享对象文件

c++ - 在 Linux 上使用 `__cxa_thread_atexit@@CXXABI` 编译时未定义对 `libc++` 的引用

c++ - 从汇编代码调用c库函数时运行错误

c - 将常量指针作为参数传递给另一个函数的问题

c - 反向打印整数数组

c - 为什么这个 C 代码段被标记为错误?

c - 编译 C 程序有多容易?

c++ - 为什么我在这段代码中得到一个 undefined reference ?