原文:https://blog.youkuaiyun.com/woailincon/article/details/9415935
在Linux等系统的环境中,C语言库及其头文件都是系统的一部分,只要安装了编译工具即可以完成C语言程序的开发。这点与Windows中程序的开发有所不同,Windows中一般需要安装开发包才能进行程序开发。
C语言程序经过编译-汇编-连接,最终生成可执行程序格式。可执行程序中包含两个部分的内容:
程序头
程序主体(二进制机器代码)
在程序头中包含了供操作系统加载的信息,操作系统根据这些信息加载可执行程序。而可执行程序的主体依然是二进制的机器代码。程序在运行的时候,正是靠逐条地执行这些机器代码,形成程序运行的序列。
在Linux操作系统中,普遍使用ELF格式来作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位Intel体系上不同操作系统之间可移植的二进制文件格式。
如果开发者定义了一个二进制接口集合,ELF标准允许用它来支持流线型的软件运行。通过它可以减少不同执行接口的数量,也可以减少重新编程和重新编译的代码。
ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库。
# 理解二进制 两个命令
hexdump -C nginx | less
objdump -d nginx | less # 反汇编常用
# 二进制文件分析(反汇编常用):https://blog.youkuaiyun.com/chen1415886044/article/details/104698084/
# cat test.c
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("hello,程序猿编码\n");
return 0;
}
#
gcc -c test.c # 编译出test.o 文件
objdump -d test.o # 查看
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 89 7d fc mov %edi,-0x4(%rbp)
b: 48 89 75 f0 mov %rsi,-0x10(%rbp)
f: bf 00 00 00 00 mov $0x0,%edi
14: e8 00 00 00 00 callq 19 <main+0x19>
19: b8 00 00 00 00 mov $0x0,%eax
1e: c9 leaveq
1f: c3 retq