如何获得有关" X的更多信息会导致部分类型与Y"

时间:2017-09-14 06:00:43

标签: c++ linker aix powerpc

我正在使用运行AIX(oslevel 7200-00-01-1543)和GCC 6.1(6.1.0)的Power 8机器。我们正在捕获下面显示的编译错误。我试图收集有关导致冲突的更多信息。

我读过Inline static data causes a section type conflict,但我并不完全清楚内联是如何涉及由(1)一个类中的析构函数引起的冲突和(2)不同类中的方法(两者都不是标记为内联)。

另一个好问题是GCC error “ causes a section type conflict”,但我们没有使用链接描述文件而且-fno-zero-initialized-in-bss没有帮助。

由于同样的原因,我无法将其减少到最小的测试用例,因此我目前没有最小的测试用例。

我们如何收集有关导致错误的冲突的更多信息?有没有办法指示GCC告诉我们有关这些部分的更多信息,或者告诉我们导致冲突的属性?

当我添加-save-temps标志然后检查文物时,我看不到任何异常。

提出问题Section type conflict for identically defined variables的人有同样的问题。他试图对其进行故障排除,但无法找到其他信息。

现在在GCC问题跟踪器中打开:Compile error "X causes a section type conflict with Y" should provide more information

我们在许多系统上进行测试,AIX机器是唯一有问题的机器。在使用GCC运行openSUSE的另一台Power 8机器上,我们没有遇到这个问题。

-bash-4.3$ gmake
g++ -DNDEBUG -g2 -O3 -fPIC -pthread -pipe -c bench2.cpp
In file included from bench2.cpp:9:0:
gfpcrypt.h: In function 'CryptoPP::DL_PrivateKey_GFP<GP>::~DL_PrivateKey_GFP() [with GP = CryptoPP::DL_GroupParameters_DSA]':
gfpcrypt.h:519:13: error: CryptoPP::DL_PrivateKey_GFP<GP>::~DL_PrivateKey_GFP() [with GP = CryptoPP::DL_GroupParameters_DSA] causes a section type conflict with void CryptoPP::AllocatorWithCleanup<T, T_Align16>::deallocate(void*, CryptoPP::AllocatorWithCleanup<T, T_Align16>::size_type) [with T = unsigned char; bool T_Align16 = true]
     virtual ~DL_PrivateKey_GFP() {}
             ^
In file included from integer.h:20:0,
                 from validate.h:8,
                 from bench2.cpp:6:
secblock.h:217:7: note: 'void CryptoPP::AllocatorWithCleanup<T, T_Align16>::deallocate(void*, CryptoPP::AllocatorWithCleanup<T, T_Align16>::size_type) [with T = unsigned char; bool T_Align16 = true]' was declared here
  void deallocate(void *ptr, size_type size)
       ^~~~~~~~~~
GNUmakefile:1026: recipe for target 'bench2.o' failed

我们的修复方法是将析构函数移出,如下所示。我们不知道导致问题的原因或原因是什么。最初的问题仍然存在:我们将来如何解决问题呢?

@@ -516,7 +516,7 @@ template <class GP>
 class DL_PrivateKey_GFP : public DL_PrivateKeyImpl<GP>
 {
 public:
-    virtual ~DL_PrivateKey_GFP() {}
+    virtual ~DL_PrivateKey_GFP();

     //! \brief Create a private key
     //! \param rng a RandomNumberGenerator derived class
@@ -570,6 +570,10 @@ class DL_PrivateKey_GFP : public DL_PrivateKeyImpl<GP>
         {this->AccessGroupParameters().Initialize(p, q, g); this->SetPrivateExponent(x);}
 };

+// Out-of-line dtor due to AIX and GCC
+template <class GP>
+DL_PrivateKey_GFP<GP>::~DL_PrivateKey_GFP() {}
+
 //! \class DL_SignatureKeys_GFP
 //! \brief Discrete Log (DL) signing/verification keys in GF(p) groups
 struct DL_SignatureKeys_GFP

0 个答案:

没有答案