【问题标题】:Compiling an assembly source on Mac OS and converting file to object/executable在 Mac OS 上编译汇编源并将文件转换为对象/可执行文件
【发布时间】:2018-03-15 16:11:02
【问题描述】:

我对编程很陌生,我有一个关于在 Mac OS 上编译汇编语言的问题。我知道要将我的.c 转换为.s,我应该使用gcc -m32 -S。但是,我已经编写了自己的 .s 文件。我想知道是否可以转换我制作的.s,以便我的 Mac 可以编译它。 问题是我想编译 .c.s 以验证它们是否返回相同的值。

【问题讨论】:

  • gcc 本身可用于编译 .s 文件。首先尝试使用 C 中的原始版本(这样您就知道语法和内容是有效的并且可以生成二进制文件)。 (如gcc -m32 that_s_file_produced_from_c.s -o binary_name
  • 您自己创建的 .s 文件 - 它是通过 syscallint 0x80 进行系统调用吗?这是.s文件是32位还是64位代码?

标签: macos gcc assembly


【解决方案1】:

您是否只是尝试将.s 文件传递​​给编译器?如果编写正确,那么它只会被转换为目标文件和/或可执行文件。

这是一个应该可以工作的最小示例:

$ cat 1.s # two lines of a program
.global _main # MacOS expects symbol names decorated
_main: retq # a single return instruction in `main`'s body
$ gcc 1.s # compile it
$ ./a.out # run the resulting program

【讨论】:

  • 这绝对不会在 Mac 上以这种方式工作(它用前导下划线装饰符号)。你真的在 macOS 上试过吗?
  • @fuz: 但是运行gcc -m32 foo.s 会起作用,其中foo.s 是由gcc -m32 -O3 -S foo.c 生成的,这就是这个答案的重点。即,即使该示例特定于没有使用前导 _ 的 ELF 平台,总体建议是在“正确编写”的 .s 上运行 gcc foo.s
  • @PeterCordes 是的。尽管 OP 的示例实际上不能在 OS X 上运行,但它在某种程度上是一个很好的例子,说明如何使东西在 OS X 上运行。-ish?
  • @fuz 你抓住了我:从未尝试在 MacOS 主机上运行该示例。我将更改我的示例以使用 _main 而不是 main — 这足够了吗?
  • @fuz:gcc 1.s / ./aout 部分很好。 OP 已经有一个他们想要编译的.s。但是,是的,这绝对是一个 更好 的答案,示例 .s 固定在 OS X 上工作,这就是我之前没有投票的原因。 :P(Grigory:OP 想要-m32,这是编译以及组装+链接时所必需的。)
【解决方案2】:

生成带有扩展名.s 的汇编代码后,使用以下命令:

gcc -o executable-binary-file-name assembly.s    

例如,如果您的程序集文件名为my.s,并且您希望您的可执行文件名称为my,则使用命令:

gcc -o my my.s  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多