Linux: Как получить полное имя общего объекта, просто загруженного от конструктора?

Joe Albahari (Автор C# 3.0 вкратце и LINQPad) записал утилиту под названием PredicateBuilder, который может привыкнуть к И и ИЛИ функционирует вместе.

http://www.albahari.com/nutshell/predicatebuilder.aspx

, В то время как это работает над функциями, это - открытый исходный код, таким образом, можно проверить его и видеть, как это работает.

8
задан 29 October 2009 в 09:06
поделиться

2 ответа

Я думаю, что функция dladdr может делать то, что вы хотите. На странице руководства:

Функция dladdr () принимает указатель на функцию и пытается разрешить имя и файл, в котором он находится. Информация хранится в Структура Dl_info :

 typedef struct {
const char * dli_fname; / * Путь к общему объекту, который
 содержит адрес * /
void * dli_fbase; / * Адрес, по которому общий объект
 загружено * /
const char * dli_sname; / * Название ближайшего символа с адресом
 ниже чем адрес * /
void * dli_saddr; / * Точный адрес указанного символа
 в dli_sname * /
} Dl_info;

Если адрес сопоставления символов не найден, тогда dli_sname и dli_saddr имеют значение NULL .

dladdr () возвращает 0 в случае ошибки и ненулевое значение в случае успеха.

Таким образом, вы просто указываете ему указатель на функцию (например, адрес самого конструктора), и он даст вам имя файла и кучу другой информации. Вот пример кода:

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

__attribute__((constructor))
void on_load(void) {
    Dl_info dl_info;
    dladdr(on_load, &dl_info);
    fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}

РЕДАКТИРОВАТЬ: Похоже, эта функция существует и в OS X с той же семантикой.

4
ответ дан 5 December 2019 в 23:15
поделиться

Один в высшей степени уродливый и ужасный способ сделать это - просмотреть / proc / pid / maps и найти отображение, которое содержит адрес выполняемой функции on_load .

1
ответ дан 5 December 2019 в 23:15
поделиться