我的ARM-EABI工具链和/或libstdc ++存在问题。
当我编译并链接一个由文件组成的简单C ++库时
test.cpp,TestClass.cpp,TestClass.h
一些解除支持例程,如__cxa_begin_cleanup
,从库中被弱引用,
objdump -T
将其显示为
00000000 w D *UND* 00000000 __cxa_begin_cleanup
00000000 w D *UND* 00000000 __cxa_call_unexpected
__cxa_begin_cleanup
在libsupc ++中实现,我们的库与之链接,但该函数未链接到库中。
为什么呢?
如果更改了库中的代码并使用了std::string
(在test.cpp中的注释中准备),则函数__cxa_begin_cleanup
将链接到生成的二进制文件objdump -T
不再向他们展示了。
存在类似的问题here,但提到的链接器选项--start-group
和--end-group
没有帮助。
有人可以帮忙吗?
ARM-EABI工具链包括: GCC 6.3.0 Binutils 2.27 Newlib 2.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.cpp
#include "testclass.h"
TestClass::TestClass(){ public_member = 1;}
TestClass::~TestClass(){}
int TestClass::PublicMethodGetPublicMember(){ return public_member;}
TestClass.h
#ifndef TESTCLASS_H_
#define TESTCLASS_H_
class TestClass
{
public:
TestClass();
~TestClass();
int PublicMethodGetPublicMember();
public:
int public_member;
};
#endif
答案 0 :(得分:0)
见ELF Standard p。 1-18:
当链接编辑器搜索归档库时,它会提取归档 包含未定义全局符号定义的成员。该 成员的定义可以是全局符号或弱符号。 链接 编辑器不提取存档成员来解决未定义的弱 符号。未解析的弱符号的值为零。
这意味着对于上面的示例,由于弱声明,不会从库中提取任何对象。但是std :: string的使用导致了对象的提取,这也满足了使用的弱符号。
要“解决”这个问题,可以使用链接器选项-u symbol
:
强制符号作为未定义的符号输入到输出文件中。 例如,这样做可以触发附加模块的链接 来自标准库。