当我将目标文件链接在一起时,生成的ELF可执行文件(仅)具有以下LOAD段:
LOAD off 0x00000000 vaddr 0x00008000 paddr 0x00008000 align 2**15 filesz 0x000010f0 memsz 0x000010f0 flags rwx
链接器ld
将所有部分合并为一个rwx
段,而不是将可写和可执行部分分开。我想阻止这个。可重定位对象的部分标记为可写或可执行,因此在链接时出现此问题。
那么,是什么决定ld
如何为细分分配权限?链接器脚本似乎没有与之相关的任何内容。是否在构建工具链时指定了什么?
我定位到ARM,工具链是arm-linux-gnueabi
,binutils
版本2.22。
编辑:链接描述文件为here。其他链接器选项为-Bdynamic
,--gc-sections
,-z nocopyreloc
和--no-undefined
。
答案 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