1

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

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

4

1 回答 1

4
#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 系统上都能工作。

于 2014-11-19T20:57:17.093 回答