将公共.o文件中的C函数替换为单个测试可执行文件的作用域

将公共.o文件中的C函数替换为单个测试可执行文件的作用域,c,unit-testing,linker,C,Unit Testing,Linker,因此,我有一个库调用init\u foo(),还有一个调用它的函数bar()。它们与其他一些双方都需要的有用的东西一起生活在library.o中 我想写一些代码,bar\u init\u failure.t.c,来测试init\u foo()失败时会发生什么,而不实际设置失败。在我们代码库的主体Perl中,我将启动库调用,并用返回失败代码的存根替换库调用。为了在C中实现类似的功能,我模糊地感觉到我可以在源代码中为bar\u init\u failure.t.C重新定义init\u foo,并仍然

因此,我有一个库调用
init\u foo()
,还有一个调用它的函数
bar()。它们与其他一些双方都需要的有用的东西一起生活在library.o中

我想写一些代码,
bar\u init\u failure.t.c
,来测试
init\u foo()
失败时会发生什么,而不实际设置失败。在我们代码库的主体Perl中,我将启动库调用,并用返回失败代码的存根替换库调用。为了在C中实现类似的功能,我模糊地感觉到我可以在源代码中为
bar\u init\u failure.t.C
重新定义
init\u foo
,并仍然链接
library.o
,但
gcc
ld
抱怨重复的符号(而不是选择第一个)所以我想我一定是搞错了什么(而且我对这类东西很生疏,所以我对自己的策略不太自信)


这里有什么方法可以安抚链接器,或者我应该使用另一种策略吗?(如果我能帮助的话,我宁愿不去破解
library.c
代码。)

如果可以将library.c重新编译到共享库中,那么可以重新定义
init\u foo()
在单元测试中。ld不会抱怨重复符号,无论是在编译时还是在执行时,`,并且会在动态库包含的任何可执行文件中调用该函数—至少在类Unix系统上—我从未在Windows上尝试过


这可能会阻止您测试
bar()
在单元测试中。ld不会抱怨重复符号,无论是在编译时还是在执行时,`,并且会在动态库包含的任何可执行文件中调用该函数—至少在类Unix系统上—我从未在Windows上尝试过


这可能会阻止您测试
bar()
,因为您将无法在其他测试中调用真实的
init\u foo()
;除非您使用从自己的
init\u foo()调用它
,例如,当设置全局变量时。

什么链接器?您可能有一个可以使用的符号别名或插入功能。GNU工具链当然有。标准
ld
gcc
工具链。什么链接器?您可能有一个可以使用的符号别名或插入功能。GNU工具链当然有。站立ard
ld
gcc
工具链。