Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS上编译程序集源代码并将文件转换为对象/可执行文件_Macos_Gcc_Assembly - Fatal编程技术网

Macos 在Mac OS上编译程序集源代码并将文件转换为对象/可执行文件

Macos 在Mac OS上编译程序集源代码并将文件转换为对象/可执行文件,macos,gcc,assembly,Macos,Gcc,Assembly,我对编程非常陌生,我有一个关于在Mac OS上编译汇编语言的问题。我知道要将我的.c转换为.s,我应该使用gcc-m32-s。但是,我已经编写了自己的.s文件。我想知道是否有可能转换我制作的.s,以便我的Mac可以编译它。 问题是我想编译.c和.s以验证它们都返回相同的值。您是否尝试将.s文件传递给编译器?如果它写得正确,那么它将被转换成一个对象文件和/或一个可执行文件 下面是一个最简单的例子: $ cat 1.s # two lines of a program .global _main #

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

您是否尝试将
.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

生成扩展名为
.s
的部件代码后,使用以下命令:

gcc -o executable-binary-file-name assembly.s    
例如,如果您的程序集文件名为
my.s
,并且您希望您的可执行文件名为
my
,则使用以下命令:

gcc -o my my.s  

gcc本身可用于编译.s文件。首先尝试使用C中的原始版本(这样您就知道语法和内容是有效的,并且可以生成二进制文件)。(比如,
gcc-m32,\u s_file_从\u c.s-o binary_name
)您自己创建的
.s
文件-它是否通过
syscall
int 0x80
进行系统调用?这是
.s
文件的32位还是64位代码?这在Mac上肯定不行(Mac用前导下划线装饰符号)。你真的在macOS上试过吗?@fuz:但是运行
gcc-m32-foo.s
会起作用,其中
foo.s
是由
gcc-m32-O3-sfoo.c
生成的,这是答案的关键。i、 e.即使该示例特定于ELF平台,其中未使用前导的
,总体建议是在“编写正确”的
.s
上运行
gcc foo.s
。@PeterCordes Yes。尽管OP的例子在OSX上实际上不起作用,但它在某种程度上是如何让东西在OSX上工作的一个很好的例子。-ish?@fuz你抓住了我:从来没有尝试过在MacOS主机上运行这个例子。我将把我的示例改为使用
\u main
而不是
main
-这足够了吗?@fuz:gcc 1.s/
/aout
部分很好。OP已经有了一个
.s
,他们想要编译。但是,是的,这个例子肯定是一个更好的答案。it’s fixed to work on OS X,这就是我以前没有升级投票的原因P(格里戈里:OP需要
-m32
,这是编译以及组装+链接时所必需的。)