自我修养——静态链接

《程序员的自我修养》读书笔记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界定的是二进制文件中的段的分布格式,地址计算方式,以及符号规则等,能够让链接器 统一识别的一种接口

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

基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特 阅读详情

相关推荐

SIMetrix教程-001.SIMetrix软件简介与安装

  由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优

gaoyong_wang的博客 2万+

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

空间分配例子:/*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

告别MATLAB!用Python的PYPOWER搞定电力系统潮流计算(附Case30完整代码)

本文介绍了如何从MATLAB迁移到Python,使用PYPOWER工具包进行电力系统潮流计算。通过详细的环境准备、数据接口兼容性实践、潮流计算实现及最优潮流计算进阶,帮助工程师和学生无缝过渡到Python生态。文章还展示了结果处理与可视化技巧,并附有Case30完整代码示例。

weixin_30411819的博客 299

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

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

阿正的梦工坊 1470

保姆级教程:用Python+OpenCV实现相移法与格雷码三维重建(从生成条纹到点云生成)

本文详细介绍了使用Python和OpenCV实现相移法与格雷码三维重建的全流程,从条纹生成到点云计算。通过结构光技术,结合相移法和格雷码,实现高精度的三维重建,适用于无纹理物体表面的密集对应点生成。教程包含环境搭建、条纹生成、相位计算、三维点云重建及常见问题排查,适合计算机视觉开发者和研究人员。

weixin_33443333的博客 351

XC7Z010-1CLG400C开发板ADC引脚配置全攻略(附完整引脚列表)

本文详细解析了XC7Z010-1CLG400C开发板的ADC引脚配置方法,涵盖XADC模块基础、CLG400封装的引脚布局、硬件设计规范及Vivado工程配置实战。特别提供了完整的引脚列表和性能优化技巧,帮助开发者高效实现模拟信号采集,适用于Zynq-7000系列开发。

weixin_29188043的博客 466

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

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

dream_for_2016的博客 192

股票分时数据获取-东方财富

获取下股票分时数据,分时均价下线,分时成交额等,用于量化t0交易条件还是很不错了的。

meiaoxue1234的博客 1万+

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

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

点滴路程 1410

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1384

【LAMMPS学习】五、LAMMPS命令(1) LAMMPS 输入脚本

本部分描述了 LAMMPS 输入脚本的格式以及其中的命令如何用于定义 LAMMPS 模拟。主要包括以下内容。

荷塘阅色 2645

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

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

sunshine_505的博客 187

如何使用Agent框架来模拟群体智能?

Agent 框架作为人工智能领域的重要工具,可以模拟复杂的群体智能行为,广泛应用于社会科学、经济学和行为学等领域。

335

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

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

weixin_45239587的博客 236

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_33949359的博客 301

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

qq_57162538的博客 1107

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

程序员的自我修养 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、付费专栏及课程。

余额充值