我试图重新绑定隐藏变量符号和C ++虚拟表对象的地址,并将其导出到动态库中。任何帮助将不胜感激。
背景 我正在将一个大型C&C ++项目从静态编译过渡到动态链接。该产品对性能敏感,因此我正在尝试最大程度地减少动态链接的影响。
我已将C / C ++编译中的默认可见性更改为隐藏(-fvisibility=hidden
)。我也在使用-mcmodel=large
。这些都大大提高了性能。由于这是一个庞大的项目,因此影响项目范围内的界面更改并不十分可行。
我的问题是单元测试。单元测试是针对同一代码链接的,我宁愿动态地链接它们,因为这被认为是过渡的主要好处之一。但是,单元测试针对库中隐藏的符号链接。
功能
我使用objcopy
重命名库中的函数。我创建具有默认可见性的程序集存根,它们直接跳转到隐藏的符号。我有两个库:一个用于测试,一个用于生产,但是它们都是从相同的目标文件中产生的,测试库还有其他存根文件。
变量 我不能使用存根,因为如果我理解正确的话,它们是GOT表中的地址间接寻址,因此不会执行任何代码。变量问题的危害性较小,因为对全局变量的引用很少,因此可以通过外科手术使它们可见。
虚拟表类 类虚拟表是弱对象。同样,如果我理解正确,我将无法使用存根方法,因为它们是不可调用的。我需要某种方法来重新绑定它们并使它们可见,否则我需要回滚几乎所有的性能改进,或重新编译所有代码以进行测试。
有什么建议吗?