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