如何在Linux上的/ proc / self / maps中检测可执行文件或共享对象

时间:2014-07-09 22:57:59

标签: linux executable shared-libraries procfs

我想列出加载到app地址空间的所有库(.so)。我使用procfs并从/ proc / self / maps读取信息。我现有的检测文件的方法是可执行的还是.so?或者我需要将每个找到的模块名称与/ proc / self / exe的值进行比较?

UPD 还有一些问题。

当我解析/ proc / self / maps procfs文件时,我想找到每个找到的加载.so模块的基本地址,但我可以找到没有dl *函数调用的方法。

我尝试使用dladdr:

    Dl_info info;
    int dladdrRes = dladdr((void*)(mmIt->startAddr), &info);
    if (!dladdrRes) continue;

    std::string modName = info.dli_fname;
    void *modBase       = info.dli_fbase;

但是modBase不是'dlopen'函数返回的addr。 只有调用'dlopen'函数的方式才有效:

dlopen( filename.c_str(), RTLD_NOW|RTLD_NOLOAD|RTLD_LOCAL );

我的想法是:当我解析/ proc / self / maps时,我知道所有已加载模块的名称,而我不需要调用内核来查找加载模块的基础。我发现,这是我的错。

1 个答案:

答案 0 :(得分:1)

/proc/self/maps的输出是

address           perms offset  dev   inode       pathname

可执行文件设置了x权限位。默认情况下,有一些可执行的映射但磁盘上没有文件(例如vdso)。因此,您所要做的就是提取那些maps权限位设置为并且在磁盘上具有匹配文件的x条目。

请注意,可执行映射不一定是特定文件格式。例如, wine 使用exectuable权限位映射Windows可执行文件(它们是PE文件;任何可能甚至没有在文件系统上设置可执行位),以便可以执行它们中的代码。因此,通常最好只查看/proc/self/maps,而不是尝试从存储文件中推断出任何内容。