首页 > 解决方案 > ld 链接描述文件,标记部分 RW

问题描述

我不明白为什么我的链接器脚本没有按预期工作,我正在编译我的汇编代码

nasm -f elf64 file.asm 

后来我使用我的自定义链接器脚本链接它

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

没有链接描述文件我可以执行它,但没有链接描述文件,我只想将文本和代码部分放在不同的位置,并将文本标记为 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

标签: assemblylinkerld

解决方案


您的问题是您在链接描述文件中以小写字母命名.text.data但在源文件中以大写字母命名。节名称区分大小写,因此链接器无法识别您在链接器脚本.DATA.data指定的内容,并且不会执行您期望的操作。

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

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


推荐阅读