测试平台为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
进行了优化,因此汇编并不可怕。可以选择使用-Os
(大小超过速度)或-O3
(全面优化,包括自动矢量化)。您还可以通过-march=native
或-march=haswell
或-march=znver1
调整 CPU 并使用它支持的扩展(禅宗)-s
:制作更小的可执行文件( strip )-c -o main.o
:编译但不链接,生成名为main.o
的目标文件使用objconv生成
nasm
代码:objconv -fnasm main.o
结果将存储在
main.asm
中。结果将非常接近 Nasm 语法。但是,您可能需要进行一些细微的调整以消除警告/错误。只需尝试使用 Nasm 编译即可
nasm -f elf32 main.asm
并手动修复错误/警告。例如:
- 从
.SECTION
行中删除align=N
和execute
/noexecute
字样。 - 从
global
声明中删除文本: function
- 删除
default rel
行 - 如果您愿意,可以删除空白部分等
- 从
链接 Nasm 在步骤 3 中使用 gcc 生成的
main.o
:gcc main.o
您也可以使用 ld 链接它,但这要困难得多。
关于assembly - 如何在Linux上从c源代码生成nasm可编译的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737947/