测试平台为 32 位 Linux。
基本上,我知道 gcc 可以用来生成 Intel 和 At&T 风格的汇编代码,但似乎不能直接使用 nasm/tasm 来编译 gcc 生成的 Intel 风格的汇编代码。
我正在 Windows 和 Linux 平台上进行项目分析 asm 代码,所以我想如果它们都可以由 nasm\yasm 等平台独立的汇编程序编译,我可以有一个更轻松的时间......
所以我的问题是如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?
测试平台为 32 位 Linux。
基本上,我知道 gcc 可以用来生成 Intel 和 At&T 风格的汇编代码,但似乎不能直接使用 nasm/tasm 来编译 gcc 生成的 Intel 风格的汇编代码。
我正在 Windows 和 Linux 平台上进行项目分析 asm 代码,所以我想如果它们都可以由 nasm\yasm 等平台独立的汇编程序编译,我可以有一个更轻松的时间......
所以我的问题是如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?
我发现反汇编目标文件比使用 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
:制作更小的可执行文件(条带)
-c -o main.o
:编译但不链接,生成一个名为的目标文件main.o
使用objconv生成nasm
代码:
objconv -fnasm main.o
结果将存储在main.asm
.
结果将非常接近 Nasm 语法。但是,您可能需要进行一些小的调整以消除警告/错误。只需尝试用 Nasm 编译它
nasm -f elf32 main.asm
并手动修复错误/警告。例如:
align=N
and execute
/noexecute
单词。.SECTION
: function
从global
声明中删除文本default rel
线使用 gcc链接main.o
由 Nasm 在步骤 3 中生成的结果:
gcc main.o
您也可以使用 ld 链接它,但这要困难得多。
如果你很懒: https ://github.com/diogovk/c2nasm
我有一个脚本可以自动执行 Babken Vardanyan 的建议。
这是一种没有的方法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)