链接程序和库指南

附录 A 链接编辑器快速参考

以下各节提供了最常用的链接编辑器方案的简单概述(也可称为备忘单)。有关链接编辑器生成的输出模块种类的介绍,请参见链接编辑

提供的示例说明了提供给编译器驱动程序的链接编辑器选项,即调用链接编辑器最常用的机制。在这些示例中,将会使用 cc(1)。 请参见使用编译器驱动程序

链接编辑器不会对任何输入文件名赋予任何意义。每个文件都会被打开并检查,以确定其需要的处理类型。 请参见输入文件处理

可以使用 -l 选项输入遵循命名约定 libx.so 的共享库,以及遵循命名约定 libx.a 的归档库。 请参见库命名约定。这为允许使用 -L 选项来指定搜索路径提供了更大的灵活性。 请参见链接编辑器搜索的目录

链接编辑器本质上以静态动态两种模式之一运行。

静态模式

使用 -d n 选项时会选定静态模式,通过此模式可创建可重定位目标文件和静态可执行文件。在此模式下,可以接受的输入形式只有可重定位目标文件和归档库。使用 -l 选项可以对归档库进行搜索。

创建可重定位目标文件


$ cc -dn -r -o temp.o file1.o file2.o file3.o .....

创建静态可执行文件

静态可执行文件的使用将受到限制。 请参见静态可执行文件。静态可执行文件通常包含特定于平台实现的细节,这会限制可执行文件在备用平台上运行的能力。许多 Solaris 库的实现都取决于动态链接功能,如 dlopen(3C)dlsym(3C)。 请参见装入其他目标文件。这些功能对于静态可执行文件不可用。


$ cc -dn -o prog file1.o file2.o file3.o .....

-a 选项可用于指示静态可执行文件的创建。使用-d n不使用 -r 选项隐含表示为使用 -a

动态模式

动态模式是链接编辑器操作的缺省模式。指定 -d y 选项可以强制执行此模式;但是只要不使用 -d n 选项,则隐含表示为使用此模式。

在此模式下,可以接受的输入形式包括可重定位目标文件、共享库和归档库。使用 -l 选项可以进行目录搜索,即搜索每个目录以查找共享库。如果未找到任何共享库,则会搜索同一目录来查找归档库。使用 -B static 选项可以强制仅对归档库执行搜索。 请参见同时链接共享库和归档

创建共享库

以下示例结合了以上几点:


$ cc -c -o foo.o -K pic -xregs=no%appl foo.c

$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \

-z combreloc -z ignore -R /home/lib foo.o -L. -lbar -lc

以下示例结合了以上几点:


$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \

-z combreloc -z ignore -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc

$ ln -s libfoo.so.1 libfoo.so

创建动态可执行文件

以下示例结合了以上几点:


$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \

-lfoo file1.o file2.o file3.o .....