创建共享库
此部分描述如何创建共享库。
必备任务
- 创建一个或多个将要编译链接以创建共享库的源文件。 这些文件包含其他源文件中引用的导出符号。
对于本文中的示例,两个源文件,share1.c和share2.c,使用。 该share1.c 文件包含以下代码:
该share2.c文件包含以下代码:/************ * share1.c: shared library source. *************/ #include <stdio.h> void func1 () { printf("func1 called\n"); } void func2 () { printf("func2 called\n"); }
这些文件中的导出符号是func1,func2和func3./************ * share2.c: shared library source. *************/ void func3 () { printf("func3 called\n"); } - 创建主源文件,该文件引用将包含在共享库中的导出符号。
对于本文中的示例,指定了主源文件main.c启用基本映像激活的缺省 OVF。 该main.c 文件包含以下代码:
/************ * main.c: contains references to symbols defined * in share1.c and share2.c *************/ #include <stdio.h> extern void func1 (), func2 (), func3 (); main () { func1 (); func2 (); func3 (); } - 创建在由其他对象模块引用的共享库中显式导出符号所必需的导出文件。
对于本文中的示例,一个名为shrsub.exp启用基本映像激活的缺省 OVF。 该shrsub.exp 文件包含以下代码:
该#!行仅在该文件用作导入文件时才有意义。 在这种情况下,#!行标识要在运行时使用的共享库文件的名称。#! /home/sharelib/shrsub.o * Above is full pathname to shared library object file func1 func2 func3
PROCEDURE
- 编译并链接这两个要共享的源代码文件。 (此过程假定您位于 /home/sharedlib 目录。) 要编译和链接源文件,请输入以下命令:
这将创建共享库名shrsub.o在 /home/sharedlib 目录中。cc -c share1.c cc -c share2.c cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry- -bM:SRE 标记
- 标记生成的对象文件shrsub.o作为可重入的共享库
每个使用共享代码的进程会在其专用进程区域中获取数据的一个专用副本。
- 标记
- 设置哑元入口点_nostart覆盖缺省入口点,_start
- -bnoentry 标记
- 告诉链接编辑器共享库没有入口点
共享库可能有一个入口点,但系统装入程序在共享库装入时不使用入口点。
- 使用以下命令将共享库置于归档文件中:
此步骤是可选的。 将共享库置于归档中使得在链接程序时指定共享库更加方便,因为可对 ld 命令使用 -l 和 -L 标记。ar qv libsub.a shrsub.o - 用共享库编译和链接主源代码以创建可执行文件。 (此步骤假定当前工作目录包含 main.c 文件。) 请使用以下命令:
如果共享库不在归档内,请使用此命令:cc -o main main.c -lsub -L/home/sharedlib
程序main现在可执行。 该func1,func2和func3已为装入时间延迟解析标记符号。 在运行时,系统装入程序将模块装入到共享库中(除非该模块已经装入)并动态解析各引用。cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
注: 从 C++ 对象创建共享库时,必须在导出文件中使用已管理的 C++ 符号名称。 但是,C++
编译器可能提供用于创建共享库的选项。 请参阅编译器文档以了解更多信息。
- -L 标记
- 添加指定的目录 (在本例中,/home/sharedlib) 到库搜索路径,保存在程序的装入程序部分中。
在运行时库搜索路径用于告知装入程序从何处查找共享库。
- LIBPATH 环境变量
- 一个由冒号分隔的目录路径列表,它也可用于指定不同的库搜索路径。 其格式与 PATH 环境变量的格式一致。
搜索列表中的目录以解析对共享对象的引用。 /usr/lib 和 /lib 目录包含共享库,且通常应该包括在库搜索路径内。