解析DT_TEXTREL警告含义及消除该汇编链接警告的方法
警告含义与解决方法
警告含义
relocation in read-only section '.text'
.text段是程序的代码段,默认被标记为只读。你的代码里直接用mov rsi, msg引用.data段的msg符号,NASM默认生成的是绝对地址引用。当链接器生成PIE(位置无关可执行文件,gcc默认行为)时,需要对这个绝对地址进行重定位——也就是在程序加载时修改.text段里的这个地址值。但.text是只读的,这种需要修改只读段的重定位操作就会触发这个警告。creating DT_TEXTREL in a PIE
DT_TEXTREL是动态链接器的一个标记,说明可执行文件需要修改.text段来完成重定位。而PIE的设计目标是实现位置无关加载,避免修改只读代码段,所以这个警告是在提示你生成的PIE不符合安全规范,存在需要修改只读段的重定位信息。
消除警告的方法
方法1:使用位置无关的寻址方式(推荐)
x86-64架构下,PIE程序应该用RIP相对寻址来访问全局数据,这样不需要修改.text段,而是通过当前指令地址的偏移来计算数据地址。修改代码中引用msg的行:
原代码:
mov rsi, msg
修改为:
lea rsi, [rel msg]
完整修改后的代码:
global main section .text main: mov rax, 1 mov rdi, 1 lea rsi, [rel msg] ; 改用RIP相对寻址 mov rdx, 6 syscall mov rax,60 xor rdi,rdi syscall section .data msg: db "Hello",10,0
重新编译链接,警告会消失。
方法2:编译为非PIE可执行文件
如果不需要位置无关特性,可以让gcc生成普通的非PIE可执行文件,使用-no-pie选项:
nasm -f elf64 hello.asm gcc -no-pie hello.o
这样链接器会使用绝对地址加载,不需要修改.text段,警告也会消失。
内容的提问来源于stack exchange,提问作者Arin Chaudhuri
相关产品推荐
相关产品推荐

