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
相关产品推荐
相关产品推荐

