美文网首页
程序员的自我修养:链接、装载与库

程序员的自我修养:链接、装载与库

作者: 笔寂晓才 | 来源:发表于2017-03-22 21:44 被阅读173次

    编译的时候会一个一个文件的编译,生成目标文件,同时建立符号表。

    最后再整体链接起来,替换各自的符号表文件,形成一个整体的可执行文件。


    Section:(编译)

    汇编器会把程序编程目标文件,目标文件是由多个section组成的。

    Segment:(链接输出)

    把程序具有相同权限的部分放在一起(可执行文件不同的部分将加载进不同的 section,并且每个 section 会转换进某个 segment 里),使得内存权限得到高效管理,同时使分页对齐的时候减少浪费。

    两者区别:

    从链接的角度看,ELF文件是按Section存储的;从装载的角度看,ELF文件是按照Segment来划分的。

    在将目标文件链接成可执行文件的时候,链接器会尽量把相同权限属性的段分配在同一空间。比如可读可执行的段放在一起,这就是典型的代码段。


    Page:(运行加载时使用的技术)

    通过分段(segment)保证程序之间不会互相影响,但是存在内存使用效率的问题。分段对内存区域的映射还是按照程序为单位,被换入换出的是整个程序,这样势必会造成大量的磁盘访问,从而影响速度,这种方法还是比较粗糙,粒度比较大。事实上,根据程序的局部性原理,当一个程序运行时,在某个时间段内,它只是频繁的用到一小部分数据,也就是说,程序的很多数据其实在一个时间段内都是不会被用到的。人们很自然的想到了更小粒度的内存分割和映射方法,使得程序的局部性原理得到充分应用,提供内存使用率。——分页。

    把地址空间人为的等分成固定大小的页,每一页的大小由硬件决定或者硬件支持多种大小,由操作系统来决定用哪一个。

    相关文章

      网友评论

          本文标题:程序员的自我修养:链接、装载与库

          本文链接:https://www.haomeiwen.com/subject/gkeanttx.html