ld链接描述文件,标记为RW

时间:2019-03-21 13:39:37

标签: assembly linker ld

我不明白为什么我的链接脚本无法按预期工作, 我正在使用

编译我的汇编代码
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

1 个答案:

答案 0 :(得分:2)

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

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

最后,请注意,ELF标准出于各种目的保留了所有以句点(.开头的节名称。如果您要向程序中添加自定义部分,请给它们指定以句点开头的名称。