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.

Это возможно?

Ответы на вопрос(5)

Ваш ответ на вопрос