【问题标题】:Compiling a C program with a specific architecture编译具有特定架构的 C 程序
【发布时间】:2010-03-13 00:37:16
【问题描述】:

我最近在尝试在我的 Mac 上编译依赖于另一个库的开源库时遇到了一些问题,并且遇到了一些关于库架构不兼容的错误。有人可以解释为特定架构编译 C 程序背后的概念吗?我以前见过-arch 编译器标志,也见过传递给它的值,例如ppc、i386 和x86_64,我假设它们映射到CPU“语言”,但我的理解到此为止。如果一个程序使用特定的架构,它加载的所有库是否也需要位于相同的架构上?如何判断给定程序/进程在什么架构下运行?

【问题讨论】:

    标签: c++ c compiler-construction


    【解决方案1】:

    有人可以解释为特定架构编译 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 市场,所以这是值得的!

    【讨论】:

      【解决方案2】:

      这里可能令人困惑的一点是,Mac 平台有他们所谓的universal binary,它实际上是一个存档中的两个二进制文件,一个用于英特尔,另一个用于 ppc 架构。您的计算机将自动决定运行哪一个。您可以(有时)在仿真模式下为另一个架构运行二进制文件,并且某些架构是其他架构的超集(即 i386 代码通常会在 i486、i586、i686 等上运行)但大多数情况下是唯一的代码你可以运行的是你的处理器架构的代码。

      对于交叉编译,不仅程序,而且它使用的所有库,都需要与目标处理器兼容。有时这意味着要安装第二个编译器,有时这只是为编译器提供正确的额外模块的问题。 gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch 的交叉编译器。各种架构的 gcc 交叉编译器很可能是单独安装的。

      【讨论】:

        【解决方案3】:

        要构建与 CPU 原生架构不同的架构,您将需要一个交叉编译器,这意味着生成的代码无法在您所在的机器上原生运行。 GCC 可以很好地做到这一点。要找出程序是为检查文件命令而构建的体系结构。至少在基于 Linux 的系统中,32 位 x86 程序将需要 32 位 x86 库来配合它。我想大多数操作系统都是一样的。

        【讨论】:

          【解决方案4】:

          ldd 在这种情况下有帮助吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-18
            相关资源
            最近更新 更多