gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:54:50 24 4
gpt4 key购买 nike

测试平台为32位Linux。

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

我正在 Windows 和 Linux 平台上进行项目分析 asm 代码,所以我想如果它们都可以由像 nasm\yasm 这样的平台无关的汇编器编译,我可能会更轻松......

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

最佳答案

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

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

    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的目标文件

  2. 使用objconv生成 nasm 代码:

    objconv -fnasm main.o

    结果将存储在main.asm中。

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

    nasm -f elf32 main.asm

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

    • .SECTION 行中删除 align=Nexecute/noexecute 字样。
    • global 声明中删除文本 : function
    • 删除default rel
    • 如果您愿意,可以删除空白部分等
  4. 链接 Nasm 在步骤 3 中使用 gcc 生成的 main.o:

    gcc main.o

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

关于assembly - 如何在Linux上从c源代码生成nasm可编译的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com