2013-05-26 70 views
2

背景包括GCC鏈接 - 指定存檔文件

我現在用的是GNU工具ARM嵌入式處理器編譯器,它是一個GCC編譯器的代碼輸出部分。我目前正在Windows環境中工作。

我正在構建一個比較大的項目,並且已經成功編譯了所有的源代碼,但在鏈接階段面臨挑戰。這個特定的平臺作爲兩個獨立的RAM區域,我需要將目標代碼的某些部分映射到特定區域。

我想我應該能夠使用連接器腳本,例如:

SECTIONS 
{ 
    ER_CCM 0x10000000: 
    { 
     * (.bss) 
    } 
    ER_SRAM 0x20000000: 
    { 
     someLib.obj (.bss) 
    } 
} 

不過,我的問題是,編譯器輸出的.lib,而不是.OBJ文件的文件(檔案)。該接頭用在所有的歸檔文件的當前目錄下面的語法被調用:

ld.exe --library-path=C:\SomePath\lib --Map C:\Somepath\bin\mapfile.map --script=C:\Somepath\bin\linkscript.ldf -(file1.lib file2.lib ... -)

即使.lib文件包含到.OBJ文件的引用,鏈接器抱怨說,它無法找到文件someLib.obj可能是因爲它沒有提供完整的路徑來知道該映射所指的文件。

在鏈接器腳本中提供具有完整路徑的鏈接器也似乎不起作用;包含在指定目標文件中的符號仍然顯示在內存的第一部分中。

問題

是樣品鏈接腳本語法是否有效?第一部分中的通配符是否會阻止節部分中的指定文件映射正確?

如何指定鏈接器將某些目標文件範圍內的存檔文件映射到特定區域?這甚至有可能嗎?

回答

1

事實證明,我的主要問題是Put gcc libs .data in specific section?的重複,雖然因爲我也詢問了通配符的放置/順序,我會留下這個問題發佈。

我的第一個任務的答案是:在其他部分之前放置通配符條目,以防止其他部分正確導入指定的目標文件。這種行爲是鏈接器特定的,因爲我看到其他鏈接器不是這種情況。

解決這個問題的方法是一定要使用通用的最後一節中鏈接腳本:

SECTIONS 
{ 
    ER_SRAM 0x20000000: 
    { 
     someLib.obj (.bss) 
    } 
    ER_CCM 0x10000000: 
    { 
     * (.bss) 
    } 
} 

至於指包含在壓縮文件(.LIB)文件中的目標文件。答案中的鏈接後給出,但是這裏要再次重申:

添加一個通配符嵌入對象文件中的部分delcaration:

ER_SRAM 0x20000000: 
{ 
    *someLib.obj (.bss) 
} 

這裏需要說明的是,由於用通配符使用對象文件名,如果文件丟失或者輸入拼寫錯誤,鏈接器不會拋出錯誤。