在给定 C++ 文件输入的情况下,机器的哪些组件会影响生成的机器代码?
What components of a machine affect the machine code produced given a C++ file input?
我写了这个问题What affects generated machine code at each step of the compilation process?并意识到范围太广了。所以我会试着用不同的问题来问它的每个组成部分。
我要问的第一个问题是,给定一个任意的 C++ 文件,什么会影响它生成的可执行二进制文件?到目前为止我理解以下每一个都在起作用
- CPU 架构,如 x86_64、ARM64、Power PC、Microblaze 等
- 机器的内核如Linux内核v5.18、v5.17、Windows内核版本、Mac内核版本等
- Debian、Cent等操作系统OS、Windows7、Windows10、MacOSX Mountain Lion、Mac OS X 塞拉利昂。
- 不确定 OS 在内核更改之上发生了什么变化。
- 最后用来编译、汇编的工具link。诸如 GCC、Clang、Visual Studio (VS)、GNU 汇编器、GNU 编译器、VS 编译器、VS linker 等
所以我从中得到的 2 个问题是
- 是否还有我遗漏的其他组件会影响最终可执行文件的外观?
- 操作系统对最终可执行的机器代码有影响吗?因为我以为这都是内核的问题。
我认为您缺少的主要内容是 Application Binary Interface。 ABI的一部分是调用约定,它决定了寄存器使用和参数传递的某些属性,因此这些直接影响生成的机器代码。
内核有一个加载程序,该加载程序适用于文件格式,如 ELF 或 PE。这些通过确定进程的布局以及程序代码和数据如何加载到内存中以及机器代码指令如何访问数据和其他代码来影响机器代码。例如,某些环境需要与位置无关的代码,这会影响某些机器代码指令。
The CPU architecture like x86_64, ARM64, Power PC, Microblaze, ect.
是的。指令集架构定义了可用的指令,进而定义了可用的 CPU 寄存器、它们的使用方式以及指针等内容的大小。
The kernel of a machine like Linux kernel v5.18, v5.17, a Windows Kernel version, a Mac kernel version ect.
不是真的。不过,操作系统的选择会影响 ABI,这是非常相关的。
The operating system such as Debian, CentOS, Windows 7, Windows 10, Mac OS X Mountain Lion, Mac OS X Sierra.
操作系统通常决定 ABI,这很重要。
the tools used to compile, assembly and link. Things like GCC, Clang, Visual Studio (VS), GNU assembler, GNU compiler, VS Compiler, VS linker, ect.
当然,不同的工具会产生一些不同的机器码,有时差异是相同的,尽管对于某些输入,有些工具会产生比其他工具更好的机器码。
我写了这个问题What affects generated machine code at each step of the compilation process?并意识到范围太广了。所以我会试着用不同的问题来问它的每个组成部分。
我要问的第一个问题是,给定一个任意的 C++ 文件,什么会影响它生成的可执行二进制文件?到目前为止我理解以下每一个都在起作用
- CPU 架构,如 x86_64、ARM64、Power PC、Microblaze 等
- 机器的内核如Linux内核v5.18、v5.17、Windows内核版本、Mac内核版本等
- Debian、Cent等操作系统OS、Windows7、Windows10、MacOSX Mountain Lion、Mac OS X 塞拉利昂。
- 不确定 OS 在内核更改之上发生了什么变化。
- 最后用来编译、汇编的工具link。诸如 GCC、Clang、Visual Studio (VS)、GNU 汇编器、GNU 编译器、VS 编译器、VS linker 等
所以我从中得到的 2 个问题是
- 是否还有我遗漏的其他组件会影响最终可执行文件的外观?
- 操作系统对最终可执行的机器代码有影响吗?因为我以为这都是内核的问题。
我认为您缺少的主要内容是 Application Binary Interface。 ABI的一部分是调用约定,它决定了寄存器使用和参数传递的某些属性,因此这些直接影响生成的机器代码。
内核有一个加载程序,该加载程序适用于文件格式,如 ELF 或 PE。这些通过确定进程的布局以及程序代码和数据如何加载到内存中以及机器代码指令如何访问数据和其他代码来影响机器代码。例如,某些环境需要与位置无关的代码,这会影响某些机器代码指令。
The CPU architecture like x86_64, ARM64, Power PC, Microblaze, ect.
是的。指令集架构定义了可用的指令,进而定义了可用的 CPU 寄存器、它们的使用方式以及指针等内容的大小。
The kernel of a machine like Linux kernel v5.18, v5.17, a Windows Kernel version, a Mac kernel version ect.
不是真的。不过,操作系统的选择会影响 ABI,这是非常相关的。
The operating system such as Debian, CentOS, Windows 7, Windows 10, Mac OS X Mountain Lion, Mac OS X Sierra.
操作系统通常决定 ABI,这很重要。
the tools used to compile, assembly and link. Things like GCC, Clang, Visual Studio (VS), GNU assembler, GNU compiler, VS Compiler, VS linker, ect.
当然,不同的工具会产生一些不同的机器码,有时差异是相同的,尽管对于某些输入,有些工具会产生比其他工具更好的机器码。