ld 命令
用途
链接对象文件。
语法
ld [ -D Number ] [ -e Label ] [ -G ] [ -H Number ] [ -K ] [ -m ] [ -M ] [ -o Name ] [ -r ] [ -s ] [ -S Number ] [ -T Number ] [ -u Name ] ... [ -v ] [ -V ] [ -z ] [ -Z String ] ... [ -b Option ] ... [ -L Directory ] ... { -f FileID ... -l Name ... InputFile ... }或ld -bsvr4 [ -d[y | n] ] [ -D Number ] [ -e Label ] [ -G ] [ -H Number ] [ -K ] [ -m ] [ -M ] [ -o Name ] [ -r ] [ -R Path ] [ -s ] [ -S Number ] [ -T Number ] [ -u Name ] ... [ -v ] [ -V ] [ -z [ defs | nodefs ] ] [ -z multidefs ] [ -z [text | nowarntext | warntext ] ] ] [ -Z String ] ... [ -b Option ] ... [ -L Directory ] ... { -f FileID ... -l Name ... InputFile ... }描述
ld 命令 (也称为链接编辑器或绑定程序) 将对象文件,归档和导入文件组合到一个输出对象文件中,从而解析外部引用。 生成可运行的可执行对象文件。 此外,如果指定的 ld 命令没有 -s 标志,可以将输出文件作为 InputFile 参数调用另一个 ld 命令。 缺省情况下, ld 命令会创建其输出并将其放置在 a.out 文件中。
ld 命令可以不必再次列示所有输入对象文件就重新链接程序。 例如,如果大型程序中的一个对象文件发生变化,你可以通过在命令行中列出新的对象文件和旧的程序,以及程序所需的任何共享库,重新链接程序。 请参阅 示例。
ld 命令按您在命令行上指定的顺序链接输入文件。 如果不止一次指定文件,仅处理第一次出现的文件。 使用 -bI (大写字母 i) , -bimport, -bkeepfile, -f或 -l (小写字母 L) 标志或作为 InputFile 参数指定至少一个输入文件。 -bI、"-bimport或 "-bkeepfile"标志是与 "I、"import"或 "keepfile"选项一起使用的 "-b标志)
当生成在操作系统下运行的程序时,可以使用 cc 命令链接文件。 因为 cc 命令用公共选项和必备支持库调用 ld 命令,所以可以不在命令行中指定。 (从 /etc/xlC.cfg或 /etc/vac.cfg 配置文件中读取此信息。)
- 链接方式
ld命令可以链接 32 位对象和程序,也可以链接 64 位对象和程序,但 32 位和 64 位对象可能无法链接在一起。 要指定链接方式,可以使用 OBJECT_MODE 环境变量或 -b32 或 -b64 选项。
- 归档文件
存档文件是复合对象,其中包含导入文件和对象文件,包括共享对象。 如果归档文件包含另一个归档文件或不能识别类型的成员,ld 命令发出一个警告并忽略不能识别的成员。 如果归档文件中包含的对象文件在 XCOFF 标头中设置了 "
F_LOADONLY位,则 "ld命令将忽略该成员。 此位用于指定保留在归档文件中的共享对象的旧版本,以允许现有应用程序装入和运行。 新应用程序与共享对象的新版本,既归档的另一个成员,进行链接。- 共享对象
通过调用另一条 "ld命令创建的共享对象是一个在 XCOFF 标头中设置了 "
F_SHROBJ位的对象文件。 共享对象定义了在运行时解析的外部符号。 如果指定了 "-bnso或 "-bnoautoimp选项,"ld命令会将共享对象作为普通对象文件处理,如果文件被剥离,链接就会失败。通常,仅当引用了共享对象中的符号时,才会在输出文件的装入程序部分中列出用作输入的共享对象。 不过,在使用运行时链接器时,即使没有引用符号,也可能希望列出共享对象。 使用 -brtl 选项时,将在输出文件中列出命令行上列出的所有非归档成员的共享对象。 程序运行时,系统加载器会加载所有此类共享对象,这些共享对象导出的符号可能会被运行时链接器使用。 除非归档里的导入文件启动了自动装入,否则作为归档成员的共享对象不能自动地装入。 要启用自动加载,请参阅导入和导出文件格式(-bI:和-bE:标志)。
- 导入和导出文件
导入文件是标识运行时要解析的外部符号的 ASCII 文件。 导入文件标识了定义导入符号的共享对象。 系统在运行时装入程序查找和解析符号。 如果导入文件的第一行以 #! (#,感叹号) 开头,那么可以在命令行上将该文件指定为普通 InputFile。 否则,必须使用 -bI 或 -bimport 选项来指定导入文件。
导出文件是识别其他要导入的可执行对象可用的外部符号的 ASCII 文件。 导出文件格式与导入文件格式一样。
- 库
库是其名称以 .a结尾或可能以 .so结尾的文件。 要指定库,可以指定绝对或相对路径名,或者使用格式为 -l Name的 -l (小写字母 L) 标志。 最后一个表单指定 libName.a 文件,或者在使用 rtl 选项时,指定要在多个目录中搜索的 libName.so 文件。 这些搜索包含 -L 标识指定的所有目录及标准库目录 /usr/lib 和 /lib。
注: 如果使用绝对或相对路径名 (而不是使用 -l Name 标志) 指定共享对象或包含共享对象的归档文件,那么路径名将包含在输出文件的装入程序部分的导入文件标识字符串中。 可以用 -bnoipath 选项覆盖此行为。- 正在处理
ld 命令以相同方式处理所有输入文件,不管是不是归档。 它包含所有对象的符号表,并废弃重复现有符号的符号定义。 与某些其他版本的 ld 命令不同,您不需要对归档文件进行排序,因此引用在定义之前。 甚至,不必在命令行中不止一次地列示归档文件。
ld 命令标志的顺序不影响如何处理,除非标志和输入对象文件、库和导入文件配合使用。 这些标志为 -L, -f, -l (小写字母 L) , -bkeepfile和 -bI (大写字母 i)。 标志以下列顺序处理:
- -L标志添加目录到搜索目录列表来定位由-l(小写字母 L)标志指定的库。 按指定的顺序搜索目录。 所有 -L 标志处理在处理任意-l 标志之前进行。
- ld 命令按指定的顺序处理 InputFile 参数,由 -f 标志指定的文件和由 -l (小写字母 L) 标志指定的库。
- 在处理所有其他对象文件和库之后,ld 命令处理由 -bI(大写字母 i)标志指定的导入文件。 如果在处理对象文件之前必须处理该文件,可以不用 -bI 参数指定一个导入文件作为输入文件。 在这种情况下,导入文件的第一行必须以 #! (#,感叹号) 符号开头,并且将使用步骤 2 中描述的其他输入文件来处理导入文件。
- -bkeepfile 选项命名一个 ld 命令不在其上执行垃圾收集的输入文件。 如果指定的输入文件也指定为 InputFile 参数或在 -f 标志指定的文件中列出,那么 -bkeepfile 选项不会影响文件的处理顺序。 否则,文件和其他输入文件一起按第 2 步描述的顺序处理。
除非指定 -r 标志或 -bnox 选项或在链接时报告错误,否则 ld 命令生成的输出文件具有执行许可权集。 如果出现任何严重错误或输出文件指定为输入文件时发生错误,不会覆盖现有的输出文件。
- 符号
ld 命令使用以下预定义符号来提供特殊地址位置,并且可以在 C 语法中声明为
extern char name[ ]。 符号名称为项 描述 _text指定程序的第一个位置。 _etext指定程序后的第一个位置。 _data指定数据的第一个位置。 _edata指定已初始化的数据后的第一个开头。 _end或end指定所有数据后的第一个位置。 使用符号的唯一方式是取用它的地址。 如果输入文件重新定义其中任何符号,那么可能会产生不可预测的结果。 编译器使用另一个预定义符号 "
_ptrgl,通过函数指针实现调用。- 垃圾回收
缺省情况下,当生成输出文件时 ld 命令执行垃圾收集,删除不被引用的控制部分(CSECT)。
CSECT 是不可分的代码或数据单元。 如果包含有关于其他 CSECT 中符号的重定位项(RLD),此 CSECT 将引用其他 CSECT。 引用的 CSECT 导致它引用的所有 CSECT 也被引用。 此外,如果 CSECT 包含导出的符号,使用 -u 标志指定的符号或使用 -e 标志指定为入口点的符号,那么将引用该 CSECT。
如果未引用符号但在输出文件中需要该符号,那么可以导出该符号,使用 -u 标志指定该符号或禁止垃圾回收。 要抑制垃圾信息收集,使用 -r 标志或 -bnogc 选项。 要禁止对个别对象文件进行垃圾回收,请使用 -bkeepfile 选项或 -bgcbypass 选项。 甚至当抑制垃圾信息收集时,将删除未引用的内部符号。
- 忽略的和不受支持的标志。
为了与其他版本的 ld 命令兼容,可以识别但忽略某些标志。 这些标志会生成一条消息,说明已忽略该标志及其操作数。 忽略的标志没有进一步的处理不会导致 ld 命令停止。 忽略下列标志:
-ANumber -bnostrcmpct -n -bfilelist -bstrcmpct -N -bfl -BNumber -Q -bforceimp -d -RNumber -bi -i -VNumber -binsert -j[Key:]Number -x -bnoforceimp -kKey:Path -YNumber注: 当 ld 命令行上存在 -bsvr4 选项时,将重新定义 -R 和 -z 选项。ld 命令中不支持的标志将导致错误消息。 在诊断完所有不支持的标志后,没有进一步处理 ld 命令将停止。
标志
ld 命令符合 XPG 实用程序语法准则,只是自变量 — 仅适用于下一个操作数,而不适用于命令行上的其余操作数。 例如,在命令行中,如果输入 ld --
-s -v,那么会将 -s 视为文件名,并将 -v 视为标志。 要将 -v 视为文件名,请输入 ld -- -s -- -v 。
| 项 | 描述 |
|---|---|
| -b选项 | 设置特殊处理选项。 可以重复选项。 有关这些选项的更多信息,请参阅选项 (-bOptions)。 |
-d [y | n] |
如果指定了 -dy ,那么 ld 将使用动态链接; 此选项等同于 -b so 选项。 指定 -dn 时, ld 将使用静态链接; 此选项等同于 -b nso 选项。 缺省值为 -dy。 此选项只在指定 -bsvr4 选项时有效。 |
| -D 数字 | 将输出文件的初始化数据 (数据部分) 的起始地址设置为 Number。 如果指定数据是 -1,在文本部分后立即启动数据部分。 缺省情况下,数据部分在位置 0 处开始。 如果同时指定了 -D 和 -bpD 标志,那么后一个标志优先。 注: 系统装入器在运行时重新定位数据部分,因此指定的数字会影响地址映射中列出的地址或由 dump 或 nm 命令之类的实用程序打印的地址。
|
| -e 标签 | 设置可执行输出文件的入口点到
Label。 缺省入口点是 __start(双下划线 start)。 |
| -f FileID | 指定包含要处理的输入文件列表的文件。 FileID 必须包含输入文件名的列表。 FileID 中的每一行都被视为在 ld 命令行上单独列出。 文件中的行可以包含 shell 模式字符 * (星号) , [ (左括号) , ] (右括号) 和 ? (问号) ,这些字符通过使用 glob 子例程展开,并且可以指定多个对象文件。 |
| -G | -G 生成支持与运行时链接程序配合使用的共享对象。 -G 标志等同于使用 -b 标志指定 erok, rtl, nortllib, nosymbolic, noautoexp和 M:SRE 选项。 后继选项可以覆盖这些选项。 |
| -H 数字 | 对齐输出文件的文本、数据和装入程序部分,以致每个部分在是
Number 倍数的文件偏移量处开始。 如果指定数是 1,那么不会对齐。 如果指定的数字为 0 ,那么装入程序部分将在字边界上对齐,文本和数据部分将在边界上对齐,以满足这些部分中所有 CSECT 的对齐。 缺省值为 0。 如果指定的 Number 导致任何 CSECTS 在输出文件中不对齐,那么 ld 命令会发出警告,并且输出可执行文件可能无法装入或运行。 |
| -K | 对齐输出文件的头、文本、数据和装入程序部分以致每一部分从页面边界处开始。 此标志等同于指定 -H Number,其中 Number 是运行 ld 的机器的页面大小。 |
| -l Name | 处理 libName.a 文件。 在动态方式下,通过使用 rtl 选项来处理 libName.a 或 libName.so 文件。 在所有情况下,将搜索由 -L 标志指定的目录或标准库目录 (/usr/lib 和 /lib) 中的目录以查找该文件。 在使用 rtl 选项的动态方式下,包含 libName.so 或 libName.a 的第一个目录满足搜索。 如果在同一目录中找到这两个文件,那么将使用 libName.so 文件。 可以重复使用此标志。 有关动态方式的更多信息,请参阅 运行时链接。 注: 即使在读取归档时未看到对符号的引用,也会保留符号的第一个定义。 在 ld 命令的其他版本中,如果在读取归档时未看到对该符号的引用,那么将忽略该归档中定义的符号。
|
| -L 目录 | 将 Directory 添加到用于查找由 -l (小写字母 L) 标志指定的库的搜索目录列表中。 除非使用 -blibpath, -bnolibpath或 -bsvr4 选项,否则还会在输出对象文件装入器部分中记录目录列表 (包括标准库目录) ,以供系统装入器使用。 可以重复使用此标志。 |
| -m 或 -M | 在标准输出中列出为创建输出文件而处理的所有文件和归档成员的名称。 不列示共享对象和导入文件。 |
| -o Name | 命名输出文件为 Name。 缺省情况下,输出文件名是 a.out。 |
| -r | 生成要用作另一个 ld 命令调用中的输入文件的不可执行输出文件。 此文件可能还包含未解析的符号。 -r 标志等同于使用 -b 标志指定 erok, noglink, nox和 nogc 选项。 (后继选项覆盖这些选项。) |
| -R Path | 只在 -bsvr4 选项出现在 ld 命令行时有效。 它定义用冒号分隔的目录列表,这些目录用于向运行时链接程序指定库搜索目录。 Path 如果存在且不为 NULL,那么记录在输出文件的装入程序部分。 然后在运行时将可执行文件与共享库链接时使用。 此选项的多个实例与每个 Path 并置,并用冒号隔开。 |
| -s | 当创建输出文件时,移除符号表、行号信息和重定位信息。 移除保留空格但不妨碍调试器的使用。 您还可以使用 strip 命令来删除现有可执行文件。 注: 如果非共享对象被除去,那么无法链接这些对象。 共享对象可以移除,但当静态链接时不能使用一个移除的共享对象。
|
| -S 数字 | 设置运行输出可执行程序文件时允许用户堆栈的最大大小 (以字节计)。 此值保存在辅助头中,系统装入程序使用此值来设置 软 ulimit。 缺省值为 0。 |
| -T 数字 | 设置输出文件的文本部分的开始地址到 Number。 缺省值为 0。 如果同时指定了 -T 和 -bpT 标志,那么后一个标志优先。 注: 系统装入程序在运行时重新定位文本部分,因此指定的数字会影响地址映射中列出的地址或由 nm 或 dump 命令之类的实用程序打印的地址。
注意: 如果 Number 是
0x1000xxxxxxx ,并且链接的程序是 64 位程序,那么系统装入器会将可执行文本装入到从地址 0x10000000000处的段开始的内存中。 |
| -u Name | 此选项可防止外部符号 Name的垃圾回收。 如果指定的符号不存在,将报告一个警告。 可以重复使用此标志。 |
| -v | 将有关绑定程序命令执行的其他信息写入 loadmap 文件。 |
| -V | 将 ld 命令的版本字符串写入标准错误 (stderr)。 |
| -z | 在缺少 -b svr4 选项的情况下, -z 标志的功能与 -K 标志相同。 |
| -z defs | 如果链接末尾仍有未定义的符号,该选项将导致致命错误。 当构建可执行文件时,此选项是缺省值。 构建共享库时也是有用的,以便确保对象是独立的,即所有符号引用在内部解决。 此选项只在指定 -b svr4 选项时有效。 它等同于 -b ernotok 选项。 |
| -z nodefs | 此标志允许未定义的符号。 当构建共享库时,此选项是缺省值。 当与可执行文件一起使用时,未指定对此类未定义符号的引用行为。 此选项只在指定 -b svr4 选项时有效。 它等同于 -b erok 选项。 |
| -z multidefs | 此选项允许多个符号定义。 默认情况下,在可重置对象(.o文件)之间出现多个符号定义会导致致命错误。 此选项消除了错误条件并允许采用第一个符号定义。 此选项只在指定 -b svr4 选项时有效。 |
| -z text | 只是在动态方式下,如果保留与 .text 部分相反的重定位,强制出现致命错误。 此选项只在指定 -b svr4 选项时有效。 |
| -z nowarntext | 只是在动态方式下,允许与所有可映射部分(包括 .text 部分)相反的重定位。 此选项是构建共享库时的缺省选项。 此选项只在指定 -b svr4 选项时有效。 |
| -z warntext | 只是在动态方式下,如果保留与 .text 部分相反的重定位,那么发出警告。 此选项是构建可执行文件时的缺省选项。 此选项只在指定 -b svr4 选项时有效。 |
| -Z 字符串 | 在搜索由 -l (小写字母 L) 标志指定的库时,使用 String 作为标准库目录的名称的前缀。 例如,使用 -Z test 和 -lxyz 标志, ld 命令将查找 /test/usr/lib/libxyz.a 和 /test/lib/libxyz.a 文件。 当使用 -Z String 标志时,不搜索标准库目录。 此标志对保存在输出文件的装入程序部分中的库路径信息没有影响。 当开发库的新版本时,标志是有用的。 可以重复使用此标志。 |
绑定程序
ld 命令验证命令行参数并调用绑定程序 (缺省情况下为 /usr/ccs/bin/bind 文件) ,传递生成的绑定程序子命令列表。 绑定程序链接文件。 虽然绑定程序由 ld 命令调用,但您可以直接启动绑定程序。 在这种情况下,绑定程序从标准输入中读取命令。
两个选项影响绑定程序的调用。 binder 指定调用哪一个绑定程序,nobind 选项防止 ld 命令调用绑定程序。 其他绑定程序选项影响生成的绑定程序子命令。
如果 ld 命令在选项或命令行参数中没有检测到任何错误,将调用绑定程序。 以命令行的格式调用绑定程序:
bind [quiet_opt] [loadmap_opt]
quiet_opt 的缺省值是 quiet,loadmap_opt 缺省值是空串,所以缺省命令行是:
/usr/ccs/bin/bind quiet
选项 (-bOptions)
- 在以下绑定程序选项列表中,由单词 或 分隔的两个选项名称是同义词。
- FileID 表示路径名称。 可以使用相对的或完整的路径名。
- 对于后跟自变量的不可重复选项,您可以使用空自变量来否定该选项。 也就是说,仅指定选项和冒号。
- 如果选项冲突,最后一个选项优先。
| 项 | 描述 |
|---|---|
| 32 | 指定 32 位链接方式。 在这种方式下,所有输入对象文件必须是 XCOFF32 文件,否则会报告错误。 忽略 XCOFF64 归档成员。 对于指定特定符号方式的导入或导出文件,将忽略 64 位符号。 如果同时指定了 -b32 和 -b64 选项,那么将使用最后指定的选项。 如果未指定任何选项,那么将根据环境变量 OBJECT_MODE的值确定方式。 |
| 64 | 指定 64 位链接方式。 在此方式下,所有输入对象文件都必须是 XCOFF64 文件,否则将报告错误。 忽略 XCOFF32 归档成员。 对于指定特定符号方式的导入或导出文件,将忽略 32 位符号。 如果同时指定了 -b32 和 -b64 选项,那么将使用最后指定的选项。 如果未指定任何选项,那么将根据环境变量 OBJECT_MODE的值确定方式。 |
| asis | 处理所有混合大小写的外部符号。 此选项是缺省选项。 要处理所有大写的外部符号,请参阅以下 caps 选项。 |
| aslr 或 aslr:[tdsmp] * 或 aslr:- | 指定程序的地址空间布局随机化。 当仅使用此选项时, aslr 选项将启用所有随机化属性,而 如果 aslr 选项后跟冒号,那么可以启用各个属性。 以下属性表示文本,数据,堆栈, mmap 和专用库: t, d, s, m和 p。 对于未列出的属性,将保持禁用随机化设置。
注: 不能为 32 位程序指定 m 和 p 属性。
对某些程序进行了编译和链接,从而将可重定位的地址映射到文本部分中。 此选项要求在运行程序时重定位地址。 如果对文本或数据启用了随机化,那么这些程序将失败。 因此,当存在文本部分重定位时,除非在使用 aslr 选项时显式指定 t 和 d 属性,否则不会启用文本和数据随机化。 |
| autoexp | 自动地从输出模块中导出一些符号,不必在导出文件中列示它们。 (此选项不从输出模块中导出所有符号。 使用 bexpall 选项导出所有符号。) 此选项是缺省值。 链接主程序时使用此选项。 当未指定以 S 开头的模块类型 (使用 M 或 modtype 选项) 并且未使用 noentry 选项时,链接程序假定您正在链接主程序。使用 autoexp 选项时,如果命令行上列出的任何共享对象从特殊文件 . (点) 导入符号,并且链接的模块包含符号的本地定义,那么将自动导出该符号。 当您使用 rtl 选项进行链接时,还会自动导出其他符号。 如果链接的模块中定义的符号具有一个或多个从命令行上列出的共享对象导出的定义,并且如果其中任何定义是 BSS 符号,那么将自动导出该符号。 如果链接的模块中的定义是 BSS 符号,那么将使用 nosymbolic 属性导出该符号。 否则,符号以 symbolic 属性导出。 如果符号以其他的导出属性列在导出文件里,使用显式属性。 如果 "autoexp选项会自动导出一个符号,但该符号被列在带有 "list属性的导出文件中,则该符号不会被导出。 |
| autoimp 或 so | 从指定为输入文件的任何共享对象导入符号。 共享对象被引用,但不作为输出对象文件的一部分被包含。 此选项是缺省选项。 |
| autoload: path/file (member) | 自动装入归档成员。 |
| bigtls | 如果输出对象或程序中的线程本地存储器的大小大于 64 KB,并且使用了编译器来生成 对 local-exec 或 local-dynamic 线程本地变量的直接引用,那么生成额外的代码。 对于不能以 16 位偏移量寻址的 线程本地变量的每个直接引用,都需要额外代码。 因为包含额外代码的程序可能性能较差,所以最好减少使用直接引用的线程局部变量数,而不是使用该选项。 缺省选项是 nobigtls 选项。 |
| bigtoc | 如果目录 (TOC) 的大小大于 64 KB ,那么生成额外的代码。 对于不能以 16 位偏移量寻址的 TOC 符号的每个引用都需要额外代码。 因为包含所生成代码的程序的性能可能很差,所以在使用此选项之前,请减少该程序所需的 TOC 条目数。 缺省值为 nobigtoc 选项。 |
| bindcmds:FileID | 将 ld 命令生成的绑定程序命令的副本写入 FileID。 当将绑定程序作为独立程序调用时,可以将生成的文件作为标准输入重定向到绑定程序。 缺省情况下,不生成文件。 |
| binder:FileID | 使用 FileID 作为 ld 命令调用的绑定程序。 缺省绑定程序是 /usr/ccs/bin/bind 文件。 |
| bindopts:FileID | 将绑定程序程序参数的副本写到 FileID。 您可以使用生成的文件将绑定程序作为独立程序启动。 缺省情况下,不生成文件。 |
| C:文件 ID或 "calls:文件 ID | 将输出对象文件的地址映射写入 FileID。 先按段和后按地址排序符号。 对于列在映射中的每个符号,列示了从这个符号到另一个符号的引用。 缺省情况下,不生成文件。 要了解有关 calls 选项的更多信息,请参阅 地址映射。 |
| caps | 处理所有大写的外部符号。 缺省值为 asis 选项。 |
| cdtors[: [incl] [: [nnn] [:order]]] | 链接程序收集关于 C++ 静态构造函数或析构函数的信息并将此信息保存在输出文件中。 incl
子选项告知链接程序在创建保存信息时要搜索哪些归档成员。 以下是可能的值:
nnn 子选项指定输出模块的优先级。 如果程序同时装入多个模块,那么将使用 nnn 子选项来控制模块初始化的顺序。 (如果输出文件是程序并且不是共享对象,那么会忽略此优先级。) 此优先级的范围为 -231 到 231-1。 缺省优先级为 0。 从-231到-231+1023 之间的值为 C++ 运行时初始化保留。 对于具有相同优先级的所有函数,order 子选项指定调用各个构造函数或析构函数的顺序。 以下是可能的值:
可以多次指定此选项,但只使用指定的最后一个子选项。 取消指定的子选项不影响当前值或缺省值。 例如, -bcdtors:csect:20:s -bcdtors:::r 与 -bcdtors:csect::20:r相同。 缺省值为 -bnocdtors。 如果指定了 -bcdtors ,那么它与 -bcdtors:all:0:s相同。 注意:
|
| comprld 或 crld | 可能的话,连接同一地址上的多个重定位项(RLD)到单一的 RLD。 此选项是缺省选项。 |
| cror15 | 使用 cror 15,15,15 (0x4def7b82) 指令作为跟在调用指令后面的特殊 no-op 指令。 缺省值为 ori 0, 0,
0 (0x60000000)。 请参阅 nop 选项。如果要在AIX® 3.1 上重新链接当前级别系统上的对象文件,请使用此选项。 |
| cror31 | 使用 cror 31,31,31 (0x4ffffb82) 指令作为跟在调用指令后面的特殊 no-op 指令。 缺省值为 ori 0, 0,
0 (0x60000000)。 请参阅 nop 选项。在 AIX 3.2上要重新链接的系统的当前级别上链接对象文件时,请使用此选项。 |
| D: Number [/dsa] 或 maxdata:Number[/dsa] | 设置运行可执行程序时允许用户数据区(或用户堆)使用的最大大小(用字节表示)。 此值保存在辅助头中,系统装入程序使用此值来增加软数据限制 (如果需要)。 缺省值为 0。 使用此选项时,会为用户数据区保留指定的字节数。 程序可能无法使用 shmat 或 mmap 函数将对象显式映射到为用户数据区保留的虚拟地址。 对于 32 位程序,系统允许的最大值为 对于 64 位程序, maxdata 选项为程序数据堆提供了保证的最大大小。 可以指定任何值,但无论指定的值是 maxdata 还是 |
| datapsize:psize | 请求数据的 psize 页面大小 (以字节为单位)。 该值可以指定为十进制、十六进制或八进制数。 数字规范与 C 编程语言中的数字规范相同。 此外,可以将页面大小指定为后跟一个字符后缀的数字:
-b datapsize:16k 或 -b datapsize:0x4000 请求 0x4000 获取数据,并在 XCOFF 头中设置 F_VARPG 位。 |
| dbg:Option 或 debugopt:Option | 设置特定调试或控制选项。 缺省情况下,不设置调试选项。 使用 dbg:loadabs 或 debugopt:loadabs 选项表示在由 -T 和 -D 标志指定的同一地址上装入输出程序。 在此情况下,不改变绝对分支指令到(相对)分支指令,即使其目标是可重新定位的符号。 类似地,也从不将分支指令改变成绝对分支指令。 |
| delcsect | 如果 CSECT 中的符号由预先读取对象文件定义,那么删除 CSECT 中的所有符号。 此选项防止同一程序上出现不止一个的相同函数的实例。 For example, if a.o file defines function a() and b.o file defines functions a() and b(), linking a.o and b.o with the -bdelcsect option deletes symbols a() and b() from b.o. 因此,不存在两个 a() 实例。 缺省值是 nodelcsect 选项。 |
| dynamic 或 shared | 导致链接程序用动态方式处理后继共享对象。 此选项是缺省选项。 动态方式下,共享对象不是以静态方式包含在输出文件中。 相反,共享对象列在输出文件的装入程序部分。 当您指定 rtl 选项并且动态方式生效时,以 .so 和 .a 结尾的文件将满足使用 -l (小写 L) 标志指定的库的搜索。 当两者都生效时,当在同一目录中存在时,会将首选项指定给 .so 而不是 .a 。 当您指定 rtl 选项并且静态方式生效时,将处理以 .a 结尾的文件。 |
| E:文件 ID或 "export:文件 ID | 导出文件 FileID中列出的外部符号。 已导出的符号列在输出文件的装入程序部分。 没有缺省的导出文件。 使用 "svr4选项时,"E:FileID选项会取消任何 "expall或 "expfull选项。 |
| ernotok 或 f | 如果有任意未解析的外部引用,将报告错误。 此选项是缺省选项。 |
| erok | 生成无错误的输出对象文件,即使有未解析的外部引用。 缺省值为 ernotok 选项。 |
| errmsg | 如果错误消息的错误级别高于或等于 halt 选项值并且使用了 quiet 选项或重定向了标准输出,那么将这些消息写入标准错误。 此选项是缺省选项。 |
| ex1:FileID、ex2:FileID、ex3:FileID、ex4:FileID 和 ex5:FileID | 在典型的绑定程序子命令序列中提供用户出口。 由 FileID 指定的每个文件都必须包含如下运行的绑定程序子命令的列表:
|
| expall | 此选项导出除导入的符号,归档成员中定义的未引用符号以及以下划线 (_) 开头的符号以外的所有全局符号。 您可以通过在导出文件中列出符号或使用 expfull 选项来导出更多符号。 此选项不会影响由 autoexp 选项导出的符号。 使用该选项时,可以使用导出文件来避免这种情况。 但是,通过使用导出文件,可对导出的符号进行显式控制,并允许在共享对象中使用其他全局符号,而不必担心与从其他共享对象导出的名称发生冲突。 缺省值为 noexpall。 |
| expfull | 除导入的符号和存档成员中定义的符号外,该选项可导出所有全局符号。 与 -bexpall 选项不同, -bexpfull 选项会导出以下划线 (_) 开头的符号,还会导出符号的模块入口点。 根据特定用例和运行时链接程序的配置, -bexpfull 选项的实际行为可能有所不同。 -bexpfull 选项不会影响 autoexp 选项导出的符号。 除非 svr4 选项与 -b 标志一起使用,否则缺省值为 noexpfull 。 |
| export:FileID | 功能与 E: FileID 选项一样。 |
| f | 功能与 ernotok 选项一样。 |
| forceimprw | 强制将包含对已导入符号的引用的只读 CSECT 变为读或写。 缺省值为 noforceimprw。 |
| forkpolicy:策略 | 链接到 64 位程序时,设置 XCOFF 附加标题的 _AOUT_FORK_POLICY 和 _AOUT_FORK_COR 标志。 如果 policy 是 cor,那么还会设置 _AOUT_FORK_COR 标志,请求在程序运行时使用 "复制时引用" forktree 策略。 如果 policy 为 牛,那么将重置 _AOUT_FORK_COR 标志,并在程序运行时请求使用写入时复制 forktree 策略。 链接至 32 位程序时,将忽略此标志。 缺省值为 noforkpolicy。 |
| gc | 执行垃圾收集。 使用 nogc,gcbypass 或 keepfile 选项防止一些或所有对象文件的垃圾收集。 此选项是缺省选项。 |
| gcbypass:数字 | 如果指定了 gc 选项,那么指定在收集垃圾时要绕过的文件数。 如果使用 nogc 选项,忽略此选项。 如果 Number 是 0,此选项等同于 gc 选项并且执行所有文件的垃圾收集。 缺省值为 0。 |
| glink:FileID | 使用FileID 指定的全局链接原型代码。 生成每个导入或未定义的函数的全局链接界面。 在 32 位模式下,默认为 "/usr/lib/glink.o文件。 在 64 位模式下,默认为 "/usr/lib/glink64.o文件。 |
| h:Number 或 halt:Number | 指定绑定程序命令继续处理的最大错误级。 缺省值为 4。 如果任何绑定程序子命令的返回值大于 Number,那么不处理其他绑定程序子命令。 如果停机级别值为 8 或更高,那么输出文件可能不是可执行文件 (如果它是完全生成的)。 返回值是:
|
| I:FileID 或 import:FileID | (大写 i) 导入 FileID中列出的符号。 没有缺省的导入文件。 |
| initfini:[ 初始] [:终止] [:优先级] | 指定模块的初始化和模块的终止函数,此处 Initial 是初始化例程,Termination 是终止例程,
Priority 是有符号整数,值从 -2,147,483,648 到 2,147,483,647。 至少指定 Initial 和 Termination中的一个,如果同时省略 Termination 和 Priority,那么还必须在 Initial 之后省略冒号。 如果未指定 优先级,那么缺省值为 0 。 可以重复选项。 此选项以优先级排序例程,以最小的(大多数是负数)优先级开始。 按顺序调用初始化例程,以相反顺序终止例程。 此选项以未指定顺序调用相同优先级的调用例程,但如果多个 initfini 选项指定了相同的优先级,且同时指定了初始化和终止例程,那么保持例程的相关顺序。 例如,如果指定了选项 "initfini:i1:f1和 "initfini:i2:f2,那么函数 "i1和 "i2"将以未指定的顺序被调用,但如果在加载模块时 "i1在 "i2之前被调用,那么在卸载模块时 "f2将在 "f1之前被调用。 注意:
|
| ipath | 对于列在命令行中的共享对象,不是用 -l 标志指定共享对象,而当在输出文件的装入程序部分列示共享对象时使用路径组件。 此选项是缺省选项。 |
| keepfile:FileID | 此选项会阻止对 FileID进行垃圾回收。 缺省情况下,绑定程序删除所有全部文件里未引用的 CSECTS。 可以重复使用此选项。 |
| lazy | 此选项允许延迟装入模块的从属模块。 此选项将添加 -lrtl 选项,该选项跟在其他标志和选项之后。 如果指定了 -brtl 选项,那么将忽略 -blazy 选项,并且不会启用延迟装入。 当链接模块时,在模块的装入程序部分保存从属模块的列表。 在装入模块后系统装入程序自动地装入从属模块。 启用延迟加载时,延迟一些从属模块的装入直到在第一时间调用模块里的函数。 当模块的所有引用是函数调用时,延迟加载模块。 如果模块里的变量是引用的,那么将以典型方式装入模块。 注: 如果您使用的是延迟装入,请在比较函数指针时务必小心。 通常,函数有唯一的地址比较两个函数指针确定是否指向同一函数。 通过使用延迟装入来链接模块时,延迟装入模块中函数的地址与其他模块计算的地址不同。 依赖于函数指针比较的程序不得使用延迟装入。
有关延迟装入的更多信息,请参阅 共享库和延迟装入。 |
| l:FileID 或 loadmap:FileID | (小写 L) 将每个绑定程序子命令及其结果写入 FileID。 缺省情况下,不生成文件。 |
| libpath:路径 | 当写输出文件的装入程序部分时,使用 Path 作为库路径。 路径 is neither checked for validity nor used when searching for libraries specified by the -l flag. Path 覆盖使用 -L 标志时生成的任何库路径。 如果不指定任何 -L 标志或指定 nolibpath 选项,在输出文件的装入程序部分中写入缺省库路径信息。 缺省库路径信息为 LIBPATH 环境变量 (如果已定义) 的值,否则为 /usr/lib:/lib。 |
| loadmap:FileID | 功能与 l: FileID 选项一样。 |
| lpdata | 在可执行文件的 XCOFF 头中设置 F_LPDATA 位。 设置了该位时,进程将为其数据请求大页面。 |
| 项 | 描述 |
|---|---|
| M:ModuleType 或 modtype:ModuleType | 在对象文件中设置两字符的模块类型域和共享对象标志。 绑定程序未检查模块类型,但必须将其设置为下列其中一个值:
|
| map:FileID 或 R:FileID | 将输出对象文件的地址映射写入 FileID。 先按段和后按地址排序符号。 缺省情况下,不生成文件。 要了解有关 map 选项的更多信息,请参阅 地址映射。 |
| maxdata:编号[/dsa] | 功能与 D: Number[/dsa] 选项一样。 |
| maxstack:Number 或 S:Number | 功能与 -S 标志一样。 |
| modtype:ModuleType | 功能与 M: ModuleType 选项一样。 |
| nl 或 noloadmap | 此选项不会将绑定程序子命令及其结果写入装入映射文件。 此选项是缺省选项。 |
| noaslr | 取消先前 aslr 选项在命令行上的影响。 |
| noautoexp | 防止任意符号的自动导出。 缺省值为 autoexp 选项。 |
| noautoimp 或 nso | 链接任意未移除的、共享的对象作为普通的对象文件。 使用此选项时,不使用共享对象的装入程序部分。 缺省值是 autoimp 或 so 选项。 注: 通过使用其中任一标志,您可以静态地将共享对象文件链接到应用程序中。 静态链接的任何应用程序都不是从任何修订或发行版级别到任何其他修订或发行版级别的二进制可移植。
|
| nobigtls | 如果编译器生成对线程局部变量的直接引用,并且由于线程局部存储器的大小大于 64 KB 而重定位到其中一个变量溢出,那么此选项将生成严重错误消息。 如果生成了输出文件,那么它不会正确运行。 nobigtls 选项是缺省选项。 |
| nobigtoc | 如果 TOC 的大小大于 64 KB ,那么此选项将生成严重错误消息。 如果生成了输出文件,那么它不会正确执行。 此选项是缺省选项。 |
| nobind | 省略调用绑定程序。 相反地,ld 命令将绑定程序子命令的生成列表写入标准输出。 缺省情况下,ld 命令调用绑定程序。 |
| nocdtors | 此选项不会收集静态构造函数或析构函数。 此选项是缺省选项。 |
| nocomprld 或 nocrld | 此选项不会将同一地址上的多个重定位项 (RLD) 组合到单个 RLD 中。 缺省值是 comprld 或 crld 选项。 |
| nodelcsect | 此选项允许在符号解析期间考虑 CSECT 中的所有符号,即使 CSECT 中的某些符号是在先前读取的对象文件中定义的。 关于更多信息,请参阅 delcsect 选项。 nodelcsect 选项是缺省值。 |
| noexpall | 除非在导出文件中列出符号或使用 autoexp 选项将其导出,否则此选项不会导出符号。 此选项是缺省选项。 |
| noexpfull | 除非在导出文件中列出符号或使用 autoexp 选项将其导出,否则此选项不会导出符号。 除非使用 svr4 选项,否则此选项是缺省值。 |
| noentry | 此选项指示输出文件没有入口点。 保留任意需要的符号,用 -u 标记或导出的文件指定它们。 可以使用 -r 标志或 nogc 或 gcbtpass 选项保留一些或所有对象文件的所有外部符号。 如果既不使用 noentry 也不使用 nox 选项并且找不到入口点,那么将发出警告。 使用 svr4 选项时,将禁止此警告。 |
| noerrmsg | 此选项不会将错误消息写入标准错误。 如果指定 noquiet 选项,并将标准输出传送到诸如 tee 或 pg之类的命令,请使用此选项。 |
| noforceimprw | 此选项允许只读 CSECT 引用导入的符号。 此选项是缺省选项。 |
| noforkpolicy | 链接到 64 位程序时,清除 XCOFF 附加标题的 _AOUT_FORK_POLICY 和 _AOUT_FORK_COR 标志。 将使用缺省派生树策略,除非通过 VMM_CNTRL 环境变量指定一个派生树策略。 链接至 32 位程序时,将忽略此标志。 此选项是缺省选项。 |
| nogc | 此选项可防止垃圾回收。 保留包含全局符号的所有对象文件里的 CSECT,不管是否是引用的。 缺省值为 gc 选项。 |
| noglink | 防止 ld 命令插入全局链接代码。 缺省情况下,绑定程序插入全局链接代码。 |
| noipath | 对于列在命令行中的共享对象,不是用 -l 标志指定共享对象,而是当列示在导出文件的装入程序部分的共享对象时使用空路径组件。 空路径组件始终用于使用 -l 标志指定的共享对象。 此选项不影响通过使用在导入文件中以 #! 开头的行来指定路径组件。 缺省值是 ipath 选项。 |
| nolibpath | 覆盖由 -L 标志生成或由 libpath 选项指定的任何先前库路径。 相反,缺省库路径信息写在输出文件的装入程序部分。 缺省库路径信息是 LIBPATH 环境变量的值(如果被定义的话),否则就是 /usr/lib:/lib。 |
| noloadmap | 功能与 nl 选项一样。 |
| nolpdata | 清除可执行文件的 XCOFF 头中的 F_LPDATA 位。 未设置该位时,进程将为其数据使用小(常规)页面。 |
| nom | 此选项不会列出用于创建输出文件的对象文件。 此选项覆盖 -m 标志。 此选项是缺省选项。 |
| noobjreorder | 此选项不使用深度优先的 CSECT 重新排序逻辑。 输出文件里的 CSECT 以对象文件和库文件在命令行中指定的同样顺序排列,除了按下列方式:
如果同时指定了 noobjreorder 和 noreorder 选项,那么 noreorder 选项优先。 缺省值是 reorder 选项。 |
| noorder_file | 此选项不会按指定顺序映射符号。 此标志会取消上一个 -border_file 标志的影响。 此选项是缺省选项。 |
| nop:Nop | 指定在到本地例程的分支之后使用的 no-op 指令。 Nop 可能是特定值
cror15、cror31 或 ori 之一,或一个八位的十六进制数。 ori 指令是缺省值。 指定 -bnop:cror15 选项等同于指定 -bcror15 选项;指定 -bnop:cror31 选项等同于指定 -bcror31 选项。 如果指定其中一个特殊 nop 选项,那么将覆盖所有先前的 nop 选项。 如果 Nop 是一个八位的十六进制数,指定任意的机器指令。 机器指令覆盖所有先前为 Nop 指令指定的特定值。 当使用此格式时,可以重复此选项。 指定的最后一个机器指令是绑定程序在模块内分支后生成的指令。 其他指定的机器指令识别成 no-op 指令,但转换成首选的 no-op 指令。 |
| noquiet | 将每个绑定程序子命令和其结果写入标准输出。 缺省值为 quiet 选项。 |
| noreorder | 此选项不会对 CSECT 进行重新排序,只是将所有 XMC_TC (TOC 地址常量) 和 XMC_TD (TOC 变量) CSECT 组合在一起并将它们放在数据部分中,并将所有 BSS 符号组合在一起并将它们放在 bss 部分中。 所有其他 CSECT 放置在文本部分,因此文本和数据混合在输出文件里。 使用 noreorder 选项时,输出文件的文本部分可能不再独立于位置,如果文本部分不独立于位置,那么系统装入程序将不会装入模块。 因此,请避免将此选项用于程序和内核扩展。 如果同时指定了 noobjreorder 和 noreorder 选项,那么 noreorder 选项优先。 缺省值是 reorder 选项。 |
| nortl | 禁用输出文件的运行时链接。 该选项意味着 nortllib 和 nosymbolic- 选项。 此外,不会执行 rtl 选项下描述的更多操作。 除非使用 svr4 选项,否则此选项是缺省值。 |
| nortllib | 此选项不包含对运行时链接程序的引用。 如果使用此选项链接主程序,那么不会在程序中进行运行时链接,而不考虑程序所使用的任何共享模块的链接方式。 除非使用 svr4 选项,否则此选项是缺省值。 |
| norwexec | 指定如果系统的 sed_config 设置未关闭,那么进程的专用数据区具有非执行许可权。 |
| noshrsymtab | 阻止在输出对象中设置 _AOUT_SHR_SYMTAB 标志。 此选项是缺省状态。 |
| nostabsplit | 阻止调试节被写入扩展名为 .stab 的备用输出文件。 此选项为缺省设置。 |
| nostrip | 此选项不会生成剥离的输出文件。 因此,在输出文件中写入符号表和重定位信息。 此选项覆盖 -s 标志。 此选项是缺省选项。 |
| nosymbolic | 将 nosymbolic 属性分配给大多数没有以显式属性导出的符号。 有关更多信息,请参阅 导出符号的属性。 缺省值是 nosymbolic- 选项。 |
| nosymbolic- | 将 nosymbolic- 属性分配给大多数没有以显式属性导出的符号。 有关更多信息,请参阅 导出符号的属性。 此选项是缺省选项。 |
| notextro 或 nro | 此选项不检查以确保没有输出对象文件的文本部分的装入时重定位条目。 此选项是缺省选项。 |
| notmprelname | 绑定程序不检查常规实例化。 注: 仅 32 位方式需要此选项。 构建 64 位对象时,将忽略此选项。
|
| notypchk | 此选项不会检查外部函数调用之间的函数参数类型。 缺省值为 typchk 选项。 |
| nov | 此选项不会将其他信息写入装入映射文件。 此选项是缺省值并且覆盖 -v 标志。 |
| noweaklocal | 通过使用正常搜索顺序来解析弱符号。 此选项会覆盖 weaklocal 选项。 它是缺省选项。 |
| nox | 此选项不会使输出文件成为可执行文件。 即不写辅助头,也不写装入程序部分。 指定在辅助头或装入器部分中写入的值的标志和选项在使用此选项时无效。 缺省值为 x 选项。 |
| nro | 功能与 notextro 选项一样。 |
| nso | 功能与 noautoimp 选项一样。 |
| order_file:FileID | 按指定顺序映射列示在 FileID 中的符号。 先映射列示在该文件中的符号,然后再映射相同存储映射类的其他符号。 该文件中指定的函数名必须以句点开始,因为不以句点开头的函数名表示函数描述符。 |
| order:规范 | 控制输出文件中某些符号映射的顺序。 规格如下:
|
| pD:源 | 指定 源 作为包含数据部分开头的文件页面的第一个字节的地址。 例如,如果数据部分从对象文件中的偏移量 0x22A0 开始,并且指定了 pD:0x20000000 ,那么将为数据部分的第一个字节分配地址 0x200002A0。 此选项假定页面大小为 4096 (0x1000) 字节。注: 如果同时指定了 -bpD 和 -D 标志,那么后一个标志优先。
|
如果要取消先前指定的插件路径,请不要指定 path 变量 -bplugin:。 如果输入文件是位码文件或包含位码文件的归档,并且未指定插件路径,那么 ld 命令将失败。 |
|
plugin_opt选项。 该选项通常由编译器生成。 |
|
| pT:源 | 指定 源 作为包含文本部分开头的文件页面的第一个字节的地址。 例如,如果文本部分从对象文件中的偏移量 0x264 开始,并且指定了 pT:0x10000000 ,那么文本部分的第一个字节将分配给地址 0x10000264。
|
| quiet | 此选项不会将绑定程序子命令及其结果写入标准输出。 此选项是缺省选项。 |
| 项 | 描述 |
|---|---|
| R:FileID | 功能与 map: FileID 选项一样。 |
| r 或 reorder | 在 save 命令处理过程中对 CSECT 进行重新排序。 重新排序通过引用的相近性排列存储映射类。 此选项是缺省选项。 |
| ras | 在输出模块的辅助头中设置标志,以便表示模块的存储密钥和恢复都安全。 有关如何使内核扩展成为密钥安全和恢复安全的更多信息,请参阅 内核扩展和设备支持编程概念 。 |
| rename:符号, NewName | 将外部符号 Symbol 重命名为 NewName。 实际上,这就好像是在处理文件前将所有对象文件里的 Symbol 定义和引用重命名为 NewName。 缺省情况下,不重命名符号。 |
| reorder | 功能与 r 选项一样。 |
| ro 或 textro | 确保没有结果对象文件的文本部分的装入时重定位条目。 缺省值为 nro 选项。 |
| rtl | 为输出文件启用运行时链接。 该选项意味着 rtllib 和 symbolic 选项。 当动态方式生效 (请参阅 dynamic 和 static 选项) 时, rtl 选项允许使用 -l 标志指定的输入文件在 .so 和 .a中结束。 全部是共享对象的输入文件作为程序的从属列在输出文件装入程序部分。 共享对象按在命令行中指定的相同顺序列示。 仅当归档指定自动装入共享对象成员时,才会列出归档中包含的共享对象。 您可以通过创建具有以下行的导入文件来指定归档成员 foo.o 的自动装入:
创建导入文件后,将导入文件作为成员添加到归档。 您还可以使用 -bautoload 选项为归档成员 foo.o 指定自动装入:您可以使用 -bautoloads 选项指定更多归档成员。 如果导入文件的第一行以 |
| rtllib | 此选项包含对运行时链接程序的引用。 运行时链接程序在 librtl.a中定义,并且会自动将隐式 -lrtl 标志添加到命令行。 链接主程序时必须使用此选项 (由 rtl 选项隐含) ,否则不会发生运行时链接。 共享对象不必用该选项链接。 缺省值为 nortllib 选项,除非使用 svr4 选项。 |
| rwexec | 指定根据系统的 sed_config 设置来确定进程的专用数据区的执行许可权。 此选项是缺省选项。 |
| rwexec_must | 指定进程的专用数据区具有执行许可权,而不考虑系统的 sed_config 设置。 |
| S:数字 | 功能与 -S 标志一样。 |
| scalls:FileID | 将对象文件的地址映射写到 FileID。 按字母顺序列示符号。 对于列在映射中的每个符号,列示了从这个符号到其他符号的引用。 缺省情况下,不生成文件。 要了解有关 scalls 选项的更多信息,请参阅 地址映射。 |
| shared | 功能与 dynamic 选项一样。 |
| shrsymtab | 在 64 位模式下,在 XCOFF 辅助头中设置 _AOUT_SHR_SYMTAB 标志。 如果 File 是 64 位程序,那么运行该程序时会创建共享符号表。 如果 File 是 64 位对象而不是 64 位程序,那么可以设置 _AOUT_SHR_SYMTAB 标志,但在运行时不起作用。 在 32 位模式下,将忽略此标志。 缺省值为 noshrsymtab。 |
| smap:FileID | 将对象文件的地址映射写到 FileID。 按字母顺序列示符号。 缺省情况下,不生成文件。 要了解有关 smap 选项的更多信息,请参阅下面的 地址映射 。 |
| so | 功能与 autoimp 选项一样。 |
| stabcmpct:级别 | 指定调试部分中 stabstring 的压缩级别。 Stabstring 是长度超过八个字符的字符串。 符号表里的每个子串在调试部分中有自己的偏移量。 对于 Level,下列值是有效的:
|
| stabsplit | 此选项使调试部分写入扩展名为 .stab的备用输出文件。 |
| stackpsize:psize | 请求进程主线程堆栈的 psize 页面大小 (以字节为单位)。 该值可以指定为十进制、十六进制或八进制数。 数字规范与 C 编程语言中的数字规范相同。 此外,可以将页面大小指定为后跟一个字符后缀的数字:
-b stackpsize:16k 或 -b stackpsize:0x4000 请求 0x4000 进程主线程堆栈,并在 XCOFF 头中设置 F_VARPG 位。 |
| static | 此选项使链接程序以静态方式处理后续共享对象。 静态方式下,共享对象静态链接在输出文件里。 |
| svr4 | 此选项更改命令行上其他某些选项的含义和链接程序的标准行为。 它对链接程序有以下影响:
|
| sxref:FileID | 将对象文件的地址映射写到 FileID。 按字母顺序列示符号。 对于列在映射中的每个符号,列示了从这个符号到其他符号的引用。 缺省情况下,不生成文件。 要了解有关 sxref 选项的更多信息,请参阅下面的 地址映射 。 |
| symbolic | 将 symbolic 属性分配给大多数没有以显式属性导出的符号。 有关更多信息,请参阅下面的 已导出符号的属性 。 当使用 svr4 选项时,此选项是缺省值。 否则,缺省值为 symbolic- 选项。 |
| textro | 功能与 ro 选项一样。 |
| textpsize:psize | 请求文本的 psize 页面大小 (以字节为单位)。 该值可以指定为十进制、十六进制或八进制数。 数字规范与 C 编程语言中的数字规范相同。 此外,可以将页面大小指定为后跟一个字符后缀的数字:
-b textpsize:16k 或 -b textpsize:0x4000 请求 0x4000 文本,并在 XCOFF 头中设置 F_VARPG 位。 |
| tmplrename | 指定绑定程序必须检查常规实例化。 绑定程序检查表单 __tfNNxxx_name 的任何符号并将符号重命名为 name。 缺省值为 -bnotmplrename。 注: 仅 32 位方式需要此选项。 构建 64 位对象时将忽略此选项。
|
| typchk | 执行外部函数调用之间的函数参数类型的检查。 参数类型检查的信息可由编译器和汇编程序包含在对象文件中。 此选项是缺省选项。 有关类型检查的更多信息,请参阅 XCOFF 对象文件格式。 |
| weaklocal | 指定首先在引用弱符号的对象文件中搜索这些弱符号。 如果未在其中找到这些符号,将恢复使用正常的搜索顺序。 |
| x | 使输出文件成为可执行文件 (如果不存在错误)。 此选项是缺省选项。 |
| X 或 xref:FileID | 将对象文件的地址映射写到 FileID。 先按段和后按地址排序符号。 对于列在映射中的每个符号,列示了从这个符号到其他符号的引用。 缺省情况下,不生成文件。 要了解有关 xref 选项的更多信息,请参阅下面的 地址映射 。 |
运行时链接
缺省情况下,链接时绑定共享对象里的符号引用。 即,输出模块将导入模块与在特定共享对象里的定义关联在一起。 在装入时,将使用指定共享对象中的定义,即使其他共享对象导出相同的符号也是如此。
您可以使程序使用运行时链接程序,从而允许在装入时恢复某些符号。 要创建使用运行时链接程序的程序,请使用 -brtl 选项链接该程序。 共享模块的链接方式影响符号的重新绑定。
您可以使用 -G 标志来构建已启用运行时链接的共享对象。 您可以通过使用 rtl_enable 命令重新链接现有共享对象来完全启用这些对象的运行时链接,除非这些对象已被除去。
符号可视性
输入对象文件中的全局符号和弱符号可以使用可视性符号进行标记。 定义了四种符号可视性。
| 符号 | 可视性 |
|---|---|
| 内部 | 未导出符号。 不能将符号的地址提供给其他程序或共享对象,但链接程序不会对此进行验证。 |
| 已隐藏 | 未导出符号。 |
| 受保护 | 该符号已导出,但无法反弹 (或被抢占) ,即使正在使用运行时链接也是如此。 |
| 已导出 | 符号随全局导出属性一起导出。 |
可以在汇编程序源文件中指定符号的可视性。 有些编译器也支持可视性。 有关详细信息,请查阅编译器文档。
还可以使用导出文件来指定符号的可视性。 通常,导出文件中指定的可视性优先于对象文件中指定的可视性。 为程序或共享对象创建导出列表时,此链接程序会考虑符号可视性。
导入和导出文件格式(-bI: 和 -bE: 标志)
导入或导出文件中的每一行均包含符号的名称,(可选)后跟地址或关键字。 主要关键字为 svc、svc32、svc3264、svc64、syscall、syscall32、syscall3264、syscall64、symbolic、nosymbolic、nosymbolic-、list、cm、bss、internal、hidden、protected 和 export。 还有几个关键字是 weak 和 required,可以与另一个关键字一起使用。
在导入文件中,指定一个地址时允许将符号映射至固定地址,如共享内存段中的地址。 您还可以使用其中一个关键字 cm, bss或 weak 来指定导入符号的存储类。 使用 autoexp 选项时,导入的符号的存储类会影响自动导出的符号。 如果在导入文件中指定了任意其他关键字,将忽略此关键字。
在导出文件中,可以在函数名之后使用 svc、svc32、svc3264、svc64、syscall、syscall32、syscall3264 或 syscall64 关键字来指示该函数是系统调用。 链接内核扩展时需要此选项。 如果输出文件不是内核扩展,那么这些关键字等价于 symbolic 关键字。
您可以使用 list 关键字来使符号在输出文件的装入程序部分中列出,尽管它未标记为导出的符号。 list 关键字可用于要在运行时处理某些符号的应用程序。 系统装入程序或运行时链接程序不会处理所列示的符号。
可以使用 symbolic, nosymbolic或 nosymbolic-keyword 使属性与导出的符号相关联。 会忽略导出文件中的符号地址。 在导出文件中,关键字 cm 和 bss 等价于 nosymbolic 关键字。 可以使用 internal, hidden, protected或 export 关键字来指定符号的可视性。 有关更多信息,请参阅导出符号的属性 。
weak 关键字可用于指定弱符号绑定,并且可以与另一个属性一起使用。
使用 required 关键字来验证符号是否已定义并且未导入。 对不满足这些条件的符号会输出一个错误。
ld 命令按下列准则处理导入和导出文件。
- 忽略空白行。
- 以 *(星号)开始的行是注释,可以忽略。
以 # (#,空格) 开头的行向 setopt 绑定程序子命令 (-bdbg:选项) 提供操作数。 例如,包含
# verbose的行会导致绑定程序在从文件中读取时列出每个符号。 当处理文件时,选项设置是活动的。 # 32 , # 64 , # no32和 # no64 选项可用于指定列出的符号是否必须用于 32 位链接和/或 64 位链接。32-bit and 64-bit Import File Options
项 描述 32 在导入或导出文件中使用此选项来指定在以 32 位方式进行链接时必须处理后续符号,但在以 64 位方式进行链接时忽略后续符号。 如果未指定 32 或 64 选项,那么将以 32 位和 64 位方式处理所有符号。 64 在导入或导出文件中使用此选项来指定在以 64 位方式进行链接时必须处理后续符号,但在以 32 位方式进行链接时忽略后续符号。 如果未指定 32 或 64 选项,那么将以 32 位和 64 位方式处理所有符号。 no32 或 no64 重设先前的 32 或 64。 在 32 位和 64 位方式下处理后继符号。 - 处理导入文件时,以 #! (#,感叹号) 开头的行提供要与后续导入符号关联的共享库名。 该行可以出现多次,并适用于随后的符号,直到读到以 "
#!开头的下一行。 此文件名信息放在 XCOFF 对象文件的装入程序部分。 系统装入程序用于在执行期间定位适当的对象文件。 如果导入文件名是 "ipath/ifile(成员),则根据导入文件名和导入文件中 "#!行的内容来确定放入加载器部分的文件名,如下所示:项 描述 #! ( #!之后没有任何内容) 使用空路径,空文件和空数字。 系统装入器将此选项视为延迟导入。#! () 使用 ipath,ifile和imember。 如果导入文件作为命令行中 InputFile 参数指定,可以使用此行。 在此情况下,文件必须以#!开头。 如果缺省名称已由另一个#!行更改,那么此行也可用于复原缺省名称。#! path/文件 (成员) 使用指定路径、文件和成员。 #! 路径/文件 使用指定路径和文件以及空成员。 #! 文件 使用空路径、指定的文件和空成员。 运行时,搜索目录列表查找共享对象。 #! (成员) 使用 ipath,ifile和指定的成员。 运行时,搜索目录列表查找共享对象。#! 文件 (成员) 使用空路径以及指定的文件和成员。 运行时,搜索目录列表查找共享对象。 #! . (单个点) 此名称指的是主可执行文件。 当创建从不同名称的多个主程序导入符号的共享对象时使用此文件。 主程序必须导出由其他模块导入的符号,否则装入失败。 此导入文件名可以与运行时链接程序配合使用,也可以不与运行时链接程序配合使用。 #! .. (两个点) 使用此名称来列出由运行时链接程序解析的符号。 使用此文件名可创建由使用运行时链接程序的程序使用的共享对象。 如果在未与 rtllib 选项链接的程序中使用从 .. 导入符号的模块,那么这些符号将无法解析,并且对此类符号的引用会导致未定义的行为。
当使用-brtl 选项时,自动装入归档成员,如下创建导入文件。 如果 shr.so 是归档里的共享对象,创建一个导入文件:
# autoload
#! (shr.so)
您可以在更多行上列出额外的成员名 (如果适用)。 您不需要在导入文件中列出符号名称,因为从 shr.so 导入的符号是从 shr.so 本身读取的。
已导出符号的属性
使用运行时链接时,仅当使用正确的属性导出符号时,才能恢复对同一模块中符号的引用。 无法恢复对具有 symbolic 属性的符号的引用。 可以恢复对具有 nosymbolic 属性的符号的引用。 如果符号是变量,那么可以恢复对具有 nosymbolic- 属性的符号的引用。 对于函数符号,可以反弹使用函数指针的调用,而不能反弹直接函数调用。 nosymbolic- 属性是缺省值,提供此属性是为了与先前版本的操作系统兼容,但建议不要使用此属性。
如果您不是使用运行时链接程序,请避免使用 nosymbolic 属性,因为模块内函数调用是通过使用全局链接代码通过函数描述符间接进行的。 否则,导出符号的属性对与不使用运行时链接程序的程序配合使用的模块无效。
可以为导出文件中列出的符号指定显式导出属性。 大多数没有显式属性的符号是使用缺省导出属性导出的,如 symbolic, nosymbolic或 nosymbolic- 选项所指定。
如果在导出文件中列示的符号不带关键字,并且在输入文件中指定了符号的可视性,那么符号的可视性会加以保留。 可以使用 internal, hidden, protected或 export 关键字来覆盖输入符号的可视性。
weak 导出属性在装入程序部分中使用L_弱来标记关联符号的映射类型。
导入的符号可能只有 weak 导出属性。 如果从另一个模块导入了符号,那么可以恢复对该符号的所有引用。 但是,如果在固定地址处导入符号,那么所有引用都将绑定到此固定地址,并且无法由运行时链接程序进行反弹。 系统装入程序必须解析延迟的导入。 运行时链接程序从不解析或重新绑定对延迟导入的引用。
对于非导入符号的导出,将使用以下规则。
- 如果符号有 list 属性,将在装入程序部分符号表中列示,但不在符号表条目里设置 L_EXPORT 标志。 运行时链接程序将忽略此类符号。
- 如果使用显式属性或显式可视性导出符号,那么将使用显式属性或可视性。
- 如果符号是 BSS 符号,那么将使用 nosymbolic 属性导出该符号。
- 否则,符号以全局属性导出,全局属性由 symbolic、nosymbolic 或 nosymbolic- 选项指定。 缺省全局属性是 nosymbolic-。
地址映射
ld 命令生成地址映射,列示输出对象文件里的符号布局。 如果使用 map(或 R)选项,在地址序列里每个部分的字符前首先列示未解析的符号和导入符号。 如果使用 calls(或 C)选项,列示的每个符号在从此符号到其他符号的引用之前。 如果使用 xref (或 X) 选项,那么列出的每个符号后跟来自其他符号的对该符号的引用的列表。 如果使用 smap, scalls或 sxref 选项,那么地址映射包含与 map, calls或 xref 选项列出的信息相同的信息,但符号按字母顺序列出。
存储类为 C_HIDEXT 的内部符号在输出时会使用字符 < 和 >(尖括号)将符号名称括起来。 使用存储类 C_EXT 的外部符号的名称将不带尖括号打印,而存储类为C_弱文本的符号将以字符 { 和 } 围绕符号名称打印。
列出了有关每个符号的以下信息:
- 符号是否是导入的、导出的或入口点的指示。 * (星号) 用于标记入口点, I 用于标记导入的符号, E 用于标记导出的符号。
- 地址(除导入符号以外)
- 长度和对齐(对于 CSECT 和 BSS 符号)
- 存储映射类
- 符号类型
- 符号数(用作区分同名的符号)
- 符号名称
- 输入文件信息
存储映射类和符号类型定义在 /usr/include/syms.h 文件里。 在地址映射中,仅显示最后两个字符,但存储映射类 XMC_TC0 显示为 T0。
输入文件信息取决于输入文件类型。 对于对象文件,将列出从 C_FILE 符号表条目获取的源文件名称。 如果对象来自归档文件,对象文件按以下格式列示:
ArchiveFileName[ObjectName]
共享对象名列示在 { } (花括号) 之间。 如果共享对象通过导入文件定义,那么导入文件名列在共享对象名之前。
导入符号有 ER 符号类型,但有关联的文件输入信息。 未定义的符号与 ER 的符号类型列在一起,但除了符号数的所有其他列都为空。
-T 和 -D 标志 (或 pT 或 pD 选项) 会影响这些地址映射中打印的地址。 对于机器级调试,选择地址是有用的,这样符号就可以与它们在运行时具有的相同地址一同列示。 对于不使用专用装入的共享对象的 32 位程序,可以通过指定 -bpT:0x10000000 和 -bpD:0x20000000 选项来选择正确的地址。 缺省情况下,在 /etc/xlC.cfg 或 /etc/vac.cfg 文件中定义了这些选项。
环境变量
以下环境变量影响 ld 命令执行:
| 项 | 描述 |
|---|---|
| LIBPATH | 如果定义了 LIBPATH,使用它的值作为缺省库路径信息。 缺省库路径为 /usr/lib:/lib。 如果未指定 -L 标志且未指定 -blibpath 选项,那么将在输出文件的装入程序部分中写入缺省库路径信息。 不管指定的任意选项,当搜索命令行中指定的库时不使用 LIBPATH。 |
| TMPDIR | 如果输出文件存在或位于远程文件系统上,那么 ld 命令将生成临时输出文件。 将在 TMPDIR指定的目录中创建临时输出文件。 如果没有定义 TMPDIR,当输出文件是远程的或在与现有的输出文件同样的目录下时,临时输出文件创建在 /tmp下。 |
| OBJECT_MODE | 如果既不使用 -b32 也不使用 -b64 选项,那么将检查 OBJECT_MODE 环境变量以确定链接方式。 如果 OBJECT_MODE 的值为 32 或 64,那么将使用 32 位或 64 位方式。 如果值为 32_64 或任何其他值,那么链接程序将打印一条错误消息并以非零返回码退出。 否则,将使用 32 位方式。 |
示例
- 要链接多个对象文件并生成要在操作系统下运行的 a.out 文件,请输入以下命令:
-lc (小写字母 L) 链接 libc.a 库。 链接 libc.a 库的更简单方法是使用 cc 命令 (编译器) 来链接文件,如下所示:ld /usr/lib/crt0.o pgm.o subs1.o subs2.o -lccc pgm.o subs1.o subs2.o - 要指定输出文件的名称,请输入以下命令:
在文件 pgm 里创建输出。cc -o pgm pgm.o subs1.o subs2.o - 如果仅更改了对象文件 subs1.o ,要重新链接 pgm ,请输入以下命令:
最初来自对象文件 pgm.o 和 subs2.o 的 CSECT 是从文件 pgm中读取的。 如果程序由多个输入文件构成但仅有少数文件同时更改时此技术可以加速处理。cc -o pgm subs1.o pgm - 要与库子例程链接,请输入以下命令:
这将链接对象模块 pgm.o, subs1.o和 subs2.o,来自 mylib.a 归档的子例程以及来自由 -l (小写字母 L) 标志指定的库的子例程 (这表示 /usr/lib/libtools.a 文件)。cc pgm.o subs1.o subs2.o mylib.a -ltools - 要生成共享对象,请输入以下命令:
这将从由 -lc 标志指定的库 libc.a 链接对象文件 subs1.o, subs2.o和子例程。 它导出在文件 shrsub.exp 中指定的符号,并将链接的共享对象存储在文件 shrsub.o中。 -bM:SRE 在链接的对象文件中设置共享对象标志。ld -o shrsub.o subs1.o subs2.o -bE:shrsub.exp -bM:SRE -lc - 要与先前生成的共享对象 shrsub.o 链接,请输入以下命令:
这会将 pgm.o 对象文件与 shrsub.o 的已导出符号相链接。 链接的输出存储在 pgm 对象文件中。 -L '.' 会将当前目录添加至系统装入程序用来查找 shrsub.o 共享对象的库搜索路径。 在运行时,仅当从包含 shrsub.o 文件实例的目录运行此程序时,或者在 /usr/lib 标准库目录中找到 shrsub.o 文件时,才会装入此程序。 要允许从任何位置运行程序,请使用选项 -L `pwd`。cc -o pgm pgm.o shrsub.o -L '.'可以使用 dump 命令来查看系统装入器搜索的目录列表。
- 要通过将 libc.a 库用作非共享库来链接程序,请输入以下命令:
以必需的支持库来链接 pgm.o 并且命名输出文件 pgm。 对于 cc 命令, libc.a 库是必需的支持库,并作为共享库链接至用户的程序。 在此示例中, -bnso 选项指示 ld 命令作为非共享库与 libc.a 库链接,而 -bI:/lib/syscalls.exp 指示 ld 命令导入内核或 /usr/lib/boot/unix 文件中包含的系统调用函数。 无论何时用 -bnso 选项链接,在共享对象中导入且导出(既,通过)的任意符号必须先显式导入,正如此例中由 -bI:/lib/syscalls.exp 选项所操作的。cc -o pgm pgm.o -bnso -bI:/lib/syscalls.exp注: 每当 /usr/lib/libc.a 链接为非共享时,都必须使用标志 -bI:/lib/syscalls.exp 。 无论何时安装操作系统的更新发行版,应用程序也不得不再次链接。 静态链接的任何应用程序都不是从任何修订或发行版级别到任何其他修订或发行版级别的二进制可移植。 - 要启用随机化属性,请输入以下命令:
-baslr如果存在文本段重置,请勿启用文本和数据随机化。
- 要只对文本和堆栈启用随机化,请输入以下命令:
-baslr:ts
文件
| 项 | 描述 |
|---|---|
| /usr/bin/ld | 包含 ld 命令。 |
| /usr/lib/lib*.a | 指定用于链接程序的库。 |
| a.out | 指定缺省输出文件名。 |