使用特定体系结构编译C程序

Mar*_*oft 13 c c++ compiler-construction

我最近在尝试编译我的Mac上的开源库时遇到了一些问题,这些库依赖于另一个库并且在不兼容的库架构方面遇到了一些错误.有人可以解释为特定架构编译C程序背后的概念吗?我已经看到了-arch之前编译器标志,并看到传递给它如价值观ppc,i386x86_64我假设映射到CPU的"语言",但我的理解停在那里.如果一个程序使用特定的体系结构,那么它加载的所有库都需要在同一个体系结构上吗?如何判断给定程序/进程在哪种体系结构下运行?

Nor*_*sey 16

有人可以解释为特定架构编译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
Run Code Online (Sandbox Code Playgroud)

您可以看到这些二进制文件已经针对非常古老的80386体系结构进行了编译,即使我的硬件是更现代的i686.i686(Pentium Pro)向后兼容80386,运行80386二进制文件以及本机二进制文件.为了实现这种向后兼容性,英特尔遇到了大量麻烦和费用 - 但它们几乎垄断了台式机CPU的市场,所以值得!