c - 使用 dlopen 访问 POSIX 函数

标签 c shared-libraries posix dlopen dlsym

POSIX 2008 引入了几个文件系统函数,它们在确定文件路径时依赖于目录描述符(我说的是 -at 函数,例如 openatrenameatsymlinkat 等)。我怀疑是否所有 POSIX 平台都支持它(好吧,至少最新版本似乎支持)并且我正在寻找一种方法来确定平台是否支持此类功能。当然,可以使用 autoconf 和 friend 进行编译时确定,但我正在寻找一种可能性来确定实现是否支持 -at 函数动态.

我首先想到的是 dlopen()/dlsym()/dlclose() 组合;至少我已经从 /usr/libc.so.6 共享库中成功加载了必要的符号。但是,libc 在不同平台上的名称可能不同(或者?)。是否有用于查找 libc 的标准位置列表?至少在 Linux 上 /lib/libc.so 似乎不是指向共享库的符号链接(symbolic link),而是一个 ld 脚本。如果支持 POSIX 函数,是否存在其他方法可以在运行时检查?提前致谢!

最佳答案

#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <stdio.h>

int main ()
{
    void * funcaddr = dlsym(RTLD_DEFAULT, "symlinkat");
    /* -----------------------^ magic! */
    printf ("funcaddr = %p\n", funcaddr);
}

输出:

funcaddr = 0x7fb62e44c2c0

神奇的解释:你的程序已经链接了libc,不需要再加载了。

请注意,这实际上是 GNU libc 功能,正如 _GNU_SOURCE 所暗示的那样。 POSIX 保留 RTLD_DEFAULT “供将来使用”,然后继续像 GNU libc 一样定义它。所以严格来说,它不能保证在所有 POSIX 系统上工作。

关于c - 使用 dlopen 访问 POSIX 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026664/

相关文章:

C-POSIX : Shared Memory

c - c中的自引用指针

c - 如何为 Arm Linux 构建静态版本的 pcap 库

c - 如何将 SHA1 返回值转换为 ascii

在C中创建不同名称的文件

java - 如何在 Linux 中进行延迟/延迟加载?

java - 为 Raspberry Pi 编译 JD2XX

c++ - 加载共享库时出错 : libsfml-graphics. so.2.2.0

c - 使用 C 的套接字和线程

c - 从管道读取时进程暂停 - linux