2015-02-11 15 views
1

我想爲特定C文件生成的.data部分中的符號將它們放在最終可執行文件中的不同部分(例如.mydata)中。例如,c - 將.data發送到不同的部分

normaldata.c: char * my_str = "this should appear in .data"; 
specialdata.c: char * my_special_str = "this should appear in .mydata"; 

默認情況下,my_strmy_special_str出現在.data部分。但是,當我生成specialdata.o時,我想發送任何可能出現在.data而不是.mydata的內容。我知道我可以使用__attribute__((section(".mydata")))來實現這種效果,但我不知道如何將它應用到結構的指針成員的指定初始化程序(我已簡化了此問題的代碼)。相反,我想也許我可以使用鏈接器腳本,並將特定文件中的所有數據發送到我的特殊部分。

我嘗試這個鏈接腳本(link.lds):

SECTIONS 
{ 
    .mydata : { *(.data) } 
} 

gcc -c specialdata.c -T link.lds -o specialdata.o,但objdump -x specialdata.o輸出顯示一個.data部分但沒有.mydata部。

我在做什麼錯?

回答

0

在您的C聲明中,section()屬性指定鏈接器的輸入節名稱。鏈接描述文件的SECTIONS部分中指定的.mydata名稱是輸出部分的名稱。在.mydata中,您告訴鏈接器將「*(.data)」輸入節中的所有符號放入.mydata輸出節中,但是您的C屬性使用輸出節的名稱。

要使鏈接器將C變量放在正確的輸出節中,必須在.mydata輸出節定義和C section()屬性中的輸入節中使用相同的名稱。

嘗試更改輸入節的名稱並在鏈接描述文件和C屬性中使用相同的名稱。

鏈接腳本:

SECTIONS 
{ 
    /* Put all symbols from the .my_data input section into the 
    * .mydata output section. 
    */ 
    .mydata : { *(.my_data) } 
} 

specialdata.c來源:

// Note that the input section name is ".my_data", not ".mydata". 
char * my_special_str __attribute__((section(".my_data"))) = 
    "this should appear in .mydata";