加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 编译具有特定架构的C程序

发布时间:2020-12-16 05:40:08 所属栏目:百科 来源:网络整理
导读:我最近正在尝试在Mac上编译一个开源库,这取决于另一个库,并且对于不兼容的库架构有一些错误.有人可以解释编译特定架构的C程序的概念吗?我已经看到了-arch编译器标志,并且已经看到传递给它的值,如ppc,i386和x86_64,我假设映射到CPU“语言”,但我的理解在那里
我最近正在尝试在Mac上编译一个开源库,这取决于另一个库,并且对于不兼容的库架构有一些错误.有人可以解释编译特定架构的C程序的概念吗?我已经看到了-arch编译器标志,并且已经看到传递给它的值,如ppc,i386和x86_64,我假设映射到CPU“语言”,但我的理解在那里停止.如果一个程序使用特定的架构,那么它所加载的所有库都需要在同一架构上?我如何知道给定程序/进程运行的是什么架构?

解决方法

Can somebody explain the concept behind compiling a C program for a specific architecture?

是.这个想法是将C转换成一系列本地机器指令,将程序编码成二进制形式.这里的“架构”的含义是“指令集架构”,这是指令如何以二进制编码.例如,每个架构都有自己的编码方式来编写一个添加两个整数的指令.

编译到机器指令的原因是它们运行非常非常快.

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?

如果一个进程在硬件上运行,则它运行在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,for GNU/Linux 2.6.8,stripped

您可以看到,这些二进制文件已经为旧的80386架构编译,即使我的硬件是更现代化的i686. i686(Pentium Pro)向后兼容80386,并运行80386二进制文件以及本地二进制文件.为了使这种向后兼容性成为可能,英特尔付出了很大的麻烦和费用,但是他们几乎在桌面CPU上占据了市场份额,所以值得!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读