手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

crle (1)

名称

crle - 配置运行时链接环境

用法概要

crle [-64] [-a 
name] [-A name] [
-c conf] [-e 
env] [-E env] 
 [-f flags] [-i 
name] [-I name] [
-g name] [-G 
name] 
 [-l dir] [-o 
dir] [-s dir] [
-t] [-u] [-v]

描述

crle 实用程序针对运行时链接配置文件的创建和显示而提供。配置文件由运行时链接程序 ld.so.1(1) 在进程启动期间读取和解释。运行时链接程序尝试为所有进程读取一个缺省配置文件。对于 32 位进程,缺省配置文件是 /var/ld/ld.config。对于 64 位进程,缺省配置文件是 /var/ld/64/ld.config。

若不带任何参数,或仅仅只有 –c 选项,则 crle 将显示配置信息。此信息包括配置文件的内容、所有系统缺省值以及重新生成该配置文件所需的命令行。当与其他任何选项结合使用时,将会创建或更新为一个新的配置文件。

还可通过设置 LD_CONFIG 系列的环境变量之一将运行时链接程序定向至备用配置文件。LD_CONFIG 对于 32 位和 64 位程序均适用。因为 32 位和 64 位配置文件不同,单一的配置文件无法同时用于两类目标文件。因此,在一类程序执行另一类程序时,LD_CONFIG 可能会对程序执行产生不利影响。尤其是,由 32 位版本的标准 Solaris 实用程序执行其对应的 64 位程序这种情况很常见。LD_CONFIG 在此情况下无法胜任。因此,建议使用专门针对某一类进程的 LD_CONFIG_32 和 LD_CONFIG_64 环境变量。

在标准位置 /var/ld 中创建不正确的配置文件可能会阻止程序运行,进而可能难于从其中进行恢复。要防止出现此情况,建议首先在临时位置创建新的配置文件。然后,针对此新的配置文件设置适当的 LD_CONFIG 环境变量。该设置会使运行时链接程序使用新的配置文件而非任何缺省值。验证后,如果需要,可将新的配置文件移至缺省位置。任何时候,都可将环境变量 LD_NOCONFIG 设置为任意值以指示运行时链接程序忽略任何配置文件。该设置可通过实验证明其有用性。

配置文件可以包含以下信息。

缺省搜索路径

运行时链接程序使用规定的搜索路径定位目标文件的动态依赖项。此搜索路径的构成部分如下所示:以任何一个 LD_LIBRARY_PATH 定义所指定的路径开始,后跟目标文件的 runpath 所指定的路径。最后使用特定于目标文件类的任何缺省搜索路径。搜索路径中这个最后的组成部分可以在配置文件中提供。通常,使用该功能时可通过任何系统缺省值进行补充。请参见 –l 和 –u 选项。

可信目录

在处理安全应用程序时,运行时链接程序将限制 LD_LIBRARY_PATH 搜索和 $ORIGIN 标记扩展的使用。请参见Oracle Solaris 11.2 链接程序和库指南 中的安全性。此外,也会限制可从其中定位预装入和审计库的目录。与预装入和审计库关联的路径名会限制为已知可信目录。可信目录可以在配置文件中提供。通常,使用该功能时可通过任何系统缺省值进行补充。请参见 –s 和 –u 选项。

环境变量

任何由运行时链接程序解释的环境变量都可在配置文件中进行指定。

目录高速缓存

已定义目录内共享目标文件的位置可以作为配置文件内的高速缓存进行维护。该目录高速缓存可以降低搜索应用程序依赖项的开销。

备用目标文件

结合目录高速缓存,共享目标文件可以指定备用目标文件以便在运行时使用。这些备用目标文件可以由用户提供。备用目标文件还可由 crle 创建,作为共享目标文件的副本固定在已知存储单元。这些固定的备用目标文件在运行时所需的处理要少于其对应的原始共享目标文件。

对于希望在中心位置安装第三方软件或者更改未用适当 runpath 编码的应用程序搜索路径的管理员而言,定义额外的缺省搜索路径或额外的可信目录非常有用。

声明备用目标文件提供了一种替换依赖项的方法,无需使用符号链接或 LD_LIBRARY_PATH 设置。

声明由运行时链接程序解释的环境变量提供了一种针对所有应用程序集中控制其定义的方法。

目录高速缓存和 crle 生成的备用目标文件可以提供一种减少应用程序的运行时启动开销的方法。对于需要许多依赖项或重新定位其依赖项的开销极其高的应用程序而言,备用目标文件非常有用。包含 position-dependent 代码的共享目标文件若要进行重新定位,通常开销都比较大。请注意,系统具有许多有助于降低开销的高速缓存工具(如负路径查找),因此,利用 crle 创建目录高速缓存所产生的影响可能很小(一些非常特殊的情况除外)。

如果在配置文件中指定由 crle 生成的备用目标文件,运行时链接程序将执行一些最小一致性验证。备用目标文件将针对其原始目标文件进行验证。此验证意在避免由于应用程序配置信息与底层系统组件失去同步而导致的应用程序故障。当此情况出现时,可能会危及到动态链接系统组件提供的灵活性。此类型的应用程序故障可能非常难于诊断。不会验证目录高速缓存信息。进程看不到对目录结构所做的任何更改,直到重新构建高速缓存。

系统共享目标文件通常都经过了良好的调优,进行高速缓存所带来的好处并不是那么明显。目录高速缓存和备用目标文件功能通常适用于用户应用程序和共享目标文件,并且可能仅在某些非常特殊的情况下才会显示出情况的改善。

使用 –I 和 –G 选项时,crle 将使用 dldump(3C) 为所发现的共享目标文件创建备用目标文件。备用目标文件在前面的 –o 选项所指定的目录中创建,或缺省设置为创建配置文件时所在的目录。dldump() 所用的标志由 –f 选项指定,或缺省设置为 RTLD_REL_RELATIVE。

选项

支持以下选项。

–64

指定要处理 64 位目标文件,缺省值为 32 位。使用 –64 创建 64 位特定配置文件。

–a name

为 name 创建备用路径名称。将备用路径名称添加到配置文件。

实际备用文件必须由用户提供。允许此选项出现多次。如果 name 是一个目录,则将此目录中的所有共享目标文件添加到高速缓存。如果 name 不存在,则会在高速缓存中将 name 标记为不存在的文件。

通常,此选项与 –o 选项结合使用。

–A name

为 name 创建可选备用路径名称。将此备用路径名称添加到配置文件。

此选项类似 –a 选项,只是如果在运行时备用目标文件不可用,将使用原始目标文件 name。此模型类似辅助过滤器的用法。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 4  章 共享目标文件。

通常,此选项与 –o 选项结合使用。

–c conf

指定要使用配置文件名 conf。如果未提供此选项,则使用缺省配置文件。

–e env

指定一个可替换的环境变量 env。只有适用于运行时链接程序的环境变量才有意义。允许此选项出现多次。此选项类似于 –E 选项。然而,对于在运行时解析配置文件定义以及同名的进程环境定义的方式,这两个选项有所不同。

配置文件中设置的定义可以由进程环境定义覆盖,或由空值进程环境定义禁止。

换言之,在运行时进程环境可以替换或删除这些配置文件定义。

–E env

指定一个永久的环境变量 env。只有适用于运行时链接程序的环境变量才有意义。允许此选项出现多次。此选项类似于 –e 选项。然而,对于在运行时解析配置文件定义以及同名的进程环境定义的方式,这两个选项有所不同。

对于运行时链接程序有意义的环境变量定义属于这两种类别之一。单一定义是指诸如 LD_NOLAZYLOAD=1 和 LD_DEBUG_OUTPUT=file 之类的定义。列表定义(可以有一个或多个值)是指诸如 LD_LIBRARY_PATH=path 和 LD_DEBUG=files,details 之类的定义。

在配置文件中设置的单一定义优先于进程环境定义。在配置文件中设置的列表定义附加到进程环境定义。空值进程环境定义不能禁止配置文件中设置的任何定义。

换言之,在运行时进程环境不能替换或删除这些配置文件定义。

–f flags

向用于生成备用目标文件的 dldump(3C) 调用提供符号 flags 参数。可以使用 /usr/include/dlfcn.h 中定义的任何 RTLD_REL 标志。可以使用 "|" 字符将多个标志连接起来(逻辑 or 关系)。在这种情况下,字符串应以引号括起来,以避免 shell 进行扩充。如果未提供 flags 值,则缺省标志为 RTLD_REL_RELATIVE。

–i name

向配置高速缓存添加单个 name。允许此选项出现多次。name 可以是一个共享目标文件或一个目录。如果 name 是一个目录,则将此目录中的所有共享目标文件添加到高速缓存。如果 name 不存在,则在高速缓存中将 name 标记为不存在的目录。

–I name

类似 –i,此外,所处理的任何共享目标文件均使用 dldump(3C) 创建一个备用目标文件。如果 –f 标志包含 RTLD_REL_EXEC,则 name 可以是将为其创建备用目标文件的动态可执行文件。以此种方式只能指定一个动态可执行文件,因为创建的高速缓存特定于此应用程序。

–g name

向配置高速缓存添加组 name。每个目标文件都会展开以确定其依赖项。允许此选项出现多次。 name 可以是动态可执行文件、共享目标文件或目录。如果 name 是共享目标文件,则将该共享目标文件及其依赖项添加到高速缓存。如果 name 是目录,则将该目录中的每个共享目标文件及其依赖项添加到高速缓存。

–G name

类似 –g 选项,此外,所处理的任何共享目标文件均使用 dldump(3C) 创建一个备用目标文件。如果 name 是一个动态可执行文件,而且 –f 标志包含 RTLD_REL_EXEC,则还会为此动态可执行文件创建一个备用目标文件。以此种方式只能指定一个动态可执行文件,因为创建的高速缓存特定于此应用程序。

–l dir

为 ELF 目标文件指定新的缺省搜索目录 dir。允许此选项出现多次。

32 位 ELF 目标文件的缺省搜索路径是 /lib,后跟 /usr/lib。64 位 ELF 目标文件的缺省搜索路径是 /lib/64,后跟 /usr/lib/64。

使用此选项将替换缺省搜索路径。因此,通常需要使用 –l 选项来指定与任何要应用的新路径相关的原始系统缺省值。但是,如果 –u 选项生效,而配置文件不存在,则系统缺省值会添加到新配置文件。这些缺省值在使用 –l 选项指定新路径之前进行添加。

–o dir

当与 –a 或 –A 选项结合使用时,指定任何备用目标文件所在的目录 dir。如果备用目标文件由 crle 创建,此选项将指定备用目标文件的创建位置。若不使用此选项,备用目标文件将位于创建配置文件的目录。允许此选项出现多次,目录 dir 用于为后面的任何命令行选项定位备用目标文件。备用目标文件不允许覆盖其关联的原始目标文件。

通常,此选项与 –a 或 –A 选项结合使用。

–s dir

为 secure ELF 目标文件指定新的可信目录 dir。允许此选项出现多次。

有关安全目标文件的定义,请参见ld.so.1(1)中的“安全性”部分。有关安全应用程序的运行时限制的论述,请参见Oracle Solaris 11.2 链接程序和库指南 中的安全性。

32 位安全 ELF 目标文件的缺省可信目录是 /lib/secure,后跟 /usr/lib/secure。对于 64 位安全 ELF 目标文件,缺省的可信目录是 /lib/secure/64,后跟 /usr/lib/secure/64。

使用此选项将替换缺省可信目录。因此,通常需要使用 –s 选项来指定与任何要应用的新目录相关的原始系统缺省值。但是,如果 –u 选项生效,而配置文件不存在,则系统缺省值会添加到新配置文件。这些缺省值在使用 –l 选项指定新目录之前进行添加。

–t

已过时。请参见“附注”部分。

–u

请求更新配置文件,可能是添加新信息。若无其他选项,将检查任何现有配置文件并重新计算其内容。其他参数允许将信息附加到重新计算的内容。请参见“附注”部分。

如果配置文件不存在,则会按其他参数的指示创建配置文件。当使用 –l 和 –s 选项时,将首先向配置文件应用系统缺省值,然后才向通过这些选项指定的目录应用系统缺省值。

配置文件的格式可以是缺少系统标识信息(通常写在文件开头处)的较旧格式。在这种情况下,crle 不会将系统标识信息放入所生成的文件中,以保留文件与旧版本 Solaris 的兼容性。请参见“附注”部分。

–v

指定详细模式。创建配置文件时,对于要处理的文件的跟踪会写入标准输出。在输出配置文件的内容时,会提供更详细的目录和文件信息。

缺省情况下,运行时链接程序会为所处理的每个 32 位应用程序尝试读取配置文件 /var/ld/ld.config。对于每个 64 位应用程序,则读取 /var/ld/64/ld.config。在处理备用应用程序时,运行时链接程序将使用 $ORIGIN/ld.config. app-name 配置文件(如果存在)。请参见“附注”部分。应用程序可以通过设置 LD_CONFIG 环境变量来引用备用配置文件。还可通过在构建应用程序时在应用程序中记录配置文件名来指定备用配置文件。请参见 ld(1) 的 –c 选项。

示例

示例 1 试用临时配置文件

以下示例将使用 ELF 目标文件的新缺省搜索路径创建一个临时配置文件。环境变量 LD_CONFIG_32 用于指示运行时链接程序针对所有 32 位进程使用此配置文件。

$ crle -c /tmp/ld.config -u -l /local/lib
$ crle -c /tmp/ld.config

Configuration file [version 4]: /tmp/ld.config
  Platform:     32-bit MSB SPARC
  Default Library Path (ELF):  /lib:/usr/lib:/local/lib
  Trusted Directories (ELF):   /lib/secure:/usr/lib/secure  \
                               (system default)

Command line:
  crle -c /tmp/ld.config -l /lib:/usr/lib:/local/lib

$ LD_CONFIG_32=/tmp/ld.config date
Thu May 29 17:42:00 PDT 2008
示例 2 为 ELF 目标文件更新并显示新的缺省搜索路径

以下示例将更新并显示 ELF 目标文件的新缺省搜索路径。

# crle -u -l /local/lib
# crle

Configuration file [version 4]: /var/ld/ld.config
  Platform:     32-bit MSB SPARC
  Default Library Path (ELF):  /lib:/usr/lib:/local/lib
  Trusted Directories (ELF):   /lib/secure:/usr/lib/secure  \ 
                               (system default)

Command line:
  crle -l /lib:/usr/lib:/local/lib

# crle -u -l /ISV/lib
# crle

Configuration file [version 4]: /var/ld/ld.config
  Platform      32-bit MSB SPARC
  Default Library Path (ELF):  /lib:/usr/lib:/local/lib:/ISV/lib
  Trusted Directories (ELF):   /lib/secure:/usr/lib/secure  \
                               (system default)

Command line:
  crle -l /lib:/usr/lib:/local/lib:/usr/local/lib

在本示例中,缺省配置文件最初并不存在。因此,新的搜索路径 /local/lib 附加到系统缺省值。下一次更新将搜索路径 /ISV/lib 附加到已在配置文件中设置的那些路径。

示例 3 从错误配置文件进行恢复

以下示例将在缺省位置创建一个错误配置文件。可通过使用 LD_NOCONFIG 环境变量指示运行时链接程序忽略任何配置文件来删除该文件。请注意,建议创建临时配置文件,并使用环境变量 LD_CONFIG 试用这些文件。

# crle -l /local/lib
# date
ld.so.1: date: fatal: libc.so.1: open failed:  \ 
   No such file or directory
Killed
# LD_NOCONFIG=yes rm /var/ld/ld.config
# date
Thu May 29 17:52:00 PDT 2008

此配置文件不包含系统缺省搜索路径,因此,date 实用程序无法找到所需的系统依赖项。在这种情况下,应使用 –u 选项。

示例 4 为 ELF 目标文件新建缺省搜索路径和可信目录并进行显示

以下示例将为 ELF 目标文件新建缺省搜索路径和可信目录并进行显示。

# crle -l /local/lib -l /lib -l /usr/lib -s /local/lib
# crle

Configuration file [version 4]: /var/ld/ld.config
  Platform:     32-bit MSB SPARC
  Default Library Path (ELF):  /local/lib:/lib:/usr/lib
  Trusted Directories (ELF):   /local/lib

Command line:
  crle -l /local/lib:/lib:/usr/lib -s /local/lib

有了此配置文件,可以将第三方应用程序安装在 /local/bin 中,而将其依赖项安装在 /local/lib 中。缺省搜索路径使应用程序无需设置 LD_LIBRARY_PATH 即可定位其依赖项。本示例中缺省可信目录也进行了替换。

示例 5 为 ELF 目标文件创建目录高速缓存

以下示例将为 ELF 目标文件创建目录高速缓存。

$ crle -i /usr/dt/lib -i /usr/openwin/lib -i /lib -i /usr/lib  \
        -c config
$ ldd -s ./main
....
   find object=libc.so.1; required by ./main
    search path=/usr/dt/lib:/usr/openwin/lib  (RUNPATH/RPATH ./main)
    trying path=/usr/dt/lib/libc.so.1
    trying path=/usr/openwin/lib/libc.so.1
    search path=/lib  (default)
    trying path=/lib/libc.so.1
        libc.so.1 =>     /lib/libc.so.1

$ LD_CONFIG=config ldd -s ./main
....
   find object=libc.so.1; required by ./main
    search path=/usr/dt/lib:/usr/openwin/lib  (RUNPATH/RPATH ./main)
    search path=/lib  (default)
    trying path=/lib/libc.so.1
        libc.so.1 =>     /lib/libc.so.1

通过此配置,高速缓存将反映出系统库 libc.so.1 不存在于目录 /usr/dt/lib 或 /usr/openwin/lib 中。因此,针对此系统文件的搜索将忽略这些目录,即使应用程序的 runpath 指示应搜索这些路径。

示例 6 为 ELF 可执行文件创建备用目标文件高速缓存

以下示例将为 ELF 可执行文件创建备用目标文件高速缓存。

$ crle -c /local/$HOST/.xterm/ld.config.xterm  \
        -f RTLD_REL_ALL  -G /usr/openwin/bin/xterm
$ ln  -s /local/$HOST/.xterm/xterm  /local/$HOST/xterm
$ ldd /usr/local/$HOST/xterm
    libXaw.so.5 =>  /local/$HOST/.xterm/libWaw.so.5  (alternate)
    libXmu.so.4 =>  /local/$HOST/.xterm/libXmu.so.4  (alternate)
    ....
    libc.so.1 =>    /local/$HOST/.xterm/libc.so.1  (alternate)
    ....

通过此配置,将创建新的 xterm 及其依赖项。这些新目标文件相互进行完全重定位,与原始目标文件相比,加快了启动速度。此应用程序的执行使用其自己特定的配置文件。通常,此模型比使用环境变量 LD_CONFIG 更为灵活,因为配置文件不可能由其他应用程序(如 ldd(1) 或 truss(1))错误使用。

示例 7 创建备用目标文件高速缓存以替换 ELF 共享目标文件

以下示例将创建备用目标文件高速缓存以替换 ELF 共享目标文件。

$ ldd /usr/bin/vi
    libcurses.so.1 =>  /lib/libcurses.so.1
    ....

# crle -a /lib/libcurses.so.1 -o /usr/xpg4/lib
# crle

Configuration file [version 4]: /var/ld/ld.config
  Platform:     32-bit LSB 80386
  Default Library Path (ELF):  /lib:/usr/lib  (system default)
  Trusted Directories (ELF):   /lib/secure:/usr/lib/secure  \
                               (system default)

Directory: /lib
  libcurses.so.1  (alternate: /usr/xpg4/lib/libcurses.so.1)
....

$ ldd /usr/bin/vi
    libcurses.so.1 => /usr/xpg4/lib/libcurses.so.1 (alternate)
    ....

有了此配置,任何通常解析至 /usr/lib/libcurses.so.1 的依赖项将改为解析至 /usr/xpg4/lib/libcurses.so.1。

示例 8 设置可替换环境变量和永久环境变量

以下示例将设置可替换环境变量和永久环境变量。

# crle -e LD_LIBRARY_PATH=/local/lib  \
        -E LD_PRELOAD=preload.so.1
# crle
.....
Environment Variables:
  LD_LIBRARY_PATH=/local/lib  (replaceable)
  LD_PRELOAD=preload.so.1  (permanent)

.....
$ LD_DEBUG=files LD_PRELOAD=preload.so.2 ./main
.....
18764: file=preload.so.2;  preloaded
18764: file=/local/lib/preload.so.2  [ ELF ]; generating link map
.....
18764: file=preload.so.1;  preloaded
18764: file=/local/lib/preload.so.1  [ ELF ]; generating link map
.....

通过此配置文件,可替换搜索路径将与附加到进程环境定义的永久预装入目标文件一起进行指定。

退出状态

创建或显示配置文件将导致返回 0。否则,任何错误情形都会随附一条诊断消息并返回非零值。

附注

如果原始应用程序包含 .dynamic 标记 DT_FLAGS_1 或 DT_FEATURE_1 之一,则可标记备用应用程序以使用应用程序特定的配置文件。如果没有这些条目,必须使用 LD_CONFIG 环境变量指定配置文件。使用后一种方法时应格外小心,因为此环境变量对任何分支应用程序均可见。

使用 –u 选项至少需要 crle 版本 2。从显示配置文件内容的角度来看,很显然需要此版本级别。

$ crle

Configuration file [2]: /var/ld/ld.config
  ......

使用版本 2 配置文件,crle 能够构造重新生成配置文件所需的命令行参数。此命令行构造使用 –u 选项提供完整的更新功能。尽管版本 1 配置文件更新也是可以的,但配置文件内容可能对于 crle 计算整个更新需求而言并不够用。

配置文件包含平台特定的二进制数据。给定的配置文件只能由具有相同机器类和字节排序的软件进行解释。配置文件的开头是系统标识信息。此信息由 crle 和运行时用来检查其与配置文件的兼容性。此信息还使得 file(1) 命令能够正确识别配置文件。为了保持向后兼容性,缺少此信息的较旧文件仍是可以接受的,尽管不具备标识和错误检查(具有这些检查也是可以的)。在针对缺少系统信息的较旧文件处理更新 (–u) 操作时,crle 不会向结果添加系统标识信息。

Oracle Solaris 11 在 SPARC 硬件上不再继续支持 SunOS 4.x AOUT 可执行文件。在做出此更改之前,–t 选项提供了一种表示目标文件类型(ELF 或 AOUT)的切换方式,该选项影响后面的任何 –l 或 –s 选项。–t 选项现在已过时,任何 AOUT 特定指令均将忽略,并给出一个警告说明此影响。同样,使用 crle 检查包含 AOUT 信息的旧配置文件也将生成一个警告消息,指出信息已过时。

文件

/var/ld/ld.config

32 位应用程序的缺省配置文件。

/var/ld/64/ld.config

64 位应用程序的缺省配置文件。

/var/tmp

临时配置文件的缺省位置。请参见 tempnam(3C)。

/usr/lib/lddstub

用于 dldump(3C) 32 位目标文件的桩应用程序。

/usr/lib/64/lddstub

用于 dldump(3C) 64 位目标文件的桩应用程序。

/usr/lib/libcrle.so.1

用于 dldump (3C) 32 位目标文件的审计库。

/usr/lib/64/libcrle.so.1

用于 dldump (3C) 64 位目标文件的审计库。

环境变量

没有 crle 引用的环境变量。不过,在处理由 crle 创建的配置文件时,有几个环境变量会影响运行时链接程序的行为。

LD_CONFIG、LD_CONFIG_32 和 LD_CONFIG_64

提供备用配置文件。

LD_NOCONFIG、LD_NOCONFIG_32 和 LD_NOCONFIG_64

禁用配置文件处理。

LD_NODIRCONFIG、LD_NODIRCONFIG_32 和 LD_NODIRCONFIG_64

从配置文件禁用目录高速缓存处理。

LD_NOENVCONFIG、LD_NOENVCONFIG_32 和 LD_NOENVCONFIG_64

从配置文件禁用环境变量处理。

LD_NOOBJALTER、LD_NOOBJALTER_32 和 LD_NOOBJALTER_64

从配置文件禁用备用目标文件处理。

属性

有关下列属性的说明,请参见 attributes(5):

属性类型
属性值
可用性
system/linker
接口稳定性
Committed(已确定)

另请参见

file(1)、ld(1)、ld.so.1(1)、dldump(3C)、tempnam(3C)、attributes(5)

Oracle Solaris 11.2 链接程序和库指南