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文件不足以支撑程序的执行,还需要其他的一些东西来执行文件。

进程虚拟地址空间

每个进程都有4g的虚拟空间
但是实际上的空间要比4g小的多
在执行的时候虚拟地址会转化为实际地址

地址以字节编码
1 Byte = 8bits
常以16进制表示
0x3c = 0011 1100

虚拟内存用户空间每个进程一份
虚拟内存内核空间所有进程共享一份
虚拟内存mmap段中的动态链接库仅在物理内存中装载一份

以上是关于C语言编译器icc与gcc编译出来的执行文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装icc编译器

linux gcc编译参数有啥用?

如何强制 OpenMPI 使用 GCC 而不是 ICC?是不是需要重新编译 OpenMPI?

Linux之gcc与g++编译器

gcc 和VC++有啥区别呢,VC++编译时用的编译器 相当于gcc的是啥东西

linux下c编程怎么编译