我不明白为什么我的链接脚本无法按预期工作, 我正在使用
编译我的汇编代码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
答案 0 :(得分:2)
您的问题是,您在链接描述文件中用小写命名.text
和.data
,而在源文件中用大写命名。段名区分大小写,因此链接器不会将.DATA
识别为您在链接器脚本中指定的.data
,并且不会执行您期望的操作。
要解决此问题,请始终对节名称使用相同的大小写。
最后,请注意,ELF标准出于各种目的保留了所有以句点(.
开头的节名称。如果您要向程序中添加自定义部分,请给它们指定以句点开头的名称。