当前位置: 首页 > article >正文

动静态库原理与ELF文件详解

1. 什么是库所有的库本质都是源文件对应的 .o 文件动静态库中不要包含 main 函数静态库: .a[linux]、.lib[windows]动态库:.so[linux]、.dll[windows]2. 静态库静态库.a程序在链接的时候把代码链接到可执行文件中程序运行的时候不再需要静态库编译默认使用动态链接库gcc的 -static 强制设置链接静态库2.1 静态库生成静态库命名必须遵守 libxxx.aar -rc libmyc.a *.o # 把所有 .o 文件打包成 xxx.a2.2 静态库使用# 场景1头文件和库文件安装到系统路径下 gcc main.c -lmystdio # 场景2头文件和库文件和我们的源文件在同一个路径下 gcc main.c -L . -lmymath # 场景3头文件和库文件有自己的独立路径 gcc main.c -I 头文件路径 -L 库文件路径 -lmymath选项可以不留空格-L指定库路径-I大写指定头文件搜索路径-l小写指定库名库文件名称和引入库的文件去掉前缀 lib 和 后缀 .a / .so 如 libc.a - c3. 动态库动态库.so程序在运行的时候才去链接动态库的代码多个程序共享使用库的代码动态库可以在多个程序间共享所以动态链接使得可执行文件更小节省磁盘空间3.1 动态库生成# 1. 生成位置无关的目标文件 .o gcc -c -fPIC test.c add.c ... # 2. 生成动态库 gcc -shared -o libmy.so *.oshared表示生成共享库模式fPIC产生位置无关码库文件名称和引入库的文件去掉前缀 lib 和 后缀 .a / .so 如 libc.so - c3.2 动态库的使用gcc main.c -I 头文件路径 -L 库文件路径 -lmymath选项可以不留空格L指定库路径I大写指定头文件搜索路径l小写指定库名3.3 库运行搜索路径问题编译时用 -L 能找到库生成可执行文件但是系统不知道导致运行时找不到对应库文件解决方法拷贝 .so 文件到系统共享库路径下一般指 /usr/lib、/usr/local/lib、/lib64 或者开篇指明的库路径向系统库路径下建立同名软连接更改环境变量临时常用LD_LIBRARY_PATHldconfig方案配置 /etc/ld.so.conf.d/,使用ldconfig更新3.4 总结结论1gcc/g默认使用动态库想用静态链接只能提供静态库并加 -static结论2在linux系统下默认情况安装的大部分库默认都优先安装的是动态库结论3库应用程序 1n结论4vs不仅仅形成可执行程序也能形成动静态库4. 目标文件.o/.obj可重定位目标文件目标文件.o文件是一个二进制文件文件格式是 ELF是对二进制代码的一种封装动静态库、可执行程序、可重定位目标文件都是 ELF 格式的5. ELF文件ELF文件可重定位目标文件即 xxx.o 文件可执行文件即可执行程序共享目标文件即 xxx.so 文件(静态库是 xxx.o 的打包压缩包不属于)内核转储存放当前程序的执行上下文用于dump信号触发ELF文件组成ELF头描述文件的主要特性程序头表列举所有有效的段和属性节头表包含对节的描述节ELF文件的组成单位包含特定类型的数据代码节(.txt)保存机器指令是程序的主要执行部分数据节(.data)保存已初始化的全局变量和局部静态变量6.ELF从形成到加载轮廓6.1 ELF形成可执行step1前置步骤将多份 C/C 源代码翻译成目标 .o 文件 动静态库ELFstep2将多份 .o 文件 section 进行合并6.2 ELF可执行文件加载一个 ELF 会有多种不同的 Section在加载到内存的时候也会进行 Section 合并形成 segment合并原则相同属性比如可读可写可执行需要加载时申请空间等为什么要将 section 合并成为 segment为了减少页面碎片提高内存效率链接视图 – 对应节头表 Section header table静态链接的时候一般关注的是链接视图执行视图 – 对应程序头表 Program header table如何加载可执行文件告诉操作系统哪些模块可以被加载进内存ELF HEADER主要目的是定位文件的其他部分7. 链接与加载7.1 静态链接研究静态链接本质就是研究 .o 是如何加载的在 .o 文件中不知道调用函数的地址所以在汇编时编译器只是将函数的跳转地址先暂时设为0链接的时候这个地址会修正多个 .o 合并之后在最终的可执行程序中就知道函数对应的地址了静态链接就是把库中的 .o 进行合并并修正他们的地址链接过程中会涉及到对 .o 中外部符号进行地址重定位7.2 ELF加载与进程地址空间7.2.1 虚拟地址/逻辑地址一个ELF程序在没有被加载到内存的时候就有地址ELF的逻辑地址起始地址偏移量认为是起始地址0进程 mm_struct、vm_area_struct 在刚创建的时候数据从哪里来从 ELF 各个 segment 来每个 segment 都有自己的起始地址和自己的长度用来初始化内核结构中的 [start,end] 等范围数据秒另外再用详细地址填充页表虚拟地址机制不光要OS支持编译器也要支持7.2.2 理解进程地址空间磁盘里的 ELF 存的是虚拟地址加载到内存后内核建立虚拟地址到物理地址的映射CPU 永远用虚拟地址由 MMU 转成物理地址去执行mm_struct 和 vm_area_struct 管理这个映射关系真正的映射写进页表7.3 动态链接与动态库加载库函数调用1.被进程看到动态库映射到进程的地址空间2.被进程调用在进程的地址空间中进行跳转7.3.1 进程如何看到动态库进程通过虚拟地址看到动态库7.3.2 进程间如何共享库的动态库中的代码不会重复出现了7.3.3 动态链接7.3.3.1 概要静态链接会将编译产生的所有目标文件连同用到的各种库合并形成一个独立的可执行文件静态链接的最大问题在于生成的文件体积大并且相当耗费内存资源动态链接将连接的整个过程推迟到了程序加载的时候将需要共享的代码提取出来保存成一个独立的动态链接库等到程序运行的时候再将它们加载到内存不但可以节省空间还因为同一模块在内存中只需要保留一份副本可以被不同的进程共享7.3.3.2 可执行程序_start 函数会调用动态链接器的代码来解析和加载程序所依赖的动态库sharedlibraries。动态链接器会处理所有的符号解析和重定位确保程序中的函数调用和变量访问能够正确地映射到动态库中的实际地址环境变量和配置文件指定动态库搜索路径7.3.3.3 怎么进行库函数调用访问库中任意方法只需要知道库的起始虚拟地址方法偏移量即可定位库中的方法整个调用过程是从代码区跳转到共享区调用完毕再返回代码区整个过程完全在进程地址空间中进行7.3.3.4 全局偏移量表GOT每个进程的每个动态库有独立的 GOT 表所有进程间不能共享 GOT 表在调用函数的时候会先查表然后根据表中的地址来进行跳转这些地址在动态库加载的时候会被修改为真正的地址7.3.3.5 库间依赖库也会调用其他库库之间是有以来的库中也有 GOT库在被调用到时才对函数进行重定位延迟绑定PLT动态链接实际上将链接的整个过程从编译(准确来说是汇编)时推迟到了程序的运行时

相关文章:

动静态库原理与ELF文件详解

1. 什么是库 所有的库,本质都是源文件对应的 .o 文件动静态库中不要包含 main 函数静态库: .a[linux]、.lib[windows]动态库:.so[linux]、.dll[windows] 2. 静态库 静态库(.a):程序在链接的时候把代码链接到可执行文件中&#xff…...

【路径规划】基于时空A星算法求解带时间约束的多机器人路径规划问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

server.impl.ts 文件分析

server.impl.ts 文件分析 文件概述 server.impl.ts 是 OpenClaw 项目的网关服务器实现文件,负责启动和管理整个网关服务。它包含了网关服务器的核心功能,如配置加载、认证授权、通道管理、WebSocket 服务器、插件系统、健康监控等。 文件结构与功能分析 详细注释 import…...

[测试] Phase 1 Notion Draft

新一轮技术发布潮已然到来,工程团队在实际落地过程中遇到的事故与挑战成为关注焦点。近期多个新框架和开源工具陆续上线,开发者们在真实环境下进行了深度实测,结果令人深思。 技术发布背后的工程事故 在某次新框架发布后,团队迅速…...

Spring Boot 3.x 集成 AI 智能体实战

Spring Boot 3.x 集成 AI 智能体实战 本文介绍如何使用 Spring Boot 3.x 构建 AI 智能体应用,涵盖核心概念和详细实战步骤,帮助开发者快速上手智能体开发。 核心概念 Spring Boot 3.x:最新的 Spring Boot 版本,支持现代化开发特性…...

【第10篇】Mamba 100篇合集 · 从入门到天花板

【第10篇】Mamba 100篇合集 从入门到天花板 副标题:从技术到战略:Mamba 为何能成为 AI 换道超车的核心? 作者:华夏之光永存 专栏:Mamba 100篇全集 从入门到道级天花板 卷属:第一卷 入门篇(第…...

TCL发布会解析:Q9M Pro领衔,T7M系列双星登场,163吋Micro LED双曜压轴

3月17日,“当技术站上巅峰 普惠才有力量”2026 TCL SQD-Mini LED电视春季新品发布会隆重举行,TCL重磅推出Q9M Pro、T7M Pro、T7M Ultra、Max163M Pro、Max163M等一系列王炸级电视新品。其中,Q9M Pro、T7M Pro以及T7M Ultra系列的上市&#xf…...

某国赛CTF逆向题目Writeup:re2

目录脱壳第一层EXE第二层EXEFLAG脱壳 010打开 UPX改了特征码,版本5.1.0 直接拖到ida分析不出来 这里我们选择动态调试脱壳,先找OEP,f9运行到入口 触发TLS回调函数断点,停在了ret上 64位UPX壳中不会用一个明显的跨段jmp指令跳…...

深度拆解DeFi经典漏洞案例,Sonne Finance Exploit

在 DeFi 安全事件中,发生在 Sonne Finance上的漏洞非常具有研究价值。攻击者并没有利用传统的重入漏洞或闪电贷操纵,而是利用 借贷协议中“利率与份额计算的精度错误”,最终在几笔交易中抽走约 2000 万美元资产。这类漏洞本质属于 share acco…...

百度文库免vip下载文档_百度文库vip兑换码

这个还是我朋友给我说的一个工具,可以直接下载文档。也不需要登录会员。给大家看一下。方法在这:点我去下载 这个就是测试下载的文档,还是不错的。大家有需要可以去试试看 今日密码在这...

DevSecOps平台建设之Vue3可视化和代码示例

这是我们结合的一份关于Vue3基础理论知识和代码案例的开发教程 Vue2 和 Vue3 最根本的区别在于响应式系统的实现方式,这一变化解决了 Vue2 在数据监听方面的诸多局限性。 Vue2 的 Object.defineProperty 实现 Vue2 使用 Object.defineProperty 来实现响应式系统&…...

免费查AI率的网站有哪些?这3个亲测靠谱

免费查AI率的网站有哪些?这3个亲测靠谱 上周帮室友改论文,她用DeepSeek写了一章文献综述,结果学校预检AI率直接飙到60%多。她问我有没有免费查AI率的地方,想先自己测一下到底哪些段落被标红了。 说实话,现在网上搜&quo…...

南昌本地靠谱的整木定制公司

在南昌,随着人们生活品质的提高,对于家居装修的要求也越来越高,整木定制成为了许多别墅、大平层和高端住宅业主的首选。然而,市场上的整木定制公司众多,如何选择一家靠谱的公司成为了一个难题。今天,就为大…...

记忆函数 II 题解

题目链接 2630. 记忆函数 II - 力扣(LeetCode) 思路 题目所提到 相等才给出缓存的结果,那么我们用 hash 的想法,给每个参数记录下来 对于简单数据类型 —— 值相等 ,类型相等即可 对于复杂数据类型 —— 需要是指…...

2026年,绿壳蛋为何成为餐桌新宠?揭秘专业生产背后的品质坚守

清晨,当你敲开一枚温润如玉的绿壳蛋,看着橙黄透亮的蛋黄在平锅中慢慢凝固,或许不会想到,这枚小小的鸡蛋背后,是一场从田间到餐桌的现代农业品质革命。近年来,绿壳蛋以其独特的营养价值与生态概念&#xff0…...

【MinerU】技术深度解析:开源PDF文档智能提取的利器

文章目录MinerU技术深度解析:开源PDF文档智能提取的利器一、引言二、核心功能特性2.1 智能内容提取2.2 高精度识别能力2.3 技术优势三、技术架构解析3.1 整体架构3.2 核心技术栈3.2.1 PDF-Extract-Kit3.2.2 多后端支持3.3 处理流程详解步骤1:文档类型检测…...

Spring Boot 3.5正式普及!Java虚拟线程+GraalVM原生镜像,启动仅0.3秒

文章目录前言虚拟线程:终于不用为"开线程"心疼了传统线程就像全职员工虚拟线程是"临时工大军"GraalVM原生镜像:Java的"预制菜"革命JVM启动慢是为啥?AOT编译:直接把菜炒好端上桌上手实操&#xff1a…...

做立辉物性表学到的word技巧

在word, 如何不让第一页的页眉设置跑到第二页? 插入分节符:首先,将光标放在第一页内容的末尾。然后点击Word顶部菜单栏的【布局】→【分隔符】→ 在“分节符”中选择【下一页】-1-3-8。这一步会把文档分成两个独立的“节”,第一页…...

geocode.com.cn:经纬度查询省市县乡街道的地理编码服务

在很多业务里,用户上传的并不是详细地址,而是一组经纬度。比如外勤打卡、物流轨迹、设备定位、地图标注、风控分析、LBS 推荐、乡镇级数据统计等场景,系统真正需要的往往不是“坐标”,而是“这个点属于哪个国家、哪个省、哪个市、…...

Windows系统漏洞MS17-010全解析

Windows操作系统的定义Windows是由微软公司开发的一系列图形用户界面操作系统,主要用于个人电脑、服务器和移动设备。它提供了直观的交互方式,支持多任务处理,并兼容广泛的硬件和软件。主要特点图形用户界面(GUI)&…...

2026年高校AI检测政策收紧:免费降ai工具还能用多久

2026年高校AI检测政策收紧:免费降ai工具还能用多久 2025年秋季学期,教育部发布了一份关于加强高校学术诚信建设的指导意见,其中明确提到了对AI辅助写作的规范要求。到了2026年春季,多所高校跟进出台了具体的AI检测执行方案。 政…...

模型解释技术特征重要性可视化

模型解释技术特征重要性可视化:揭开黑箱的钥匙 在人工智能和机器学习快速发展的今天,复杂模型(如深度神经网络、集成模型等)的“黑箱”特性一直是困扰研究者和应用者的难题。模型解释技术通过揭示模型内部决策逻辑,帮…...

深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告

深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告 引言:自动驾驶架构的范式转移与“以规划为导向”的哲学 在自动驾驶技术的发展演进中,系统架构经历了从基于规则的专家系统到模块化深度学习流水线,再到如今端到端(End-to-End, E2E)神经网络架构…...

Rust的Box堆分配与栈上大数组在递归数据结构中的选择标准

Rust作为一门注重安全与性能的系统级编程语言,在内存管理上提供了独特的设计选择。其中,递归数据结构的内存分配策略尤为关键,开发者常常需要在Box堆分配与栈上大数组之间做出权衡。本文将深入探讨这两者的选择标准,帮助开发者在不…...

Go JSON 序列化性能对比与优化

Go JSON 序列化性能对比与优化 在现代Web开发中,JSON作为数据交换的主流格式,其序列化性能直接影响系统的吞吐量和响应速度。Go语言凭借高效的并发模型和简洁的语法,成为许多高性能服务的首选,但其标准库的JSON序列化性能在某些场…...

安全测试入门:OWASP Top 10

安全测试入门:OWASP Top 10 在数字化时代,网络安全威胁日益严峻,企业和开发者亟需掌握安全测试的核心知识。OWASP(开放网络应用安全项目)发布的Top 10榜单,是公认的Web应用安全风险权威指南。它为安全测试…...

组织技术矩阵式团队与功能式团队的管理效率对比

组织技术矩阵式团队与功能式团队的管理效率对比 在现代企业管理中,团队组织方式直接影响管理效率。矩阵式团队和功能式团队是两种常见的结构,前者强调跨部门协作,后者则以职能分工为核心。本文将从决策效率、资源调配、沟通成本、创新能力和…...

拆分管理化技术中的拆分计划拆分实施拆分验证

拆分管理化技术是现代项目管理中的核心方法之一,其核心环节包括拆分计划、拆分实施和拆分验证。通过将复杂任务分解为可管理的小模块,团队能够更高效地推进项目,同时降低风险。这一技术广泛应用于软件开发、工程建设等领域,尤其适…...

用ip命令替代过时的ifconfig和route命令

在Linux网络管理的演进历程中,ifconfig和route曾是管理员最熟悉的工具。随着网络技术的复杂化,这些传统命令逐渐显露出功能局限和兼容性问题。如今,ip命令作为iproute2工具集的核心组件,以更强大的功能和统一的语法成为现代Linux系…...

边缘设备管理平台搭建

边缘设备管理平台搭建:赋能智能时代的终端管控 在物联网和5G技术快速发展的今天,边缘计算成为数据处理的关键节点。边缘设备管理平台作为连接海量终端与云端的中枢,能够实现设备高效管控、数据实时处理及资源灵活调度。如何搭建一个稳定、安…...