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

北京做网站建设有发展吗升级访问页面跳转

北京做网站建设有发展吗,升级访问页面跳转,紧急通知网页升级,太原关键词优化公司文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定 符号解析与重定位链接器优化重复代码消除函数链接级别 静态库静态链接优缺点 静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行…

文章目录

  • 静态链接
    • 空间与地址分配
      • 相似段合并
      • 虚拟地址分配
      • 符号地址确定
    • 符号解析与重定位
    • 链接器优化
      • 重复代码消除
      • 函数链接级别
    • 静态库
    • 静态链接优缺点

静态链接

一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行文件被加载后无需再进行重定位操作(符号已经在链接阶段全部得到重定位),这种方式即静态链接,静态链接的过程分为空间与地址分配+符号解析与重定位

空间与地址分配

空间与地址分配阶段链接器需要为各个节分配虚拟地址,分配虚拟地址的第一步就是要把各个目标文件的节进行合并,现代链接器都是采用相似段合并的方式对目标文件的节进行合并,所谓相似节合并,即多个目标文件的代码节合一起,数据节合一起

相似段合并

链接器扫描所有目标文件各个节的信息,获取其长度,对相似节进行合并,合并完后的节在代码段中称为段实际上ELF文件中既能称作节(section),也能称作段(segment),但是可执行文件中一般都是称为段,并且有个更专业的术语称为执行视图,而目标文件中的节称为链接视图

在这里插入图片描述

虚拟地址分配

//a.c
extern int shared;
int main(){int a=0;swap(&a,&shared);return 0;
}
//b.c
int shared=1;
void swap(int* a,int* b){*a^=*b=*a^=*b;
}

观察2个源文件的目标文件节信息
在这里插入图片描述

只需要关注红框选中的三个字段,size和file off为节的大小和在目标文件中偏移量,而VMA是虚拟地址,很明显0地址是无效的,它们其实都还没有被分配虚拟地址,这很正常,因为它们只是目标文件,是不能被执行的,也就没有必要分配什么虚拟地址了,但是由它们静态链接所产生的可执行文件具有有效的虚拟地址

在这里插入图片描述

合并后段大小不严格等于目标文件中对应的节大小之和是因为链接过程中还会添加一些额外信息

符号地址确定

目标文件中的各个符号都有相对于节起始位置的偏移量,这个偏移量很重要,符号地址的确定依赖它,对于一个符号来说,它在目标文件中的地址和在可执行文件中的地址是不一样的,链接后这些符号的绝对地址一定会发生变化,为了后续符号解析与重定位可以正常进行,就需要确定符号在可执行文件中的地址,如何确定就是通过这个不变的偏移量(符号地址再怎么变化,它相对于所在节的偏移量是始终不会发生改变的,链接器不会把一个节拆开)

在这里插入图片描述

符号解析与重定位

这一步是静态链接的核心步骤,基本上所有的链接错误都是发生在这个阶段,因为该阶段链接器的工作是确定外部符号引用的绝对地址,如果存在需要重定位但是找不到其定义的符号,就直接报错。

重定位工作之前,链接器必须知道可执行文件有哪些符号,哪些符号是需要被重定位的,因此链接器需要借助可执行文件中的全局符号表和全局重定位表,这2张表由是多个目标文件的符号表和重定位表合并而来的,因此可执行文件中的符号表和重定位表由第一步空间与地址分配完成

在这里插入图片描述

对于没有经过重定位的目标文件来说,那些外部符号的符号值是没有意义的

在这里插入图片描述

链接器将所有的外部符号进行重定位后

在这里插入图片描述

经过重定位后CPU就可以通过这个有效的操作数进行相对寻址正确的访问数据和执行函数

链接器优化

重复代码消除

//template.h
template<typename T>T add(T x,T y){return x+y;
}
//a.cc
int main(){add(1,2);return 0;
}
//b.cc
int ADD(int x,int y){return add(x,y);
}

C++中引入了模板,一个模板函数可能被多个源文件所实例化,这会造成重复的代码,例如a.cc和b.cc实例化出的函数都是int add(int,int),链接器会对其进行合并,减少不必要的空间浪费(可执行文件中的代码段只有一份int add(int,int))

更加专业的解释

  • 编译器在每个翻译单元中生成模板函数的实例
  • 链接器在链接这些对象文件时,会注意到多个相同的函数实例(例如 int add(int, int)),但不会报错,因为它会自动选择其中一个实例,忽略其他重复的实例(前提是定义在头文件中,这样编译器才能实例化)
  • 这种行为是由C++标准规定的,称为“外部链接”的模板实例化

模板请不要声明和定义分离,这会造成链接错误

函数链接级别

目标文件中所定义的函数不一定在可执行文件中都会被使用,如果无脑地将所有函数全都放入可执行文件的代码段,这会造成无端的空间浪费,链接器引入了人函数链接级别的概念来优化,简单来说就是只把可执行文件中用到的函数写入可执行文件的代码段,不会用到的那些函数定义丢弃

静态库

静态库即一组目标文件的集合,Linux下通过ar命令对一组目标文件进行打包

ar -rc libmine.a a.o b.o

通过静态库链接可以简化命令行,链接器会在链接过程中从静态库中寻找所需要的数据或函数定义

gcc/g++在链接时默认采用动态链接,显示的静态链接需要添加-static选项

静态链接优缺点

优点

  • 过程较为简单,一旦成功生成可执行文件后,就可以直接运行,并且不会有库依赖问题

缺点

  • 可执行文件很大,因为静态链接的可执行文件将所有目标文件都进行合并;多个可执行文件可能静态链接了相同的库,但是它们运行时无法共享代码段(即使代码段是一样的),这会造成内存中存在多份一样的代码
  • 升级维护困难,静态库的任何更新操作需要重新编译链接生成新的可执行文件

————————————————————————————————————

http://www.yayakq.cn/news/515742/

相关文章:

  • 做介绍英文网站南昌网站建设哪家比较好
  • 网站开发模板word做网站要学那些
  • 怎么查一个网站是否备案wordpress关注插件
  • 大连网站制作 姚喜运建立虚拟网站
  • 合作网站建设百度博客网站模板
  • 撸撸撸做最好的导航网站个人网站怎么制作成图片
  • 怎么做付费的小说网站自己的做网站
  • 化妆品网站建设案例怎样优化网站
  • 网站建设方案费用预算企业管理咨询服务合同模板
  • 千助网站建设长沙小学网站建设
  • 做石材一般用哪些网站推销做公司网站的公司有哪些
  • 微信网站开发服务关于网站建设的论文题目
  • 国外网站怎样建设wap网站分享代码
  • 和平网站建设公司舟山城乡建设培训中心网站
  • 寻找项目做的网站中山建设银行招聘网站
  • wordpress 关闭访问网站推广优化设计方案
  • 建设工程监理 精品课网站免费网络课程平台
  • 互联网站从事登载新闻业务管理暂行规定外包小程序开发注意事项
  • 精品网站建设公中国艺术设计联盟
  • 北京网站建设哪个好百度免费网站如何建设
  • php网站开发实验报告建设通银行官方网站
  • 个人网站上传有啥要求折纸效果网站
  • 公司付的网站费怎么做分录苏州有哪些做网站公司好
  • 用html做网站顺序二手书屋网站开发的意义
  • 网站 app建设开发合作协议中文域名和网站的关系
  • 毕业设计网站开发流程图西安网站建设xazxcy
  • 网站建设对于企业发展的优势平面设计好找工作不
  • wordpress 修改语言包百度首页排名优化服务
  • 浅蓝色.net企业网站源码带后台flash成品网站
  • 万网建站流程网站优化页面