《C专家编程(异步图书) (C和C++经典著作)【文字版】 (Perter Van Der Linden) (Z-Library).pdf》
Perter Van Der Linden
◆ 5.1 函数库、链接和载入
>> 基础知识:编译器创建一个输出文件,这个文件包含了可重定位的对象。这些对象就是与源程序对应的数据和机器指令。
>> 这些可以方便地从编译器中分离出来的单独程序包括:预处理器(preprocessor)、语法和语义检查器(syntacticand semantic checker)、代码生成器(codegenerator)、汇编程序(assembler)、优化器(optimizer)、链接器(linker),当然还包括一个调用所有这些程序并向各个程序传递正确选项的驱动器程序(driver program)(见图5-1)。
>> 可以使用-#选项查看编译过程的各个独立阶段。-V选项能提供版本信息。
>> 如果函数库的一份拷贝是可执行文件的物理组成部分,那么我们称之为静态链接;如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么我们称之为动态链接。
>> 链接-编辑(link-editing)、载入(loading)和运行时
>> 链接(runtime linking)。
◆ 5.2 动态链接的优点
>> 动态链接的主要目的就是把程序与它们使用的特定的函数库版本中分离开来。取而代之的是,我们约定由系统向程序提供一个接口,该接口保持稳定,不随时间和操作系统的后续版本发生变化。程序可以调用接口所承诺的服务,而不必担心这些功能是怎样提供的或者它们的底层实现是否改变。
>> 动态链接是一种“just-in-time(JIT)”链接,这意味着程序在运行时必须能够找到它们所需要的函数库。链接器通过把库文件名或路径名植入可执行文件中来做到这一点。
>> 把编译所生的.o文件用正确的实用工具进行处理一一如果是静态库,使用“ar”,如果是动态库,使用“ld”。
>> 有些函数库(如libaio.so,libdl.so,libsys. so,libsolv.so以及librpcsvc.so等)只能以动态链接的形式使用。如果在应用程序中使用了这些函数库中的任何一个,你的程序就必须使用动态链接。最好的策略就是所有的应用程序都使用动态链接,这就可以避免可能产生的问题。