–B nodirect 选项提供了最简单的机制,它阻止从任何动态目标文件进行直接绑定。此选项阻止从任何其他目标文件进行直接绑定,并阻止从要生成的目标文件内进行直接绑定。
以下组件用于生成三个共享目标文件:A.so.1、O.so.1 和 X.so.1。–B nodirect 选项用于阻止 A.so.1 直接绑定到 O.so.1。不过,O.so.1 可以使用 –z direct 选项继续建立到 X.so.1 的直接绑定。
$ cat a.c extern int o(), p(), x(), y(); int a() { return (o() + p() - x() - y()); } $ cat o.c extern int x(), y(); int o() { return (x()); } int p() { return (y()); } $ cat x.c int x() { return (1); } int y() { return (2); } $ cc -o X.so.1 -G -Kpic x.c $ cc -o O.so.1 -G -Kpic o.c -Bnodirect -zdirect -R. X.so.1 $ cc -o A.so.1 -G -Kpic a.c -Bdirect -R. O.so.1 X.so.1
可以使用 elfdump(1) 来查看 A.so.1 和 O.so.1 的符号信息。
$ elfdump -y A.so.1 [1] DBL [3] X.so.1 x [5] DBL [3] X.so.1 y [6] DL [1] O.so.1 o [9] DL [1] O.so.1 p $ elfdump -y O.so.1 [3] DB [0] X.so.1 x [4] DB [0] X.so.1 y [6] N o [7] N p
字母 "N" 表示不允许直接绑定到函数 o() 和 p()。尽管 A.so.1 已使用 –B direct 选项来请求直接绑定,但是没有建立到函数 o() 和 p() 的直接绑定。O.so.1 仍然可以使用 –z direct 选项来请求到其依赖项 X.so.1 的直接绑定。
Oracle Solaris 库 libproc.so.1 是使用 –B nodirect 选项生成的。该库的用户应该为许多 libproc 函数提供他们自己的回调接口。从 libproc 的任何依赖项对 libproc 函数的引用都应当绑定到任何用户定义(如果存在这样的定义)。