链接对象代码。
ld [ -DNumber ] [ -eLabel ] [ -G ] [ -HNumber ] [ -K ] [ -m] [ -M ] [ -oName ] [ -r ] [ -s ] [ -SNumber ] [ -TNumber ] [ -u Name ] ... [ -v ] [ -z ] [ -ZString ] ... [ -bOption ] ... [ -LDirectory ] ... { -fFileID ... -lName ... 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.cfb 配置文件中读取信息。)
ld命令可以和 64 位对象和程序一样链接 32 位对象和程序,但是 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 结束的文件。要指定库,可以指定一个完整或相对路径,或以 -lName形式使用 -l(小写字母 L)标记。 最后格式指明了在多个目录下搜索libName.a 文件,或以动态方式搜索 libName.so 文件。搜索目录包含以-L标记指定的目录和标准库目录 /usr/lib 和 /lib。
ld命令以相同方式处理所有输入文件,不管是不是归档。它包含所有对象的符号表,并废弃重复现有符号的符号定义。不象 ld 命令的其它版本,不必排列归档文件的顺序,因此引用在定义之前。甚至,不必在命令行中不止一次地列出归档文件。
ld 命令标记的顺序不影响如何处理,除非标记和输入对象代码、库和导入文件一起使用。标记是:-L、-f、-l(小写字母 L)、-bkeepfile 和 -bI(大写字母)。标记以下列顺序处理:
由 ld 命令生成的输出文件有执行许可集,如果不指定 -r 标记或 -bnox选项或在链接时报告错误。如果出现任何严重错误或输出文件指定为输入文件时出现错误,不会覆盖现有的输出文件。
ld 命令使用下列预定义符号提供特殊地址位置并且可以以 C 语法声明为 extern char name[ ]。符号名是:
_text | 指定程序的第一个位置。 |
_etext | 指定程序后的第一个位置。 |
_data | 指定数据的第一个位置。 |
_edata | 指定已初始化的数据后的第一个开头。 |
_end 或 end | 指定所有数据后的第一个位置。 |
使用符号的唯一方式是取用它的地址。如果输入文件重新定义了任何符号,可能产生不可预知的结果。附加的预定义符号,_ptrgl,被编译程序用来实现使用函数指针的调用。
缺省情况下,当生成输出文件时 ld 命令执行垃圾收集,删除不被引用的控制部分(CSECT)。
CSECT 是不可分的代码或数据单元。如果包含有关于其它 CSECT 中符号的重定位项(RLD),此 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 命令中不支持的标记将导致错误消息。在诊断完所有不支持的的标记后,没有进一步处理 ld命令将停止。
除了参数 -- 仅适用于下一个操作数,不适用于命令行的其余操作数之外,ld 命令符合 XPG 实用程序语法准则。例如,在命令行里:
ld -- -s -v
-s 看作文件名,-v 看作标记。-v 看作文件名,指定:
ld -- -s -- -v
-bOption | 设置特殊处理选项。可以重复选项。关于选项的更多信息,请参阅 选项(-bOptions)。 |
-DNumber | 设置输出文件的已初始化数据(数据部分)的开始地址到 Number。 如果指定数据是 -1,在文本部分后立即启动数据部分。缺省情况下,数据部分在位置 0 处开始。
注:
在运行时系统装入程序重定位数据部分,因此指定的数字仅影响列在地址映射中或被实用程序,诸如 dump 或 nm 命令,打印的地址中。 |
-eLabel | 设置可执行输出文件的入口点到 Label。缺省入口点是 __start(双下划线 start)。 |
-fFileID | 指定包含要处理的输入文件列表。 FileID 必须包含输入文件名列表。FileID 中的每一行就象在 ld 命令行中分别列出那样被处理。文件中的行包含 shell 模式字符*(星号)、 [(左括弧)、](右括弧)和 ? (问号),可以使用 glob 子例程进行扩展并且能指定多个对象代码。 |
-G | 产生与运行时链接程序一起工作的共享对象。 -G标记等价与指定带有-b标记的 erok、rtl、nortllib、nosymbolic、noautoexp 和 M:SRE选项。后继选项可以覆盖这些选项。 |
-HNumber | 对齐输出文件的文本、数据和装入程序部分,以致每个部分在是 Number 倍数的文件偏移量处开始。如果指定数是 1,则不会对齐。如果指定数是 0,装入程序部分在单词边界对齐,文本和数据在边界对齐来确保各部分的所有 CSECT 对齐。缺省值是 0。
如果指定的 Number 引起输出文件内的任何 CSECT 不对齐, ld命令发出一个警告并且可能不能装入或运行输出可执行文件。 |
-K | 对齐输出文件的头、文本、数据和装入程序部分以致每一部分从页面边界处开始。标记等价与指定 -HNumber,此处Number 是运行 ld 的机器上的页面大小。 |
-lName | 在动态方式下,处理 libName.so 或 libName.a 文件。在所有情况下都将搜索由 -L 标志指定或位于标准库目录(/usr/lib 和 /lib)中的目录以查找该文件。在动态方式下,包含 libName.so 或 libName.a 的第一个目录满足该搜索。如果在同一个目录中同时找到了这两个文件,则使用 libName.a。要首选 libName.so,还必须指定 rtl 选项。可以重复使用此标记。关于选项的更多信息,请参阅 运行时链接。
注:
即使在读取压缩文档时没有符号的引用,也要保留符号的初始定义。在ld 命令的其它版本中,如果读取归档时没有符号的引用,忽略定义在归档中的符号。 |
-LDirectory | 添加 Directory 到用于查找库的搜索目录列表,库由 -l(小写字母 L)标记指定。目录列表包含标准库目录,如果不使用 -blibpath 或 -bnolibpath 选项,在输出对象代码装入程序部分记录目标列表以供系统装入程序使用。可以重复使用此标记。 |
-m 或 -M | 将创建输出文件所要处理的所有文件的名称和归档成员列到标准输出。不列出共享对象和导入文件。 |
-oName | 命名输出文件为 Name。缺省情况下,输出文件名是 a.out。 |
-r | 产生在另一个 ld命令调用中作为输入文件使用的非可执行的输出文件。文件可能包含非解析的符号。 -r 标记等价于指定带有-b 标记的 erok、noglink、nox和 nogc 选项。(后继选项覆盖这些选项。) |
-s | 当创建输出文件时,移除符号表、行号信息和重定位信息。移除保留空格但不妨碍调试器的使用。可以使用 strip 命令移除现有的可执行文件。
注:
如果被移除,非共享对象不能链接。共享对象可以移除,但当静态链接时不能使用一个移除的共享对象。 |
-SNumber | 当运行输出的可执行程序时,设置允许用户堆栈使用的最大大小(用字节表示)。此值保存在辅助头中,由系统装入程序使用来设置 soft ulimit。缺省值是0。
关于大用户堆栈和 32 位程序的更多信息,请参阅 『Large Program Support Overview』AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。 |
-TNumber | 设置输出文件的文本部分的开始地址到 Number。缺省值是 0。
注:
在运行时系统装入程序重定位文本部分,因此指定的数字仅影响列在地址映射或由实用程序诸如 nm 或 dump命令打印的地址。 |
-uName | 防止外部的符号 Name 的垃圾收集。如果指定的符号不存在,将报告一个警告。 可以重复使用此标记。 |
-v | 写关于 loadmap 文件的绑定程序命令执行的附加信息。 |
-z | 功能与 -K 标记一样。 |
-ZString | 当搜索由 -l(小写字母 L)标记指定的库时,以 String 作为标准库目录名称的前缀。例如,用-Z/test 和 -lxyz 标记,ld 命令查找 /test/usr/lib/libxyz.a 和 /test/lib/libxyz.a 文件。当使用 -ZString 标记时,不搜索标准库目录。 标记对存储在输出文件的装入程序部分的库路径没有影响。当开发库的新版本时,标记是有用的。 可以重复使用此标记。 |
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
对于 -b 标记的 Options 变量,下列值是可能的。在 -b 标记后用一个空格将超过一个的选项分开列出。
32 | 指定 32 位链接方式。在这种方式下,所有输入对象代码必须是 XCOFF32 文件,否则会报告错误。忽略 XCOFF64 归档成员。对于指定了特定符号的方式的导入或导出文件,忽略 64 位符号。如果同时指定了-b32 和 -b64 选项,使用最后指定的选项。如果没有指定选项,从环境变量 OBJECT_MODE 的值确定方式。 |
64 | 指定 64 位链接方式。在这种方式下,所有输入对象代码必须是 XCOFF64 文件,否则会报告错误。忽略 XCOFF32 归档成员。对于指定了特定符号的方式的导入或导出文件,忽略 32 位符号。如果同时指定了 -b32 和 -b64 选项,使用最后指定的选项。如果没有指定选项,从环境变量 OBJECT_MODE 的值确定方式。 |
asis | 处理所有混合大小写的外部符号。这是缺省值。处理所有大写的外部符号,请参阅下面的 caps 选项。 |
autoexp | 自动地从输出模块中导出一些符号,不必在导出文件中列出它们。(此选项不从输出模块中导出所有符号。使用 -bexpall 选项导出所有符号。) 这是缺省值。链接主程序时使用此选项。链接程序假定没有指定以 S 开头的模块类型(使用 M 或 modtype 选项)时正在链接主程序,并且没有使用 noentry 选项。
当使用 autoexp 选项时,如果列在命令行中的任何共享对象从特定文件导入符号 .(点),并且链接模块包含符号的本地定义,将自动导出符号。 当用rtl 选项链接时,其它符号自动导出。如果定义在链接的模块里的符号有从列在命令行上的共享对象导出的一个或多个附加定义并且任意定义是 BSS 符号时,自动导出符号。如果链接的模块里的定义是 BSS 符号时,符号是以 nosymbolic 属性导出的。否则,符号以 symbolic 属性导出。如果符号以其它的导出属性列在导出文件里,使用显式属性。 如果autoexp 选项自动地导出符号,但以 list 属性列在导出的文件中,则不导出符号。 |
autoimp 或 so | 从指定作为输入文件的任意共享对象中导入符号。 共享对象被引用,但不作为输出对象代码的一部分被包含。这是缺省值。 |
autoload: path/file(member) | 当使用-brtl 选项时自动装入归档成员。 |
bigtoc | 如果目录表的大小(TOC)比 64KB 大,将生成额外代码。对于不能以 16 位偏移量寻址的 TOC 符号的每个引用都需要额外代码。因为包含生成代码的程序性能可能较低,所以需要在使用选项之前减少程序需要的 TOC 项目数。缺省是nobigtoc选项。 |
bindcmds:FileID | 把由 ld命令生成的绑定程序命令的拷贝写到 FileID。当绑定程序作为单机程序调用时,可以重定向生成文件作为到绑定程序的标准输入。缺省情况下,不产生文件。 |
binder:FileID | 使用 FileID 作为绑定程序,由 ld 命令调用。缺省绑定程序是/usr/ccs/bin/bind 文件。 |
bindopts:FileID | 写绑定程序程序参数的拷贝到FileID。可以使用生成的文件启动作为单机程序的绑定程序程序。缺省情况下,不产生文件。 |
C:FileID 或 calls:FileID | 写输出对象代码的地址映射到FileID。 先按段和后按地址排序符号。对于列在映射中的每个符号,列出了从这个符号到另一个符号的引用。缺省情况下,不产生文件。学习有关 calls 选项的更多信息,请参阅地址映射。 |
caps | 处理所有大写的外部符号。缺省是asis 选项。 |
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] | 当运行可执行程序时,设置允许用户域(用户堆)使用的最大大小(用字节表示)。此值保存在辅助头中,由系统装入程序使用来设置软件数据 ulimit。缺省值是 0。当使用此选项时,为用户数据域保存指定的字节数。程序不能显式地将使用shmat 或 mmap 函数的对象映射到为用户数据域保留的虚拟地址。
对于 32 位程序,运行在大程序支持下的系统允许的最大值是 0x80000000,运行在超大程序支持下的系统允许最大值是 0xD0000000。请参阅在 AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 上的 『Large Program Support Overview』。当指定非零值时,用户数据域在第 3 段开始,程序使用需要的段来满足指定的 maxdata 值。 对于 64 位程序,maxdata 选项提供了程序数据堆的保证的最大大小。可以指定任意值但不管指定的最大数据值的大小如何,数据域都不能超过 0x06FFFFFFFFFFFFF8。 |
dbg:Option 或 debugopt:Option | 设置特定调试或控制选项。缺省情况下,不设置调试选项。
使用 dbg:loadabs 或 debugopt:loadabs 选项表示在由 -T 和 -D 标志指定的同一地址上装入输出程序。在此情况下,不改变绝对分支指令到(相对)分支指令,即使其目标是可重新定位的符号。类似地,也从不将分支指令改变成绝对分支指令。 |
delcsect | 如果 CSECT 中的符号由预先读对象代码定义,那么删除 CSECT 中的所有符号。此选项防止同一程序上出现不止一个的相同函数的实例。例如,如果a.o 定义函数 a(),b.o 定义函数 a() 和 b(),用 -bdelcsect 选项链接 a.o 和 b.o 从b.o 中删除符号 a() 和 b()。这样,a() 的两个实例不存在了。缺省值是 nodelcsect 选项。 |
dynamic 或 shared | 导致链接程序用动态方式处理后继共享对象。这是缺省值。动态方式下,共享对象不是静态包含在输出文件下的。相反,共享对象列在输出文件的装入程序部分。当指定rtl 选项和动态方式正在运行时,以 .so 和 .a 结尾的文件满足 -l(小写字母 L)标志指定的库搜索。如果这两者都生效了,而同一个目录中同时存在 .so 和 .a,则首选前者,而不是后者。否则,如果仅设置了动态,而没有设置 rtl,将首选 .a,而不是 .so。 |
E:FileID 或 export:FileID | 导出列在文件 FileID 中的外部的符号。已导出的符号列在输出文件的装入程序部分。没有缺省的导出文件。 |
ernotok 或 f | 如果有任意未解析的外部引用,将报告错误。这是缺省值。 |
erok | 产生无错误的输出对象代码,即使有未解析的外部引用。缺省值是 ernotok 选项。 |
errmsg | 如果信息的错误级别高于或等同于 halt 选项值并且使用 quiet 选项或重定向标准输出,将错误消息写到标准错误。这是缺省值。 |
ex1:FileID,ex2:FileID,ex3:FileID,ex4:FileID 和 ex5:FileID | 在典型的绑定程序子命令序列中提供用户出口。由 FileID 指定的每个文件必须包含绑定程序子命令列表,它将按如下运行: |
expall | 导出全部全局符号,除了导入的符号,定义在归档成员中的未引用的符号和以下划线开始的符号(_)。可以通过在导出的文件里列出它们导出附加符号。此选项不影响由 autoexp 选项导出的符号。
当使用此选项,能避免使用导出的文件。另一方面,使用导出文件提供导出符号上的显式控制,并且允许使用其它共享对象内的全局符号不必当心与其他共享对象导出的名称冲突。缺省值是 noexpall。 |
export:FileID | 功能与 E:FileID 选项一样。 |
f | 功能与 ernotok 选项一样。 |
gc | 执行垃圾收集。使用 nogc,gcbypass 或 keepfile 选项防止一些或所有对象代码的垃圾收集。这是缺省值。 |
gcbypass:Number | 如果指定 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] | 指定模块的初始化和模块的终止函数,此处 Initial 是初始化例程,Termination 是终止例程,Priority 是有符号整数,值从 -2,147,483,648 到 2,147,483,647。必须至少指定 Initial 和Termination 中的一个,如果省略了 Termination 和 Priority,必须也省略Initial 后的冒号。如果没有指定 Priority,0 是缺省值。可以重复选项。
此选项以优先级排序例程,以最小的(大多数是负数)优先级开始。按顺序调用初始化例程,以相反顺序终止例程。 此选项以未指定顺序调用相同优先级的调用例程,但如果多个 initfini 选项指定了相同的优先级,且同时指定了初始化和终止例程,则保持例程的相关顺序。例如,如果指定了选项 initfini:i1:f1 和 initfini:i2:f2, 那么以未指定的顺序调用i1 和 i2,但当加载模块时如果在i2 之前调用 i1,当未加载时将在 f1 之前调用f2。 注:
IBM 将仅使用下列范围值中的优先级:
-2,147,483,640 to -2,147,000,000 -1,999,999,999 to -1,000,000,000 -1,999,999,999 to -1,000,000,000 -99,999,999 to -50,000,000 0 50,000,000 to 99,999,999 1,000,000,000 to 1,999,999,999 2,147,000,000 to 2,147,483,640 |
ipath | 对于列在命令行中的共享对象,不是用 -l 标记指定共享对象,而当在输出文件的装入程序部分列出共享对象时使用路径组件。这是缺省值。 |
keepfile:FileID | 防止 FileID 的垃圾收集。缺省情况下,绑定程序删除所有全部文件里未引用的 CSECTS。可以重复使用此选项。 |
lazy | 启用模块的从属模块的迟缓装入。此选项在其它标记后添加 -lrtl 标记和选项。如果指定-brtl 选项,忽略-blazy 选项并且禁用迟缓装入。
当链接模块时,在模块的装入程序部分保存从属模块的列表。在装入模块后系统装入程序自动地装入从属模块。启用迟缓装入时,延迟一些从属模块的装入直到在第一时间调用模块里的函数。 当模块的所有引用是函数调用时,迟缓装入模块。如果模块里的变量是引用的,那么将以典型方式装入模块。 注:
如果使用迟缓装入当比较函数指针时应小心。通常,函数有唯一的地址比较两个函数指针确定是否指向同一函数。当使用迟缓装入链接模块时,迟缓装入模块的函数地址与其它模块计算的地址不一样。依赖于函数指针比较的程序应该不使用迟缓装入。
关于迟缓装入的更多信息,请参阅 『Shared Librariesand Lazy Loading』AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。 |
l:FileID 或 loadmap:FileID | (小写字母 L)将每个绑定程序子命令和结果写到 FileID。 缺省情况下,不产生文件。 |
libpath:Path | 当写输出文件的装入程序部分时,使用 Path 作为库路径。当搜索由 -l 标记指定的库时,Path 既不作有效性检查也不被使用。当使用 -L 标记时,Path 覆盖生成的任意库路径。
如果不指定任何 -L 标记或指定 nolibpath 选项,在输出文件的装入程序部分中写入缺省库路径信息。缺省库路径信息是 LIBPATH 环境变量的值(如果定义的话),否则就是/usr/lib:/lib。 |
loadmap:FileID | 功能与 l:FileID 选项一样。 |
m:UR | 为链接程序设置 SGETUREGS 标志。当设置了 SGETUREGS 标志时,寄存器的内容存储在缓冲区里。通过coredump 系统调用使用此选项。 |
M:ModuleType 或 modtype:ModuleType | 在对象代码中设置两字符的模块类型域和共享对象标记。绑定程序不检查模块类型,但应设置成下列值之一: |
map:FileID 或 R:FileID | 将输出对象代码的地址映射写到FileID。 先按段和后按地址排序符号。缺省情况下,不产生文件。学习有关 map 选项的更多信息,请参阅 地址映射。 |
maxdata:Number[/dsa] | 功能与 D:Number[/dsa] 选项一样。 |
maxstack:Number 或 S:Number | 功能与 -S 标记一样。 |
modtype:ModuleType | 功能与 M:ModuleType 选项一样。 |
nl 或 noloadmap | 不将绑定程序子命令和结果写到装入映射文件。这是缺省值。 |
noautoexp | 防止任意符号的自动导出。缺省值是autoexp 选项。 |
noautoimp 或 nso | 链接任意未移除的、共享的对象作为普通的对象代码。使用此选项时,不使用共享对象的装入程序部分。缺省值是 autoimp 或 so 选项。
注:
通过使用这些标记之一,可以将共享对象代码静态链接到应用程序。任意静态链接的应用程序不是可以从任意修正或发行版级别移植到其它修正或发行版级别上的二进制文件。 |
nobigtoc | 如果 TOC 的大小超过 64KB,将生成严重错误消息。如果生成输出文件,是不能直接执行。这是缺省值。 |
nobind | 省略调用绑定程序。相反地,ld 命令将绑定程序子命令的生成列表写到标准输出。缺省情况下, ld 命令调用绑定程序。 |
nocomprld 或 nocrld | 不将同一地址的多个重定位项(RLD)组合到单一的 RLD。缺省值是 comprld 或 crld 选项。 |
nodelcsect | 在符号分辨率中允许考虑 CSECT 里所有符号,即使 CSECT 里的一些符号已在先前的读对象代码中被定义。关于更多信息,请参阅 delcsect 选项。nodelcsect 选项是缺省值。 |
noexpall | 不导出符号,除非在导出的文件里列出它们或用 autoexp 选项导出它们。这是缺省值。 |
noentry | 表示输出文件无入口点。保留任意需要的符号,用 -u 标记或导出的文件指定它们。可以使用 -r 标志或nogc 或 gcbtpass 选项保留一些或所有对象代码的所有外部符号。如果既不使用noentry 也不使用nox 选项并且找不到入口点,将发出警告。 |
noerrmsg | 不将错误消息写到标准错误。如果指定 noquiet 选项并且管道输出标准输出到诸如 tee 或 pg 的命令中,则使用此选项。 |
nogc | 防止垃圾收集。保留包含全局符号的所有对象代码里的 CSECT,不管是否是引用的。缺省值是 gc 选项。 |
noglink | 防止 ld 命令插入全局链接代码。缺省情况下,绑定程序插入全局链接代码。 |
noipath | 对于列在命令行中的共享对象,不是用 -l 标志指定共享对象,而是当列出在导出文件的装入程序部分的共享对象时使用空路径组件。为用 -l 标志指定的共享对象总是使用空路径组件。 此选项不影响通过使用在导入文件中以 #! 开头的行来指定路径组件。。缺省值是 ipath 选项。 |
nolibpath | 覆盖由 -L 标记生成或由 libpath 选项指定的先前库路径。相反,缺省库路径信息写在输出文件的装入程序部分。缺省库路径信息是 LIBPATH 环境变量的值(如果被定义的话),否则就是 /usr/lib:/lib。 |
noloadmap | 功能与 nl 选项一样。 |
nom | 不列出用于创建输出文件的对象代码。此选项覆盖 -m 标记。这是缺省值。 |
noobjreorder | 不使用深度优先 CSECT 重排序逻辑。输出文件里的 CSECT 以对象代码和库文件在命令行中指定的同样顺序排列,除了按下列方式:
如果同时指定了noobjreorder 和 noreorder 选项,noreorder 选项优先。缺省值是 reorder 选项。 |
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 选项描述的附加操作。这是缺省值。 |
nortllib | 不包含运行时链接程序的引用。如果用此选项链接主程序,不管程序使用什么方式来链接任意共享模块,程序里都没有运行时链接。这是缺省值。 |
nostrip | 不生成移除的输出文件。因此,在输出文件中写符号表和重定位信息。此选项覆盖 -s 标志。这是缺省值。 |
nosymbolic | 将 nosymbolic 属性分配给大多数没有以显式属性导出的符号。关于更多信息,请参阅 已导出符号的属性。缺省值是 nosymbolic- 选项。 |
nosymbolic- | 将 nosymbolic- 属性分配给大多数没有以显式属性导出的符号。关于更多信息,请参阅 『Attributes of Exported Symbols。』 这是缺省值。 |
notextro 或 nro | 不必检查,确保对于输出对象代码的文本部分没有装入时间重定位的条目。这是缺省值。 |
notypchk | 不检查外部函数调用之间的函数参数类型。缺省值是 typchk 选项。 |
nov | 不将附加信息写到装入映射文件。此选项是缺省值并且覆盖 -v 标志。 |
nox | 不使输出文件可执行。即不写辅助头,也不写装入程序部分。指定写进辅助头或装入程序部分的标志和选项在使用此选项时无效。缺省值是 x 选项。 |
nro | 功能与 notextro 选项一样。 |
nso | 功能与 noautoimp 选项一样。 |
pD:Origin | 指定 Origin 作为包含数据部分开始的文件页首字节地址。例如,如果数据部分在对象代码里的开始偏移量是0x22A0,并且 pD:0x20000000 是指定的,数据部分的首字节地址被分配为0x200002A0。假定页面大小是 4096(0x1000)字节。 |
pT:Origin | 指定Origin 作为包含文本部分开始的文件页首字节地址。例如,如果文本部分在对象代码里的开始偏移量是 0x264 ,并且 pT:0x10000000 是指定的,文本部分的首字节地址是0x10000264。 |
quiet | 不将绑定程序子命令和其结果写到标准输出中。这是缺省值。 |
R:FileID | 功能与 map:FileID 选项一样。 |
r 或 reorder | 重新排序 CSECT 以作为 save 命令处理的一部分。重新排序通过引用的相近性排列存储映射类。这是缺省值。 |
rename:Symbol, NewName | 将外部符号 Symbol 重命名为 NewName。实际上,这就好像是在处理文件前将所有对象代码里的 Symbol 定义和引用重命名为 NewName。缺省情况下,不重命名符号。 |
reorder | 功能与 r 选项一样。 |
ro 或 textro | 确保对于生成的对象代码的文本部分,没有装入时间重定位的条目。缺省值是nro 选项。 |
rtl | 启用输出文件的运行时链接。此选项意味着 rtllib 和 symbolic 选项。
当起用动态方式时(请参阅dynamic 和 static 选项),rtl 选项允许用 -l 标志指定的输入文件以 .so 和 .a 结束。 全部是共享对象的输入文件作为程序的从属列在输出文件装入程序部分。共享对象按在命令行中指定的相同顺序列出。 如果压缩文档指定了共享对象成员的自动装入,仅列出包含在归档里的共享对象。通过下列行创建文件来指定归档成员foo.o 的自动装入: # autoload #! (foo.o) 将文件作为成员添加到归档。 通过使用 -bautoload 选项,可以指定归档成员 foo.o 的自动装入:-bautoload:<archive_name>(foo.o)也可以用附加的-bautoloads指定附加的归档成员。 |
rtllib | 包含运行时链接程序的引用。运行时链接程序在 librtl.a 中定义,并且隐式-lrtl 标志自动地添加到命令行。当链接主程序或没有运行时链接时,此选项(由 rtl 选项默示的)必须使用。共享对象不必用该选项链接。缺省值是 nortllib 选项。 |
S:Number | 功能与 -S 标志一样。 |
scalls:FileID | 将对象代码的地址映射写到 FileID。按字母顺序列出符号。对于列在映射中的每个符号,列出了从这个符号到其它符号的引用。缺省情况下,不产生文件。学习有关scalls 选项的更多信息,请参阅 地址映射。 |
shared | 功能与 dynamic 选项一样。 |
smap:FileID | 将对象代码的地址映射写到 FileID。按字母顺序列出符号。缺省情况下,不产生文件。学习有关 smap 选项的更多信息,请参阅下面的『地址映射』。 |
so | 功能与 autoimp 选项一样。 |
stabcmpct:Level | 指定调试部分中 stabstring 的压缩级别。Stabstring 是长度超过八个字符的字符串。符号表里的每个子串在调试部分中有自己的偏移量。对于 Level,下列值是有效的: |
static | 导致链接程序以静态方式处理后继共享对象。静态方式下,共享对象静态链接在输出文件里。甚至,当查找以 -l 标志指定的库时,找不到以.so 结束的文件。 |
sxref:FileID | 将对象代码的地址映射写到 FileID。按字母顺序列出符号。对于列在映射中的每个符号,列出了从这个符号到其它符号的引用。缺省情况下,不产生文件。学习有关sxref 选项的更多信息,请参阅下面的 『Address Maps』。紧接着。 |
symbolic | 将 symbolic 属性分配给没有以显式属性导出的大多数符号。关于更多信息,请参阅下面的『导出符号的属性』。缺省值是nosymbolic- 选项。 |
textro | 功能与 ro 选项一样。 |
typchk | 执行外部函数调用之间的函数参数类型的检查。参数类型检查信息能通过编译器和汇编程序包含在对象代码里。这是缺省值。
关于类型检查的更多信息,请参阅 『XCOFF(a.out)文件格式 』 AIX 5L Version 5.2 Files Reference。 |
x | 如果无错误,使输出文件可执行。这是缺省选项。 |
X 或 xref:FileID | 将对象代码的地址映射写到 FileID。先按段和后按地址排序符号。对于列在映射中的每个符号,列出了从这个符号到其它符号的引用。缺省情况下,不产生文件。学习有关 xref 选项的更多信息,请参阅下面的『地址映射』。 |
缺省情况下,链接时绑定共享对象里的符号引用。即,输出模块将导入模块与在特定共享对象里的定义关联在一起。在装入时,即使其它共享对象导出相同的符号,也使用在指定的共享对象里的定义。
促使程序使用运行时链接程序,允许运行时重新绑定一些符号。创建使用运行时链接程序的程序,用 -brtl 选项链接程序。共享模块的链接方式影响符号的重新绑定。
通过使用 -G 标志构建支持运行时链接的共享对象。只要没有被移除就可以通过用 rtl_enable 命令重链接共享对象来完全启用现有共享对象的运行时链接。
导入或导出文件内的每一行必须在可选的关键字或可选的的地址前列出一个单一的符号。关键字是 svc、svc32、svc3264、svc64、syscall、syscall32、syscall3264、syscall64、symbolic、nosymbolic、nosymbolic-、list、cm、bss和 weak。仅使用 weak 关键字与其它关键字连接。
在导入文件里,可以指定符号后的地址将 CSECT 数据映射到共享内存段并且取消使用汇编程序的必要性。也可以使用 cm、bss 或 weak 中的一个关键字指定导入符号的存储类。当使用 autoexp 选项时,导入符号的存储类影响自动导出的符号。如果在导入文件中指定了任意其它关键字,将忽略此关键字。
在导出的文件中,在名称后可以使用 svc 或 syscall 关键字表示这是一个系统调用。当链接内核扩展时这是必须的。可以使用 symbolic、nosymbolic, 或 nosymbolic- 关键字将属性和导出的符号关联在一起。关于更多信息,请参阅 已导出符号的属性。尽管不会作为导出文件被标记,但可以使用 list 关键字使符号列在输出文件的装入程序部分。这可以用于要在运行时处理一些符号的应用程序。系统装入程序或运行时链接程序不处理列出的符号。在导出文件里忽略符号地址和关键字cm 和 bss。可以使用 weak 关键字指定 weak 符号绑定,也可以和其它属性一起使用。
ld 命令按下列准则处理导入和导出文件。
以 # (#,空白)开始的行提供操作数给 setopt 绑定程序子命令(-bdbg:Option)。例如,当从文件读取包含# verbose 的行时,会导致绑定程序列出每个符号。当处理文件时,选项设置是活动的。可以用 # 32、# 64、# no32 和 # no64 选项指定列出的来指定是否应该为 32 位链接、64 位链接或同时两者使用所列出的符号。
32 位和 64 位导入文件选项
32 | 当在 32-bit 方式下链接时,在导入或导出文件里使用此选项指定应该处理的后继符号,但在 64-bit 方式下链接时,忽略此选项。如果没有指定 32 或 64 选项,在 32- 和 64-bit 方式下都处理所有的符号。 |
64 | 当在 64 位方式下链接时,在导入或导出文件里使用此选项指定应该处理的后继符号,但在 32 位方式下链接时,忽略此选项。如果没有指定 32 或 64 选项,在 32- 和 64-bit 方式下都处理所有的符号。 |
no32 或 no64 | 重设先前的 32 或 64。在 32 位和 64 位方式下处理后继符号。 |
当使用-brtl 选项时,自动装入归档成员,如下创建导入文件。如果 shr.so 是归档里的共享对象,创建一个导入文件:
# autoload #! (shr.so)
如果适当的话,可以在附加行列出附加成员名称。不必列出导入文件里的符号名称,因为从 shr.so 导入的符号将从 shr.so 自己中读取。
关于创建共享库的更多信息,请参阅在 AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的『如何创建共享库』。关于装入和绑定的更多信息,请参阅 load 子例程 AIX 5L Version 5.2 Technical Reference: Base Operating System and Extensions Volume 1。
当使用运行时链接时,如果导出符号带有正确属性,那么仅能重新绑定同一模块的符号引用。不能重新绑定带有 symbolic 属性的符号引用。不能重新绑定带有nosymbolic 属性的符号引用。如果符号是变量,不能重新绑定带有nosymbolic- 属性的符号引用。对于函数符号,可以重新绑定使用函数指针的调用,而不能重新绑定直接的函数。nosymbolic- 属性是缺省值并且为和操作系统的先前版本兼容而提供,但不推荐这种用法。
如果没有使用运行时链接程序,避免 使用nosymbolic 属性,因为将通过使用全局链接代码的函数描述符直接进行模块内函数调用。否则,对于与不使用运行时链接程序的程序一起使用的模块导出的符号属性无效。
可以指定导出文件里列出的符号的显式导出属性。大多数没有显式属性的符号以缺省的导出属性导出,缺省的导出属性由 symbolic、nosymbolic或 nosymbolic- 选项指定。
weak 导出属性将装入程序部分里的关联符号映射类型标记为 L_WEAK。
导入符号仅有 weak 导出属性。如果从其它模块中导入符号,符号的所有引用将被重新绑定。然而,在固定地址导入符号,所有符号绑定到固定地址,并且不能被运行时链接程序重新绑定。系统装入程序必须解析延迟的导入。运行时链接程序从来不解析或重新绑定到延迟导入的引用。
对于导出非导入的符号,使用下列规则。
ld 命令生成地址映射,列出输出对象代码里的符号布局。如果使用 map(或 R)选项,在地址序列里每个部分的字符前首先列出未解析的符号和导入符号。如果使用 calls(或 C)选项,列出的每个符号在从此符号到其它符号的引用之前。如果使用xref(或 X)选项,列出的每个符号在从其它符号到此符号的引用列表之前。如果使用 smap、scalls 或 sxref 选项,地址映射包含分别与 map、calls 或 xref 选项列出的相互对应的相同信息,但以字母顺序列出符号。
带有存储类 C_HIDEXT 的内部符号与包围符号名的字符 < 和 >(尖括号)一起打印。带有存储类 C_EXT 的外部符号名不与尖括号一起打印,带有存储类 C_WEAKEXT 的外部符号与包围符号名的字符 { 和 } 一起打印。
列出的关于每个符号的信息包括:
存储映射类和符号类型定义在 /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 命令执行:
ld /usr/lib/crt0.o pgm.o subs1.o subs2.o -lc
-lc(小写字母 L)链接libc.a 库。完成这的简单方式是使用 cc 命令(编译器)按如下所示链接文件:
cc pgm.o subs1.o subs2.o
cc -o pgm pgm.o subs1.o subs2.o
在文件 pgm 里创建输出。
cc -o pgm subs1.o pgm
起初来自对象代码 pgm.o 和 subs2.o的 CSECT 从文件 pgm中读出。如果程序由多个输入文件构成但仅有少数文件同时更改时此技术可以加速处理。
cc pgm.o subs1.o subs2.o mylib.a -ltools
这会链接对象模块 pgm.o、subs1.o 和 subs2.o,来自 mylib.a 归档的子例程和来自由 -l(小写字母 L)标志指定的库中的子例程。(这指 /usr/lib/libtools.a 文件)。
ld -o shrsub.o subs1.o subs2.o -bE:shrsub.exp -bM:SRE -lc
这链接对象代码 subs1.o、subs2.o和来自库 libc.a 中用 -lc 标志指定的子例程。导出指定在文件 shrsub.exp里的符号并且存储链接的共享对象在文件 shrsub.o 里。-bM:SRE 在链接共享对象里设置共享对象标记。
cc -o pgm pgm.o shrsub.o -L '.'
这用 shrsub.o导出的符号链接对象代码pgm.o。链接的输出存储在对象代码 pgm 中。 -L '.' 添加当前目录到系统装入程序用于定位 shrsub.o 共享对象的库搜索路径。运行时,仅在从包含 shrsub.o 文件实例的目录运行或发现 shrsub.o 文件在 /usr/lib 标准库目录中时,装入该程序。允许从任何地方运行程序,使用选项 -L `pwd`。
可以使用 dump 命令参阅由系统装入程序搜索的目录列表。
cc -o pgm pgm.o -bnso -bI:/lib/syscalls.exp
以必需的支持库来链接 pgm.o 并且命名输出文件 pgm。对于 cc 命令,libc.a 库是必须的支持库和通常是作为共享库编辑到用户程序的链接。此例中,-bnso 选项指示 ld 命令用libc.a 库作为非共享库链接,-bI:/lib/syscalls.exp 指示 ld 命令导入实际上包含在内核或 /usr/lib/boot/unix 文件中的系统调用函数。无论何时用 -bnso 选项链接,在共享对象中导入且导出(既,通过)的任意符号必须先显式导入,正如此例中由 -bI:/lib/syscalls.exp 选项所操作的。
/usr/bin/ld | 包含 ld 命令。 |
/usr/lib/lib*.a | 指定链接程序使用的库。 |
a.out | 指定缺省输出文件名。 |
ar 命令、as 命令、nm 命令、dump 命令、rtl_enable 命令、strip 命令。
a.out 文件格式。
glob 子例程、load 子例程、loadbind 子例程、loadquery 子例程、unload 子例程。
『如何创建共享库』AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。
『大程序支持概述』AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。
『共享库和迟缓装入』 AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。
『共享库概述』AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs。
『XCOFF(a.out)文件格式 』AIX 5L Version 5.2 Files Reference。