ld 链接描述文件,标记 RW 部分
ld linker script, mark section RW
我不明白为什么我的 linker 脚本没有按预期工作,
我正在使用
编译我的汇编代码
nasm -f elf64 file.asm
后来我 link 使用我的自定义 linker 脚本
ld -o file.elf64 -T linker_script.lds file.o
没有 linker 脚本我可以执行它,但是使用 linker 脚本不行,我只想将文本和代码部分放在不同的位置并将文本标记为 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
您的问题是您在链接描述文件中将 .text
和 .data
命名为小写,但在源文件中以大写命名。部分名称区分大小写,因此链接器不会将 .DATA
识别为您在链接描述文件中指定的 .data
,并且不会执行您期望的操作。
要解决此问题,请始终对部分名称使用相同的大小写。
最后,请注意所有以句点 (.
) 开头的部分名称均由 ELF 标准保留用于各种目的。如果您想将自定义部分添加到您的程序中,请为它们指定不以句点开头的名称。
我不明白为什么我的 linker 脚本没有按预期工作, 我正在使用
编译我的汇编代码nasm -f elf64 file.asm
后来我 link 使用我的自定义 linker 脚本
ld -o file.elf64 -T linker_script.lds file.o
没有 linker 脚本我可以执行它,但是使用 linker 脚本不行,我只想将文本和代码部分放在不同的位置并将文本标记为 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
您的问题是您在链接描述文件中将 .text
和 .data
命名为小写,但在源文件中以大写命名。部分名称区分大小写,因此链接器不会将 .DATA
识别为您在链接描述文件中指定的 .data
,并且不会执行您期望的操作。
要解决此问题,请始终对部分名称使用相同的大小写。
最后,请注意所有以句点 (.
) 开头的部分名称均由 ELF 标准保留用于各种目的。如果您想将自定义部分添加到您的程序中,请为它们指定不以句点开头的名称。