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

Linux下32位汇编遇.text段重定位警告问题求助

解决汇编代码链接时的只读段重定位与DT_TEXTREL警告

警告原因

这两个警告源于Linux本地环境默认启用**PIE(位置无关可执行文件)**特性,而你的汇编代码或链接逻辑使用了绝对地址寻址:

  1. relocation in read-only section '.text':.text段是只读属性,但代码中存在需要运行时修改的绝对地址重定位项,链接器无法在只读段完成重定位操作。
  2. creating DT_TEXTREL in a PIE:PIE模式下不允许生成带文本重定位(DT_TEXTREL)的可执行文件,这是系统安全机制的限制,而你的代码触发了该限制。

WSL环境未出现警告,大概率是因为该环境下gcc默认关闭了PIE编译选项。

解决方案

方案1:修改汇编代码为位置无关寻址(推荐)

将代码中的绝对寻址改为RIP相对寻址(x86_64架构下替代EIP寻址的标准方式),示例如下:

  • 原绝对引用全局变量:
    mov $my_global_var, %eax
    
    修改为RIP相对寻址:
    lea my_global_var(%rip), %rax
    
  • 原直接调用函数:
    call my_func
    
    修改为通过PLT表调用(确保位置无关):
    call my_func@PLT
    

同时检查utility.s工具文件,确保其中所有寻址逻辑也改为位置无关形式。

方案2:临时关闭PIE编译链接特性

如果暂时无法修改代码,可以调整assemble.ps1脚本中的gcc/ld命令参数,强制关闭PIE:

  • 修改编译命令,添加-fno-pie参数:
    gcc -c -fno-pie $args[0] -o temp.o
    
  • 修改链接命令,添加-no-pie参数:
    ld -no-pie temp.o -o output
    

或直接合并为一条命令:

gcc -no-pie $args[0] -o output

方案3:确保编译链接生成标准PIE可执行文件

若要保留PIE安全特性,需确保代码完全位置无关,同时调整编译参数:

  • 编译时添加-fPIC(生成位置无关目标文件):
    gcc -c -fPIC $args[0] -o temp.o
    
  • 链接时添加-pie参数(默认可能已开启,但显式指定更稳妥):
    ld -pie temp.o -o output
    

内容的提问来源于stack exchange,提问作者Francesco Bonistalli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:23:24