C语言 使用 dlopen 访问 POSIX 函数



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

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

#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <stdio.h>
int main ()
{
    void * funcaddr = dlsym(RTLD_DEFAULT, "symlinkat");
    /* -----------------------^ magic! */
    printf ("funcaddr = %pn", funcaddr);
}

输出:

funcaddr = 0x7fb62e44c2c0

神奇的解释:您的程序已经与libc链接,无需再次加载。

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

最新更新