Linux gcc 换行选项:链接库中的问题

问题描述 投票:0回答:1

早上好, 我有以下情况:

  • 我有一个库中间件.so,它为外部库 buyLib.so 提供包装器
  • middleware.so的makefile链接动态库buyLib.so且不可修改
  • 我需要编写一个测试用例来确保 middleware.so 使用 buyLib.so 中的函数(以确保没有人用低性能的自定义实现替换 buyLib.so 的优化实现)。

我按照以下方式处理这个问题:

  • 在我的 GTEST 中,我定义了 buyLib.so 库函数的包装实现 (即

    void __wrap_firstBoughtLib()
    {
      //Some action to be trapped by gtest testcase
    }
    

)并且我使用

修改了基于 gtest 的测试套件的 make 文件

-Wl,--wrap=firstBoughtLib()

现在,当我直接从测试用例调用firstBoughtLib()时,调用的函数是__wrap_firstBoughtLib(),而不是buyLib.so中的原始函数。然而,在 middleware.so 中执行的对firstBoughtLib()的每次调用仍然使用buyLib.so中的函数。 我尝试从 LD_LOAD_LIBRARY 中删除包含 buyLib.so 的文件夹,以便 middleware.so 找不到它,但随后在启动时软件抱怨缺少库。

如果您对如何解决该问题有任何建议,我将不胜感激。

c++ gcc wrapper ld ldd
1个回答
0
投票

我终于发现可以避免这样的问题。 我没有修改 middleware.so makefile,而是修改了 tje 单元测试的 makefile 添加了该选项:

-Wl,-defsym,firstBoughtLib=__wrap_firstBoughtLib

通过这种方式,即使在 middleware.so 中执行的对符号firstBoughtLib 的任何调用都将被我的自定义 __wrap_firstBoughtLib 替换。 希望这可以帮助遇到类似问题的人

© www.soinside.com 2019 - 2024. All rights reserved.