链接程序和库指南

依赖项排序

当动态可执行文件和共享库都依赖于相同的常用共享库时,这些目标文件的处理顺序可能会变得有些难以预测。

例如,假设共享库开发者生成的 libfoo.so.1 具有以下依赖项:


$ ldd libfoo.so.1

        libA.so.1 =>     ./libA.so.1

        libB.so.1 =>     ./libB.so.1

        libC.so.1 =>     ./libC.so.1

如果使用此共享库创建动态可执行文件 prog,并定义显式依赖 libC.so.1,则生成的共享库顺序如下:


$ cc -o prog main.c -R. -L. -lC -lfoo

$ ldd prog

        libC.so.1 =>     ./libC.so.1

        libfoo.so.1 =>   ./libfoo.so.1

        libA.so.1 =>     ./libA.so.1

        libB.so.1 =>     ./libB.so.1

动态可执行文件 prog 的构造将会影响对共享库 libfoo.so.1 依赖项处理顺序的任何要求。

专门致力于符号插入和 .init 节处理的开发者应意识到共享库处理顺序中存在这种潜在的更改。