有人可以解释为特定架构编译 C 程序背后的概念吗?
是的。这个想法是将C翻译成一系列本地机器指令,将程序编码成二进制形式。这里的“架构”的意思是“指令集架构”,也就是指令是如何以二进制编码的。例如,每种架构都有自己的编码方式,用于将两个整数相加的指令。
编译成机器指令的原因是它们运行得非常非常快。
如果一个程序使用特定架构,它加载的所有库是否也需要位于同一架构上?
是的。 (有例外,但很少见。)
我如何知道给定程序/进程在什么架构下运行?
如果一个进程在您的硬件上运行,它运行在本机架构上,在 Unix 上您可以通过运行命令 uname -m 来发现它,尽管对于人类读者来说,uname -a 的输出可能会提供更多信息。
如果您有可执行二进制文件或共享库(.so 文件),您可以使用file 命令发现其架构:
% file /lib/libm-2.10.2.so
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
您可以看到这些二进制文件是为非常古老的 80386 架构编译的,尽管我的硬件是更现代的 i686。 i686 (Pentium Pro) 向后兼容 80386 并运行 80386 二进制文件以及本机二进制文件。为了使这种向后兼容成为可能,英特尔付出了很多麻烦和费用——但他们实际上垄断了台式机 CPU 市场,所以这是值得的!