2010-04-21 82 views
7

我正在爲基於ARM-Cortex M3的設備編寫引導腳本。如果我編譯彙編程序引導腳本和C應用程序代碼,然後合併目標文件並將它們傳輸到我的設備,一切正常。GNU ld刪除部分

但是,如果我用ar創建歸檔(libboot.a),並結合該存檔與C應用程序有一個問題:

我已經把啓動代碼段:

.section .boot, "ax" 
    .global  _start 

_start: 
    .word  0x10000800 /* Initial stack pointer (FIXME!) */ 
    .word  start 
    .word  nmi_handler 
    .word  hard_fault_handler 
    ... etc ... 

我發現ld從最終的二進制文件中刪除(「boot」部分不可用)。這是非常自然的,因爲ld不瞭解它,但它會導致設備無法正確引導。

所以我的問題是:強制包含此代碼的最佳方法是什麼?

回答

10

嘗試添加類似:

KEEP(*(.boot)) 
ld鏈接腳本

告訴鏈接,以保持.boot部分。

但是,我不確定這是否足以導致ld.boot部分的歸檔中提取任何對象 - 它可能根本不會考慮對象,除非該對象中的某個符號導致該對象如果這是一個問題,請指定_start作爲入口點(在ld命令行上使用-e _start或在鏈接描述文件中使用ENTRY(_start))可能是解決方案。

3

我想你想通過--no-gc-sections選項到鏈接器。來自GNU ld documentation

--gc-sections 
--no-gc-sections 

Enable garbage collection of unused input sections. 

`--gc-sections' decides which input sections are used 
by examining symbols and relocations. The section 
containing the entry symbol and all sections containing symbols 
undefined on the command-line will be kept, as will sections 
containing symbols referenced by dynamic objects. 
Note that when building shared libraries, the linker must 
assume that any visible symbol is referenced. Once this initial 
set of sections has been determined, the linker recursively marks 
as used any section referenced by their relocations. 
See `--entry' and `--undefined'. 
2

鏈接器將僅從歸檔中提取解析明確引用的符號所需的那些對象。您的啓動代碼沒有被明確引用,因爲它是通過復位向量調用的。

如果你的啓動代碼包括多個模塊,您應該創建一個部分鏈接對象文件使用LD和-r/--relocatable選項,這將對象合併成一個單一的對象,而不需要解決所有的符號(如主()例如)。這可以用於與應用程序代碼的完整鏈接。如果它只是單個目標文件,那麼在任何情況下創建一個存檔都沒有真正的優勢(並且因爲您發現它不起作用)。

請注意,傳統上GNU C運行時啓動是在一個名爲crt0.o(不是歸檔文件)的文件中提供的,可能出於同樣的原因。

1

您可以使用ld --whole-archive選項來提取未引用的符號。這ld options page有這對整個歸檔 --whole歸檔

對於--whole歸檔 選項後 命令行中提到的每個存檔,包括在 每個對象文件中的鏈接存檔而不是 在檔案中搜索所需的 目標文件。這通常用於 將檔案文件轉換爲共享的 庫,強制將每個對象包含在生成的共享 庫中的 。此選項可能比使用更多 。
從gcc使用此選項時有兩點需要注意:首先,gcc不知道關於此選項的 ,因此您必須使用 -Wl,-whole-archive。其次,不要忘記在您的檔案列表後使用-Wl,-no-whole-archive ,因爲 gcc會將您自己的檔案列表 添加到您的鏈接中,並且您可能不希望這個 標誌影響那些好。

也看到堆棧溢出這個問題,uses of whole-archive option

2

鏈接時可以使用--whole-archive,但它是一把大象槍。該名男子頁聲稱:

對於--whole-archive選項後,在命令行中提到的每個歸檔,包括鏈接在歸檔中每個對象文件,而不是搜索需要的目標文件存檔。