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

时间:2013-12-23 06:12:25

标签: assembly nasm gas tasm yasm

测试平台是32位Linux。

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

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

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

3 个答案:

答案 0 :(得分:32)

我发现这是一种更好的方法来反汇编目标文件,而不是使用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:制作较小的可执行文件(strip)

    -c -o main.o:编译但不链接,生成名为main.o的对象文件

  2. 使用objconv生成nasm代码:

    objconv -fnasm main.o
    

    结果将存储在main.asm

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

    nasm -f elf32 main.asm
    

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

    • align=N行中删除executenoexecute / .SECTION字词。
    • : function声明
    • 中删除文字global
    • 删除default rel
    • 如果您愿意,可以删除空白部分
  4. 使用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)