debugging - 使用 GCC 检测 ABI 兼容性问题

标签 debugging gcc g++ glibc abi

我最近花了相当多的时间来追踪一个问题,该问题原来是由 -D_GLIBCXX_DEBUG 编译库引起的。 (它告诉 libstdc++ 使用带有额外检查的标准库的调试版本)但不编译客户端程序。这导致了 ABI 兼容性问题。

有什么方法可以用 GCC 自动检测这样的问题吗? Visual Studio 提供了 detect_mismatch pragma我认为这可以达到这个目的,但我不知道任何 GCC 等价物。 GCC 做了一些嵌入符号名称(例如 GLIBCXX_3.4.9 )的事情,我可以想象如果相应的符号(例如 mylib_debug_stl )不存在,由于 undefined symbol 会导致链接错误的方案,但我唯一的方法能想到去使用那个符号真的很hacky。

或者,其他人如何避免这个问题?将库的检查版本构建为不同的名称或类似的名称?

最佳答案

Is there some way I can automatically detect problems like this with GCC?



只有链接器可以检测您是否链接了不兼容的代码,而不是编译器。

替代链接器,gold ,可以检测--detect-odr-violations的一些问题选项。

Alternatively, how do other people avoid this issue? Build the checked version of the library to a different name or something like that?



我只是确保在我想使用 Debug模式时重建所有内容,我认为我从未想要保留一个使用 Debug模式构建的库。它用于调试,而不是用于正常使用。

我很少用 -D_GLIBCXX_DEBUG无论如何,我更经常做这样的事情:
#if 0
# include <debug/vector>
namespace my_class_stl = __gnu_debug;
#else
#include <vector>
namespace my_class_stl = std;
#endif

struct my_class
{
  typedef my_class_stl::vector<int> container;
  typedef container::iterator iterator;
  // ...
};

然后,当我想对该特定类使用 Debug模式向量时更改预处理器条件,而不影响 程序中的容器。因为更改涉及写入文件(并因此更新其时间戳),因此任何依赖于该 header 的内容都将被 make 重建。 ,并且有两种不同的类型,std::vector<int>__gnu_debug::vector<int> ,它们具有不同的符号并且不会被链接器混淆。

只是定义 _GLIBCXX_DEBUG不会导致重新构建所有依赖项,并且会默默地更改 std::vector 的定义全局,而不是将特定容器更改为具有不同名称的不同类型,__gnu_debug::vector

关于debugging - 使用 GCC 检测 ABI 兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629255/

相关文章:

c++ - 如何使用辅助函数在 C++ 中编译以下 flex 文件

c++ - 具有派生模板类和继承成员变量的语法难题

使用 monodevelop 调试 dotnet core 2.0 项目

linux - GCC:在搜索 -ltest 时跳过不兼容的/home/Linux/lib/libtest.a

c++ - macOS fatal error : sys/_types/_int8_t. h : No such file or directory #include <sys/_types/_int8_t. h>

c++ - 获取错误 'char16_t and char32_t undeclared'

linux - 有谁知道是否有人集成了 libsegfault.so 和 gdbserver 以便将 gdb 即时附加到崩溃的程序?

.net - DebuggerDisplay 属性是否可以应用于不属于自己的类型?

c++ - 如何调试堆损坏错误?

c++ - Qt Creator 编译错误(找不到.o 文件)