Заставить модуль .so использовать функцию libc в случае дублирования функций - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть файл .so, который загружается в адресное пространство двоичной программы с использованием механизма LD_PRELOAD.

Программа binray (не моя) имеет собственную реализацию функции malloc.

Поскольку мой модуль загружается в эту программу, он использует программу malloc вместо libc malloc, что приводит к сбою.

Я сам собрал двоичную программу (она с открытым исходным кодом) и увидел, что изменение функции malloc на функцию mymalloc решает проблему.

Поскольку в производственной среде я не могу изменить двоичную программу, я хочу найти другое решение.

Можно ли заставить модуль .so использовать libc версию malloc (или любой другой функции) в тех случаях, когда такая же функция существует в загрузочной программе?

Любая помощь будет очень ценится.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Вы можете получить указатель на malloc() явно с помощью dlsym().

#define __USE_GNU 1 /* needed for RTLD_NEXT */
#include <dlfcn.h>

void* (*mymalloc)(size_t a);

mymalloc = (void* (*)(size_t)) dlsym (RTLD_NEXT, "malloc");

Естественно, вы должны сделать то же самое для free(), realloc() и всего, что вы используете.

0 голосов
/ 22 сентября 2011

Вы можете попробовать использовать управление версиями символов ELF. Посмотрите на ваше определение libc malloc:

$ objdump -T libc.so | grep malloc
0006fef0 g    DF .text  000001e7  GLIBC_2.0   malloc

Так что, если вы связываете свой .so файл, используя скрипт связывания, такой как:

GLIBC_2.0 { malloc; };

Вы можете получить то, что вы хотите. Предполагая, конечно, что исполняемая версия malloc не имеет версии с тем же именем (маловероятно).

ИСПРАВЛЕНИЕ : к сожалению, это не работает! Версия используется при определении символа. Когда вы используете его, он получает версию из экспортированной таблицы. Но тот, что в исполняемом файле, имеет приоритет ....

ПРИМЕЧАНИЕ : Но учтите, что такое поведение предусмотрено стандартом ELF. Это делается для того, чтобы все модули в одном и том же процессе использовали одну и ту же функцию malloc, и поэтому они могут совместно использовать память, то есть один модуль malloc, другой модуль free. Если ваш so терпит крах с программой malloc, то один из двух: ваш so сломан; или программа не работает. Если это второй, то любой другой модуль, который будет связан, также потерпит крах. Поэтому, возможно, вам стоит проверить свой код ...

...