使用dlopen访问POSIX函数

时间:2014-11-19 20:48:16

标签: c shared-libraries posix dlopen dlsym

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

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

1 个答案:

答案 0 :(得分: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&#34;供将来使用&#34;,然后继续完全像GNU libc那样定义它。严格来说,不能保证在所有POSIX系统上都能正常工作。