R..*_*R.. 6 c linker gcc binutils
是否有一种方法可以使用gcc和GNU binutils来标记某些函数,以便它们在链接时生成错误(如果使用的话)?我的情况是我有一些库函数,我不是为了与现有的二进制文件兼容而删除,但我想确保没有新编译的二进制文件尝试使用这些函数.我不能只使用编译时gcc属性,因为违规代码忽略了我的标题,并用configure脚本检测函数的存在并自己进行原型设计.我的目标是为坏configure脚本生成链接时错误,以便它们停止检测函数的存在.
编辑:一个想法..将使用程序集指定.type入口点的错误与动态链接器兼容但在尝试链接新程序时生成链接错误?
为您不希望人们使用的已弃用函数生成链接时错误的最佳方法是确保已弃用函数不存在于库中 - 这使它们比“已弃用”更进一步。
也许你可以提供一个辅助库,其中包含已弃用的函数;不注意的人可以链接辅助库,但是主流人不会使用辅助库,因此不会使用这些功能。然而,它仍然超出了“弃用”阶段。
获得链接时警告是很棘手的。显然,GCC 对某些函数(mktemp()等)执行此操作,并且如果您运行使用gets(). 我不知道他们做了什么来实现这一点。
根据评论,我认为您需要在编译时解决问题,而不是等到链接时或运行时。
GCC 属性包括(来自 GCC 4.4.1 手册):
Run Code Online (Sandbox Code Playgroud)error ("message")如果在函数声明上使用此属性,并且没有通过死代码消除或其他优化来消除对此类函数的调用,则会诊断出包含消息的错误。这对于编译时检查很有用,特别是与 __builtin_constant_p 和内联函数一起使用,其中无法通过 extern char [(condition) ? 1:-1];技巧。虽然可以使函数未定义并因此调用链接失败,但使用此属性时,即使存在内联函数或不发出调试信息,也可以更早地诊断问题并提供调用的准确位置。
Run Code Online (Sandbox Code Playgroud)warning ("message")如果在函数声明上使用此属性,并且没有通过死代码消除或其他优化来消除对此类函数的调用,则会诊断出包含消息的警告。这对于编译时检查非常有用,特别是与 __builtin_constant_p 和内联函数一起使用。虽然可以在 .gnu.warning* 部分中使用消息定义函数,但使用此属性时,即使存在内联函数或不发出调试信息,也会更早地诊断问题并提供调用的确切位置。
如果配置程序忽略这些错误,它们就被破坏了。这意味着无法使用这些函数编译新代码,但现有代码可以继续使用库中已弃用的函数(直到需要重新编译为止)。