2012-06-04 29 views
1

當我鏈接在一起對象文件,將得到的ELF可執行具有(僅)以下LOAD段:如何防止ld組合可寫和可執行部分?

LOAD off 0x00000000 vaddr 0x00008000 paddr 0x00008000 align 2**15 
    filesz 0x000010f0 memsz 0x000010f0 flags rwx 

合併所有部分成一個rwx段,而不是分離的可寫和可執行接頭ld部分。我想阻止這一點。可重定位對象具有標記爲可寫或可執行的部分,因此此問題出現在鏈接時。

那麼,什麼決定了ld如何爲段分配權限?鏈接器腳本似乎沒有任何相關的東西。工具鏈構建時是否指定了某些內容?

我針對的是ARM,工具鏈是arm-linux-gnueabibinutils版本2.22。

編輯:鏈接器腳本是here。其他鏈接選項是-Bdynamic,--gc-sections,-z nocopyreloc--no-undefined

+0

這似乎依賴於連接器。即使使用相同的鏈接器腳本,「arm-eabi」產生的段也是可分離的。我仍然不知道具體說明了什麼。 –

+0

請發佈你的鏈接腳本你的問題的答案就在那裏,除非你用命令行覆蓋它,並且在這種情況下發布命令行,否則不能做很多沒有。非常可能且相當容易在鏈接描述文件中隨意分開... –

+0

添加了腳本和選項 –

回答

1

通常,鏈接器腳本用於定義段,順序,是保留它們還是將它們從二進制文件中清除(發佈構建鏈接器腳本可能選擇刪除調試信息)。

這裏是一個鏈接腳本的例子: system-onesegment.ld

編輯:修改部分的權限,要更改.section僞.section_name,「許可」的許可,任何部分之前把這個。

例子:

.text 
mov r0, r0 
b main 
.section .rodata, "ro" 
.word 0x00000001 
.previous 
main: mov r0, r0 
+0

鏈接描述文件沒有指定段的權限。 –

+0

是的,但它沒有,但是當你輸入數據時,代碼在你設置權限的部分。 .text「.text」,「ax」,%progbits(其中progbits告訴鏈接器我們可能有數據在那裏通知文字池) .section「.data」,「ro」 .section「.heap」, 「arw」 – sgupta

+0

@ user1075375我有點想在x86_64 arch上做同樣的事情,我需要將.text段的權限改爲可寫。我嘗試使用.section .text,「W」:在文本部分開始之前,但我在該行收到語法錯誤。任何建議將不勝感激。謝謝 – abhi