POSIX 2008 引入了几个文件系统函数,它们在确定文件路径时依赖于目录描述符(我说的是 -at
函数,例如 openat
、renameat
、symlinkat
等)。我怀疑是否所有 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/