Gcc 弱符号的奇怪链接行为(ARM-EABI展开例程\uuuu cxa\u begin\u cleanu)

Gcc 弱符号的奇怪链接行为(ARM-EABI展开例程\uuuu cxa\u begin\u cleanu),gcc,linker,libstdc++,weak-linking,Gcc,Linker,Libstdc++,Weak Linking,我们的ARM-EABI工具链和/或libstdc++有问题 当我编译并链接一个由文件组成的简单C++库时 test.cpp、TestClass.cpp、TestClass.h 一些展开支持例程,如\ucxa\u begin\u cleanup,在库中的引用较弱, objdump-T将它们显示为 00000000 w D *UND* 00000000 __cxa_begin_cleanup 00000000 w D *UND* 00000000 __cxa_call_unexp

我们的ARM-EABI工具链和/或libstdc++有问题

当我编译并链接一个由文件组成的简单C++库时 test.cpp、TestClass.cpp、TestClass.h 一些展开支持例程,如
\ucxa\u begin\u cleanup
,在库中的引用较弱,
objdump-T
将它们显示为

00000000  w   D  *UND*  00000000 __cxa_begin_cleanup
00000000  w   D  *UND*  00000000 __cxa_call_unexpected
\uuuucxa\u begin\u cleanup
是在libsupc++中实现的,我们的库与libsupc++链接,但函数未链接到库中。 为什么?

如果库中的代码被更改,并且使用了
std::string
(在test.cpp中的注释中准备),函数
\uuucxa\u begin\u cleanup
将链接到生成的二进制文件,
objdump-T
将不再显示它们

也有类似的问题,但是提到的链接器选项
--start group
--end group
没有帮助

有人能帮忙吗

ARM-EABI工具链包括: GCC 6.3.0 比努蒂尔斯2.27 newlib2.4.0

命令行:

arm-eabi-gcc.exe test.cpp TestClass.cpp -fPIC -O0 -lstdc++ -lsupc++ -o a.out
资料来源:

test.cpp

#include <string>
#include "testclass.h"

int bur_heap_size = 0;

//std::string str1;

int fun ()
{
   TestClass obj1;
//   str1 = "blabla";
   return 0;
}
TestClass.h

#ifndef TESTCLASS_H_
#define TESTCLASS_H_

class TestClass
{
    public:
    TestClass();
    ~TestClass();
    int PublicMethodGetPublicMember();
    public:
    int public_member;
};

#endif
见第页。1-18:

链接编辑器搜索存档库时,会提取存档 包含未定义全局符号定义的成员。这个 成员的定义可以是全局符号,也可以是弱符号链接 编辑器不提取存档成员以解析未定义的弱 符号。未解析的弱符号的值为零

这意味着对于上面的示例,由于弱声明,不会从库中提取任何对象。但是std::string的使用导致了对象的提取,这也满足了所使用的弱符号

要“解决”此问题,可以使用链接器选项
-u symbol

强制将符号作为未定义的符号输入到输出文件中。 例如,这样做可能会触发附加模块的链接 来自标准库

#ifndef TESTCLASS_H_
#define TESTCLASS_H_

class TestClass
{
    public:
    TestClass();
    ~TestClass();
    int PublicMethodGetPublicMember();
    public:
    int public_member;
};

#endif