“fff”假函数框架如何在引入强符号的同时避免违反 ODR 规则?

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

我正在尝试了解

fff
框架和 C++ 的单一定义规则。

我使用

fff
来模拟自由函数并测试它们,我将使用以下示例来解释问题。

要嘲笑的库是

libarchive
,我嘲笑
archive_write_free

我有以下一组文件:

  1. LibArchiveFake.h
    -> 它包含声明
    DECLARE_FAKE_VALUE_FUNC
  2. LibArchiveFake.cpp
    -> 它包含定义
    DEFINE_FAKE_VALUE_FUNC
    并编译为目标文件。
  3. TarballArchiverTest.cpp
    -> 其中包括头文件并包含实际测试,并且还编译为目标文件。
  4. tar_test
    这只是二进制文件。

二进制文件使用前面提到的目标文件进行编译,并链接到

libarchive.so
,如下所示。

g++  -Wall -Wextra -Werror -Wpedantic -g -ggdb -O0 -DNC_DEBUG CMakeFiles/utilitiesTests.dir/mainTest.cpp.o CMakeFiles/utilitiesTests.dir/FStreamFilesystemOpsTest.cpp.o CMakeFiles/utilitiesTests.dir/CopierTest.cpp.o CMakeFiles/utilitiesTests.dir/FakeLibArchive.cpp.o CMakeFiles/utilitiesTests.dir/TarballArchiverTest.cpp.o -o utilitiesTests -lgmock /usr/lib64/libgtest.so /usr/local/lib/libboost_filesystem.so.1.74.0 /usr/local/lib/libboost_iostreams.so.1.74.0 /usr/lib64/libarchive.so /usr/lib64/libgtest.so -lpthread 

我通过readelf检查了生成的

LibArchiveFake.cpp
目标文件及其
.ii
文件。它包含
archive_write_free
的强大定义,
/usr/lib64/libarchive.so
也是如此。

LibArchiveFake.o
55: 000000000000275f   752 FUNC    GLOBAL DEFAULT    1 archive_write_free

/usr/lib64/libarchive.so.o
572: 0000000000063740     9 FUNC    GLOBAL DEFAULT   12 archive_write_free

我知道 ODR 有一些例外,但我不明白

fff
如何不违反 ODR。

我将不胜感激任何线索。

c++ gcc linker
1个回答
0
投票

它违反了 ODR,并且 C++ 标准未指定使用此实用程序的程序的行为。

在这种情况下,链接器如何处理从 so 文件加载符号的细节恰好使结果不会完全是灾难性的。

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