You need to enable JavaScript to run this app. NASM x86汇编调用C库编译链接错误及后续警告问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

NASM x86汇编调用C库编译链接错误及后续警告问题咨询

警告含义

  • main.o: warning: relocation in read-only section '.text'
    .text段是存储程序执行代码的只读段,你的汇编代码直接在指令中硬编码了.data段msg符号的地址,32位位置无关可执行文件(PIE)编译模式下,链接阶段需要修改.text段内的对应指令来填入最终的msg实际地址,对只读段执行重定位写入操作就触发了该警告。
  • warning: creating DT_TEXTREL in a PIE
    DT_TEXTREL是ELF格式的标记位,代表当前可执行文件的代码段存在需要动态重定位的条目。程序加载时操作系统需要修改原本只读的代码段内容,既会降低内存页共享率、浪费内存,也存在安全风险,因此链接器会抛出该警告。

修复方案

两种方案二选一即可:

方案1:关闭PIE编译(无需修改汇编代码)

你写的汇编是传统32位非位置无关的写法,只需要给gcc编译命令添加-no-pie参数即可消除警告,命令修改为:

gcc -m32 -no-pie -o main main.o

方案2:修改汇编代码适配PIE规则

如果需要保留PIE的安全特性,可以调整汇编代码,通过全局偏移表(GOT)获取全局符号的地址,修改后的汇编代码如下:

section .text
  global main
  extern printf
  extern _GLOBAL_OFFSET_TABLE_

main:
  ; 32位PIE下获取GOT基地址的标准写法
  call .get_got
.get_got:
  pop ebx
  add ebx, _GLOBAL_OFFSET_TABLE_ - .get_got

  ; 从GOT中读取msg的地址压栈
  push DWORD [ebx + msg@GOT]
  mov eax, 0
  call printf

  add esp, 4
  ret

section .data
  msg db "Hello", 0xa, 0

修改后用原命令编译即可,不会触发警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 21:06:06