У меня есть общая библиотека - plugin.so
, которая dlopen
-едана хост-программой с флагом RTLD_LOCAL
, у меня есть собственные функции работы с памятью, определенные в этой библиотеке:
void *plugin_malloc(size_t size) { /* ... */ }
void plugin_free(void *ptr) { /* ... */ }
Мне нужно заменить ВСЕ malloc/free
вызовы в plugin.so
на свои plugin_malloc/plugin_free
, я попытался использовать расширение атрибута псевдонима GCC:
void *malloc(size_t) __attribute__((alias("plugin_malloc"), used))
void free(void*) __attribute__((alias("plugin_free"), used))
Однако это работает только тогда, когда библиотека связана с основной программой, но не работает с dlopen
способом.
Я работаю в Linux с компилятором GCC-4.8.5, и у меня есть исходный код plugin.so
, и я могу изменить его, как мне нравится, но я не могу изменить хост-программу и заменить malloc/free
допустимо не только в plugin.so
, но и во всей программе.
Итак, есть ли решение? Спасибо.
EDIT: У меня также нет разрешения изменять аргументы запуска программы хоста, переменные среды , я могу просто предоставить plugin.so
парням, которые владеют программой хоста, и они запускают хост-программа и dlopen
my plugin.so
.