一、GCC常用命令
1、对Hello的基本操作
- Hello.c代码
#include <stdio.h> //此程序很简单,仅仅打印一个 Hello World 的字符串。
int main(void) {
printf("Hello World! \n");
return 0;
}
-
三条命令
①预处理
②编译,将预处理生成的 hello.i 文件编译生成汇编程序 hello.s
③汇编,汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o 的目标文件中。 -
链接
1、静态链接
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行 文件会比较大
text链接静态库,代码尺寸变得极大
2、动态链接
动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统 中把相应动态库加载到内存中去。
链接了许多其他的动态库,主要是linux系统glibc 动态库
二、ELF文件
链接器链接后生成的最终文件为 ELF 格式可执行文件,一个 ELF 可执行文件通常 被链接为不同的段,常见的段譬如.text、.data、.rodata、.bss 等段
.text:已编译程序的指令代码段。
.rodata:ro 代表 read only,即只读数据(譬如常数 const)。
.data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。
.debug:调试符号表,调试器用此段的信息帮助调试。
由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包 含的指令和数据,需要使用反汇编的方法
使用 objdump -S 将其反汇编并且将其 C 语言源代码混合显示出来:
总结
对gcc的一些常用命令更加熟悉,ELF文件也了解的更多