Как обнаружить исполняемый или общий объект в /proc/self/maps в Linux
Я хочу перечислить все библиотеки (.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'. Работает только способ, который вызывает функцию dlopen:
dlopen( filename.c_str(), RTLD_NOW|RTLD_NOLOAD|RTLD_LOCAL );
Моя идея такова: когда я анализирую / proc / self / maps, я знаю имена всех загруженных модулей, и мне не нужно вызывать ядро, чтобы найти базу загруженного модуля. Как я нахожу, это моя ошибка.
1 ответ
Выход из /proc/self/maps
является
address perms offset dev inode pathname
Исполняемые файлы имеют x
бит разрешения установлен. По умолчанию есть несколько карт, которые являются исполняемыми, но не имеют файла на диске (например, например, vdso
). Так что все, что вам нужно сделать, это извлечь эти записи maps
которые имеют x
бит разрешения установлен и есть соответствующий файл на диске.
Обратите внимание, что на самом деле не обязательно, чтобы исполняемая карта была в определенном формате файла. Например, Wine отображает исполняемые файлы Windows (которые являются PE-файлами; у всех может даже не быть установленного исполняемого бита в файловой системе) с исполняемым битом разрешения, так что код в них может быть выполнен. Так что, как правило, стоит просто посмотреть на /proc/self/maps
и не пытайтесь выводить что-либо из файлов на хранилище.