如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

lll*_*lll 21 assembly gnu-assembler nasm tasm yasm

测试平台是32位Linux.

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

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

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

Bab*_*yan 34

我发现这是一种更好的方法来反汇编目标文件,而不是使用gcc生成的汇编代码.

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

    gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
    
    Run Code Online (Sandbox Code Playgroud)

    -fno-asynchronous-unwind-tables:不要生成不必要的部分 .eh_frame

    -O2优化所以asm并不可怕.可选地使用-Os(大小超速)或-O3(包括自动向量化的完全优化).您也可以调整CPU并使用它支持的扩展 -march=native或使用-march=haswell-march=znver1(Zen)

    -s:make较小的可执行文件(strip)

    -c -o main.o:编译但不链接,生成一个名为的目标文件 main.o

  2. 使用objconv生成nasm代码:

    objconv -fnasm main.o
    
    Run Code Online (Sandbox Code Playgroud)

    结果将存储在main.asm.

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

    nasm -f elf32 main.asm
    
    Run Code Online (Sandbox Code Playgroud)

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

    • 从行中删除align=Nexecute/ noexecutewords .SECTION.
    • : functionglobal声明中删除文本
    • 删除该default rel
    • 如果你愿意,删除空白部分等
  4. main.o使用gcc 链接在步骤3中由Nasm生成的结果:

    gcc main.o
    
    Run Code Online (Sandbox Code Playgroud)

    你也可以使用ld链接它,但它更难.

  • 你可能至少应该使用“gcc -O2”来优化,除非你特别想要一个你不想看到的带有asm的低效臃肿可执行文件。 (2认同)

dio*_*ovk 9

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

我有一个脚本自动执行Babken Vardanyan的建议.

  • 使用此工具编译的大多数代码仅用于教学目的.如果编译器进行优化,可能需要"快捷方式",这可能会让学生感到困惑,不是吗?从这个意义上说,更冗长并不是一件坏事. (3认同)