linux将汇编转为机器码,如何将汇编语言转化为机器码

在Linux环境下,通过gcc和nasm将汇编语言转化为机器码。遇到gcc默认编译链接的问题时,使用'-c'参数仅编译不链接。nasm作为更准确的工具,能更好地处理AT&T语法。pwntools库提供了方便的汇编转换函数,简化了转换过程。
摘要由CSDN通过智能技术生成

很简单,使用gcc即可,我们写如下程序:

pop eax

复制代码

保存为文本文件,命名为test.s

然后使用gcc在32位的环境下编译

gcc test.s

复制代码

结果会报错,为什么呢?

/usr/bin/ld: /tmp/ccj87S8M.o: relocation R_X86_64_32S against undefined >symbol eax' can not be used when making a PIE object; recompile with -fPIC /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function_start':

(.text+0x20): undefined reference to `main'

/usr/bin/ld: final link failed: Invalid operation

collect2: error: ld returned 1 exit status

因为gcc默认汇编是要编译链接一气呵成的。这里我们使用参数-c,即可只编译不链接。

gcc -c test.s

复制代码

这样就出来了一个test.o文件,里面只有pop eax的机器码,我们可以使用objdump -d查看。

objdump -d test.o

复制代码

可以看到pop eax被转化为了popq,为什么呢?因为gcc采用的是AT&T 语法pop eax要写成pop %eax再编译才行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值