C语言编译器icc与gcc编译出来的执行文件有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编译器icc与gcc编译出来的执行文件有啥区别?相关的知识,希望对你有一定的参考价值。
我有一个C语言源代码,用icc编译会出现警告,有执行文件输出;同样用GCC编译,不会出现警告,输出的执行文件比ICC小,这个编译出的执行文件有什么差别么(注:linux系统编译)
ICC 是intel 针对intel 体系架构开发的编译器,显然,你的代码,如果运行在intel机器上,intel的人开发的编译器,编译出来的可执行代码效率更高。毕竟人家对intel体系结构这么熟悉,里面的优化说明的,肯定做得不错。但是只能运行在intel体系结构上。比如你的PPC的板子就不能运行了。GCC是一般性的通用的编译器,可以编译运行在各种体系结构上的代码,比如intel, PPC, ARM, MIPS。它很通用。里面的开发者,当然也熟悉intel 体系架构。但是也要考虑到通用。所以,是一般化的选择。在intel体系结构上运行的话,可能某些地方不如ICC的效率高。
他们实现的原理基本是一致的,但是在细节上,肯定差别很大。比如针对同一种语句,有的会告警,有的不会。有些支持扩展特性。有些不支持。 参考技术A ICC: intel c++ compiler, intel的c++编译器,针对intel的处理器进行优化编译。
GCC:GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布。 参考技术B 最重要的区别,就是 icc 出的代码在 AMD 的处理器上跑的特别慢,主要是厂商之间的死斗而已。其他没什么主要的。
个人偏好 clang 。
PWN
二进制基础
- 程序的编译与链接
- Linux下的可执行文件格式ELF
- 进程虚拟地址空间
- 程序的装载与进程的执行
- x86amd64汇编简述
程序的编译与链接
从C源代码到可执行文件的生成过程
C语言代码 -> 汇编代码 -> 机器码 -> 可执行文件
- 编译
- 由C语言代码生成汇编代码
gcc -S 文件名
- 汇编
- 由汇编代码生成机器码
gcc 文件名
- 链接
- 将多个机器码的目标文件链接成一个可执行文件
gcc 文件名
在Linux下一步从C编译到机器码gcc 文件名
反汇编从汇编到C语言是可以做到的,但是从汇编代码到高级语言是不现实的。汇编代码和机器代码是一一对应的关系。
目前反汇编的话IDA做的是比较好的。
Linux下的可执行文件格式ELF
- 什么是可执行文件
- 广义:文件中的数据是可执行代码的文件,.out,.exe,.sh,.py等
- 狭义:文件中的数据是机器码的文件.out,.exe,.dll,.so
可执行文件的分类
- Windows:PE(Portable Executable)
- 可执行程序
- .exe
- 动态链接库
- .dll
- 静态链接库
- .lib
- 可执行程序
- Linux:ELF(Executable and Linkable Format)
- 可执行文件
- .out
- 静态链接库
- .so
- 动态链接库
- .a
- 可执行文件
附上大佬的图
- ELF文件
- ELF文件头表
-记录了ELF文件的组成结构 - 程序头表/段表
- 告诉系统如何创建进程
- 生成程序的可执行文件必须拥有此结构
- 重定位文件不一定需要
- 节头表
- 记录了ELF的节的节区信息
- 用于链接的目标文件必须拥有此结构
- 其他类型目标文件不一定需要
- ELF文件头表
在磁盘中的文件断电之后会被存储,但是在内存中的文件断电之后就会消失
一个ELF文件不足以支撑程序的执行,还需要其他的一些东西来执行文件。
进程虚拟地址空间
每个进程都有4g的虚拟空间
但是实际上的空间要比4g小的多
在执行的时候虚拟地址会转化为实际地址
地址以字节编码
1 Byte = 8bits
常以16进制表示
0x3c = 0011 1100
虚拟内存用户空间每个进程一份
虚拟内存内核空间所有进程共享一份
虚拟内存mmap段中的动态链接库仅在物理内存中装载一份
以上是关于C语言编译器icc与gcc编译出来的执行文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 OpenMPI 使用 GCC 而不是 ICC?是不是需要重新编译 OpenMPI?