我想列出加载到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时,我知道所有已加载模块的名称,而我不需要调用内核来查找加载模块的基础。我发现,这是我的错。
答案 0 :(得分:1)
/proc/self/maps
的输出是
address perms offset dev inode pathname
可执行文件设置了x
权限位。默认情况下,有一些可执行的映射但磁盘上没有文件(例如vdso
)。因此,您所要做的就是提取那些maps
权限位设置为并且在磁盘上具有匹配文件的x
条目。
请注意,可执行映射不一定是特定文件格式。例如, wine 使用exectuable权限位映射Windows可执行文件(它们是PE文件;任何可能甚至没有在文件系统上设置可执行位),以便可以执行它们中的代码。因此,通常最好只查看/proc/self/maps
,而不是尝试从存储文件中推断出任何内容。