UNIX 下 C 语言动态链接库 SO
2009-11-22 专题
大恒 daheng99@qq.com
相关技术
gcc 编译加-fPIC
以动态链接库的形式给出的。所以编译这个库的时候我们需要指定-fPIC,也就是指定
生成的代码是位置无关的(position independent code)。
在-fPIC 情况下,编译器将把所有的绝对位移用相对于 0 地址的相对位移代替,然后在
引用这些位移的时候用库的装载地址作为基址来寻址。
动态连接, 这样程序可以支持二进制文件接口, 比如连接 libc 时一般都使用.so 而不
是.a, 你总不想在 libc 更新后重新链接你的程序吧? 实际上这种功能比所谓的 share
更重要, 应用也更广泛.
也就是说你的应用程序所使用的 so 文件可以更新,但应用程序无需重新编译。
动态库的生成
动态库的生成可分为三个步骤,设计库源码、编译位置无关码(PIC)型.o 文件和链
接动态库。链接动态库的命令包含特殊标志,与链接静态库和链接可执行目标文件有区别
而且不同的 Unix 系统,其实现的细节也不尽相同。
编译 PIC 型.o 中间文件的方法一般是采用 C 语言编译器的“-KPIC”或者“-fpic”选项,有
的 Unix 版本 C 语言编译器缺省带上了 PIC 标志。创建最终动态库的方法一般是采用 C 语
言编译器的“-G”或者“-shared”选项,或者直接使用工具 ld 创建。
本处设计一个创建并调用动态库的例子,分别将源文件 d1.c 和 d2.c 编译为动态库
d1.so 和 d2.so,并在主程序中调用之。
1. 设计库源码
程序 pr1.c 提供了函数 print 和变量 p,如代码 3-4 所示:
评论0