如果代码引用库中的某个符号,是否有办法使链接失败?
我似乎很清楚地记得链接器脚本语言中有这样的指令,但显然它不是GNU LD(也许它是一个错误的内存)。
我需要它来防止第三方库的某些部分意外链接到应用程序。如果它确实链接,它会添加一些静态初始化器,这些初始化器会在运行时造成严重破坏(这是一个嵌入式项目,因此环境有点古怪)。我无法更改有问题的第三方库。我想在构建时检测错误。我想我可以编写一个后构建脚本来解析映射文件并在发现有问题的部分时发出错误,但上面提到的[false?]内存会提示我确定单独使用链接器无法完成。
我正在使用GNU GCC工具链。
答案 0 :(得分:0)
好的,走出午餐帮我找到了这个(非常明显的)解决方案:
/* stubs.c */
void ERROR_DO_NOT_REFERENCE_THIS_SYMBOL( void );
void Offending3rdPartyFunction( void )
{
ERROR_DO_NOT_REFERENCE_THIS_SYMBOL();
}
此处,永远不会定义符号ERROR_DO_NOT_REFERENCE_THIS_SYMBOL
。另一个源文件被添加到项目中,其中存根(如上所示)用于不能引用的每个函数。如果代码确实引用了这些函数之一,则存根将优先于库提供的符号,并且链接将失败:
test.cpp:(.text._TestFunc+0x4): undefined reference to `ERROR_DO_NOT_REFERENCE_THIS_SYMBOL()'
collect2.exe: error: ld returned 1 exit status