我想列出所有加载到应用程序地址空间的库(.so)。我使用procfs并从/ proc/self/maps中读取信息。我现有的方法来检测文件是可执行文件或.so?或者我需要将每个找到的模块名称与/ proc/self/exe的值进行比较?如何检测Linux上/ proc/self/maps中的可执行文件或共享对象
UPD还有一些问题。
当我解析/ proc/self /映射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的' 函数返回。 只有这样,它调用文件的dlopen'功能的工作原理:
dlopen(filename.c_str(), RTLD_NOW|RTLD_NOLOAD|RTLD_LOCAL);
我的想法是:当我解析的/ proc /自/地图,我知道所有加载的模块的名称,我不”需要调用内核来查找加载模块的基础。我发现,这是我的错。
+0
您的第二个想法似乎是最合理的捷径,避免了像打开所有这些文件和解析ELF标头这样的困难。 –
+0
我自己解析ELF似乎不是一个好主意,我只想使用公共记录的API –