чтобы уточнить, мой вопрос относится к переносу/перехвату вызовов с одной функции/символа на другую функцию/символ , когда вызывающий и вызываемый определяются в одном модуле компиляции с помощью компилятора и компоновщика GCC.
У меня есть ситуация, напоминающая следующее:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Я хотел бы обернуть вызовы к этим функциям, и я могу сделать это (до точки) с помощью ld --wrap
option (и затем я реализую __wrap_foo и __wrap_bar, которые, в свою очередь, вызывают __real_foo и __real_bar, как и ожидалось в результате параметра ld --wrap
).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Проблема, с которой я столкнулась, заключается в том, что это вступает в силу только для ссылок на foo и bar из вне этого блока компиляции (и разрешено во время соединения). То есть, вызовы foo и bar из других функций внутри foo.c не обернуты.
Я попытался использовать objcopy --redefine-sym, но это только переименовывает символы и их ссылки.
Я хотел бы заменить вызовы на foo
и bar
(внутри foo.o) на __wrap_foo
и __wrap_bar
(так же, как они разрешаются в других объектных файлах с помощью компоновщика --wrap
). ПЕРЕД Я передаю файлы *.o в компоновщик --wrap
и не изменяя исходный код foo.c.
Таким образом, обертывание/перехват происходит для всех вызовов foo
и bar
, а не только тех, которые происходят вне foo.o.
Возможно ли это?