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

青岛市黄岛区网站建设seo排名外包

青岛市黄岛区网站建设,seo排名外包,网站建设公司骗人,知识付费分销平台有哪些文章目录【第2部分】静态链接1 编译过程2 编辑器的工作流程3 链接——模块的拼接4 目标文件目标文件中的段(section)ELF文件结构5 静态链接1 空间与地址分配2 符号解析与重定位【第3部分】装载与动态链接1 装载的方式2 进程的启动3 为什么需要动态链接&a…

文章目录

  • 【第2部分】静态链接
    • 1 编译过程
    • 2 编辑器的工作流程
    • 3 链接——模块的拼接
    • 4 目标文件
      • 目标文件中的段(section)
      • ELF文件结构
    • 5 静态链接
      • 1 空间与地址分配
      • 2 符号解析与重定位
  • 【第3部分】装载与动态链接
    • 1 装载的方式
    • 2 进程的启动
    • 3 为什么需要动态链接?
    • 4 动态链接的基本实现
    • 5 位置无关码(PIC)
    • 6 显式运行时链接(Explicit Run-time Linking)

【第2部分】静态链接

在这里插入图片描述

1 编译过程

  1. 预编译
    预编译将源文件和包含的头文件编排成xx.i的预编译文件,主要是将#include的文件内容替换进源文件,并且将宏定义(#define)展开,还有处理预编译指令(#if#ifdef等)以及删除注释等等。
  2. 编译
    简单来说就是将C语言代码转换成汇编代码;
  3. 汇编
    汇编器将汇编代码转换成机器码,产出一个xx.o目标文件;
  4. 链接
    对目标文件进行编排,组合成可执行文件或者库(目标文件的包)。

2 编辑器的工作流程

词法分析->语法分析->语义分析->源代码优化->目标代码生成和优化。

3 链接——模块的拼接

问题引入:当一个程序被分割成多个模块时,最终如何组成的一个可执行程序?

链接的过程包括:

  • 地址和空间分配
  • 符号决议(symbol resolution),或符号绑定(symbol binding)
  • 重定位(relocation)——给程序中引用某个绝对地址的指令打补丁

链接器会根据指令所引用的符号,找到符号的地址,然后修正指令。

4 目标文件

Linux上,我们统称目标文件和可执行文件为ELF格式的文件,广义上他们几乎是一样的。

ELF文件有以下4大类:

  1. Relocatable File —— xx.o
  2. Executable File
  3. Shared Object File —— .so
  4. Core Dump File

目标文件中的段(section)

在这里插入图片描述
在这里插入图片描述

ELF文件结构

  1. 文件头-ELF Header
    可以使用readelf -h xx.o来查看文件头。
  2. 段表-Section Header Table
    使用readelf -S来查看ELF文件包含的段。
  3. 重定位表-Relocation Table0
    .rel.text.rel.data,记录重定位信息
  4. 字符串表
    把字符串集中起来存放到一个表里,然后通过使用偏移地址来引用字符串(结尾为空字符),包括.strtab(符号名的字符串)和.shstrtab(段名的字符串)

5 静态链接

1 空间与地址分配

扫描所有目标文件,收集所有的符号定义和符号引用,放到全局符号表中;计算出各个文件的各个段在合并后的位置以及长度,建立映射关系。

2 符号解析与重定位

在编译文件时,一些函数是在外部文件中定义的,编译器并不知道它的地址,就暂时将它们的地址设为0,真正的地址计算和修改则留给链接器。

那么链接器如何知道哪些指令中使用的地址需要重定位?这时就轮到重定位表发挥作用了,重定位表记录了每个符号的入口地址在表中的偏移地址。

【第3部分】装载与动态链接

1 装载的方式

  1. 覆盖装入:由程序员管理模块何时被加载到内存,该方式已被淘汰
  2. 页映射:以页为单元在磁盘和内存之间装载或置换数据

2 进程的启动

  1. 创建虚拟地址空间(通过MMU映射到物理内存)
  2. 读取可执行文件的文件头,建立虚拟地址空间和可执行文件的映射关系(用于加载可执行文件所在的页到内存)
  3. 将CPU指令寄存器设置成可执行文件入口

3 为什么需要动态链接?

  • 只使用静态链接,会造成内存和磁盘的浪费;
  • 使用静态链接时,如果某个模块更新,那么整个程序都要重新编译;

动态链接:等到程序开始运行时才进行链接。

4 动态链接的基本实现

程序装载时,动态链接器将所需要的动态库装载到进程地址空间,将所有未决议的符号绑定到相应的动态链接库,并进行重定位工作。

为了优化程序装载时进行链接的性能问题,采取了延迟绑定等方法。

cat /proc/xxxx/maps即可查看某个进程的的虚拟地址空间分布,其中可以看到部分引用的.so动态库所被映射的位置,其中有一个库为ld-x.x.so,这实际上就是linux的动态链接器,进程运行前会先跳转到动态链接器的代码中运行,完成链接工作后再跳转回进程代码运行。

5 位置无关码(PIC)

装载时重定位——把动态库的重定位也推迟到装载时进行。但有一个问题,动态链接库的代码在多个进程间共享,而重定位需要修改其指令,每个进程需要的修改可能不一样(比如跳转的地址不一样),那么就没法共享了。

PIC的基本思想:将指令中需要修改的部分分离出来,放到数据段中,这样指令部分就可以保持不变,而数据段对于每个进程都是有自己的独一份的。

模块间的数据访问:在数据段里建立一个指向外部变量的指针数组,即全局偏移表(Global Offset Table,GOT)。在编译时即确定GOT相对于当前指令的偏移,同时确定GOT中每个地址对应于哪个变量;模块装载时,加载器查找每个变量的实际地址,填充GOT的各个项。

如何区分动态库是否为PIC:readelf -d xx.so | grep TEXTREL,如果输出为空,则不是PIC。so库必须是PIC才能真正实现共享。

6 显式运行时链接(Explicit Run-time Linking)

或者叫运行时加载,即程序运行时自己指定加载的模块,且可以在不需要时将模块卸载。这可以用来实现插件、驱动等。程序可以通过4个API对动态库进行操作:

  • dlopen():加载动态库到进程地址空间
  • dlsym():找到所需的符号所在的地址
  • dlclose():卸载模块
  • dlerror():调用上面3个函数后,可以通过调用该函数判断前者调用是否成功
http://www.ds6.com.cn/news/42468.html

相关文章:

  • 青海网站建设企业关键词整站优化
  • 跟犀牛云一样做网站的青岛seo网站排名优化
  • 帮做论文网站如何做企业网站
  • 做网站的具体步骤排名查询
  • 静态网站公用头部如何调用标题怎么在百度发布信息
  • 模板网站客服电话ip域名查询网
  • 网站建设方案功能惠州关键词排名优化
  • wordpress全球销量主题优化教程网官网
  • 沈阳网站制作思路网络可以搜索国外网站的搜索引擎
  • 做网站哪里的服务器速度快免费建站哪个最好
  • 网站建设业务如何自己免费制作网站
  • 网站seo排名肇庆网站制作软件
  • o2o平台有哪些网站搜索引擎推广培训
  • 网站运营商查询一份完整的市场调查方案
  • 深圳个人做网站手游推广渠道和推广方式
  • wordpress建站服务器百度小说网
  • 智慧团建注册登录入口官网手机版无锡网站制作优化
  • 专门做钻石国外网站推销网站
  • 茂名一站式网站建设报价宁波seo服务推广
  • 什么建站程序最利于seo景区营销案例100例
  • 公司网站百度小程序开发百度新闻网站
  • 海外 国内网站建设百度文库官网登录入口
  • 网站开发的心得体会做推广的公司一般都叫什么
  • 做全世界的生意的网站关键词查找的方法有以下几种
  • 权威的赣州网站建设站长之家seo概况查询
  • 相城高端网站建设线上营销方式
  • 北京做网站建设的公司排名怎么看百度指数
  • 电子商务网站建设 下载企业推广方式
  • 杭州网站建设杭州手机网站建设如何开通自己的网站
  • 安多网站制作成都专门做网站的公司