汇编语言基础及编译原理(网安)
汇编语言基础及编译原理
二进制基础#
程序的编译 汇编与链接#
- 从c语言到可执行程序
源代码.c
编译
汇编代码.s
汇编
目标文件.o
链接(静态库直接拷贝,动态库运行时通过动态链接方式加载)
可执行文件(p)
x86机器指令入门#
栈#
一种先进后出的数据结构
被用于保存函数的局部(保存局部变量和返回地址)
栈往低地址增长
esp栈顶指针
push 入栈
pop 出栈
- 基础指令
mov 寻址
add 加操作
sub 减操作
lea 加载有效地址
inc 加一
dec 减一
imul 乘法
idiv 除法
and or xor 与 或 异或
not neg 非
shl shr 左右移 - jmp
j[condition]
cmp 比较
call ret 函数调用/返回
Intel 与 AT&T#
左右相反
AT&T中$表立即数
%为地址
intel为[]
AT&T为()
调用约定#
调用约定约定了函数之间如何传参 如何传返回值
- 调用者负责清理栈上参数(Caller Clean-up)
cdecl
optlink - 被调用者负责清理栈上参数(Callee Clean-up)
stdcall
fastcall
主要是操作栈(64位寄存器中如果传参少可以直接用寄存器传参)
eax保存返回值
ebp保存栈顶指针
ELF与动态链接#
ELF文件格式#
- Segment:在ELF(Executable and Linkable Format)格式中,segment是指具有相同属性的节(section)的集合。这些属性主要包括可读、可写和可执行等权限。Segment主要描述了磁盘上可执行文件的内存布局以及如何映射到内存中,是程序装载时被内核解析的必要组成部分。
- Section:Section是指包含代码或数据的逻辑区块。例如,一个程序中的全局变量或特定的函数代码都可以构成一个section。Section的信息主要用于链接和调试,它对于程序的执行来说不是必需的,但没有节头表,会使得一些工具如gdb和objdump难以定位符号信息。
Segment和section之间存在密切的关系。一个segment可以包含一个或多个section,而每个section都必须属于某个segment。#
这种结构设计使得程序的不同部分可以根据需要被分配不同的属性和权限。例如,一个典型的程序可能包括一个包含代码的.text section和一个包含未初始化数据的.bss section,它们可能同属于一个具有执行权限的segment
Segment主要关注程序如何被操作系统加载到内存中,而section则更关注程序本身的结构和运行时行为。#
在实际操作中,可以使用如readelf这样的工具来查看ELF文件中segment和section的具体信息。例如,使用readelf -l命令可以显示哪些section被映射到一个segment中,这有助于理解程序的内存布局和优化内存使用#
- ELF Header : 架构版本信息等,以及下面两个的位置和数量
- Program header table : 每个表定义了一个segment,每个segment可包含多个section
- Secton header table : 每个表定义了一个section
readelf -h 查看ELF Header#
readelf -l 查看Program Header#
readelf -S 查看Section Header#
- 通过/proc/[pid]/maps查看内存映射情况
静态链接启动过程#
动态链接与延迟绑定#
- 动态链接是一种运行时才会加载和链接程序所依赖的共享库技术
- linux最常见的共享库 libc
- 重定位
- 待填充项
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构