测试平台是32位Linux。
基本上,我知道gcc可以用来生成Intel和At& T风格 汇编代码,但似乎你 不能 直接使用nasm / tasm编译 英特尔风格的汇编代码gcc生成。
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm \ yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
答案 0 :(得分:32)
我发现这是一种更好的方法来反汇编目标文件,而不是使用gcc生成的汇编代码。
首先,从源代码生成目标文件:
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
-fno-asynchronous-unwind-tables
:不要生成不必要的部分,例如.eh_frame
-O2
优化,因此asm并不可怕。 (可选)使用-Os
(大小超速)或-O3
(包括自动向量化的完全优化)。您还可以调整CPU并使用-march=native
或-march=haswell
或-march=znver1
(Zen)支持的扩展程序
-s
:制作较小的可执行文件(strip)
-c -o main.o
:编译但不链接,生成名为main.o
的对象文件
使用objconv生成nasm
代码:
objconv -fnasm main.o
结果将存储在main.asm
。
结果将非常接近Nasm语法。但是,您可能需要进行一些小的调整以消除警告/错误。只需尝试使用Nasm编译它
nasm -f elf32 main.asm
并手动修复错误/警告。例如:
align=N
行中删除execute
和noexecute
/ .SECTION
字词。: function
声明global
default rel
行使用gcc链接由步骤3中由Nasm生成的main.o
:
gcc main.o
您也可以使用ld链接它,但这要困难得多。
答案 1 :(得分:9)
如果你懒惰: https://github.com/diogovk/c2nasm
我有一个自动执行Babken Vardanyan建议的脚本。
答案 2 :(得分:0)
这里没有objconv
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)