2015-05-10 3 views
7

Возможно ли динамическое изменение таблицы символов во время выполнения в C (в формате elf в Linux)?Динамическое изменение таблицы символов во время выполнения (в C)

Моя конечная цель заключается в следующем:

Внутри определенной функции говорят foo, я хочу, чтобы переопределить функцию malloc на мой пользовательский обработчик my_malloc. Но за пределами foo, любой malloc должен по-прежнему звонить в malloc, как в glibc.

Примечание: это отличается от LD_PRELOAD, который будет отменять malloc в течение всего выполнения программы.

ответ

6

Возможно ли динамическое изменение таблицы символов во время выполнения в C (в формате elf в Linux)?

Теоретически это возможно, но на практике это слишком сложно сделать.

Внутри определенной функции говорят foo, я хочу, чтобы переопределить функцию malloc на мой пользовательский обработчик my_malloc. Но за пределами foo, любой malloc должен по-прежнему звонить в malloc как в glibc.

Изменение таблицы символов (даже если это было возможно) будет не получить вас к желаемой цели.

Всех звонки из везде внутри вашего ELF двоичного (давайте предположим foo в основном исполняемом файле), преобразовываться в же PLT слота импорта [email protected]. Этот слот разрешен для glibc malloc при первом вызове (из любой точки вашей программы, если вы не используете LD_BIND_NOW=1 или аналогичный). После того, как этот слот был разрешен, любая дальнейшая модификация таблицы символов будет иметь без эффекта.

Вы не сказали, сколько контроля над foo у вас есть.

Если вы можете перекомпилировать его, то задача становится тривиальной:

#define malloc my_malloc 
int foo() { 
    // same code as before 
} 
#undef malloc 

Если вы передали прекомпилированный foo.o, вы связываете его с my_malloc.o, и вы хотите, чтобы перенаправлять все звонки внутри foo.o от malloc до my_malloc, на самом деле это довольно просто сделать на уровне объекта (т.е. до конечной ссылки).

Все, что вам нужно сделать, это пройти регистрационные записи foo.o, а также изменить те, которые говорят: «Введите адрес внешнего malloc здесь, чтобы« поместить адрес внешнего my_malloc здесь ».

Если foo.o содержит дополнительные функции, кроме foo, довольно просто ограничить перемещение переустановки только перемещением внутри foo.

+0

> измените те, которые говорят «поместите адрес внешнего malloc здесь», чтобы «поместить адрес внешнего my_malloc здесь». Любой инструмент, скажем gcc, который может это сделать? – Richard

Смежные вопросы