如何捕捉无意识的功能插入?

Sie*_*geX 6 c linker gcc function-interposition

通过我的书" 专家C编程",我看到了关于功能插入的章节,以及如果无意中发生了如何导致一些严重的难以发现的错误.

书中给出的例子如下:

my_source.c

mktemp() { ... }

main() {
  mktemp();
  getwd();
}
Run Code Online (Sandbox Code Playgroud)

的libc

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 ; 虽然改名完全应该也解决了这个问题.

本章给我留下了一些未解决的问题,希望你们能回答:

  1. GCC是否有办法警告功能干预?我们当然不会打算发生这种情况,如果有的话,我想知道它.
  2. 我们的软件组是否应该采用将关键字static放在我们不希望暴露的所有功能之前的做法?
  3. 可以用静态库引入的函数进行插入吗?

谢谢您的帮助.

编辑

我应该注意到,我的问题不仅仅是针对插入标准C库函数,还包括其他库中的函数,可能是第三方,也许是内部创建的.本质上,我想捕捉任何插入的实例,无论插入的函数在哪里.

Mic*_*urr 1

听起来您想要的是让工具检测函数中是否存在名称冲突 - 即,您不希望外部可访问的函数名称意外地具有相同的名称,因此“覆盖”或隐藏具有相同名称的函数图书馆中的名字。

最近有一个与此问题相关的问题:Linking Libraries with Duplicate Class Names using GCC

在您链接的所有库上使用该--whole-archive选项可能会有所帮助(但正如我在答案中提到的那样,我真的不知道它的效果如何,也不知道说服构建将该选项应用于所有库有多容易)