How to generate a nasm compilable assembly code from c source code on Linux?
测试平台是32位Linux。
基本上,我知道gcc可用于生成Intel和At&T风格
汇编代码,但似乎您不能直接使用nasm / tasm进行编译
生成的英特尔样式汇编代码gcc。
我正在Windows和Linux平台上都进行项目分析asm代码,因此我想如果它们都可以由独立于平台的汇编程序(如nasm \ yasm)进行编译,那么我可以拥有更轻松的时间...
所以我的问题是如何在Linux上从c源代码生成nasm可编译汇编代码?
我发现这是反汇编目标文件而不是使用gcc生成的汇编代码的更好方法。
首先,从您的源代码生成一个目标文件:
1 | gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c |
使用objconv生成
1 | objconv -fnasm main.o |
结果将存储在
结果将非常接近Nasm语法。但是,您可能需要进行一些细微调整,以消除警告/错误。只需尝试使用Nasm进行编译
1 | nasm -f elf32 main.asm |
并手动修复错误/警告。例如:
-
从
.SECTION 行中删除align=N 和execute /noexecute 字。 -
从
global 声明中删除文本: function -
删除
default rel 行 - 如果需要,请删除空白部分
使用gcc链接Nasm在步骤3中生成的结果
1 | gcc main.o |
您也可以使用ld链接它,但是要困难得多。
如果您很懒:
https://github.com/diogovk/c2nasm
那里有一个脚本可以自动执行Babken Vardanyan的建议。
这是不使用
1 | ndisasm -u <(objdump -j .text -d main.o | cut -d: -f2 | cut -d$'\\t' -f 2 | perl -ne 'next if /file/; s/\\s+//g; print' | xxd -r -p) |