Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

使用 –B nodirect 选项

–B nodirect 选项提供了最简单的机制,它阻止从任何动态目标文件进行直接绑定。此选项阻止从任何其他目标文件进行直接绑定,并阻止从要生成的目标文件内进行直接绑定。

以下组件用于生成三个共享目标文件:A.so.1O.so.1X.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.1O.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 函数的引用都应当绑定到任何用户定义(如果存在这样的定义)。