Замена функции C из общего файла .o для области видимости одного исполняемого файла теста - PullRequest
1 голос
/ 27 сентября 2010

Итак, у меня есть библиотечный вызов init_foo() и функция bar(), которая его вызывает.Они живут в library.o вместе с некоторыми другими полезными вещами, которые нужны обоим.

Я хочу написать некоторый код, bar_init_failure.t.c, чтобы проверить, что происходит при сбое init_foo(), без фактической настройки сбоя.В Perl, основной части нашей кодовой базы, я бы запустил Test :: Resub и заменил бы вызов библиотеки заглушкой, которая возвращает код ошибки.Чтобы добиться чего-то похожего в C, у меня было смутное впечатление, что я могу переопределить init_foo в исходном коде для bar_init_failure.t.c и по-прежнему ссылаться на library.o для остальной части кода, но gcc и ld жалуютсянасчет дубликатов символов (вместо того, чтобы выбирать первый), поэтому я думаю, что я ошибаюсь в чем-то (и я довольно ржавый в таких вещах, поэтому я не слишком уверен в своей стратегии).

Есть ли какой-нибудь способ умиротворить компоновщик или есть другая стратегия, которую я должен использовать?(Я бы предпочел не взламывать код library.c, если я могу помочь.)

1 Ответ

1 голос
/ 27 сентября 2010

Если вы можете перекомпилировать library.c в общую библиотеку, то вы можете переопределить init_foo() в модульных тестах.Я не буду жаловаться на дубликаты символов ни во время компиляции, ни при выполнении`, и вызову функцию в исполняемом файле, независимо от того, что содержит динамическая библиотека - по крайней мере, в Unix-подобных системах - я никогда не пробовал в Windows.

Это может помешать вам протестировать bar(), так как вы не сможете вызвать реальный init_foo() в других тестах;если вы не используете dlsym () , чтобы вызвать его из вашего собственного init_foo(), например, когда установлена ​​глобальная переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...