手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

ld.so.1(1)

名称

ld.so.1 - 动态目标文件的运行时链接程序

用法概要

/lib/ld.so.1 
/lib/ld.so.1 [-e envar] dynamic-object [object args]...

描述

动态应用程序包含一个或多个动态目标文件。动态应用程序通常是指动态可执行文件,以及一个或多个共享目标文件依赖项。在动态应用程序的初始化和执行过程中,将调用解释器。该解释器可将应用程序与其共享目标文件依赖项绑定在一起。在 Solaris 中,该解释器也称为运行时链接程序。

在动态可执行文件的链接编辑期间,将创建一个特殊的 .interp 部分,以及一个关联的程序头。此节包含用于指定程序的解释程序的路径名。将 –I 选项用于链接编辑器 ld(1) 来构造可执行文件时,可指定解释器路径名。由链接编辑器提供的缺省名称是运行时链接程序的名称 ld.so.1

在动态可执行文件的执行过程中,内核将映射文件和所需解释器的定位。请参见 exec(2)mmapobj(2)。内核将映射到该解释器中并将控制权传输给该解释器。将向解释器传递足够的信息,使之能够继续绑定,然后执行应用程序。

除了初始化应用程序,运行时链接程序还可以向应用程序提供相关服务以扩展其地址空间。此外,还可以映射其他共享目标文件并绑定到共享目标文件中的符号。

运行时链接程序可执行以下功能:

  • 处理配置文件(如果存在)。 配置文件可用来更改缺省搜索路径、提供目录高速缓存,以及提供备选目标文件依赖项。请参见 crle(1)。缺省情况下,对于 32 位目标文件,将使用配置文件 /var/ld/ld.config。对于 64 位目标文件,将使用缺省配置文件 /var/ld/64/ld.config。备选配置文件可通过 LD_CONFIG 环境变量指定。此外,还可以使用 ld(1)–c 选项在动态可执行文件内对备选配置文件进行编码。

  • 运行时链接程序可以分析应用程序的动态信息部分 .dynamic,从而确定哪些共享目标文件依赖项是必需的。

  • 然后,运行时链接程序会定位并映射到这些依赖项中,并接着分析每个依赖项的动态信息部分,以便确定是否需要任何其他依赖项。

  • 装入所有共享目标文件依赖项以后,运行时链接程序将执行任何必要的重定位操作。这些重定位操作可以绑定共享目标文件,为进程执行做准备。

  • 将调用共享目标文件依赖项以及(可能)动态可执行文件提供的初始化函数。这些函数的调用顺序与依赖项的拓扑排序顺序相反。如果存在循环依赖项,将使用排序顺序调用初始化函数并删除循环。ldd(1) 可用于显示共享目标文件依赖项的初始化顺序。

  • 控制权将传递给应用程序。

  • 在应用程序执行期间,可调用运行时链接程序来执行任何延迟的函数绑定操作。

  • 如果从进程中删除任何共享目标文件,将调用结束化函数。缺省情况下,这些函数的调用顺序与依赖项的拓扑排序顺序相同。

  • 应用程序还可以使用 dlopen(3C) 来调用运行时链接程序的服务以获取其他共享目标文件。可以使用 dlsym(3C) 绑定到这些目标文件提供的符号。

有关前面每个主题的更多详细信息,请参见Oracle Solaris 11.2 链接程序和库指南

运行时链接程序使用规定的搜索路径定位目标文件的动态依赖项。缺省搜索路径为目标文件中记录的 runpath,后跟一系列缺省值。32 位目标文件的缺省搜索路径为 /lib,后跟 /usr/lib。64 位目标文件的缺省搜索路径为 /lib/64,后跟 /usr/lib/64。这些缺省部分可以使用通过 crle(1) 创建的配置文件进行修改。将 –R 选项用于 ld(1) 以构造动态目标文件时,将指定 runpath。可以使用环境变量 LD_LIBRARY_PATH 来表示将先于缺省目录进行搜索的目录。

命令行使用

通常情况下,运行时链接程序是通过执行动态可执行文件间接调用的,动态可执行文件将运行时链接程序声明为它的解释器。此外,也可通过命令行直接执行运行时链接程序。该机制最常用来尝试运行时链接程序的新的实现。命令行上提供的参数包含适用于运行时链接程序的选项。这些选项后跟要执行的动态目标文件的名称,以及该目标文件所需的任何选项。事实上,运行时链接程序将替换动态目标文件所指定的任何解释器。

支持以下选项:

–e envar

指定特定于运行时链接程序的环境变量。请参见“环境变量”部分。使用该选项设置的变量将优先于任何环境变量或具有相同名称的配置文件变量。可指定变量 LD_NOENVIRON 来指示在 –e 选项处理后不应处理任何环境变量。

环境变量

每个环境变量均可使用 _32_64 后缀进行指定。这样,环境变量将分别特定于 32 位或 64 位进程。该环境变量将覆盖任何可能有效的环境变量的无后缀版本。如果环境变量指定时没有提供值且其具有 _32_64 后缀,则事实上会取消任何关联的通用环境变量设置。

LD_AUDIT、LD_AUDIT_32 和 LD_AUDIT_64

运行时链接程序装入的目标文件的冒号分隔列表。装入每个目标文件时,将检查目标文件的链接审计接口例程。将按照Oracle Solaris 11.2 链接程序和库指南 中所述的 "Link-Auditing" 接口中指定的那样调用存在的例程。另请参见 ld(1)–p–P 选项。

LD_BIND_LAZY、LD_BIND_LAZY_32 和 LD_BIND_LAZY_64

可以将环境变量 LD_BIND_LAZY 设置为任意非空值,从而强制实施运行时链接程序执行延迟绑定的缺省模式。此设置使运行时链接程序对所有已装入进程的目标文件都只执行延迟引用重定位。各目标文件可以请求在装入目标文件时执行延迟引用重定位。请参见 ld(1)–z now 选项,以及模式为 RTLD_NOWdlopen(3C)。LD_BIND_LAZY 有效时,将抑制用于执行延迟引用重定位的此类请求。

如果同时指定 LD_BIND_LAZY 和 LD_BIND_NOW,则 LD_BIND_NOW 优先。

LD_BIND_NOW、LD_BIND_NOW_32 和 LD_BIND_NOW_64

可以将环境变量 LD_BIND_NOW 设置为任意非空值,从而覆盖运行时链接程序执行延迟绑定的缺省模式。此设置使运行时链接程序对所有已装入进程的非延迟目标文件执行立即引用和延迟引用重定位。各目标文件可以请求在装入目标文件时执行非延迟的延迟引用重定位。请参见 ld(1)–z now 选项,以及模式为 RTLD_NOWdlopen(3C)。延迟的依赖项不受 LD_BIND_NOW 或 RTLD_NOW 的影响。请参见 ld(1)–z deferred 选项。

如果同时指定 LD_BIND_NOW 和 LD_BIND_LAZY,则 LD_BIND_NOW 优先。

LD_CAP_FILES、LD_CAP_FILES_32 和 LD_CAP_FILES_64

应针对任何备选功能进行验证的文件的逗号分隔列表。请参见 LD_PLATCAP、LD_MACHCAP、LD_HWCAP 和 LD_SFCAP。

LD_CONFIG、LD_CONFIG_32 和 LD_CONFIG_64

提供备选配置文件。配置文件可用来更改缺省搜索路径、提供目录高速缓存,以及提供备用目标文件依赖项。请参见 crle(1)

LD_DEBUG、LD_DEBUG_32 和 LD_DEBUG_64

提供以逗号或冒号分隔的标记列表,使运行时链接程序将调试信息输出到标准错误中。特殊标记 help 指示可用标记的完整列表。还可提供环境变量 LD_DEBUG_OUTPUT 来指定接收调试信息的文件。文件名的后缀为生成调试信息的应用程序的进程 ID。请参见 lari(1)

LD_DEMANGLE、LD_DEMANGLE_32 和 LD_DEMANGLE_64

在诊断消息中使用的任何符号名称都将按 ELF 文件中定义的那样进行显示。将 LD_DEMANGLE 设置为任意非空值时,运行时链接程序将尝试解码(取消改编)任何 C++ 符号名称。

LD_FLAGS、LD_FLAGS_32 和 LD_FLAGS_64

提供环境变量信息的备选提供方式。任何 LD_XXX 环境变量均可指定为 xxx 标记。可提供多个标记,以逗号分隔。请参见“示例”部分。

LD_HWCAP、LD_HWCAP_32 和 LD_HWCAP_64

标识替代硬件功能值。

LD_HWCAP=[+-]{token | [index]number},....

通过“+”前缀可以将后面的功能添加到备选功能中。通过“-”前缀可以将后面的功能从备选功能中删除。缺少“+-”时,后面的功能将替换备选功能。

要为不同的掩码(例如 CA_SUNW_HW_1CA_SUNW_HW_2)设置数值,可在数字前加上用方括号括起来的索引。例如,LD_HWCAP=[2]0x80CA_SUNW_HW_2 设置为值 0x80。如果未指定索引,则采用 1。无效索引将被忽略。

LD_LIBRARY_PATH、LD_LIBRARY_PATH_32 和 LD_LIBRARY_PATH_64

LD_LIBRARY_PATH 环境变量在设置的情况下将用于增强搜索路径,运行时链接程序使用该路径查找动态依赖项。LD_LIBRARY_PATH 指定将先于缺省目录进行搜索的目录的冒号分隔列表。还请注意,LD_LIBRARY_PATH 为 ld(1) 添加了其他语义。

LD_LOADFLTR、LD_LOADFLTR_32 和 LD_LOADFLTR_64

过滤器是共享目标文件的一种形式。过滤器允许在运行时选择备选共享目标文件,提供在过滤器内定义的任何符号的实现。请参见 ld(1)–f–F 选项。缺省情况下,备选共享目标文件的处理将推迟到对过滤器进行符号解析的时候。将 LD_LOADFLTR 设置为任意非空值时,装入任何过滤器后会立即对其进行处理。另请参见 ld(1) 的 –z loadfltr 选项。

LD_MACHCAP、LD_MACHCAP_32 和 LD_MACHCAP_64

标识替代计算机硬件名称。

LD_NOAUDIT、LD_NOAUDIT_32 和 LD_NOAUDIT_64

本地审计库可在应用程序和共享目标文件内进行定义。请参见 ld(1)–p–P 选项。将 LD_NOAUDIT 设置为任意非空值时,运行时链接程序将忽略任何本地审计库。

LD_NOAUXFLTR、LD_NOAUXFLTR_32 和 LD_NOAUXFLTR_64

辅助过滤器是共享目标文件的一种形式。辅助过滤器允许在运行时选择备选共享目标文件,提供在过滤器内定义的任何符号的实现。请参见 ld(1)–f 选项。将 LD_NOAUXFLTR 设置为任意非空值时,运行时链接程序将禁用该备选共享目标文件查找。

LD_NOCONFIG、LD_NOCONFIG_32 和 LD_NOCONFIG_64

缺省情况下,运行时链接程序将尝试打开并处理一个配置文件。将 LD_NOCONFIG 设置为任意非空值时,运行时链接程序将禁用该配置文件处理。

LD_NODIRCONFIG、LD_NODIRCONFIG_32 和 LD_NODIRCONFIG_64

提供 LD_NOCONFIG 的子集,从而将忽略配置文件中提供的任何目录高速缓存信息。

LD_NODIRECT、LD_NODIRECT_32 和 LD_NODIRECT_64

直接绑定信息可指导运行时链接程序直接搜索关联目标文件中的符号。请参见 ld(1)–B direct 选项。在没有直接绑定的情况下,由运行时链接程序执行的符号搜索将遵循缺省模式。将 LD_NODIRECT 设置为任意非空值时,运行时链接程序将忽略任何直接绑定信息。

LD_NOENVCONFIG、LD_NOENVCONFIG_32 和 LD_NOENVCONFIG_64

提供 LD_NOCONFIG 的子集,从而将忽略配置文件中提供的任何环境变量。

LD_NOLAZYLOAD、LD_NOLAZYLOAD_32 和 LD_NOLAZYLOAD_64

加标签进行延迟装入的依赖项不会装入到内存中,直到对该依赖项进行了显式引用。请参见 ld(1)–z lazyload 选项。将 LD_NOLAZYLOAD 设置为任意非空值时,运行时链接程序将忽略依赖项延迟装入标签并立即装入依赖项。

LD_NOOBJALTER、LD_NOOBJALTER_32 和 LD_NOOBJALTER_64

提供 LD_NOCONFIG 的子集,从而将忽略配置文件中提供的任何备选目标文件依赖项。

LD_NOVERSION、LD_NOVERSION_32 和 LD_NOVERSION_64

缺省情况下,运行时链接程序将验证主要可执行文件及其所有依赖项的版本依赖项。将 LD_NOVERSION 设置为任意非空值时,运行时链接程序将禁用该版本检查。

LD_ORIGIN、LD_ORIGIN_32 和 LD_ORIGIN_64

将环境变量 LD_ORIGIN 设置为任意非空值可触发 $ORIGIN 的即时处理。在 Solaris 9 之前,对于先调用 chdir(2),然后定位使用 $ORIGIN 字符串标记的依赖项的应用程序,该选项非常有用。现在,运行时链接程序会在缺省情况下建立当前工作目录,因此使该选项变为冗余。

LD_PLATCAP、LD_PLATCAP_32 和 LD_PLATCAP_64

标识替代平台名称。

LD_PRELOAD、LD_PRELOAD_32 和 LD_PRELOAD_64

提供由空格分隔的共享目标文件列表。这些目标文件将装入在正在执行的程序之后,但在该程序引用的任何其他共享目标文件之前。预装入目标文件提供的符号定义可以插入程序引用的共享目标文件所进行的引用。预装入目标文件提供的符号定义不会插入程序所提供的符号定义。

LD_PROFILE、LD_PROFILE_32 和 LD_PROFILE_64

定义运行时链接程序将要分析的共享目标文件。启用分析时,将创建并映射分析缓冲区文件。缓冲区文件的名称为要进行分析的共享目标文件的名称,带有 .profile 扩展名。缺省情况下,该缓冲区置于 /var/tmp 下。还可提供环境变量 LD_PROFILE_OUTPUT 来指示可在其中放置分析缓冲区的备选目录。

分析缓冲区包含 profil(2) 和调用计数信息。该信息类似于由那些通过 cc–xpg 选项链接的程序所生成的 gmon.out 信息。使用命名的共享目标文件并在设置该环境变量时运行的任何应用程序都会在分析缓冲区中累积数据。另请参见“附注”部分。可以使用 gprof(1) 检查分析缓冲区信息。

LD_PROFILE 分析技术是编译系统提供的其他技术的一种替代技术。进行分析的共享目标文件不必采用任何方式进行检测,而 LD_PROFILE 不应与已分析检测的应用程序结合使用。有关共享目标文件分析的更多信息,请参见Oracle Solaris 11.2 链接程序和库指南

LD_SFCAP、LD_SFCAP_32 和 LD_SFCAP_64

标识替代软件功能值。

LD_SFCAP=[+-]{token | number},....

通过“+”前缀可以将后面的功能添加到备选功能中。通过“-”前缀可以将后面的功能从备选功能中删除。缺少“+-”时,后面的功能将替换备选功能。

LD_SIGNAL、LD_SIGNAL_32 和 LD_SIGNAL_64

提供运行时链接程序在出现严重运行时错误的情况下用来中止进程的数字信号编号。请参见 thr_kill(3C)。缺省情况下,将使用 SIGKILL。例如,如果备选信号编号为 6 (SIGABRT),即可利用该编号创建核心文件来协助调试。另请参见针对 dlinfo(3C)RTLD_DI_SETSIGNAL 请求。

请注意,以 "LD_" 字符开头的环境变量名是为未来可能推出的针对 ld(1)ld.so.1 的增强功能而保留的。

安全

安全进程在评估其依赖项及 runpaths 时会应用某些限制,以免出现恶意依赖项替换或符号插入的情况。

对于某个进程来说,如果 issetugid(2) 系统调用返回的结果为 True,运行时链接程序会将该进程归类为安全进程。

对于 32 位目标文件,对运行时链接程序已知的缺省可信目录为 /lib/secure/usr/lib/secure。对于 64 位目标文件,缺省可信目录为 /lib/secure/64/usr/lib/secure/64。实用程序 crle(1) 可用于指定适用于安全应用程序的其他可信目录。使用此技术的管理员应确保已对目标目录进行了适当的保护,以防受到恶意入侵。

如果安全进程的 LD_LIBRARY_PATH 系列环境变量有效,则仅使用该变量所指定的可信目录来扩充运行时链接程序的搜索规则。

在安全进程中,将使用由应用程序或其任意依赖项提供的 runpath 组件,前提是该组件使用全路径名,即路径名以 "/" 开头。

在安全进程中,仅当 $ORIGIN 字符串扩展扩展到某个可信目录时才允许该字符串的扩展。但是,如果 $ORIGIN 扩展与一个已提供依赖项的目录匹配,则该目录是隐式安全的。该目录可用于提供其他依赖项。

在安全进程中,将忽略 LD_CONFIG,但是,会使用安全应用程序中记录的配置文件。请参见 ld(1)–c 选项。记录的配置文件必须使用全路径名,即路径名必须以“/”开头。使用 $ORIGIN 字符串的已记录配置文件仅限于已知的可信目录。在安全应用程序中记录配置文件的开发者应确保配置文件目录受到适当的保护,以避免恶意侵入。缺少记录的配置文件时,安全进程将使用缺省配置文件(如果存在)。请参见 crle(1)

在安全进程中,将忽略 LD_SIGNAL。

可以使用 LD_PRELOAD 或 LD_AUDIT 环境变量来与安全进程一起装入其他目标文件。必须将这些目标文件指定为路径名或简单文件名。全路径名仅限于已知的可信目录。不含 "/" 的简单文件名在定位时将遵循前述搜索路径限制。简单文件名只能解析到已知的可信目录。

在安全进程中,使用前述路径名限制处理包含简单文件名的任何依赖项。以全路径名或相对路径名表示的依赖项按原样使用。因此,安全进程的开发者应确保对以全路径名或相对路径名依赖项形式引用的目标目录进行适当的保护,以免遭恶意入侵。

创建安全进程时,应使用相对路径名来表示依赖项或构建 dlopen(3C) 路径名。此限制应适用于应用程序及所有依赖项。

示例

示例 1 使用 LD_FLAGS 对环境变量信息进行分组

对 LD_FLAGS 的下述用法相当于为 32 位应用程序设置单个环境变量 LD_BIND_NOW 和 LD_LIBRARY_PATH:

example% LD_FLAGS_32=bind_now,library_path=/lib/one:/lib/two

对 LD_FLAGS 的下述用法相当于为 64 位应用程序设置单个环境变量 LD_LIBRARY_PATH 和 LD_PRELOAD:

example% LD_FLAGS_64=library_path=/lib/one/64,preload=foo.so

文件

/lib/ld.so.1

缺省运行时链接程序。

/lib/libc.so.1

可实现 SVID ABI 兼容性的备选解释器。

/usr/lib/0@0.so.1

一种兼容性库,支持空字符指针。请参见“附注”部分。

/lib/secure/usr/lib/secure

安全应用程序的 LD_PRELOAD 位置。

/lib/secure/64/usr/lib/secure/64

安全的 64 位应用程序的 LD_PRELOAD 位置。

/lib/64/ld.so.1

64 位应用程序的缺省运行时链接程序。

/usr/lib/64/0@0.so.1

一种 64 位的兼容性库,支持空字符指针。请参见“附注”部分。

/var/ld/ld.config

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

/var/ld/64/ld.config

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

属性

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

属性类型
属性值
可用性
system/linker

另请参见

crle(1)gprof(1)lari(1)ld(1)ldd(1)exec(2)issetugid(2)mmapobj(2)profil(2)dladdr(3C)dlclose(3C)dldump(3C)dlerror(3C)dlinfo(3C)dlopen(3C)dlsym(3C)thr_kill(3C)proc(4)attributes(5)

Oracle Solaris 11.2 链接程序和库指南

附注

将 LD_PROFILE 与其他进程监视技术结合使用时应慎重,如使用 proc(4) 的用户。多进程监视技术可能会导致死锁条件,从而使分析缓冲区处于锁定状态。锁定的缓冲区将阻止任何尝试记录分析信息的进程。为了降低这种可能性,运行时链接程序的配置文件实现会确定在启动时进程是否受到监视。如果是,将在无提示情况下禁用进程的分析。不过,此机制无法捕捉在进程执行过程中附加到该进程的监视进程。

用户兼容性库 /usr/lib/0@0.so.1 提供了一种机制,可以在位置 0 建立值 0。存在一些应用程序,其错误地假定空字符指针应视为与指向空字符串的指针相同。访问空字符指针时,这些应用程序中会出现段违规。如果在运行时使用 LD_PRELOAD 将该库添加到此类应用程序,该库将提供一个与该错误行为对应的环境。然而,用户兼容性库既不是用来允许生成此类应用程序,也不是用来支持此特定编程实践。

在很多情况下,/usr/lib/0@0.so.1 的存在并没有危险,并可将其预装入不需要它的程序中,但也有例外。诸如 JVM(Java Virtual Machine,Java 虚拟机)之类的某些应用程序要求从空指针访问生成段违规。诸如 JVM 之类的应用程序不应预装入 /usr/lib/0@0.so