动态可执行文件和共享目标文件都依赖于相同的常用共享目标文件时,这些目标文件的处理顺序可能会变得更难以预测。
例如,假设共享目标文件开发者生成的 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 节处理的开发者应意识到共享目标文件处理顺序可能存在这种变化。