linux 二进制程序运行原理

原文: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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值