Compilation C++;汇编

Compilation C++;汇编,compilation,elf,low-level,Compilation,Elf,Low Level,我正在做一些(非常)低级的编程,但并不是所有的事情对我来说都是完全清楚的。我首先创建一个.cpp(或.c)文件,通过gcc运行该文件来创建一个elf或对象文件,但什么是对象文件?当我使用“as”编译器时,我会得到目标文件,但是这些文件是如何使用的?当我们可以有一个直接的二进制文件时,有一个目标文件的目的是什么?在这个问题上有一个非常清楚的解释。我也把它贴在下面。但我强烈建议你看看网站上的图表。这将使你对正在发生的事情有更好的高层理解 编译C++中的源代码文件是一个四步过程。例如,如果您有一个名为

我正在做一些(非常)低级的编程,但并不是所有的事情对我来说都是完全清楚的。我首先创建一个.cpp(或.c)文件,通过gcc运行该文件来创建一个elf或对象文件,但什么是对象文件?当我使用“as”编译器时,我会得到目标文件,但是这些文件是如何使用的?当我们可以有一个直接的二进制文件时,有一个目标文件的目的是什么?

在这个问题上有一个非常清楚的解释。我也把它贴在下面。但我强烈建议你看看网站上的图表。这将使你对正在发生的事情有更好的高层理解

<>编译C++中的源代码文件是一个四步过程。例如,如果您有一个名为Pr1.1.CPP的C++源代码文件,则执行编译命令

g++-Wall-ansi-o prog1 prog1.cpp 编译过程如下所示:

  • C++预处理器将包含的头文件的内容复制到源代码文件中,生成宏代码,并用其值定义使用y*定义定义的符号常量。
  • 由C++预处理器生成的扩展源代码文件被编译成平台的汇编语言。
  • 编译器生成的汇编代码被汇编成平台的目标代码
  • 汇编程序生成的目标代码文件与用于生成可执行文件的任何库函数的目标代码文件链接在一起
  • 通过使用适当的编译器选项,我们可以在任何阶段停止此过程

  • 要在预处理器步骤后停止进程,可以使用-E选项:

    g++-E prog1.cpp 扩展的源代码文件将打印在标准输出上(默认为屏幕);如果愿意,可以将输出重定向到文件。请注意,扩展的源代码文件通常非常大—一个20行的源代码文件可以轻松生成20000行或更多行的扩展文件,具体取决于包含的头文件

  • 要在编译步骤后停止进程,可以使用-S选项:

    g++-Wall-ansi-S prog1.cpp 默认情况下,名为filename.cpp的源文件的汇编代码将放在名为filename.s的文件中

  • 要在组装步骤后停止进程,可以使用-c选项:

    g++-Wall-ansi-c prog1.cpp 默认情况下,名为filename.cpp的源文件的汇编代码将放在名为filename.o的文件中


  • 在这个问题上有一个非常清楚的解释。我也把它贴在下面。但我强烈建议你看看网站上的图表。这将使你对正在发生的事情有更好的高层理解

    <>编译C++中的源代码文件是一个四步过程。例如,如果您有一个名为Pr1.1.CPP的C++源代码文件,则执行编译命令

    g++-Wall-ansi-o prog1 prog1.cpp 编译过程如下所示:

  • C++预处理器将包含的头文件的内容复制到源代码文件中,生成宏代码,并用其值定义使用y*定义定义的符号常量。
  • 由C++预处理器生成的扩展源代码文件被编译成平台的汇编语言。
  • 编译器生成的汇编代码被汇编成平台的目标代码
  • 汇编程序生成的目标代码文件与用于生成可执行文件的任何库函数的目标代码文件链接在一起
  • 通过使用适当的编译器选项,我们可以在任何阶段停止此过程

  • 要在预处理器步骤后停止进程,可以使用-E选项:

    g++-E prog1.cpp 扩展的源代码文件将打印在标准输出上(默认为屏幕);如果愿意,可以将输出重定向到文件。请注意,扩展的源代码文件通常非常大—一个20行的源代码文件可以轻松生成20000行或更多行的扩展文件,具体取决于包含的头文件

  • 要在编译步骤后停止进程,可以使用-S选项:

    g++-Wall-ansi-S prog1.cpp 默认情况下,名为filename.cpp的源文件的汇编代码将放在名为filename.s的文件中

  • 要在组装步骤后停止进程,可以使用-c选项:

    g++-Wall-ansi-c prog1.cpp 默认情况下,名为filename.cpp的源文件的汇编代码将放在名为filename.o的文件中


  • 可能复制的可能复制的辉煌!这正好回答了我的问题!但是如果它编译成汇编,为什么在裸机编程中需要一个堆栈呢?嗯,你能给我指出一个你从中获得这些信息的来源吗?这将是更容易澄清。对不起,我有点晚了,我正在尝试写一个操作系统,为树莓PI优化,并陷入了一些麻烦,因为整个“实际上加载OS”部分,为什么我不能使用所有的C++特性,由于堆栈问题,我假设。问:但对于覆盆子派来说,这是我的长期目标。太棒了!这正好回答了我的问题!但是如果它编译成汇编,为什么在裸机编程中需要一个堆栈呢?嗯,你能给我指出一个你从中获得这些信息的来源吗?这将是更容易澄清。对不起,我有点晚了,我正在尝试写一个操作系统,为树莓PI优化,并陷入了一些麻烦,因为整个“实际上加载OS”部分,为什么我不能使用所有的C++特性,由于堆栈问题,我假设。但对于覆盆子派来说,问题是我的长期目标。