QNX手册学习笔记——Dynamic Linking

来源:互联网 发布:mac一键切换音频输出 编辑:程序博客网 时间:2024/06/05 03:15
原来链接也是操作系统的重要的组成部分,对于数据区和代码区的分配是链接所分配的。链接库,代码区和数据区等的存储位置是完全不同的
程序的链接分为静态链接和动态链接两种链接方式。静态链接相对于动态链接来讲,因为每一个program都会有自己一个单独的链接,而一个操作系统通常需要跑多个program(process),故占用内存较大,通常情况下较少使用。
对于动态链接,通常将program与library的融合从link time推迟到run time阶段。动态链接也可称之为部分链接,在链接阶段生成的可执行代码包含了库的信息,在runtime,program 开始前根据这些信息进行动态链接。进一步讲,可以在程序执行时进行链接。例如通用驱动可以根据访问不同的硬件设备加载不同的共享库。
共享对象究竟如何使用呢?QNX采用ELF格式。该格式有两种显示方式分别为linking view 和 execution view。后者与前者的不同是在进程创建阶段仅加载代码段和数据段(load segments),其余的调试信息和标识信息等则暂不链接。QNX的ELF采用的是execution view, 因此创建进程和加载速度更快。
文中给出了一个典型的x86的进程内存的存储方式,如下图所示。从此图可以对线程、进程和gurad page,数据区,代码区,堆区,程序栈区,共享内存和共享库一目了然。
QNX手册学习笔记——Dynamic <wbr>Linking
程序管理需要报控制权交给runtime linker,让他进行链接处理。runtime linker 包含在C runtime library中。如果shared library尚未加载到memory中(此处不明白,没有在memory中,那放在哪了呢?应该是已经在memory中了,只是process的shared memory队列没有引用它而已吧),需要通过一定的查询方式找到它。此处有全局作用域概念,以及为提高速度的hash概念。对于全局作用域的概念,executables和libraries都适用;应该是针对不同进程之间都可以使用并可供其他的动态库(dynamiclibrary)使用。这与data仅供自己进程使用的概念是不一样的。
原创粉丝点击