JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

使用 elfdump 分析文件

底层系统

延迟装入动态依赖项

与位置无关的代码

-K pic-K PIC 选项

删除未使用的材料

删除未使用的节

删除未使用的文件

删除未使用的依赖项

最大化可共享性

将只读数据移动到文本中

折叠多重定义数据

使用自动变量

动态分配缓冲区

最小化分页活动

重定位

符号查找

执行重定位的时间

组合重定位节

复制重定位

使用 -B symbolic 选项

配置共享目标文件

8.  mapfile

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)mapfile

索引

配置共享目标文件

运行时链接程序可以针对任何在运行应用程序时处理的共享目标文件生成配置信息。运行时链接程序负责将共享目标文件绑定到应用程序,因此它可以拦截任何全局函数绑定。这些绑定通过 .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) 可取消这个限制。