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