ld 链接描述文件,标记 RW 部分

ld linker script, mark section RW

我不明白为什么我的 linker 脚本没有按预期工作, 我正在使用

编译我的汇编代码
nasm -f elf64 file.asm 

后来我 link 使用我的自定义 linker 脚本

ld -o file.elf64 -T linker_script.lds file.o

没有 linker 脚本我可以执行它,但是使用 linker 脚本不行,我只想将文本和代码部分放在不同的位置并将文本标记为 RWX 和数据作为 RW.

MEMORY
{
  cod (RWX)  : ORIGIN = 0x0041000 , LENGTH = 0x1000
  mem (RW)  : ORIGIN = 0x0040000 , LENGTH = 0x1000
}

SECTIONS
{
  .data : { *(.data) } >mem
  .text : { *(.text) } >cod
}

如果我查看 r2 中的部分,我得到

r2 -c 'iS' -A file.elf64
[Sections]
Nm Paddr       Size Vaddr      Memsz Perms Name
00 0x00000000     0 0x00000000     0 ---- 
01 0x00001000    69 0x00041000    69 -r-- .TEXT
02 0x00001045    13 0x00041045    13 -r-- .DATA
03 0x00001058   168 0x00000000   168 ---- .symtab
04 0x00001100    33 0x00000000    33 ---- .strtab
05 0x00001121    39 0x00000000    39 ---- .shstrtab

我不明白

(为了完整的 asm 代码)

SECTION .TEXT
  GLOBAL _start 

_start:

  mov rax, 0 ; read syscall
  mov rdi, 0
  mov rsi, hello
  mov rdx, 10
  syscall

  mov rax, 1 ; write syscall
  mov rdi, 1
  mov rsi, hello
  mov rdx, 10
  syscall

  mov rax, 1
  syscall

SECTION .DATA
  hello:     db 'Hello world!',10   
  helloLen:  equ $-hello

您的问题是您在链接描述文件中将 .text.data 命名为小写,但在源文件中以大写命名。部分名称区分大小写,因此链接器不会将 .DATA 识别为您在链接描述文件中指定的 .data,并且不会执行您期望的操作。

要解决此问题,请始终对部分名称使用相同的大小写。

最后,请注意所有以句点 (.) 开头的部分名称均由 ELF 标准保留用于各种目的。如果您想将自定义部分添加到您的程序中,请为它们指定不以句点开头的名称。