Joe Albahari (Автор C# 3.0 вкратце и LINQPad) записал утилиту под названием PredicateBuilder, который может привыкнуть к И и ИЛИ функционирует вместе.
http://www.albahari.com/nutshell/predicatebuilder.aspx
, В то время как это работает над функциями, это - открытый исходный код, таким образом, можно проверить его и видеть, как это работает.
Я думаю, что функция 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 с той же семантикой.
Один в высшей степени уродливый и ужасный способ сделать это - просмотреть / proc / pid / maps и найти отображение, которое содержит адрес выполняемой функции on_load
.