assembly - ld 链接描述文件,标记部分 RW
问题描述
我不明白为什么我的链接器脚本没有按预期工作,我正在编译我的汇编代码
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
解决方案
您的问题是您在链接描述文件中以小写字母命名.text
,.data
但在源文件中以大写字母命名。节名称区分大小写,因此链接器无法识别您在链接器脚本.DATA
中.data
指定的内容,并且不会执行您期望的操作。
要解决此问题,请始终对部分名称使用相同的大小写。
最后,请注意所有以句点 ( .
) 开头的部分名称都由 ELF 标准保留用于各种目的。如果您想在程序中添加自定义部分,请给它们起不以句点开头的名称。
推荐阅读
- sql - 为什么我的应用程序中没有返回行,而相同的查询在 DBBrowser 中返回行?
- python - 如何让我的 JupyterLab 显示我的数据框的值?
- mysql - 外键限制
- javascript - 试图在反应中导入一个img
- flutter - 动画列表不显示插入的项目颤动
- r - 如何通过配对列来对数据框进行子集化
- python - matplotlib - 为什么 blitting 冻结图
- reactjs - Api Platform & ReactJs & Symfony 4:路由问题
- sql - 如何计算另一个表的字符串中某个属性的出现次数
- javascript - 为什么 NodeJS 中来自 Angular 的 GET 请求有时为空,尽管有数据