24

测试平台为 32 位 Linux。

基本上,我知道 gcc 可以用来生成 Intel 和 At&T 风格的汇编代码,但似乎不能直接使用 nasm/tasm 来编译 gcc 生成的 Intel 风格的汇编代码。

我正在 Windows 和 Linux 平台上进行项目分析 asm 代码,所以我想如果它们都可以由 nasm\yasm 等平台独立的汇编程序编译,我可以有一个更轻松的时间......

所以我的问题是如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?

4

3 回答 3

37

我发现反汇编目标文件比使用 gcc 生成的汇编代码更好。

  1. 首先,从您的源代码生成一个目标文件:

    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

  2. 使用objconv生成nasm代码:

    objconv -fnasm main.o
    

    结果将存储在main.asm.

  3. 结果将非常接近 Nasm 语法。但是,您可能需要进行一些小的调整以消除警告/错误。只需尝试用 Nasm 编译它

    nasm -f elf32 main.asm
    

    并手动修复错误/警告。例如:

    • 从行中删除align=Nand execute/noexecute单词。.SECTION
    • : functionglobal声明中删除文本
    • 删除default rel线
    • 如果您愿意,请删除空白部分等
  4. 使用 gcc链接main.o由 Nasm 在步骤 3 中生成的结果:

    gcc main.o
    

    您也可以使用 ld 链接它,但这要困难得多。

于 2013-12-23T11:59:54.767 回答
10

如果你很懒: https ://github.com/diogovk/c2nasm

我有一个脚本可以自动执行 Babken Vardanyan 的建议。

于 2014-09-08T18:50:18.113 回答
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)
于 2019-08-14T18:28:32.803 回答