自我修养——静态链接

《程序员的自我修养》读书笔记2 -- ELF目标文件和静态链接和装载 1. 目标文件的类型 可重定位 阅读详情

半年没更新博客了,一是工作内容变了,二是项目忙,其实就是懒 - - ||

这是第100篇了,不知不觉,点点滴滴,虽不说都是高质量博文,但也算是个里程碑,毕竟都是一手敲出来的文章

最近有点迷茫,脱离android大半年了,发张方向是个迷,程序员生涯接下来的路应该怎么走~ 得好好想想了

空下来 把之前的补上,程序员的自我修养 这本书里面的第三部分

撰写不易,转载需注明出处:http://blog.youkuaiyun.com/jscese/article/details/78320636本文来自 【jscese】的博客!

简单理解

静态链接就是将前面编译好的小.o 按照一定的规则组装到一起,形成一个大的可执行文件EIF


空间和地址分配

组装的规则是所有.o中相同段放到一起,在前文自我修养——目标文件.o有什么,有列出.o文件中的结构,组装规则如下:
这里写图片描述

除了bss段都是占用实际存储空间的
同时链接时会为目标.o中的每段分配虚拟地址

使用 :

objdump -h XX.o

查看段属性,其中的 VMA即为分配的虚拟地址,linux EIF默认虚拟地址从 0x08048000 开始


重定位

多个文件编程中,常用到的是引用其它文件的 函数以及变量,这些引用的函数以及变量在当前文件编译时,找不到具体地址,会先用0或者其它特殊地址代替
并且将此类符号 加入 到 重定位表

可通过如下命令查看.o中需要宠地位的符号:

objdump -r xx.o

在第一步虚拟地址分配之后,重定位步骤时,就会修正text段中的地址为具体的虚拟地址以及操作指令


强弱符号

代码中的函数以及初始化了的全局变量 - 强符号
为初始化的全局变量 -弱符号 (attribute((week/werkref))修饰可以强行设定为弱符号)

链接规则:
1:不允许重复定义强符号
2:强弱共存,选择强符号
3:弱弱共存,选择占用空间大的弱符号

未初始化的全局变量在编译时放在了common段,而不是放在bss段,原因是,需要在链接的时候,根据以上链接规则来决议弱符号的大小,在这之前不知道在bss段中应该定义多大的空间,只有在链接完成时才会将这个全局变量放到bss段中


静态库链接

用的最多的应该是标准C库了,常见libc.a
包含了很多实用的库函数以及功能函数,可用ar 命令查看库中包含的.o

ar -t libc.a

在使用这样的静态库时,也就是同上面一样,在链接的时候,顺藤摸瓜的找到调用的api函数,把该调用函数相关联的所有函数和变量都加载到我们的目标EIF所对应的段中,形成一个可执行完整逻辑的目标文件

有个ABI(application binary interface)的概念,类似于熟知的API,只不过更加深入层次一些,API界定的是函数,ABI界定的是二进制文件中的段的分布格式,地址计算方式,以及符号规则等,能够让链接器 统一识别的一种接口

详细的描述在书中~这里只是简单记录一下

Ubuntu 24.04 搭建 Squid 代理服务器终极指南:从入门到 HTTPS 缓存AI模型 本文详细指导在Ubuntu 24.04系统部署Squid代理服务器,实现AI大模型文件的高效缓存。重点内容包括:1) 安装squid及必备的squid-openssl扩展包;2) 配置HTTPS拦截(SSL-Bumping)功能,创建CA证书和SSL数据库;3) 优化缓存策略,设置4TB存储空间并强制缓存常见大文件格式;4) 结合华为防火墙实现透明代理。文章特别强调实际部署中的关键注意事项和常见错误解决方案,如证书路径配置、权限设置等问题,帮助用户快速搭建企业级缓存代理服务。 阅读详情

相关推荐

STM32 BootLoader 入门教程:从原理到 APP 跳转实现

在 STM32 项目开发中,BootLoader 通常用于实现固件升级、程序引导和应用程序校验。本文从最基础的 BootLoader 原理开始,讲解 STM32 内部 Flash 分区设计、APP 地址偏移、向量表重定位、BootLoader 跳转 APP 的核心代码,以及实际开发中常见的问题。本文适合刚开始接触 STM32 BootLoader、IAP 在线升级、串口升级、OTA 升级的开发者阅读。

lidecong133的博客 1668

《程序员的自我修养》--静态链接

空间分配例子:/*a.c*/ extern int shared; int main() { int a = 100; swap(&a,&shared); return 0; } /*b.c*/ int shared = 1; void swap(int *a,int *b) { int temp; temp = (*a); (*a) = (*b);

zhuziyu1157817544 897

ThingsBoard 仪表板状态

请先通过阅读仪表板概述和仪表板入门案例来熟悉ThingsBoard的仪表板。文章希望通过浅显的文字描述什么是仪表板状态及如何使用。 概念 状态功能使得仪表板可以分层,配合小部件的动作,实现多层仪表板之间的跳转.每个状态对应一个仪表板的图层 每个仪表板有一个默认的根状态, 根状态可以理解为默认状态, 也就是打开仪表板默认展示的仪表板图层.编辑模式下, 点击右上角的图标来管理状态.添加多个状态后左上角出现状态切换(图层切换)下拉列表可以通过选中根状态复选框切换新的默认展示的状态/图层配合小部件的动作,实现状

物联网三分钟 2308

《程序员的自我修养:链接、装载与库》读书笔记:静态链接、动态链接

静态链接、动态链接,目标文件的内容

阿正的梦工坊 1470

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

作为经典畅销书的升级版,本书在第1版的基础上新增了大量新知识(如闪存、UFS、测试、文件系统等),并改写或删减了许多过时或不适用的内容,总修改量超过60%。本书由SSD技术社区SSDFans的核心团队成员联合业界、高校SSD方面的专家共同完成,相对于第1版,内容更全面、更新,也更有深度。本书从产品、技术和应用3个维度展开,全面、详细讲解了SSD的发展历史、产品形态、工作原理、整体架构,以及各个功能模块的原理和使用,从SSD的前端接口协议到FTL算法,再到后端的闪存和纠错,以及测试,本书都有涉及。

阿玥的小博客 3124

一文搞懂鲸鱼优化算法Whale Optimization Algorithm(WOA)!!!(核心原理+数学模型+代码实战+实际应用)

本文详细介绍了鲸鱼优化算法(WOA)的原理与实现。该算法模拟座头鲸气泡网捕食行为,通过包围猎物、螺旋攻击和随机搜索三种策略平衡全局探索与局部开发。文章首先从生物学角度解释鲸鱼捕食行为,然后给出算法的数学模型和完整流程,包括关键公式和决策逻辑。最后通过Python代码实例演示如何求解Sphere函数最小值,展示算法的实际应用。WOA具有结构简单、参数少等优点,在工程优化、机器学习等领域有广泛应用前景。

qq_42212808的博客 1011

程序员的自我修养 第四章 静态链接

程序员的自我修养 第四章 静态链接

dream_for_2016的博客 192

一张图看懂 ABAP CDS 两大子语言:CDS DDL 与 CDS DCL 以及缺席的 DML

ABAP CDS 的核心设计思想围绕语义数据模型(DDL)与数据访问控制(DCL)展开,而非单纯作为SQL查询工具。其DDL通过声明式语法定义业务导向的数据视图,强调模型稳定性与复用性;DCL则将访问控制逻辑下沉到模型层,实现行级权限过滤。ABAP CDS刻意剥离DML功能,交由ABAP SQL处理数据变更,形成清晰的分层架构。这种设计使数据定义、访问控制与应用逻辑解耦,为现代ABAP应用提供更安全、可维护的数据治理方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 976

【程序员的自我修养06】静态链接过程的思考

经过前两章的介绍,我们应该大致掌握了.o文件静态链接为可执行文件的过程。相同的符号定义在多个源文件中,符号解析流程是如何处理方式的呢?无用代码是如何处理的呢?链接的过程,可以控制函数初始化的过程吗?本文则进一步分析,探讨上述几个问题,希望能够给你的工作带来帮助。我们知道不同的.o文件在链接之前是不知道其它.o文件的内容,因此它们之间若存在相同的符号,也是只有在链接阶段才能发现。若链接器发现同一个符号有多处定义,它又是如何处理的呢?两个或两个以上强符号;

点滴路程 1410

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1247

液态神经网络(Liquid Neural Networks)从线虫大脑到下一代 AI

液态神经网络(Liquid Neural Networks,LNN)是一类具有动态内部结构的神经网络,其灵感来源于生物神经系统,尤其是大脑中神经元如何以复杂、非线性的方式响应外部刺激。与传统神经网络不同,液态神经网络的每个神经元在处理输入时,不再是静态线性或非线性变换,而是基于一个微分方程模型进行响应。这种建模方式使神经元的行为具有时间连续性和动态适应性。换句话说,它不仅“记住”过去的信息,还能根据当前环境实时调整自身的动态特性,这对于感知、决策、预测等任务都非常关键。

hello.reader 7416

《程序员的自我修养》--第二章 静态链接

《程序员的自我修养》读书笔记 第二章 静态链接

sunshine_505的博客 187

【史上最全面esp32教程】oled显示篇

esp32-arduino Oled屏幕的使用

m0_62599305的博客 1万+

《程序员的自我修养》之静态链接

静态链接内容总结: 内容重难点笔记: 重定位表 对于可重定位的ELF文件来说,它必须包含有重定位表,用来描述如何修改相应的段里的内容。对于每个要被重定位的ELF段都有一个对应的重定位表,而一个重定位表往往就是ELF文件中的一个段,所以其实重定位表也可以叫重定位段,我们在这里统一称作重定位表。 COMMON块 现在的编译器和链接器都支持一种叫 COMMON块( Common Block)的机制这种机制最早源于 Fortran,早期的 Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用

weixin_45239587的博客 236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《程序员的自我修养笔记之静态链接》

如果想彻底弄懂Android代码保护的基本原理,《Unix环境高级编程》和《程序员的自我修养》是必读书目。在此作读书笔记 第二章 程序源代码到最终可执行文件的4个步骤: 预编译 主要处理那些源代码文件中以"#"开始的预编译指令 gcc -E hello.c -o hello.i 复制代码 编译 对预编译生成的文件进行词法分析,语法分析,语义分析,中间语言生成,目标代码生成及优化生成汇编代码文...

weixin_33949359的博客 301

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

程序员的自我修养第四章 静态链接笔记

全局符号表中会包含一些标记为UND(未定义)的符号,这些符号在当前目标文件中被引用但未被定义。链接器的任务是找到这些未定义符号在其他目标文件或库中的定义,并确定它们的实际地址。

qq_57162538的博客 1107

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

程序员的自我修养 chapeter 4 静态链接

未初始化的全局变量在最终ld的那一步还是会被放在BSS段里面的,但是在单个.o文件中不会(考虑到全局可能会有多个弱定义 ,但是未初始化的局部静态变量就不一样了,外部文件是肯定不会用它的,所以大小已经定下来了) 静态链接 又提到了那个概念 很多库里面的函数实际上就是调用操作系统的API (e.g. printf( ) ) 一个静态库可以简单地看成一组目标文件的集合 question...

Hesy_H的博客 262

【程序员的自我修养】4.静态链接

对于32位Intel X86 系列处理器,重定位表的结构是由下面结构数组定义,每个元素代表一个重定位入口。重定位:会将符合的地址用一个假的临时地址地替代,真正地址的计算留给了链接器;使用第二种方法的链接器一般采用两部链接。

GouDanAndOcean的博客 477

程序员的自我修养之静态链接

静态链接一般分两步进行: 第一: 空间和地址分配,这一步做的工作是扫描所有的输入目标文件,将所有的符号表归类到全局符号表中,并合并。 第二:符号解析与重定位,重定位 是 链接过程的核心。 总结为: 合并目标文件—分配虚拟地址 1. 链接过程对C++ 进行了哪些处理? 消除重复代码 引用外部库函数 将全局构造函数及析构函数分别放到 .init 与 。fini 段。 在执行 main函数之前 会首...

weixin_44027897的博客 264

《程序员的自我修养》第四章——静态链接

链接就是将几个输入目标文件,加工并合并在一起组成一个输出文件的过程。静态链接主要有两个步骤,**空间及地址分配**、**符号解析与重定位**。 4.1 空间和地址分配 扫描所有输入目标文件,获得各段长度、属性和位置,并收集所有符号表中的符号定义和符号引用,放在一个统一的全局符号表内。 将输入文件中相同性质的段合并成输出文件的一个段,比如将输入文件所有的“.text”段合并成输出文件的“.text”。 为输出文件各段确定空间地址。空间地址有两种,一种是各段在可执行文件中的偏移地址,另一个是指进程的虚拟空间

qq_41150179的博客 366

《程序员的自我修养》第4章---静态链接

第4章 静态链接 4.1 空间和地址分配: a.c : extern int shared; int main() { int a = 100; swap(&a, &shared); } b.c : int shared = 1; void swap(int* a, int* b) { *a ^= *b ^= *a ^= *b; } 对于链接器来说,整个链接过程,它的工作就是将几个输入的目标文件加工、合并成一个输出的可执行文件。 例如将输入的 a.o 和 b.o 文件合并

ArtAndLife的博客 4867

程序员的自我修养--链接、装载与库笔记:静态链接

1. 空间与地址分配 对于链接器来说,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件。测试代码a.c和b.c内容如下: // a.c extern int shared; int main() { int a = 100; swap(&a, &shared); } // b.c int shared = 1; void swap(int* a, ...

网络资源是无限的 3363

程序员的自我修养 第4章 静态链接

gcc -c a.c b.c 经过编译后,生成两个目标文件,a.o b.o 空间与地址分配 对于链接器,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件。 可执行文件中的代码段和数据段都是由输入的目标文件中合并而来的。 链接器是如何合并的?输出文件中的空间是如何分配的? 按序叠加 相似段合并 我们在这里谈论的空间分配只关注于虚拟地址空间的分配,因为这个关系到链接器后续的关于地址的计算步骤,而可执行文本本身的空间分配与链接过程关系并不是很大。 现在的链接器空间分配策略基本上都采用上述的第.

sundaygeek的专栏 658

程序员的自我修养:第二部分静态链接

一、编译过程简介 g++ -o hello hello.cpp 上述过程包括了四个步骤:预编译、编译、汇编、链接 1、预编译 g++ -E -o hello.i hello.cpp 主要处理#开始的预编译命令 1)#define: 将所有的#define删除,并在源文件中展开 2)#if 、#ifdef、#elif、#endif条件预编译指令:决定该代码是否需要编译 3)#include预编译指令,递归地(被包含的文件也有可能包含其他文件)将被包含的文件插入到该预编译指令的位置 4)删除所有注释 5)

ehuangdan5864的博客 299

读读《程序员自我修养》--简介&静态链接

主要是梳理程序员自我修养的一些知识点

bigger_belief的博客 1062

2.程序员的自我修养 - 静态链接与程序装载

目录 第二章 静态链接 2.1程序编译的过程 第三章 目标文件的格式 3.1目标文件的格式 3.2目标文件具体内容 3.3ELF文件结构 3.4重定位表 3.5字符串表 3.6链接的接口 3.7弱符号与强符号 第四章 静态链接 4.1空间与地址分配 4.2符号解析与重定位 4.3COMMON块 4.4C++相关问题 4.5链接控制脚本 第五章 Windows PE/COFF 第六章 可执行文件的装载与进程 6.1进程虚拟地址空间 6.2装载方式 6.3从操作系.

飞舞哲 342
上一篇: C 语言字节对齐详析
下一篇: HTTP 协议
南丶烟
博客等级 码龄14年 569粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值