You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析DT_TEXTREL警告含义及消除该汇编链接警告的方法

警告含义与解决方法

警告含义

  1. relocation in read-only section '.text'
    .text段是程序的代码段,默认被标记为只读。你的代码里直接用mov rsi, msg引用.data段的msg符号,NASM默认生成的是绝对地址引用。当链接器生成PIE(位置无关可执行文件,gcc默认行为)时,需要对这个绝对地址进行重定位——也就是在程序加载时修改.text段里的这个地址值。但.text是只读的,这种需要修改只读段的重定位操作就会触发这个警告。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:52:09