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

一个人 建设网站网站网络优化服务器

一个人 建设网站,网站网络优化服务器,wordpress指定分类文章作者时间,网站改版建设方案静态链接的缺点#xff1a;生成的可执行文件体积较大#xff0c;当多个程序引用相同的公共代码时#xff0c;这些公共代码会多次加载到内存#xff0c;浪费内存资源。 为了解决这个问题#xff0c;动态链接对静态链接做了一些优化#xff1a;对一些公用的代码#xff0…静态链接的缺点生成的可执行文件体积较大当多个程序引用相同的公共代码时这些公共代码会多次加载到内存浪费内存资源。 为了解决这个问题动态链接对静态链接做了一些优化对一些公用的代码如库在链接期间暂不链接而是推迟到程序运行时再进行链接。这些在程序运行时才参与链接的库被称为动态链接库。程序运行时除了可执行文件这些动态链接库也要跟着一起加载到内存参与链接和重定位过程否则程序可能就会报未定义错误无法运行。 动态链接的好处是节省了内存资源加载到内存的动态链接库可以被多个运行的程序共享使用动态链接可以运行更大的程序、更多的程序升级也更加简单方便。 在 Windows 下解压一个软件安装包里面的 .dll 后缀的文件就是动态链接库需要和可执行文件一起安装到系统中。程序在运行前会首先把它们加载到内存链接成功后程序才能运行。 在 Linux 环境下动态库文件的后缀为 .so。 gcc -fPIC -shared add.c sub.c mul.c div.c -o libtest.so gcc main.c libtest.so cp libtest.so /usr/lib/ # 程序就可以运行了在上面的程序中可执行文件 a.out 是动态链接生成的所以在运行 a.out 之前libtest.so 这个动态链接库要放到 /lib、/usr/lib 等系统默认的库路径下否则 a.out 就会链接失败无法正常运行。 在 Linux 环境下当我们运行一个程序时操作系统首先会给程序 fork 一个子进程接着动态链接器被加载到内存操作系统将控制权交给动态链接器让动态链接器完成动态库的加载和重定位操作最后跳转到要运行的程序。 动态链接器本身也是一个动态库/lib/ld-linux.so文件动态链接器被加载到内存后会首先给自己重定位然后才能运行。像这种自己给自己重定位然后自动运行的行为一般称为自举。 动态链接器解析可执行文件中未确定的符号及需要链接的动态库信息将对应的动态库加载到内存并进行重定位操作。这个过程其实和静态链接的重定位过程一样只不过推迟到了运行阶段而已。重定位结束后程序中要引用的所有符号都有了地址和定位动态链接器将控制权交给要执行的程序跳转到该程序运行。 动态链接需要考虑的一个重要问题是加载地址。静态链接时加载地址等于链接地址这个地址是固定的。动态链接过程中类似静态链接的重定位动态链接库被加载到内存后目标文件的起始地址也发生了变化需要重定位。一个可执行文件对动态链接库的符号引用要等动态链接库加载到内存后地址才能确定然后对可执行文件中的这些符号修改即可。 main() 函数调用了 add() 函数但 add() 函数的地址还不能确定等到 libtest.so 加载到内存后add() 函数的地址才能确定下来。加载器通过动态链接、重定位操作更新了符号表中 add() 函数的实际地址并修正 main() 函数指令中引用 add() 函数的地址然后程序才可以正常运行。 这种装载时重定位的操作虽然解决了可执行文件中绝对地址的引用问题但也带来了另外一个问题对于每个进程动态库被加载到了内存的不同地址也只能被进程自身共享无法在多个进程间共享无法节省内存违背了动态库的设计初衷。如果有一种方法将动态库设计成无论放到哪里都可以执行而且可以被多个进程共享那么这个问题就迎刃而解了。 与地址无关的代码 如果想让我们的动态库放到内存的任何位置都可以运行都可以被多个进程共享一种比较好的方法是将我们的动态库设计成与地址无关的代码。将指令中需要修改的部分如绝对地址符号的引用分离出来剩余的部分就和地址无关了。需要被修改的指令符号和数据在每个进程中都有一个副本互不影响各自的运行。 编译代码时加上 -fPIC 参数Position-Independent Code就可以实现代码与地址无关把这段代码放在内存中的任何位置都无须重定位直接运行即可使用相对跳转指令代替对绝对地址的访问。 全局偏移表 在动态库的设计中对于模块内的符号相互引用通过相对寻址很容易实现代码与地址无关。但是当动态库作为第三方模块被不同的应用程序引用时库中的一些绝对地址符号如函数名将不可避免地被多次调用需要重定位。动态库中的这些绝对地址符号如何能做到同时被不同的应用程序引用呢 每个应用程序将引用的动态库绝对地址符号收集起来保存到一个表中这个表用来记录各个引用符号的地址。当程序在运行过程中需要引用这些符号时可以通过这个表查询各个符号的地址。这个表被称为全局偏移表Global Offset TableGOT。 在一个可执行文件中其引用的动态库中的绝对地址符号会被分离出来单独保存到 GOT 表中GOT 表以 section 的形式保存在可执行文件中这个表的地址在编译阶段已经确定了。当程序运行需要引用动态库中的函数时会将动态库加载到内存根据动态库被加载到内存中的具体地址更新 GOT 表中的各个符号函数的地址。等下次该符号被引用时程序可以直接跳到 GOT 表查询该符号的地址因为 GOT 表在可执行文件中的位置是固定不变的所以程序中访问 GOT 表的指令也是固定不变的唯一需要变化的是动态库加载到内存后库中的各个函数的位置确定在 GOT 表中实时更新各个符号在内存中的真实地址就可以了。 这样做的好处是在内存中只需要加载一份动态库当不同的程序运行时只要修改各自的 GOT 表它们引用的符号都可以指向同一份动态库。 延迟绑定 动态连接通过使用与地址无关这一技术加载到内存任意地址都可以运行。与地址无关这一技术在 ARM 平台可以使用相对寻址来实现。ARM 相对寻址的本质其实就是寄存器间接寻址只不过基址换成了 PC 而已访问效率还是比较低的包括程序运行之前的动态链接和重定位操作也会对程序的及时响应和性能造成一定的影响。可执行文件一般都采用延迟绑定程序在运行时并不急着把所有的动态库都加载到内存中并对它们进行重定位。当动态库中的函数第一次被调用时才会把用到的动态库加载到内存并进行重定位。 C 标准库起始就是以动态库的封装形式保存在 Linux 系统中的不同的应用程序都会调用 printf() 函数当它们在内存中运行时只需要加载一份 printf() 函数代码到内存就可以了。各个应用程序在引用 printf 这个符号时就会启动链接器将这份代码映射到各自进程的地址空间更新各自 GOT 表中 printf() 函数的实际地址然后通过查询 GOT 表找到 printf() 在内存中的实际地址就可通过间接访问跳转执行。 共享库 现在大多数软件都是采用动态链接的方式开发的不仅可以节省内存空间升级维护也比较方便。在发布软件包时可执行文件及其以来的动态链接共享库被一起打包发布如果你依赖的是系统默认自带的共享库如 C 标准库则不需要跟软件一起打包。程序安装时可执行文件会复制到 Linux 系统的默认路径下如 /bin、/sbin、/usr/bin、/usr/local/bin 等这些路径由环境变量 PATH 管理和维护。可执行文件依赖的共享库一般要放到库的默认路径下面如 /lib、/usr/lib 等。当程序运行时动态链接器首先被加载到内存运行动态链接器会分析可执行文件从可执行文件的 .dynamic 段中查询该程序运行需要依赖的动态共享库然后到库的默认路径下查找这些共享库加载到内存中并进行动态链接链接成功后将 CPU 的控制权交给可执行程序程序就可以正常运行了。 动态链接器在查找共享库的过程中除了到系统默认的路径下查找也会到用户指定的一些路径下去查找用户可以在 /etc/ld.so.conf 文件中添加自己的共享库路径。为了减少每次查找文件的时间消耗/etc/ld.so.conf 修改后可以使用 ldconfig 命令生成一个缓存 /etc/ld.so.cache 以提高查找效率。每当我们新增、删除或修改共享库的路径时使用 ldconfig 更新一下缓存就可以了。
http://www.hkea.cn/news/14373151/

相关文章:

  • 微网站促销版珠海培训网站建设
  • 成都网站制作软件制作网页的网站推荐
  • 2021年10月新闻摘抄淄博网站制作网页优化
  • 贵阳市白云区官方网站东莞企业网站找谁
  • 好的建设网站大型网站故障
  • 申请网站官网响应式网站模板怎么做
  • 互联网推广网站建设网站开发入那个科目
  • 合肥建设网官方网站wordpress做后端
  • 成都人高清影院品牌加盟长沙网站优化外包服务
  • 网站策划需要什么北京高端网站建设制作设计
  • 北京企业网站开发多少钱怎么推广销售
  • 手机触屏网站模板建筑公司电话号码
  • 商务网站建设概念wordpress 漫画网站
  • 大学 建网站襄阳南漳县城乡建设局网站
  • 浙江建设网官方网站企业营销策略分析论文
  • 浦口国家建设部网站北京好网站制作公司哪家好
  • 自己怎么做系统网站网络广告图片
  • 简洁大方的电商网站模板企业网站用视频做首页
  • 网站建设的主要功能有哪些网络广告包括
  • 做网站策划桂林生活网官网二手房
  • 遵义网站建设方案wordpress添加底部导航
  • 网站怎么做购物车wordpress 收录插件
  • 外贸网站如何做的好处深圳世茂前海中心
  • 杭州网站优化多少钱怎么做告白网站
  • 网站公司排行榜前十名杭州哪家做企业网站
  • 关于网站设计pc网站开发微信支付
  • 如何选择网站项目营销型网站更受用户欢迎的原因是
  • 网站SEO基础代做烟台网站建设精通臻动传媒
  • 邢台网站建设开发关键词检测工具
  • 行业网站设计开发费用网站注册备案之后怎么做网站