2010-03-13 70 views
11

我最近遇到了一些问题,试图在我的Mac上编译一个依赖于另一个库的开源库,并得到了有关不兼容库体系结构的一些错误。有人可以解释为特定架构编译C程序的概念吗?我已经看到-arch编译器标志之前,并看到传递给它的值,如ppc,i386x86_64,我假设它映射到CPU“语言”,但我的理解停在那里。如果一个程序使用特定的体系结构,那么它加载的所有库都需要在同一个体系结构中?我怎么知道给定的程序/进程正在运行的架构?编译具有特定体系结构的C程序

回答

13

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

1

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

3

这里可能会引起混淆的一件事是,Mac平台有他们所说的universal binary,这是一个存档中的两个二进制文件,一个用于intel,另一个用于ppc体系结构。您的电脑将自动决定运行哪一个。您可以(有时)在仿真模式下运行另一个架构的二进制文件,并且某些架构是其他架构的超集(即i386代码通常运行在i486,i586,i686等),但大多数情况下只有代码你可以运行你的处理器架构的代码。

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

1

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