2015-03-23 2 views
-6

Может ли кто-нибудь помочь мне преодолеть проблему, указанную ниже?Как преодолеть ограничение функций макета

Определение обертки для функций, которые находятся в одном файле (например, Foo и бар, и в том же файл - foo.c):

С 2 функции Foo() и бар() в том же самом файл, ассемблера разрешает вызов до линкера имеет возможность обернуть его __ wrap_bar()

Как упоминается в человеке странице --wrap = символ (Вы можете предоставить функцию «__real_malloc» так что ссылки без опции -wrap будут успешными. Если вы сделаете это, вы не должны указывать определение «__real_malloc» в том же файле, что и «__wrap_malloc», и если вы это сделаете, ассемблер может разрешить вызов be перед этим линкер имеет возможность обернуть его в «malloc».)

Функция foobar() определена в файле bar.c и вызывает обернутые функции __wrap_foo() и __wrap_bar() (завернутые, как ожидалось, линкер).

Функция __wrap_foo() вызывает функцию Foo() и функция __wrap_bar() вызывает функцию бар()

функции Foo() и бар() определены в файле foo.c. Функция foo() вызывает функциональную панель().

Вызов из них дает выход, как показано ниже:


Foobar вызова к Foo() ===> наматывается Foo ===> Foo вызова в бар ===> бар

и

foorbar вызова в бар() ===> завернуть-бар ===> бар


в то время как ожидаемый объем производства, как показано ниже:


Foobar вызова к Foo() ===> наматывается Foo ===> Foo вызова в бар ===> наматывается бар ===> Бар

и

foorbar вызов bar() ===> wrap-bar ===> bar


Пожалуйста, помогите мне решить эту проблему.

Благодаря

+0

Ну, ваш учитель уверен, что это было сложно! – moffeltje

ответ

0

Цитата: «если вы это сделаете, ассемблер может разрешить вызов до линкер имеет возможность обернуть его„таНос“

Я думаю, что слово„может“это важно. не говорит «будет», но «может». Я читал это как «вы не можете точно знать, случится ли что-то одно или другое». Это зависит от используемых вами инструментов (компилятора и т. Д.).

Если вы предоставите код и информацию о цепочке инструментов, у вас будет больше шансов получить конкретные ответы.

+0

Первый файл - foobar.с с ниже содержит: # include # include "foobar.h" недействительной Foobar() { Е ("Foobar вызова к Foo() \ п"); foo(); printf ("foorbar вызов bar() \ n"); бар(); } int main() { 0 foobar(); } Второй файл foo.c с ниже содержит: #include #include "foobar.h" недействительными Foo() { Е ("Foo вызова в бар \ п"); бар(); } void bar() { printf ("bar \ n"); } Третий файл Makefile с содержит: #/бен/ш НКУ foobar.c foo.c wrap.c -Wl, -wrap, Foo, -wrap, бар –

+0

Четвертый файл wrap.c и содержит: # include # include "foobar.h" недействительного __wrap_foo() { Е ("наматывается Foo \ п"); __real_foo(); } void __wrap_bar() { printf ("wrap-bar \ n"); __real_bar(); } Выполнение этих кодов вместе дает неправильный вывод, как указано выше. , но если мы определим функции foo() и bar() в разных файлах, то вывод будет таким, как ожидалось. –