簡體   English   中英

帶有弱符號的奇怪鏈接行為(ARM-EABI展開例程__cxa_begin_cleanup)

[英]Strange linking behaviour with weak symbols (ARM-EABI unwinding routines __cxa_begin_cleanup)

我的ARM-EABI工具鏈和/或libstdc ++有問題。

當我編譯並鏈接由文件test.cpp,TestClass.cpp,TestClass.h組成的簡單C ++庫時,庫中弱引用了諸如__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將不再顯示它們。

有一個類似的問題在這里 ,但提到的連接選項--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

資源:

測試文件

#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;}

測試類

#ifndef TESTCLASS_H_
#define TESTCLASS_H_

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

#endif

參見ELF標准 p。 1-18:

鏈接編輯器搜索存檔庫時,它將提取包含未定義全局符號定義的存檔成員。 成員的定義可以是全局符號或弱符號。 鏈接編輯器不會提取存檔成員來解析未定義的弱符號。 未解析的弱符號的值為零。

這意味着對於上面的示例,由於弱聲明,因此不會從庫中提取任何對象。 但是std :: string的使用導致對象的提取,這也滿足使用的弱符號。

要“解決”此問題,可以使用鏈接器選項-u symbol

強制將符號作為未定義符號輸入到輸出文件中。 這樣做可能會例如觸發來自標准庫的其他模塊的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM