I was recently fighting some problems trying to compile an open source library on my Mac that depended on another library and got some errors about incompatible library architectures. Can somebody explain the concept behind compiling a C program for a specific architecture? I have seen the -arch compiler flag before and have seen values passed to it such as ppc, i386 and x86_64 which I assume maps to the CPU “language”, but my understanding stops there. If one program uses a particular architecture, do all libraries that it loads need to be on the same architecture as well? How can I tell what architecture a given program/process is running under?
I was recently fighting some problems trying to compile an open source library on
Share
Yes. The idea is to translate C to a sequence of native machine instructions, which have the program coded into binary form. The meaning of “architecture” here is “instruction-set architecture”, which is how the instructions are coded in binary. For example, every architecture has its own way of coding for an instruction that adds two integers.
The reason to compile to machine instructions is that they run very, very fast.
Yes. (Exceptions exist but they are rare.)
If a process is running on your hardware, it is running on the native architecture which on Unix you can discover by running the command
uname -m, although for the human reader the output fromuname -amay be more informative.If you have an executable binary or a shared library (.so file), you can discover its architecture using the
filecommand:You can see that these binaries have been compiled for the very old 80386 architecture, even though my hardware is a more modern i686. The i686 (Pentium Pro) is backward compatible with 80386 and runs 80386 binaries as well as native binaries. To make this backward compatibility possible, Intel went to a great deal of trouble and expense—but they practically cornered the market on desktop CPUs, so it was worth it!