Gcc 弱符号的奇怪链接行为(ARM-EABI展开例程\uuuu cxa\u begin\u cleanu)
我们的ARM-EABI工具链和/或libstdc++有问题 当我编译并链接一个由文件组成的简单C++库时 test.cpp、TestClass.cpp、TestClass.h 一些展开支持例程,如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
\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