【发布时间】:2016-09-26 15:06:56
【问题描述】:
我正在做一些(非常)低级的编程,但对我来说并不是所有事情都完全清楚。我首先创建一个 .cpp(或 .c)文件,该文件通过 gcc 运行以创建 elf 或目标文件,但什么是目标文件?当我使用“as”编译器时,我得到了目标文件,但是这些是如何使用的?当我们可以有一个直接的二进制文件时,拥有一个目标文件的目的是什么?
【问题讨论】:
标签: compilation elf low-level
我正在做一些(非常)低级的编程,但对我来说并不是所有事情都完全清楚。我首先创建一个 .cpp(或 .c)文件,该文件通过 gcc 运行以创建 elf 或目标文件,但什么是目标文件?当我使用“as”编译器时,我得到了目标文件,但是这些是如何使用的?当我们可以有一个直接的二进制文件时,拥有一个目标文件的目的是什么?
【问题讨论】:
标签: compilation elf low-level
这个问题在这个site上有很清楚的解释。我也把它贴在下面。但我强烈建议你看一下网站上的图表。这将使您对正在发生的事情有更好的高级理解。
在 C++ 中编译源代码文件是一个四步过程。例如,如果您有一个名为 prog1.cpp 的 C++ 源代码文件并执行编译命令
g++ -Wall -ansi -o prog1 prog1.cpp 编译过程如下:
通过使用适当的编译器选项,我们可以在任何阶段停止此过程。
要在预处理器步骤之后停止进程,可以使用 -E 选项:
g++ -E prog1.cpp 扩展的源代码文件将打印在标准输出(默认屏幕)上;如果您愿意,可以将输出重定向到文件。请注意,扩展的源代码文件通常非常大 - 20 行的源代码文件可以轻松生成 20,000 行或更多的扩展文件,具体取决于包含的头文件。
要在编译步骤后停止进程,可以使用 -S 选项:
g++ -Wall -ansi -S prog1.cpp 默认情况下,名为 filename.cpp 的源文件的汇编代码将放在名为 filename.s 的文件中。
要在组装步骤之后停止进程,可以使用 -c 选项:
g++ -Wall -ansi -c prog1.cpp 默认情况下,名为 filename.cpp 的源文件的汇编代码将放在名为 filename.o 的文件中