2-2-18-7 QNX 系统架构-动态链接

阅读前言

本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个或多个系列进行发布,从遵从原文的翻译,到针对某些重要概念的穿插引入,以及再到各个重要专题的梳理,大致分为这三个层次部分,分不同的文章进行发布,依据这样的原则进行组织,读者可以更好的查找和理解。


1. 动态链接

在一个典型的系统中,将运行许多程序。每个程序都依赖于许多函数,其中一些是“标准的”C库函数,比如printf(), malloc(), write()等。

如果每个程序都使用标准C库,则通常每个程序都会在其内部拥有该C库的唯一副本。不幸的是,这将会导致资源的浪费。由于C库是通用的,因此让每个程序引用该库的公共实例比让每个程序包含该库的副本更有意义。这种方法有几个优点,其中最重要的是节省了总的所需的系统内存。

在我们进一步讨论之前,我们应该先看看以下一些术语:

  • Linker

链接器,是一种工具,比如 ld,通常在编译程序后立即运行,以便组合对象文件【object files】和归档文件【archive files】,重新定位它们的数据,并解析符号引用【symbol reference】。

  • Runtime linker

运行时链接器,是一种在运行程序时查找并加载共享对象的工具。运行时链接器,也被称为动态链接器【dynamic linker】,但我们会使用运行时链接器【runtime linker】,而不是【dynamic linker】,从而避免与(非运行时)链接器所做的动态链接【dynamic linking】的概念相混淆。

运行时链接器的名称是ldd(同时ldd也是列举程序所需共享对象的 utility【实用工具】 的名称)。在ELF文件的.interp部分中,对于32位目标系统,它被称为/usr/lib/ldqx.so,对于64位目标系统,它被称为/usr/lib/ldqnx-64.so。您需要在OS映像中包含相应的版本;有关详细信息,请参阅Utilities Reference中的 mkifs 条目。

  • Statically linked

静态链接,表示程序和它所链接的特定的库,在链接时由链接器进行组合。

这意味着程序和特定库之间的绑定是固定的,并且在链接时就知道了(也就是在程序运行之前就知道了)。这也意味着我们不能改变这种绑定关系,除非我们用新版本的库重新链接程序。

如果您不确定库的正确版本是否在运行时可用,或者您正在测试库的新版本,而您还不想将其作为共享方式进行安装,则可以考虑静态链接该程序。

静态链接的程序是根据对象(库)的存档【archive】进行链接的,这些对象(库)的扩展名通常为.a。这种对象集合的一个例子是标准C库,libc.a。

  • Dynamically linked

动态链接,表示程序和它所引用的特定库,在链接时不会被链接器组合起来。

相反,链接器将信息放入可执行文件中,告诉加载器,代码位于哪个共享对象模块中,以及应该使用哪个运行时链接器来查找和绑定引用。这意味着程序和共享对象之间的绑定是在运行时完成的(在程序启动之前,找到并绑定适当的共享对象)。

这种类型的程序被称为部分绑定可执行程序【partially bound executable】,因为它不是完全解析的:链接器在链接时,并没有使程序中的所有引用符号与库中的特定代码相关联。相反,链接器只是说:“这个程序在一个特定的共享对象中调用一些函数,所以我将记录下这些函数在哪个共享对象中,然后继续。” 实际上,这将绑定操作延迟到运行时进行。

动态链接的程序,是针对具有.so扩展名的共享对象进行链接的。这种对象的一个例子是标准C库的共享对象版本,libc.so。

您可以使用编译器驱动程序 qcc 的命令行选项来告诉工具链,您是静态链接还是动态链接。然后该命令行选项就决定了所使用的扩展名(是.a还是.so)。

  • Augmenting code at runtime【在运行时扩充代码】

进一步来说,程序在运行之前可能并不知道需要调用哪些函数。虽然这初看有点奇怪(毕竟,一个程序怎么可能不知道它要调用什么函数呢?),但它确实是一个非常强大的特性。这是为什么。

比如我们来看一个“通用”磁盘驱动程序。启动,探测硬件,并检测到硬盘。然后,驱动程序动态加载 io-blk 代码来处理磁盘块,因为它找到了一个面向块【block-oriented】的设备。现在驱动程序开始以块级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星原飞火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值