Sie*_*geX 6 c linker gcc function-interposition
通过我的书" 专家C编程",我看到了关于功能插入的章节,以及如果无意中发生了如何导致一些严重的难以发现的错误.
书中给出的例子如下:
mktemp() { ... }
main() {
mktemp();
getwd();
}
Run Code Online (Sandbox Code Playgroud)
mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
Run Code Online (Sandbox Code Playgroud)
根据这本书,发生的事情main()是mktemp()(标准C库函数)被my_source.c中的实现插入.虽然main()调用我的实现mktemp()是预期的行为,但是getwd()(另一个C库函数)也调用我的实现mktemp()不是.
显然,这个例子是SunOS 4.0.3版本中存在的真实生活中的错误lpr.该书接着解释修复是将关键字添加static到定义mktemp()在my_source.c ; 虽然改名完全应该也解决了这个问题.
本章给我留下了一些未解决的问题,希望你们能回答:
static放在我们不希望暴露的所有功能之前的做法?谢谢您的帮助.
我应该注意到,我的问题不仅仅是针对插入标准C库函数,还包括其他库中的函数,可能是第三方,也许是内部创建的.本质上,我想捕捉任何插入的实例,无论插入的函数在哪里.
听起来您想要的是让工具检测函数中是否存在名称冲突 - 即,您不希望外部可访问的函数名称意外地具有相同的名称,因此“覆盖”或隐藏具有相同名称的函数图书馆中的名字。
最近有一个与此问题相关的问题:Linking Libraries with Duplicate Class Names using GCC
在您链接的所有库上使用该--whole-archive选项可能会有所帮助(但正如我在答案中提到的那样,我真的不知道它的效果如何,也不知道说服构建将该选项应用于所有库有多容易)