скрипт компоновщика ld, отметить раздел RW

#assembly #linker #ld

#сборка #компоновщик #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. Имена разделов чувствительны к регистру. .data это не то же самое, что .DATA .

2. о, черт… теперь работает, большое вам спасибо 🙂

Ответ №1:

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

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

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