Функция обтекания без dlsym
Я видел похожие вопросы / ответы, которые дают мне подсказки, но они не касаются того, что я точно хочу знать. То есть, как написать общую библиотеку, которая:
- оборачивает системную функцию (скажем, malloc),
- внутренне использует реальную версию упакованных функций (например, malloc, определенную в libc), AND
- можно связать из кода клиента без указания --wrap=malloc при каждом его использовании?
Позвольте мне уточнить:
Из нескольких сообщений я узнал, что вы можете обернуть системные функции параметром --wrap ld; Вы можете написать что-то вроде этого:
void * __wrap_malloc(size_t sz) {
return __real_malloc(sz);
}
и получить общую библиотеку с:
gcc -O0 -g -Wl,--wrap=malloc -shared -fPIC m.c -o libwrapmalloc.so
Но когда клиентский код связывает эту библиотеку, он должен каждый раз передавать --wrap=malloc. Я хочу скрыть это от клиентского кода, так как библиотека, над которой я работаю, фактически оборачивает тонны системных функций.
Подход, который я использовал, состоял в том, чтобы определить malloc и найти настоящий malloc в libc, используя dlopen и dlsym. Это было почти то, что мне было нужно, но так же, как кто-то писал до вставки функций в Linux без dlsym, dlsym и dlopen, вызывал функции mem-alloc (как я видел это), поэтому мы не можем легко переопределить функции calloc/malloc с помощью этого подхода. Позже я узнал --wrap и подумал, что это аккуратно, но я просто не хочу просить клиентов давать тонны аргументов --wrap=xxxx каждый раз, когда они получают исполняемые файлы...
Я хочу иметь ситуацию, в которой malloc в коде клиента вызывает malloc, определенный в моей общей библиотеке, тогда как malloc в моей общей библиотеке вызывает malloc в libc, что звучит так, будто я спрашиваю что-то невозможное, но... я?
Если это невозможно, приветствуется любое предложение снизить нагрузку на клиентов для правильного предоставления множества аргументов --wrap=....