如何防止ld组合可写和可执行部分?

时间:2012-06-04 16:46:32

标签: linker arm elf

当我将目标文件链接在一起时,生成的ELF可执行文件(仅)具有以下LOAD段:

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

链接器ld将所有部分合并为一个rwx段,而不是将可写和可执行部分分开。我想阻止这个。可重定位对象的部分标记为可写或可执行,因此在链接时出现此问题。

那么,是什么决定ld如何为细分分配权限?链接器脚本似乎没有与之相关的任何内容。是否在构建工具链时指定了什么?

我定位到ARM,工具链是arm-linux-gnueabibinutils版本2.22。

编辑:链接描述文件为here。其他链接器选项为-Bdynamic--gc-sections-z nocopyreloc--no-undefined

1 个答案:

答案 0 :(得分:1)

通常链接器脚本用于定义节,它们的顺序,是保留它们还是将它们从二进制文件中删除(发布构建链接器脚本可能选择删除调试信息)。

以下是链接描述文件的示例: system-onesegment.ld

编辑:要修改部分权限,请将其放在您要更改.section .section_name,“permission”权限的任何部分之前。

示例:

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