使用GCC编译时如何链接汇编目标文件中的malloc函数
问题原因
当前绝大多数Linux发行版的GCC默认开启PIE(位置无关可执行文件)编译,你手写的汇编代码中call malloc使用的32位相对偏移重定位类型,不兼容PIE的链接要求,因此触发重定位报错。
可行解决方案
方案1(推荐):修改汇编适配默认PIE编译
x86_64架构下调用动态库函数需要通过PLT(过程链接表)调用,只需要把汇编里的call malloc改为call malloc@plt即可,修改后的汇编代码如下:
global test extern malloc section .text test: mov rdi, 40 call malloc@plt ret
修改后用原有命令即可正常编译:
nasm -f elf64 test.asm g++ test.o test.cpp
该方案保留了系统默认开启的PIE安全特性,程序安全等级更高。
方案2:不修改汇编,编译时关闭PIE
如果不想改动汇编代码,可以在g++链接阶段添加-no-pie参数关闭位置无关可执行文件生成,编译命令改为:
nasm -f elf64 test.asm g++ -no-pie test.o test.cpp
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

