ELF文件与gcc简述

一、gcc

GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。 ———— 转自百度百科

由于有些liunx版本不自带gcc,可能需要自行安装,安装链接。

使用vim写一个helloworld.c,用gcc编译

gcc (选项)(参数)

1.1、gcc的几个选项

-E:仅执行编译预处理;预处理为xxx.i
-c:仅执行编译操作,不进行连接操作;
-o:指定生成的输出文件(outfile);
-S:将预处理的xxx.i转换为汇编代码;
-g:产生供gdb调试用的可执行文件;
-O:基本优化(Optimize)产生一个经过优化可执行文件
-O2:最大优化

1.2、gcc参数

C源文件:指定C语言源代码文件。

1.3、编译

  • 无选项编译

    gcc -c helloworld.c //若未指定生成文件,默认生成a.out,这里的-c只是举例

  • 有选项编译
gcc -E  helloworld.c -o helloworld.i  //预处理
gcc -s helloworld.i -o helloworld.s  //生成汇编代码
gcc -c helloworld.c -o helloworld.o //编译生成的则是一个可重定位的目标文件
gcc helloworld.c -o  helloworld  //生成helloworld的elf文件

1.4、gcc在64位环境下编译32位程序

要让64位机支持运行32位应用

  sudo apt-get install lib32c-dev  
  sudo apt-get install lib32stdc++6 
  or
  sudo apt-get install gcc-multilib
  gcc -m32 static.c -o h // 编译32位程序

1.5、静态链接与动态链接

gcc -static static.c -o a  // statically linked

这里写图片描述
关于gcc的详细资料,可以去官网下载官方的pdf文档

二、ELF文件格式

ELF(Executable and linking format)文件格式是运行与unix及类unix系统(如linux)下的文件格式。与运行与windows系统下的PE格式相似,是现在最常见的两种文件格式。

  • 有三种不同的ELF文件类型
    • 可重定位的目标文件(Relocatable)
    • 可执行文件(Executable)
    • 共享库(Shared Object)

ELF 64-bit文件

编译生成的则是一个可重定位的目标文件,file命令查看

编译的到一个ELF可执行文件

查看ELF文件结构(包括文件头、节区头等等,和PE结构类似)

你可能感兴趣的:(总结)