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

退出打印视图

更新时间: 2014 年 7 月
 
 

配置共享目标文件

运行时链接程序可以针对任何在运行应用程序时处理的共享目标文件生成配置信息。运行时链接程序负责将共享目标文件绑定到应用程序,因此它可以拦截任何全局函数绑定。这些绑定通过 .plt 项执行。有关此机制的详细信息,请参见执行重定位的时间

LD_PROFILE 环境变量将指定配置文件的共享目标文件名称。可以使用此环境变量分析单个共享目标文件。可以使用此环境变量的设置来分析一个或多个应用程序使用此共享目标文件的方式。在以下示例中,将分析命令 ls(1) 的单次调用如何使用 libc

$ LD_PROFILE=libc.so.1  ls -l

在以下示例中,将在配置文件中记录此环境变量设置。此设置会导致某个应用程序使用 libc 来累积经过分析的信息。

# crle  -e LD_PROFILE=libc.so.1
$ ls -l
$ make
$ ....

启用配置时,便会创建配置数据文件(如果尚未存在)。此文件由运行时链接程序进行映射。在上述示例中,此数据文件为 /var/tmp/libc.so.1.profile。64 位库需要扩展配置文件格式,并使用 .profilex 后缀写入。还可以指定备用目录,使用 LD_PROFILE_OUTPUT 环境变量存储配置数据。

该配置数据文件用于存储 profil(2) 数据,并调用与使用指定共享目标文件相关的计数信息。使用 gprof(1) 可以直接检查此配置数据。


注 - gprof(1) 最常用于分析由可执行文件(已使用 cc(1) 的 –xpg 选项进行编译)创建的 gmon.out 配置数据。运行时链接程序的配置文件分析不要求使用此选项编译任何代码。其相关共享目标文件正在配置的应用程序不应该调用 profil(2),因为此系统调用不会在同一进程中提供多次调用。由于相同的原因,不能使用 cc(1) 的 –xpg 选项编译这些应用程序。这种编译器生成的配置机制也会在 profil(2) 的基础上生成。

此配置机制最强大的功能之一就是可以分析由多个应用程序使用的共享目标文件。通常,使用一个或两个应用程序执行配置分析。但是,共享目标文件就其本质而言可供多个应用程序使用。分析这些应用程序使用共享目标文件的方式,可以了解应在何处投入更多精力以改善共享目标文件的整体性能。

以下示例说明了在某个源分层结构中创建多个应用程序时对 libc 进行的性能分析。

$ LD_PROFILE=libc.so.1 ; export LD_PROFILE
$ make
$ gprof -b /lib/libc.so.1 /var/tmp/libc.so.1.profile
....

granularity: each sample hit covers 4 byte(s) ....

                                  called/total     parents
index  %time    self descendents  called+self    name      index
                                  called/total     children
....
-----------------------------------------------
                0.33        0.00      52/29381     _gettxt [96]
                1.12        0.00     174/29381     _tzload [54]
               10.50        0.00    1634/29381     <external>
               16.14        0.00    2512/29381     _opendir [15]
              160.65        0.00   25009/29381     _endopen [3]
[2]     35.0  188.74        0.00   29381         _open [2]
-----------------------------------------------
....
granularity: each sample hit covers 4 byte(s) ....

   %  cumulative    self              self    total
 time   seconds   seconds    calls  ms/call  ms/call  name
 35.0     188.74   188.74    29381     6.42     6.42  _open [2]
 13.0     258.80    70.06    12094     5.79     5.79  _write [4]
  9.9     312.32    53.52    34303     1.56     1.56  _read [6]
  7.1     350.53    38.21     1177    32.46    32.46  _fork [9]
 ....

特殊名称 <external> 指示要从正在配置的共享目标文件的地址范围之外进行引用。因此,在上一示例中,从动态可执行文件,或者从其他共享目标文件(正在进行配置分析时绑定到 libc),对 libc 中的函数 open(2) 发出了 1634 次调用。


注 - 共享目标文件配置具有多线程安全性,但以下情况除外:一个线程调用 fork(2),而另一个线程正在更新配置数据信息。使用 fork(2) 可取消这个限制。