скрипт компоновщика ld, пометить раздел RW - PullRequest
0 голосов
/ 21 марта 2019

Я не понимаю, почему мой скрипт компоновщика не работает должным образом, я компилирую код ассемблера, используя

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 Ответ

2 голосов
/ 21 марта 2019

Ваша проблема в том, что вы назвали .text и .data в нижнем регистре в вашем скрипте компоновщика, но в верхнем регистре в исходном файле.Имена разделов чувствительны к регистру, поэтому компоновщик не распознает .DATA как .data, указанный вами в скрипте компоновщика, и не выполняет то, что вы ожидаете.

Чтобы исправить эту проблему, последовательноиспользуйте один и тот же регистр для имен разделов.

Наконец, обратите внимание, что все имена разделов, начинающиеся с точки (.), зарезервированы стандартом ELF для различных целей.Если вы когда-нибудь захотите добавить пользовательские разделы в вашу программу, присвойте им имена, которые не начинаются с точек.

...