【问题标题】:Overwrite symbol in C/C++ [duplicate]在 C/C++ 中覆盖符号 [重复]
【发布时间】:2013-07-12 14:30:31
【问题描述】:

是否可以在 C/C++(或任何编译器)中专门覆盖符号?例如,有一个库a.lib,除了其他功能外,它还包含foo() 的实现。现在,在我的程序中,我想将foo() 的实现替换为另一个函数,这样对foo() 的任何调用都会直接转到我的实现,而不是a.lib 中的实现。

宏不是一个选项。

不修改a.lib的来源可以吗?

【问题讨论】:

  • 在 Linux 上,我们有 LD_PRELOAD。在 OS X 上,试试DYLD_INSERT_LIBRARIES。在 Windows 上:???

标签: c++ c compiler-construction static-libraries


【解决方案1】:

是的,可能。

当您进行静态链接时,链接器仅在需要时才从库中加载符号。如果程序或早期库提供了该符号,则它不会出现在“需要”列表中。

如果库将该符号定义在与其他所需符号相同的“对象”中,则会出现问题。一个设计良好的库每个符号都有一个对象(基本上,每个函数都在它自己的源文件中定义,单独编译,并单独添加到库中)。一个设计不佳的库可能具有同时定义多个函数的对象(源文件),然后您必须将它们全部拉入才能获得一个。希望你没有这个问题。

对于 Linux 系统(和其他 Unix)上的动态库,事情还不是很清楚。您可以定义该函数,它可能会被您自己的调用者使用,但库中的调用者可能仍使用库副本。这有点令人困惑。在 Windows 上,.lib 文件的工作方式可能类似于 Linux 的 .a 文件,但 .dll 文件是完全不同的野兽,具有不同的混淆方式。

【讨论】:

  • Windows (Visual C++) 明确支持函数级链接。这意味着不需要将每个函数放在自己的源文件中。
  • GCC 也是如此:-ffunction-sections 选项可以做到这一点。但是,几乎没有人使用该选项,并且无论如何都有缺点。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 2013-08-15
  • 2018-05-23
  • 2012-02-21
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多