Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

指定链接编辑器选项

通常,使用命令行选项充分指定链接编辑。但是,提供了各种环境变量来扩充命令行处理。这些变量提供可能与编译器选项冲突的选项。这些变量还用于覆盖或取消设置嵌入脚本和构建环境的命令行选项。

命令行选项之间的任何不一致都将导致致命错误状态。与环境变量提供的选项有关的任何不一致都将导致警告,第一个选项优先。任何 UNSET 操作都会伴随有警告通知。

根据环境和命令行按以下顺序解释各个选项。

  • LD_OPTIONS 环境变量。

  • 从命令行。

  • LD_UNSET 环境变量。

可以使用 LD_OPTIONS 将本该由编译器驱动程序解释的参数传递到链接编辑器。例如,可使用 –D 选项进行与链接编辑相关的诊断。此选项通常由编译器预处理程序解释。

$ LD_OPTIONS=-Dargs  cc -o main main.c
...
debug: arg[0]  option=-D:  option-argument: args  (LD_OPTIONS)
debug:
debug: arg[0]  /usr/ccs/bin/ld
debug: arg[2]  option=-o:  option-argument: main
debug: arg[3]  option=-Q:  option-argument: y
debug: arg[4]  option=-l:  option-argument: c

LD_OPTIONS 也可用于覆盖具有很多变体的选项。例如,嵌入式 –z text 选项可用 –z textoff 选项覆盖。

$ LD_OPTIONS=-ztextoff  cc -ztext -G null.o
ld: warning: option '-ztextoff' and option '-ztext' are incompatible, \
    first option taken

某些选项没有替代变体,因此不可被覆盖。但可以取消设置这些选项。例如,标准的链接编辑可以创建以下节。

$ cc -o main main.c
$ elfdump -c main | egrep "symtab|debug"
Section Header[19]:  sh_name: .symtab
Section Header[22]:  sh_name: .debug_info
Section Header[23]:  sh_name: .debug_line

可以使用 –z strip-class 选项删除这些节。

$ cc -o main -zstrip-class=symbol -zstrip-class=debug main.c
$ elfdump -c main | egrep "symtab|debug"
$

可以单独取消设置各个剥离选项。以下是取消设置剥离调试节示例的示例。

$ LD_UNSET=-zstrip-class=debug  cc -o main -zstrip-class=symbol \
    -zstrip-class=debug main.c
ld: warning: unsetting option '-zstrip-class=debug': LD_UNSET directed
$ elfdump -c main | egrep "symtab|debug"
Section Header[20]:  sh_name: .debug_info
Section Header[21]:  sh_name: .debug_line

此外,对于适用于多个实例的选项(例如 –z strip-class),可以通过指定不含任何合格选项字符串的选项来取消设置所有系列成员。以下是取消设置剥离调试节和符号表节的示例。

$ LD_UNSET=-zstrip-class  cc -o main -zstrip-class=symbol \
    -zstrip-class=debug main.c
ld: warning: unsetting option '-zstrip-class': LD_UNSET directed
$ elfdump -c main | egrep "symtab|debug"
Section Header[19]:  sh_name: .symtab
Section Header[22]:  sh_name: .debug_info
Section Header[23]:  sh_name: .debug_line

根据 LD_OPTIONS、命令行和 LD_UNSET 组件确定输出目标文件类型。然后使用此目标文件类型来调查任何 LD_{object-type}_UNSETLD_{object-type}_OPTIONS 环境变量,以删除或添加特定于正在构建的目标文件类型的选项。object-type 以大写形式提供 –z type 选项定义的类型,此目标文件类型为 EXECPIERELOCSHARED 之一。例如,输出文件类型是动态可执行文件时,将解释 LD_EXEC_OPTIONS 选项。按以下顺序处理这些环境变量。

  • LD_{object-type}_UNSET 环境变量。

  • LD_{object-type}_OPTIONS 环境变量。

例如,创建动态可执行文件和共享目标文件的构建环境可以使用 LD_EXEC_OPTIONS 环境变量针对所有动态可执行文件启用地址空间布局随机化。

$ LD_EXEC_OPTIONS=-zaslr  build.sh

与此输出目标文件类型不一致的任何命令行选项都将导致致命错误状态。环境变量提供的任何不一致选项都将导致警告,并将忽略该选项。

有关最常用的链接编辑器选项,请参见Chapter 5, 链接编辑器快速参考;有关所有链接编辑器选项的完整说明,请参见 ld(1)