#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 для различных целей. Если вы когда-нибудь захотите добавить пользовательские разделы в свою программу, дайте им имена, которые не начинаются с точек.