GNU gcc / ld - упаковка вызова символа с вызывающим и вызываемым абонентами, определенными в одном объектном файле
чтобы уточнить, мой вопрос относится к переносу / перехвату вызовов от одной функции / символа к другой функции / символукогда вызывающий и вызываемый определены в одном модуле компиляции с компилятором GCC и компоновщиком.
У меня есть ситуация, напоминающая следующее:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Я хотел бы обернуть вызовы этих функций, и я могу сделать это (в точку) сл.д.-х--wrap
вариант (а затем я реализую __wrap_foo и __wrap_bar, которые в свою очередь вызывают __real_foo и __real_bar, как и ожидалось в результате ld's--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.
Это возможно?