C - 什么库(.so文件)是c函数open(),我怎么能找到任意函数?

时间:2014-12-02 03:29:26

标签: c file dlsym

如何找到函数open()所在的库?比如,实际的名称" xxxxxx.so"包含该功能的文件?另外,我是否可以获得其他功能的信息?

1 个答案:

答案 0 :(得分:0)

  

我不知道如何找到给定函数所在的库,其中   dlopen需要

dlopen()

不需要知道库
  

如果 file 是空指针, dlopen ()将返回一个   当前运行的过程映像的全局符号表句柄。   此符号表句柄应提供对来自的符号的访问   由原始组成的有序可执行对象文件集   程序映像文件,程序加载的任何可执行目标文件   由该进程文件指定的启动(例如,共享   库),以及使用加载的可执行对象文件集   使用RTLD_GLOBAL标志 dlopen ()操作。 ...

但如果你真的想知道:

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

int main()
{
    // We don't need to know the library for dlopen():
    void *handle = dlopen(NULL, RTLD_NOW);
    if (!handle) puts(dlerror()), exit(1);
    void *p = dlsym(handle, "open");
    char *s = dlerror();
    if (s) puts(s), exit(1);
    printf("open = %p\n", p);

    // But we can find the library with a Glibc extension:
    Dl_info info;
    if (dladdr(p, &info))
        printf("%s contains %s\n", info.dli_fname, info.dli_sname);
}