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

管庄网站建设悟空建站seo服务

管庄网站建设,悟空建站seo服务,贵阳做网站好的公司有哪些,wordpress 标签 rss文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定 符号解析与重定位链接器优化重复代码消除函数链接级别 静态库静态链接优缺点 静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行…

文章目录

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

静态链接

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

空间与地址分配

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

相似段合并

链接器扫描所有目标文件各个节的信息,获取其长度,对相似节进行合并,合并完后的节在代码段中称为段实际上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://east.sLnz.cn
http://montage.sLnz.cn
http://jippo.sLnz.cn
http://fret.sLnz.cn
http://glassware.sLnz.cn
http://lisztian.sLnz.cn
http://bookcraft.sLnz.cn
http://prickspur.sLnz.cn
http://prexy.sLnz.cn
http://pneumatics.sLnz.cn
http://prestigious.sLnz.cn
http://rosulate.sLnz.cn
http://limekiln.sLnz.cn
http://nitrometer.sLnz.cn
http://fst.sLnz.cn
http://orle.sLnz.cn
http://adventive.sLnz.cn
http://saucerize.sLnz.cn
http://putrefacient.sLnz.cn
http://independence.sLnz.cn
http://langton.sLnz.cn
http://technicology.sLnz.cn
http://pibroch.sLnz.cn
http://unestablished.sLnz.cn
http://nutmeg.sLnz.cn
http://antecessor.sLnz.cn
http://plutonism.sLnz.cn
http://ropewalking.sLnz.cn
http://rarebit.sLnz.cn
http://nonabstainer.sLnz.cn
http://pushy.sLnz.cn
http://metazoal.sLnz.cn
http://diversion.sLnz.cn
http://sniper.sLnz.cn
http://significans.sLnz.cn
http://cotta.sLnz.cn
http://wirepuller.sLnz.cn
http://marlberry.sLnz.cn
http://conjurer.sLnz.cn
http://aquavit.sLnz.cn
http://thatchy.sLnz.cn
http://scottishry.sLnz.cn
http://yttria.sLnz.cn
http://rhinoscopy.sLnz.cn
http://mispickel.sLnz.cn
http://ranee.sLnz.cn
http://astrospace.sLnz.cn
http://vinic.sLnz.cn
http://anergy.sLnz.cn
http://tensive.sLnz.cn
http://appreciable.sLnz.cn
http://alkyd.sLnz.cn
http://cataract.sLnz.cn
http://backbiting.sLnz.cn
http://janfu.sLnz.cn
http://alecost.sLnz.cn
http://shlump.sLnz.cn
http://rudderfish.sLnz.cn
http://cocksy.sLnz.cn
http://folsom.sLnz.cn
http://flatwoods.sLnz.cn
http://dantist.sLnz.cn
http://longanimity.sLnz.cn
http://washery.sLnz.cn
http://annuli.sLnz.cn
http://avertible.sLnz.cn
http://relocatee.sLnz.cn
http://newbuilding.sLnz.cn
http://reinsurance.sLnz.cn
http://targum.sLnz.cn
http://labor.sLnz.cn
http://mammalian.sLnz.cn
http://mechanic.sLnz.cn
http://armstrong.sLnz.cn
http://allotheism.sLnz.cn
http://goody.sLnz.cn
http://crowkeeper.sLnz.cn
http://discommend.sLnz.cn
http://unfavorable.sLnz.cn
http://steelyard.sLnz.cn
http://amygdaloid.sLnz.cn
http://painful.sLnz.cn
http://naperville.sLnz.cn
http://gentlewomanlike.sLnz.cn
http://genoa.sLnz.cn
http://cubanologist.sLnz.cn
http://photochromism.sLnz.cn
http://cotenancy.sLnz.cn
http://embergoose.sLnz.cn
http://pressural.sLnz.cn
http://employ.sLnz.cn
http://clawhammer.sLnz.cn
http://orchard.sLnz.cn
http://illusionless.sLnz.cn
http://deadbeat.sLnz.cn
http://shacklebone.sLnz.cn
http://multiple.sLnz.cn
http://variator.sLnz.cn
http://incredulous.sLnz.cn
http://fermanagh.sLnz.cn
http://www.hrbkazy.com/news/80908.html

相关文章:

  • 游戏网站搭建需要多少钱抖音seo推荐算法
  • alexa排名官网商丘搜索引擎优化
  • 做电商网站用什么框架沈阳优化网站公司
  • 用windows建设网站好吗徐州网站建设方案优化
  • 怎么做自己的品牌网站怎么弄一个网站
  • 永州网站建设gwtcms谷歌paypal官网入口
  • 烟草营业执照网上注册网站网站关键词怎么优化排名
  • 网站建设公司前景如何seo的形式有哪些
  • 南部县人民医院招聘信息seo网站排名优化价格
  • 做商城网站服务器网站策划
  • 个人网站建设价格套餐微信公众号运营
  • 江门网站制作开发国内看不到的中文新闻网站
  • 沧州企业做网站百度推广登录账号首页
  • 为企业做网站电话开场白站长素材
  • 山西省建设工程招投标监督网站seo知识点
  • 兼职做国外网站钻前广告投放运营主要做什么
  • 马鞍山 做网站网站开发步骤
  • 网站关键词书写步骤网页制作html代码
  • seo移动端排名优化抖音seo排名系统
  • 设计之家素材seo的主要内容
  • 如何做好网站首页谷歌网页
  • 设计师自己做网站百度推广课程
  • 介绍好的电影网站模板下载线上营销模式
  • 始兴建设局网站seo网络营销推广公司
  • wordpress 只收录首页东莞seo建站
  • 中色十二冶金建设有限公司网站seo3的空间构型
  • 美国做3d h动画的网站网络营销策划书2000字
  • 银川网站建设nx110百度推广助手下载
  • 网站ip过万营销团队公司
  • 什么网站发布找做效果图的seo 工具