JavaScript is required to for searching.
跳过导航链接
退出打印视图
手册页第 1 部分:用户命令     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

简介

User Commands

acctcom(1)

adb(1)

addbib(1)

admin(1)

alias(1)

allocate(1)

amt(1)

appcert(1)

apptrace(1)

apropos(1)

ar(1)

arch(1)

as(1)

asa(1)

at(1)

atq(1)

atrm(1)

audioconvert(1)

audioctl(1)

audioplay(1)

audiorecord(1)

audiotest(1)

auths(1)

auto_ef(1)

awk(1)

banner(1)

basename(1)

basename(1B)

batch(1)

bc(1)

bdiff(1)

bfs(1)

bg(1)

biff(1B)

break(1)

builtin(1)

cal(1)

calendar(1)

case(1)

cat(1)

cd(1)

cdc(1)

cdrw(1)

chdir(1)

checkeq(1)

checknr(1)

chgrp(1)

chkey(1)

chmod(1)

chown(1)

chown(1B)

ckdate(1)

ckgid(1)

ckint(1)

ckitem(1)

ckkeywd(1)

ckpath(1)

ckrange(1)

ckstr(1)

cksum(1)

cktime(1)

ckuid(1)

ckyorn(1)

clear(1)

cmp(1)

col(1)

comb(1)

comm(1)

command(1)

compress(1)

continue(1)

cp(1)

cpio(1)

cpp(1)

cputrack(1)

crle(1)

crontab(1)

csh(1)

csplit(1)

ct(1C)

ctags(1)

ctrun(1)

ctstat(1)

ctwatch(1)

cu(1C)

cut(1)

date(1)

dc(1)

deallocate(1)

decrypt(1)

delta(1)

deroff(1)

df(1B)

dhcpinfo(1)

diff(1)

diff3(1)

diffmk(1)

digest(1)

digestp(1)

dircmp(1)

dirname(1)

dirs(1)

dis(1)

disown(1)

dispgid(1)

dispuid(1)

dos2unix(1)

dpost(1)

du(1)

du(1B)

dump(1)

dumpcs(1)

dumpkeys(1)

echo(1)

echo(1B)

ed(1)

edit(1)

egrep(1)

eject(1)

elfdump(1)

elfedit(1)

elffile(1)

elfsign(1)

elfwrap(1)

encrypt(1)

enhance(1)

env(1)

eqn(1)

errange(1)

errdate(1)

errgid(1)

errint(1)

erritem(1)

error(1)

errpath(1)

errstr(1)

errtime(1)

erruid(1)

erryorn(1)

eval(1)

ex(1)

exec(1)

exit(1)

expand(1)

export(1)

exportfs(1B)

expr(1)

expr(1B)

exstr(1)

factor(1)

false(1)

fastboot(1B)

fasthalt(1B)

fc(1)

fg(1)

fgrep(1)

file(1)

file(1B)

filebench(1)

filep(1)

filesync(1)

filofaxp(1)

find(1)

finger(1)

fmt(1)

fmtmsg(1)

fold(1)

for(1)

foreach(1)

franklinp(1)

from(1B)

ftp(1)

function(1)

gcore(1)

gencat(1)

geniconvtbl(1)

genmsg(1)

get(1)

getconf(1)

getfacl(1)

getlabel(1)

getopt(1)

getoptcvt(1)

getopts(1)

gettext(1)

gettxt(1)

getzonepath(1)

glob(1)

goto(1)

gprof(1)

grep(1)

groups(1)

groups(1B)

grpck(1B)

hash(1)

hashcheck(1)

hashmake(1)

hashstat(1)

head(1)

helpdate(1)

helpgid(1)

helpint(1)

helpitem(1)

helppath(1)

helprange(1)

helpstr(1)

helptime(1)

helpuid(1)

helpyorn(1)

hist(1)

history(1)

hostid(1)

hostname(1)

i386(1)

i486(1)

iconv(1)

if(1)

indxbib(1)

install(1B)

ipcrm(1)

ipcs(1)

isainfo(1)

isalist(1)

jobs(1)

join(1)

jsh(1)

kbd(1)

kdestroy(1)

keylogin(1)

keylogout(1)

kill(1)

kinit(1)

klist(1)

kmdb(1)

kmfcfg(1)

kpasswd(1)

krb5-config(1)

ksh(1)

ksh88(1)

ksh93(1)

ktutil(1)

kvno(1)

lari(1)

last(1)

lastcomm(1)

ld(1)

ldapadd(1)

ldapdelete(1)

ldaplist(1)

ldapmodify(1)

ldapmodrdn(1)

ldapsearch(1)

ldd(1)

ld.so.1(1)

let(1)

lex(1)

lgrpinfo(1)

limit(1)

line(1)

list_devices(1)

listusers(1)

llc2_autoconfig(1)

llc2_config(1)

llc2_stats(1)

ln(1)

ln(1B)

loadkeys(1)

locale(1)

localedef(1)

logger(1)

logger(1B)

login(1)

logname(1)

logout(1)

look(1)

lookbib(1)

lorder(1)

ls(1)

ls(1B)

m4(1)

mac(1)

mach(1)

machid(1)

madv.so.1(1)

mail(1)

Mail(1B)

mail(1B)

mailcompat(1)

mailp(1)

mailq(1)

mailstats(1)

mailx(1)

make(1S)

makekey(1)

man(1)

mconnect(1)

mcs(1)

mdb(1)

mesg(1)

mkdir(1)

mkmsgs(1)

mkstr(1B)

mktemp(1)

moe(1)

more(1)

mp(1)

mpss.so.1(1)

msgcc(1)

msgcpp(1)

msgcvt(1)

msgfmt(1)

msggen(1)

msgget(1)

mt(1)

mv(1)

nawk(1)

nc(1)

ncab2clf(1)

ncakmod(1)

neqn(1)

netcat(1)

newform(1)

newgrp(1)

newsp(1)

newtask(1)

nice(1)

nl(1)

nm(1)

nohup(1)

notify(1)

nroff(1)

od(1)

on(1)

onintr(1)

optisa(1)

pack(1)

packagemanager(1)

page(1)

pagesize(1)

pargs(1)

passwd(1)

paste(1)

patch(1)

pathchk(1)

pax(1)

pcat(1)

pcred(1)

perl(1)

pfbash(1)

pfcsh(1)

pfexec(1)

pfiles(1)

pfksh(1)

pflags(1)

pfsh(1)

pftcsh(1)

pfzsh(1)

pg(1)

pgrep(1)

pkcs11_inspect(1)

pkg(1)

pkgdepend(1)

pkgdiff(1)

pkgfmt(1)

pkginfo(1)

pkglint(1)

pkgmerge(1)

pkgmk(1)

pkgmogrify(1)

pkgparam(1)

pkgproto(1)

pkgrecv(1)

pkgrepo(1)

pkgsend(1)

pkgsign(1)

pkgtrans(1)

pkill(1)

pklogin_finder(1)

pktool(1)

plabel(1)

pldd(1)

plgrp(1)

plimit(1)

pmadvise(1)

pmap(1)

pm-updatemanager(1)

popd(1)

ppgsz(1)

ppriv(1)

pr(1)

praliases(1)

prctl(1)

preap(1)

print(1)

printenv(1B)

printf(1)

priocntl(1)

proc(1)

prof(1)

profiles(1)

projects(1)

prs(1)

prt(1)

prun(1)

ps(1)

ps(1B)

psig(1)

pstack(1)

pstop(1)

ptime(1)

ptree(1)

pushd(1)

pvs(1)

pwait(1)

pwd(1)

pwdx(1)

radadrgen(1)

ranlib(1)

rcapstat(1)

rcp(1)

read(1)

readonly(1)

red(1)

refer(1)

regcmp(1)

rehash(1)

remote_shell(1)

remsh(1)

renice(1)

repeat(1)

reset(1B)

return(1)

rksh(1)

rksh88(1)

rlogin(1)

rm(1)

rmail(1)

rmdel(1)

rmdir(1)

rmformat(1)

rmmount(1)

rmumount(1)

roffbib(1)

roles(1)

rpcgen(1)

rpm2cpio(1)

rsh(1)

runat(1)

rup(1)

rup(1C)

ruptime(1)

rusage(1B)

rusers(1)

rwho(1)

sact(1)

sar(1)

sccs(1)

sccs-admin(1)

sccs-cdc(1)

sccs-comb(1)

sccs-delta(1)

sccsdiff(1)

sccs-get(1)

sccs-help(1)

sccshelp(1)

sccs-prs(1)

sccs-prt(1)

sccs-rmdel(1)

sccs-sact(1)

sccs-sccsdiff(1)

sccs-unget(1)

sccs-val(1)

scp(1)

script(1)

sdiff(1)

sed(1)

sed(1B)

select(1)

set(1)

setenv(1)

setfacl(1)

setlabel(1)

setpgrp(1)

settime(1)

sftp(1)

sh(1)

shcomp(1)

shell_builtins(1)

shift(1)

shutdown(1B)

size(1)

sleep(1)

soelim(1)

sort(1)

sortbib(1)

sotruss(1)

source(1)

sparc(1)

spell(1)

spellin(1)

split(1)

srchtxt(1)

ssh(1)

ssh-add(1)

ssh-agent(1)

ssh-http-proxy-connect(1)

ssh-keygen(1)

ssh-keyscan(1)

ssh-socks5-proxy-connect(1)

stop(1)

strchg(1)

strconf(1)

strings(1)

strip(1)

stty(1)

stty(1B)

sum(1)

sum(1B)

sun(1)

suspend(1)

svcprop(1)

svcs(1)

switch(1)

symorder(1)

sys-suspend(1)

sysV-make(1)

t300(1)

t300s(1)

t4014(1)

t450(1)

tabs(1)

tail(1)

talk(1)

tar(1)

tbl(1)

tcopy(1)

tee(1)

tek(1)

telnet(1)

test(1)

test(1B)

tftp(1)

time(1)

timemanp(1)

times(1)

timesysp(1)

timex(1)

tip(1)

touch(1)

touch(1B)

tplot(1)

tput(1)

tr(1)

tr(1B)

trap(1)

troff(1)

true(1)

truss(1)

tset(1B)

tsort(1)

tty(1)

type(1)

typeset(1)

ul(1)

ulimit(1)

umask(1)

unalias(1)

uname(1)

uncompress(1)

unexpand(1)

unget(1)

unhash(1)

unifdef(1)

uniq(1)

units(1)

unix2dos(1)

unlimit(1)

unpack(1)

unset(1)

unsetenv(1)

until(1)

updatehome(1)

uptime(1)

userattr(1)

users(1B)

uucp(1C)

uudecode(1C)

uuencode(1C)

uuglist(1C)

uulog(1C)

uuname(1C)

uupick(1C)

uustat(1C)

uuto(1C)

uux(1C)

vacation(1)

val(1)

valdate(1)

valgid(1)

valint(1)

valpath(1)

valrange(1)

valstr(1)

valtime(1)

valuid(1)

valyorn(1)

vc(1)

vedit(1)

ver(1)

vgrind(1)

vi(1)

view(1)

vipw(1B)

volcheck(1)

volrmmount(1)

w(1)

wait(1)

wc(1)

what(1)

whatis(1)

whence(1)

whereis(1B)

which(1)

while(1)

who(1)

whoami(1B)

whocalls(1)

whois(1)

write(1)

xargs(1)

xgettext(1)

xstr(1)

yacc(1)

yes(1)

ypcat(1)

ypmatch(1)

yppasswd(1)

ypwhich(1)

zcat(1)

zlogin(1)

zonename(1)

zonestat(1)

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

ld

- 目标文件的链接编辑器

用法概要

ld [-32 | -64] [-Bdirect | nodirect] [-B dynamic | static]
[-B eliminate[=mode] | local[=mode]] [-B reduce] [-c name]
[-C] [-D [!]token1,[!]token2,...] [-e epsym]
[-f name | -F name] [-G] [-h name] [-i] [-l x] [-L path]
[-m] [-M mapfile] [-N string] [-o outfile] [-p auditlib]
[-P auditlib] [-Q y | n] [-r] [-R path] [-s]
[-S supportlib] [-t] [-u symname] [-V] [-Y P,dirlist]
[-z allextract | defaultextract | weakextract ]
[-z altexec64] [-z aslr[=mode]] [-z ancillary[=outfile]] 
[-z assert-deflib[=libname]] [-z deferred | nodeferred]
[-z defs | nodefs] [-z direct | nodirect]
[-z discard-unused=item1,item2,...] [-z endfiltee]
[-z fatal-warnings | nofatal-warnings] [-z finiarray=function]
[-z globalaudit] [-z guidance[=item1,item2,...]] [-z help ]
[-z ignore | record] [-z initarray=function] [-z initfirst]
[-z interpose] [-z lazyload | nolazyload]
[-z ld32=arg1,arg2,...] [-z ld64=arg1,arg2,...]
[-z loadfltr] [-z mapfile-add=name] [-z muldefs]
[-z nocompstrtab] [-z nodefaultlib] [-z nodelete]
[-z nodlopen] [-z nodump] [-z noldynsym] [-z nopartial]
[-z origin] [-z parent=object] [-z preinitarray=function]
[-z relaxreloc] [-z rescan-now] [-z rescan-start ...-z rescan-end]
[-z strip-class=[!]class1,[!]class2,...] [-z stub]
[-z symbolcap] [-z target=sparc|x86]
[-z text | textwarn | textoff] [-z verbose] [-z wrap=symbol]
filename ...

描述

链接编辑器 ld 通过解析对符号定义的符号引用以及执行重定位来合并可重定位的目标文件。在所有情况下,ld 的缺省输出位于 a.out 文件中。请参见“附注”部分。

ld 有许多选项。“用法概要”部分中定义了与现代编程实践有关的选项,手册页后面的几个部分对这些选项进行了介绍。其他选项不太常用,“辅助选项”部分对这些选项进行了介绍。

ld 以两种模式之一运行:动态或静态。动态模式是缺省模式,但该模式可由 -r-d 选项控制。在动态模式下,将合并作为参数提供的可重定位目标文件以生成动态可执行文件。此文件在运行时与作为参数提供的任何共享目标文件合并在一起。如果指定了 -G 选项,将合并可重定位目标文件以生成共享目标文件。此动态链接环境紧密结合了链接编辑器和运行时链接程序 ld.so.1(1) 的工作。这两个实用程序及其相关的技术和实用程序详细记录在《链接程序和库指南》中。

在静态模式下,将通过 -r 选项来合并作为参数提供的多个可重定位目标文件,以生成一个可重定位的目标文件。现代版本的 Oracle Solaris 操作系统不支持创建静态可执行文件。请参见Static Executables。本部分中的所有讨论均假定使用 -r 选项进行动态链接或静态链接。

如果任何参数是库,当在命令行中遇到该库时,缺省情况下,ld 将仅搜索该库一次。库可以是共享目标文件也可以是可重定位归档文件。请参见 ar.h(3HEAD)

共享目标文件由以前通过链接编辑一个或多个输入文件而生成的不可分割的整个单元组成。链接编辑器处理共享目标文件时,共享目标文件的所有内容将成为生成的输出文件映像的逻辑部分。在链接编辑期间,实际上不会复制共享目标文件,因为其实际包含将延迟到进程执行。包含此逻辑部分意味着,链接编辑过程可以使用在共享目标文件中定义的所有符号项。请参见《链接程序和库指南》中的第 4  章 "共享目标文件"

对于归档库,ld 仅装入定义未解析的外部引用的归档成员。ld 按顺序搜索归档库的符号表以解析可满足归档成员的外部引用。此搜索操作将重复执行,直到不存在可由归档解析的外部引用。因此,库中成员的顺序对功能没有影响,除非存在定义相同外部符号的多个归档成员。具有相互依赖关系的归档库可能需要多个命令行定义或使用 -z rescan 选项之一。请参见《链接程序和库指南》中的"归档处理"

ld 是交叉链接编辑器,能够链接 SPARC 或 x86 目标的 32 位目标文件或 64 位目标文件。ld 使用 ELF 类和命令行上第一个可重定位目标文件的机器类型来控制要运行的模式。不允许混用 32 位目标文件和 64 位目标文件。同样,只允许单个计算机类型的目标文件。请参见 -32-64-z target 选项以及 LD_NOEXEC_64 环境变量。

静态可执行文件

许多发行版都建议不要创建静态可执行文件。实际上,Solaris 中从未提供过 64 位系统归档库。因为静态可执行文件是基于系统归档库生成的,所以这种可执行文件包含关于系统实现的详细信息。该自包含特性有许多缺点:

从 Oracle Solaris 10 开始,不再提供 32 位系统归档库。如果没有这些库(特别是 libc.a),即没有专门的系统知识,将无法再创建静态可执行文件。但是,ld 处理静态链接选项以及归档库的功能保持不变。

选项

支持以下选项。

-32 | -64

创建 32 位或 64 位目标文件。

缺省情况下,要生成的目标文件的类根据从命令行处理的第一个 ELF 目标文件来确定。如果未指定任何目标文件,类由从命令行处理的第一个归档文件中遇到的第一个目标文件确定。如果没有目标文件或归档文件,链接编辑器将创建 32 位目标文件。

仅从 mapfile 创建 64 位目标文件时才需要 -64 选项。

-32-64 选项还可用在下面的罕见情况中:完全从同时包含 32 和 64 位目标文件的归档文件链接。如果归档文件中的第一个目标文件不是需要创建的目标文件的类,-32-64 选项可用来指向链接编辑器。

-B direct | nodirect

这些选项控制是否直接绑定。-B direct 通过记录符号引用与提供符号定义的依赖项之间的关系来建立直接绑定信息。此外,可以在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。运行时链接程序使用此信息直接在关联目标文件中搜索符号而不是执行缺省符号搜索。

只能对使用链接编辑指定的依赖项建立直接绑定信息。因此,还应添加 -z defs 选项。希望在直接绑定环境中插入符号的目标文件应使用 -z interpose 选项将自身标识为插入项。使用 -B direct 还会对所有依赖项启用 -z lazyload

-B nodirect 选项禁止直接绑定到要创建的目标文件所提供的接口。通过指定 -z direct 选项,可以将要创建的目标文件继续直接绑定到外部接口。请参见《链接程序和库指南》中的第 9  章 "直接绑定"

-B dynamic | static

这些选项用于控制库包含。-B dynamic 允许 -l 选项库搜索扩展至共享目标文件和归档库名称。此选项仅在动态模式下有效,并且是缺省选项。-B static-l 选项库搜索限定为仅扩展至归档库名称。可以在命令行上任意次地指定这些选项以进行切换。如果指定了 -B static 选项,在切换为 -B dynamic 选项之前,不会接受任何共享目标文件。请参见 -l 选项。

-B eliminate[=mode] | local[=mode]

导致缺省设置为全局绑定的任何符号从符号表中被删除,或缩减为局部可见。具有 STV_DEFAULT 可见性的全局符号可以由链接编辑器缩减为更具限制性的可见性。具有任何其他 STV_ 可见性的全局符号被视为具有显式可见性。链接编辑器遵循显式可见性,不能修改。请参见《链接程序和库指南》中的"SYMBOL_SCOPE / SYMBOL_VERSION 指令"。符号可见性可以通过编译器指令或通过定义版本或接口定义的 mapfiles 显式定义。

Mapfile 版本和接口定义可以包含 auto-eliminationauto-reduction 指令。请参见《链接程序和库指南》中的"SYMBOL_SCOPE / SYMBOL_VERSION 指令"。这些指令将导致未在 mapfile 中显式定义或者没有定义显示可见性的符号分别被删除或缩减为局部。除了任何显式符号定义,符号的删除或缩减还会受所生成目标文件类型影响,如随后的段落所述。-B eliminate 选项与 mapfile auto-elimination 指令请求相同的符号删除。-B local 选项与 mapfile auto-reduction 指令请求相同的符号缩减。

任一选项均可通过模式 externalnoexternal 来控制对删除全局符号或缩减全局符号的选择。此微调通常是不必要的,因为缺省情况下链接编辑器会根据所生成目标文件的类型来采用相应模式:external 适用于可执行文件,noexternal 适用于共享目标文件。

构建动态目标文件时,可能需要确保某些符号保持全局状态,以便可以从外部依赖项引用这些符号。对于动态可执行文件而言尤其如此。构建可执行文件时,可重定位目标文件由支持运行时进程初始化的编译环境提供。这些可重定位目标文件可以包含从系统依赖项引用的全局符号。无论采用任何自动删除或自动缩减符号技术,这些符号均应保持全局状态,以便不会影响运行时执行。

mode 定义为 external 时会分析任何外部依赖项,以确定依赖项中的任何符号引用是否可能绑定到所构建目标文件内的符号定义。任何符合此绑定的全局符号都不会被删除或缩减为局部。此模式是生成动态可执行文件时的缺省模式。

mode 定义为 noexternal 会绕过对任何外部依赖项的分析,这样,所有未在 mapfile 中显式定义或没有定义显式可见性的符号均会缩减。此模式是生成共享目标文件时的缺省模式。

另请参见 -B reduce 选项。

-B reduce

生成可重定位目标文件时,任何符号可见性属性所定义的符号信息或者通过定义版本或接口定义的 mapfiles 定义的符号信息会被缩减。缺省情况下,生成可重定位目标文件时,可见性属性、版本定义或接口定义仅会记录在输出映像中。创建动态可执行文件或共享目标文件时,可见性属性或 mapfile 版本或接口定义始终应用于任何符号信息。

-c name

记录配置文件的 name 以便在运行时使用。可以使用配置文件来改变缺省搜索路径,提供目录高速缓存以及提供备选目标文件依赖项。请参见 crle(1)

-C

取消改编 C++ 符号名称显示在诊断消息中。

-D [!]token1,[!]token2,...

按每个 token 的指定将调试信息输出为标准错误。特殊标记 help 指示可用标记的完整列表。请参见《链接程序和库指南》中的"调试帮助"

-e epsym
--entry epsym

将输出文件的入口点地址设置为符号 epsym

-f name
--auxiliary name

仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的辅助过滤器。允许使用此选项的多个实例。此选项不能与 -F 选项一起使用。请参见《链接程序和库指南》中的"生成辅助过滤器"

-F name
--filter name

仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的过滤器。允许使用此选项的多个实例。此选项不能与 -f 选项一起使用。请参见《链接程序和库指南》中的"生成标准过滤器"

-G
-shared

仅在动态模式下,生成共享目标文件。允许使用未定义的符号。请参见《链接程序和库指南》中的第 4  章 "共享目标文件"

-h name
--soname name

仅在动态模式下,当构建共享目标文件时,在目标文件的动态部分中记录 namename 记录在与此目标文件而不是目标文件的文件系统名链接的任何动态目标文件中。因此,name 由运行时链接程序用作共享目标文件的名称以在运行时进行搜索。请参见《链接程序和库指南》中的"记录共享目标文件名称"

-i

忽略 LD_LIBRARY_PATH。当 LD_LIBRARY_PATH 设置实际影响运行时库搜索(这会干扰正在执行的链接编辑)时,此选项非常有用。

-l x
--library x

搜索 libx.solibx.a 库,它们分别是共享目标文件和归档库的常规名称。在动态模式下,除非 -B static 选项有效,否则 ld 将在库搜索路径中指定的每个目录中搜索 libx.solibx.a 文件。目录搜索在包含任何一个文件的第一个目录处停止。ld 会选择以 .so 结尾的文件,条件是 -lx 扩展为两个文件,这两个文件的名称采用 libx.solibx.a 形式。如果未找到 libx.sold 将接受 libx.a。在静态模式下,即当 -B static 选项有效时,ld 将仅选择以 .a 结尾的文件。ld 在遇到该库时会搜索库,因此 -l 的位置非常重要。请参见《链接程序和库指南》中的"与其他库链接"

-L path
--library-path path

path 添加到库搜索目录。ld 首先在 -L 选项指定的任何目录中搜索库,然后在标准目录中搜索。仅当此选项位于 -L 选项应用到的 -l 选项之前时,此选项才有用。请参见《链接程序和库指南》中的"链接编辑器搜索的目录"

环境变量 LD_LIBRARY_PATH 可用于补充库搜索路径,但是建议使用 -L 选项,因为环境变量也会由运行时环境解释。请参见“环境变量”部分的 LD_LIBRARY_PATH

-m

在标准输出中生成内存映射或输入/输出部分列表,以及任何非致命多重定义符号。

-M mapfile

作为 ld 指令的文本文件读取 mapfile。可以多次指定此选项。如果 mapfile 是目录,将处理该目录中的所有正规文件(如 stat(2) 所定义)。请参见《链接程序和库指南》中的附录 B "System V 发行版 4(版本 1)Mapfile"/usr/lib/ld 中提供了示例 mapfile。请参见“文件”部分。

-N string

此选项会将 DT_NEEDED 条目添加到所生成的目标文件的 .dynamic 部分中。DT_NEEDED 字符串的值为在命令行上指定的 string。此选项与位置有关,且 DT_NEEDED .dynamic 条目与链接编辑行上搜索到的其他动态依赖项有关。当组合使用 -dy-r 选项时,此选项适用于在设备驱动程序可重定位目标文件中指定依赖项。

-o outfile
--output outfile

生成名为 outfile 的输出目标文件。缺省目标文件的名称为 a.out

-p auditlib

标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件。共享目标文件被标识为要求使用 -p 选项进行审计,将该共享目标文件指定为依赖项的任何目标文件都将继承此项要求。请参见 -P 选项。请参见《链接程序和库指南》中的"运行时链接程序审计接口"

-P auditlib

标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件的依赖项。依赖项审计还可以从标识为要求审计的依赖项继承。请参见 -p 选项和 -z globalaudit 选项。请参见《链接程序和库指南》中的"运行时链接程序审计接口"

-Q y | n

使用 -Q y 时,会将 ident 字符串添加到输出文件的 .comment 部分。此字符串标识用于创建文件的 ld 的版本。这将导致当存在多个链接步骤(例如使用 ld -r)时,出现多个 ld ident。此标识与 cc 命令的缺省操作相同。-Q n 将隐藏版本标识。.comment 部分可以通过 mcs(1) 实用程序来处理。

-r
--relocatable

合并可重定位目标文件以生成一个可重定位目标文件。ld 不受未解析引用的影响。此选项不能与 -a 选项一起使用。

-R path
-rpath path

冒号分隔的目录列表,用于指定运行时链接程序的库搜索目录。如果路径存在且不为空,将在输出目标文件中记录路径并将其传递给运行时链接程序。此选项的多个实例与各个用冒号分隔的 path 串联在一起。请参见《链接程序和库指南》中的"运行时链接程序搜索的目录"

在关联目标文件中使用 runpath 比设置全局搜索路径(例如通过 LD_LIBRARY_PATH 环境变量)更可取。仅应记录查找目标文件依赖项所需的 runpaths。ldd(1) 在与 -U 选项一起使用时,还可用于在动态目标文件中搜索未使用的 runpaths。

还可以通过 runpath 来提供各种标记,运行路径提供了标识系统功能或目标文件位置的灵活方式。请参见《链接程序和库指南》中的第 6  章 "使用动态字符串标记建立依赖性"$ORIGIN 标记特别适用于将动态目标文件重定位到文件系统中的其他位置。

-s
--strip-all

从输出文件中分离任何符号信息。这些选项等效于组合使用 -z strip-class 选项与 debugsymbol 类标识符。另请参见 -z redlocsym-z noldynsym 选项。

-S supportlib

共享目标文件 supportlib 是使用 ld 以及有关链接进程的给定信息装入的。使用 -S 选项定义的共享目标文件还可通过使用 SGS_SUPPORT 环境变量来提供。请参见《链接程序和库指南》中的"链接编辑器支持接口"

-t

禁止对具有不同大小或不同对齐方式的多重定义符号发出警告。

-u symname
--undefined symname

在符号表中作为未定义的符号输入 symname。此选项适用于完全从归档库装入。在此实例中,需要使用未解析的引用来强制装入第一个例程。此选项在命令行上的位置非常重要。此选项必须置于定义符号的库之前。请参见《链接程序和库指南》中的"使用 -u 选项定义其他符号"

-V
--version

输出一条消息,其中给出有关所使用的 ld 的版本的信息。

-Y P,dirlist

更改用于查找库的缺省目录。dirlist 是冒号分隔的路径列表。

-z allextract | defaultextract | weakextract
--whole-archive | --no-whole-archive

从跟随的任何归档中更改目标文件的提取条件。缺省情况下,将提取归档成员以满足未定义的引用并通过数据定义提升暂定的定义。弱符号引用不会触发提取。使用 -z allextract--whole-archive 选项时,从归档中提取所有归档成员。使用 -z weakextract 时,弱引用触发归档提取。-z defaultextract--no-whole-archive 选项提供一种在使用前面的提取选项之后返回缺省值的方法。请参见《链接程序和库指南》中的"归档处理"

-z altexec64

执行 64 位 ld。历史上,已执行的链接编辑器的类由所创建的 ELF 目标文件的类决定。现在,已执行的链接编辑器的类由底层系统的类决定。通常情况下,这是 64 位。此选项维持向后兼容性。

-z ancillary[=outfile]

指定一个辅助输出文件,用于接收通常将添加到输出目标文件的不可分配部分。运行时不需要不可分配部分,它们主要由调试器和其他监测工具使用。如果 outfile 存在,将使用指定的名称创建辅助文件。如果 outfile 不存在,则辅助文件的名称为主输出文件的名称加 .anc 后缀。请参见《链接程序和库指南》中的第 2  章 "链接编辑器"

只有可执行文件和共享目标文件支持辅助目标文件。指定 -r 选项来构建可重定位目标文件时,不能使用 -z ancillary 选项。与 -z stub 选项一起使用时,-z ancillary 选项会被静默忽略。在以下情况下也会忽略 -z ancillary 选项:即在指定该选项时未指定 outfile,以及通过 -o 选项指定的输出文件是设备特殊文件(如 /dev/null)。

-z aslr[=mode]

指定可执行文件的地址空间布局随机化 (Address Space Layout Randomization, ASLR) 行为。可以将模式值设置为 enableddisabled。如果省略模式,则启用 ASLR。

-z assert-deflib[=libname ]

允许为使用通过检查链接编辑器提供的缺省搜索路径找到的 -l 命令行选项指定的库发出警告消息。如果提供 libname 值,将启用缺省库警告功能,并将指定的库添加到不为其发出警告的库列表中。可以指定多个 -z assert-deflib 选项以指定多个不应为其发出警告的库。

libname 值应为链接编辑器找到的不带任何路径组件的库文件的名称。例如,以下选项允许发出缺省库警告,但标准 C 库除外。

ld ... -z assert-deflib=libc.so ...

-z assert-deflib 是专用选项,主要用于这样的版本环境:其中存在多个具有相同名称的目标文件且需要对所使用的库实行严格控制。该选项不用于一般用途。

-z deferred | nodeferred

允许或禁止将动态依赖项标记为延迟。标记为 deferred 的动态依赖项也将标记为延迟可装入,且不会在初始进程启动时装入。在首次绑定到延迟引用时,延迟依赖项的装入过程会延迟到进程执行。与基本的延迟可装入依赖项不同,不会在处理 LD_BIND_NOW 时处理延迟依赖项,也不会通过带有 RTLD_NOW 标记的 dlopen(3C) 来处理延迟依赖项。请参见《链接程序和库指南》中的"延迟装入动态依赖项"

组合使用延迟依赖项以及 dlsym(3C)RTLD_PROBE 句柄,可提供灵活机制和自然编码样式以供测试功能使用。

-z defs | nodefs
--no-undefined

-z defs 选项和 --no-undefined 选项会在链接末尾保留有任何未定义的符号时强制生成致命错误。此模式是构建可执行文件时的缺省模式。由于历史原因,此模式是构建共享目标文件时的缺省模式。建议使用 -z defs 选项,因为此模式可保证所构建的目标文件是自包含的。自包含目标文件在内部解析所有符号引用,或解析到目标文件的直接依赖项。

-z nodefs 选项允许未定义的符号。由于历史原因,此模式是构建共享目标文件时的缺省模式。与可执行文件一起使用时,未指定对此类未定义符号的引用的行为。不建议使用 -z nodefs 选项。

-z direct | nodirect

允许或禁止直接绑定到命令行上跟在其后的任何依赖项。与全局等效 -B direct 相比,这些选项允许对直接绑定进行更精确的控制。-z direct 选项在以下方面也与 -B direct 选项不同。不会在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。不支持延迟装入。

-z discard-unused= item1,item2,...

缺省情况下,链接编辑器会放弃未使用的空部分。在链接编辑期间,可能会将其他类别的输入材料确定为未使用。使用 -z discard-unused 选项可自动删除此类项目。可以识别以下 item 标记。

sections

通过链接编辑创建的输出文件中未使用的部分将被放弃。

files

通过链接编辑创建的输出文件中未使用的可重定位目标文件将被放弃。

如果可重定位目标文件提供的所有可分配部分均未使用,则可将该输入可重定位目标文件确定为未使用。另请参见 -z guidance 选项中有关“不需要的可重定位目标文件”的论述。

dependencies

通过链接编辑创建的输出文件中不会记录未使用的显式共享目标文件依赖项。

显式依赖项是指使用路径名或通过使用 -l 选项(更为常用)在命令行上定义的依赖项。显式依赖项可以依赖于其他目标文件,后者被称为隐式依赖项。如果符合以下两个条件,则可将显式依赖项确定为未使用。

  • 未从所构建的目标文件中引用该依赖项提供的任何全局符号。

  • 该依赖项不补偿任何隐式依赖项的要求。

另请参见 -z guidance 选项中有关“不需要的或补偿性的依赖项”的论述。

none

禁用所有未使用的处理,包括删除未使用的空部分的缺省操作。

另请参见《Oracle Solaris 11.1 链接程序和库指南》中的"删除未使用的材料"

-z endfiltee

标记 filtee 以便在过滤器进行处理时,filtee 可终止过滤器进行的任何进一步的 filtee 搜索。请参见《链接程序和库指南》中的"减少 filtee 搜索"

-z fatal-warnings | nofatal-warnings
--fatal-warnings | --no-fatal-warnings

使用 -z fatal-warnings--fatal-warnings 选项可使链接编辑器将警告视为致命错误。

使用 -z nofatal-warnings--no-fatal-warnings 选项可使链接编辑器将警告视为非致命错误。这是缺省行为。

-z finiarray=function

在所构建的目标文件的 .fini_array 部分后附加一个条目。如果不存在 .fini_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《链接程序和库指南》中的"初始化节和终止节"

-z globalaudit

此选项对已使用 -P 选项记录的审计库定义进行补充。此选项仅在构建动态可执行文件时有意义。使用 -P 选项在目标文件中定义的审计库通常允许审计该目标文件的直接依赖项。-z globalaudit 将审计程序升级为全局审计程序,因此允许审计所有依赖项。请参见《链接程序和库指南》中的"调用审计接口"

使用 -P 选项和 -z globalaudit 选项建立的审计程序等效于使用 LD_AUDIT 环境变量建立的审计程序。请参见 ld.so.1(1)

-z guidance[=item1,item2,...]

提供指南消息来指示 ld 选项,这些选项可以改进所生成目标文件的质量,或者在其他方面被视为有益。提供的特定指南在系统升级时可能会发生更改。旧版本 ld 提供的过时指南在新版本中可能已删除。同样,可能会在新版本的 ld 中添加新指南。因此,指南始终代表当前最佳做法。

通过提供代表要禁止的指南类的 item 标记列表,可以启用指南但禁止特定指南消息。这样,可以禁止不需要的建议而不会失去其他指南的优点。ld 会静默忽略无法识别的 item 标记,从而允许在多种早期或新版本的 Solaris 上执行指定的 ld 命令行。

下面是当前版本的 ld 提供的指南以及用于禁止这些消息的 item 标记。

指定所需依赖项

动态可执行文件和共享目标文件应明确定义它们所需的所有依赖项。如果在构建动态目标文件时有任何符号引用不能满足要求,指南建议使用 -z defs 选项。可以使用 -z guidance=nodefs 禁用此指南。

不指定不需要的或补偿性的依赖项

动态可执行文件和共享目标文件不应定义不满足动态目标文件建立的符号引用的任何显式依赖项。指南建议删除不需要的或未使用的依赖项。未使用的依赖项可以是以下两个类别中的一种。

  • 不满足符号引用要求的显式依赖项。

  • 不满足所构建动态目标文件的符号引用要求,但会补偿隐式依赖项的显式依赖项。请参见 -z discard-unused 选项中有关“依赖项”的论述。

可以通过 -z guidance=nounused-dependencies 或同义词 -z guidance=nounused 来禁用这两个类别的指南。可以通过 -z guidance=nounused-compensators 禁用补偿依赖项的指南。

另请参见《Oracle Solaris 11.1 链接程序和库指南》中的"删除未使用的材料"

不指定不需要的可重定位目标文件

如果某个可重定位目标文件的可分配部分未由链接编辑所涉及的任何其他目标文件所引用,则所创建的输出文件不应包含该可重定位目标文件的任何信息。指南建议删除未使用的可重定位目标文件。可以使用 -z guidance=nounused-files 禁用此指南。

另请参见《Oracle Solaris 11.1 链接程序和库指南》中的"删除未使用的材料"

延迟装入

应标识依赖项以进行延迟装入。如果在遇到 -z lazyload-z nolazyload 选项之前要处理任何依赖项,指南建议使用 -z lazyload 选项。可以使用 -z guidance=nolazyload 禁用此指南。

直接绑定

应使用直接绑定来引用依赖项。如果在遇到 -B direct-z direct 选项之一或者 -z nodirect 选项之前要处理任何依赖项,指南建议使用前两个选项中的一个。可以使用 -z guidance=nodirect 禁用此指南。

纯文本段

动态目标文件不应包含不可写但可分配部分的重定位。如果针对文本段的任何重定位持续,且未遇到 -z textwarn-z textoff 选项,指南建议使用位置无关代码 (Position Independent Code, PIC) 编译目标文件。可以使用 -z guidance=notext 禁用此指南。

Mapfile 语法

所有 mapfile 应使用版本 2 mapfile 语法。如果遇到任何使用版本 1 语法的 mapfile,指南将建议使用版本 2 语法。可以使用 -z guidance=nomapfile 禁用此指南。

库搜索路径

将静默忽略 ld 遇到的不合适的依赖项。例如,将忽略在生成 64 位目标文件时遇到的 32 位依赖项。这些依赖项可以由不正确的搜索路径设置产生,例如提供不正确的 -L 选项。尽管此依赖项是有利的,但其处理会造成浪费,而且可能会隐藏应解决的版本问题。指南建议删除任何不合适的依赖项。可以使用 -z guidance=nolibpath 禁用此指南。

此外,-z guidance=noall 可用来完全禁用指南功能。有关指南的更多信息和构建更好的目标文件的建议,请参见《链接程序和库指南》中的第 7  章 "链接编辑器快速参考"

-z help
--help

在标准输出中输出命令行选项的摘要并退出。

-z ignore | record

忽略或记录未作为链接编辑的一部分引用的共享目标文件依赖项。

-z ignore-z record 是位置选项,用于切换 ld 处理命令行中遇到的未引用依赖项的方式。遇到 -z ignore 时,将静默忽略任何后续未引用依赖项。遇到 -z record 时,将记录所有依赖项,而不考虑依赖项是否被引用。

缺省情况下,ld 会记录所有依赖项而不考虑依赖项是否被引用。可以使用非位置 -z discard-unused=dependencies 选项来更改此初始缺省设置。确立初始设置后,可以使用 -z ignore-z record 来更改缺省行为。

-z initarray=function

在所构建的目标文件的 .init_array 部分后附加一个条目。如果不存在 .init_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《链接程序和库指南》中的"初始化节和终止节"

-z initfirst

标记目标文件以便先对该目标文件进行运行时初始化,然后再对同时进入进程的任何其他目标文件进行运行时初始化。此外,在对该目标文件进行运行时终结化之前,先对同时从进程中删除的任何其他目标文件进行运行时终结化。此选项仅在构建共享目标文件时有意义。

-z interpose

将目标文件标记为插入项。在运行时,如果已使用 -z interpose 选项标记某个目标文件,则会将该目标文件标识为显式插入项。在使用 LD_PRELOAD 环境变量装入目标文件时,也会建立显式插入项。由于目标文件的装入顺序可能会出现隐含插入,但是,此隐含插入对于运行时链接程序是未知的。显式插入可确保不论目标文件的装入顺序如何都会进行插入。显式插入还可确保当直接绑定有效时,运行时链接程序在任何显式插入项中搜索符号。

-z lazyload | nolazyload

允许或禁止将动态依赖项标记为延迟装入。标记为 lazyload 的动态依赖项在初始进程启动时不会装入。这些依赖项将延迟到首次绑定目标文件时装入。注意:延迟装入要求对依赖项以及进程中使用的每个动态目标文件的关联 runpaths 进行正确声明。请参见《链接程序和库指南》中的"延迟装入动态依赖项"

-z ld32=arg1,arg2,...
-z ld64=arg1 ,arg2,...

链接编辑器的类受所创建的输出文件的类以及底层操作系统的功能影响。-z ld[ 32|64] 选项提供定义任何链接编辑器参数的方法。定义的参数分别仅由链接编辑器的 32 位类或 64 位类解释。

例如,支持库是类特定的,因此可以使用以下选项确保支持库的类正确:

ld ... -z ld32=-Saudit32.so.1 -z ld64=-Saudit64.so.1 ...
-z loadfltr

标记过滤器以指示必须在运行时立即处理 filtee。通常,过滤器处理会延迟到某个符号引用绑定到该过滤器。包含此标志的目标文件的运行时处理将模拟 LD_LOADFLTR 环境变量生效时的运行时处理。请参见 ld.so.1(1)

-z mapfile-add=name

name 添加到已知的 mapfile 条件输入表达式谓词列表中。此选项等效于在链接编辑器读取的第一个 mapfile 的顶部放置以下行。

$mapfile_version 2
$add name

通过 -z mapfile-add 输入的名称可以与 mapfile $if$elif 指令一起使用来有条件地处理 mapfile 输入。请参见《链接程序和库指南》中的第 10  章 "Mapfile"

-z muldefs
--allow-multiple-definition

允许多个符号定义。缺省情况下,在可重定位目标文件之间出现多个符号定义会导致致命错误。此选项将禁止错误条件出现,并允许采用第一个符号定义。

-z nodelete

将目标文件标记为在运行时不可删除。此模式类似于通过组合使用 dlopen(3C)RTLD_NODELETE 模式将目标文件添加到进程中。

-z nodlopen

将目标文件标记为对 dlopen(3C) 不可用,即标记为 dlopen() 指定的目标文件或标记为 dlopen() 指定的目标文件所需的任何形式的依赖项。此选项仅在构建共享目标文件时有意义。

-z nodump

将目标文件标记为对 dldump(3C) 不可用。

-z parent=object

指定目标文件,该目标文件可以是可执行文件或共享目标文件,针对该目标文件链接输出目标文件。通常,在创建要在运行时由可执行文件通过 dlopen() 函数装入的插件共享目标文件时,使用此选项。父目标文件的符号表用于满足来自插件目标文件的引用。请参见《链接程序和库指南》中的第 2  章 "链接编辑器"

-z preinitarray=function

在所构建的目标文件的 .preinit_array 部分后附加一个条目。如果不存在 .preinit_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《链接程序和库指南》中的"初始化节和终止节"

-z relaxreloc

当使用引用已删除 COMDAT 部分的符号而遇到重定位时,ld 通常会发出致命错误。如果启用 -z relaxrelocld 将改为将此类重定位重定向到保留的 COMDAT 部分中的等效符号。-z relaxreloc 是专门选项,主要由编译器作者使用,不用于一般用途。

-z rescan-now

这些选项重新扫描提供给链接编辑的归档文件。缺省情况下,当命令行上出现归档时,将立即处理归档。传统上来说,在命令行末尾指定归档,以便其符号定义可解析任何前述引用。但是,有必要多次指定归档以满足其自身的相互依赖项。

-z rescan-now 是位置选项,在命令行上遇到该选项时链接编辑器会立即处理该选项。将立即重新处理命令行上此时显示的所有归档以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。

-z rescan 是与位置无关的选项。链接编辑器会将重新扫描操作推迟到在它处理整个命令行之后再进行,然后开始对命令行上显示的所有归档执行最终重新扫描操作。-z rescan 操作可与包含初始化 (.init) 或终结化 (.fini) 部分的目标文件进行不正确地交互,从而禁止这些部分中的代码运行。由于此原因,-z rescan 已过时,建议使用 -z rescan-now

-z rescan-start ... -z rescan-end
--start-group ... --end-group
-( ... -)

定义归档重新扫描组。这是位置构造,在遇到封闭分隔符选项时链接编辑器会立即进行处理。将在组分隔符选项中找到的归档重新处理为组以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。无法嵌套归档重新扫描组。

-z strip-class=[! ]class1,[!] class2,...

从任何输入目标文件分离特定的部分类,禁止将这些部分添加到输出文件。通过此选项,可以对可在输出文件中忽略的部分进行细粒度控制。

以下分离类描述仅适用于不可分配的部分。

可以在每个类标记前加上“!”,以指示不应删除该类。此定义在与 nonalloc 类结合时非常有用。例如,使用 "-z strip-class=nonalloc,!note" 将删除所有不可分配部分(附注部分除外)。

分离的部分将从输出目标文件中彻底删除。使用 -z ancillary 选项可更改与非动态符号表 .symtab 有关的此行为以及与其相关的部分。缺省情况下,符号表会同时写入主目标文件和辅助目标文件。分离后,符号表将仅写入辅助目标文件,而在主目标文件中标记为不存在。如果在不使用 -z ancillary 的情况下从目标文件分离 .symtab,将以常规方式彻底删除该部分。

可以定义以下部分类。

nonalloc

分离任何不可分配部分。这些部分标识为不包括 SHF_ALLOC 节标志。此类可封装除 symbol 类以外的所有其他类。nonalloc 类往往本身即足以删除任何不需要的部分。

annotate

分离任何注释部分。这些部分提供内存访问工具和覆盖相关工具使用的信息。这些部分通过 SHT_SUNW_ANNOTATE 节类型来进行标识。

comment

分离任何注释部分。这些部分通过 .comment 节名称来进行标识。此外,mcs(1) 实用程序通常用于处理注释部分。

debug

分离通常用于包含调试数据的部分。这些部分通过 .compcom.line.stab*.debug* 节名称来进行标识。这些部分还可通过 SHT_SUNW_DEBUG* 节类型来进行标识。

exclude

分离任何可排除的部分。这些部分通过 SHF_EXCLUDE 节标志来进行标识。在创建可重定位目标文件时此类非常有用。缺省情况下,当创建动态可执行文件或共享目标文件时会自动排除此类部分,在创建可重定位目标文件时将保留此类部分。

说明

分离任何注释部分。这些部分通过 SHT_NOTE 节类型来进行标识。

符号

如果输出文件不是可重定位目标文件,则分离任何不可分配符号表和字符串表部分。这些部分通过 SHT_SYMTAB 节类型来进行标识。任何关联的字符串表也将删除。

-z stub

生成桩共享目标文件。桩目标文件是可提供与实际目标文件相同的链接接口但不包含代码或数据的共享目标文件,完全由 mapfile 生成。桩目标文件不能在运行时使用。但是,可以根据桩目标文件构建应用程序,桩目标文件提供要在运行时使用的实际目标文件名称,然后在运行时使用实际目标文件。

只能为共享目标文件生成桩目标文件,必须提供定义要导出的全局符号的 mapfile。因此,在使用 -z stub 时,需要使用 -G-M 选项。在生成桩目标文件时,链接编辑器将忽略在命令行中指定的任何目标文件或库文件,无需存在这些文件即可生成桩目标文件。由于可以省略编译步骤,并且相对而言链接编辑器只需进行少量操作,因此可以很快生成桩目标文件。

请参见《《链接程序和库指南》》中的“"桩目标文件"”。

-z symbolcap

将定义目标文件功能的可重定位目标文件转换为定义符号功能的可重定位目标文件。请参见《链接程序和库指南》中的"将目标文件功能转换为符号功能"

-z target=sparc|x86

指定输出目标文件的机器类型。支持的目标有 SPARC 和 x86。使用指定目标的 32 位机器类型,除非存在 -64 选项,这种情况下使用相应的 64 位机器类型。缺省情况下,要生成的目标文件的机器类型根据在命令行处理的第一个 ELF 目标文件来决定。如果未指定任何目标文件,机器类型由在命令行处理的第一个归档文件中遇到的第一个目标文件决定。如果没有目标文件或归档文件,链接编辑器将假定使用本地机器。直接使用 ld 创建其输入完全来自 mapfile 的目标文件时,此选项非常有用。请参见 -M 选项。在极少数情况下,完全从包含不同机器类型目标文件的归档文件进行链接时(此时第一个目标文件不是所需的机器类型),此选项也非常有用。

-z text | textoff | textwarn

这些选项只能在动态模式下使用。如果针对不可写但可分配部分的任何重定位持续进行,-z text 选项将强制发出致命错误。由于历史原因,此模式不是构建可执行文件或共享目标文件时的缺省模式。但是,建议使用此模式以确保可在多个正在运行的进程之间共享所构建的动态目标文件的文本段。共享文本段可使在装入内存时重定位系统开销最少。请参见《链接程序和库指南》中的"与位置无关的代码"

-z textoff 选项允许针对所有可分配部分(包括不可写部分)进行重定位。此模式是构建共享目标文件时的缺省模式。

如果针对不可写但可分配部分的任何重定位持续进行,-z textwarn 选项将列出警告。此模式是构建可执行文件时的缺省模式。

-z verbose

此选项在链接编辑期间提供附加警告诊断。当前,此选项支持以下警告。

  • 对交换区重新定位的可疑使用。

  • 构建共享目标文件时限制使用静态 TLS 重定位。

  • 符号可见性不一致。

将来可能会增强此选项的功能,以提供被认为太混乱而不能在缺省情况下生成的其他诊断。

-zwrap=symbol
-wrap= symbol
--wrap= symbol

重命名对 symbol 的未定义引用以允许将包装代码链接到输出目标文件而不必修改源代码。如果指定 -z wrap,将修改对 symbol 的所有未定义引用以引用 __wrap_symbol,并修改对 __real_symbol 的所有引用以引用 symbol。您应提供包含 __wrap_symbol 函数的目标文件。此包装函数可以调用 __real_symbol 以引用要包装的实际函数。

以下是适用于 malloc(3C) 函数的包装示例。

void *
__wrap_malloc(size_t c)
{
        (void) printf("malloc called with %zu\n", c);
        return (__real_malloc(c));
}

如果使用 -z wrap=malloc 将其他代码链接到此文件以编译所有目标文件,则对 malloc 的所有调用将改为调用函数 __wrap_malloc。对 __real_malloc 的调用将调用 malloc 实函数。

应在单独的源文件中维护实函数和包装函数。否则,编译器或汇编程序可能会解析调用而不是将该操作留给链接编辑器执行,并且可能阻止进行包装。

辅助选项

以下选项不太常用。这些选项支持向后兼容性、非常专业化的功能或已被改进的选项变体取代的选项。

-a

仅在静态模式下,生成静态可执行文件。不允许未定义的引用。此选项是静态模式的缺省行为。-a 选项不能与 -r 选项一起使用。请参见“描述”部分的“静态可执行文件”。

-b

仅在动态模式下,不对引用共享目标文件中的符号的动态可执行文件重定位进行特殊处理。如果不提供 -b 选项,链接编辑器将在动态可执行文件中应用技术以便文本段可以保持只读状态。一种技术是为共享目标文件中定义的函数的引用创建特殊位置无关重定位。另一种技术安排在运行时将在共享目标文件中定义的数据目标文件复制到可执行文件的内存映像中。

-b 选项旨在用于专用动态目标文件,不建议用于一般用途。使用该选项将禁止执行确保目标文件可共享性时需要的所有专门处理操作,甚至可能会禁止重定位 64 位可执行文件。

-B group

建立作为组的共享目标文件及其依赖项。组中的目标文件在运行时绑定到组的其他成员。此模式类似于通过组合使用 dlopen(3C)RTLD_GROUP 模式将目标文件添加到进程中。对标识为组的目标文件具有显式依赖性的目标文件会成为该组的成员。

由于该组必须为自包含,因此,使用 -B group 选项还将断言 -z defs 选项。

建立一个组可提供控制一组目标文件绑定的基本方式。不过,可以通过直接绑定实现更好的控制。请参见 -B direct 选项。

-B symbolic

仅适用于动态模式。构建共享目标文件时,将该目标文件中全局符号的引用绑定到其定义(如果可用)。通常,在运行时才会绑定共享目标文件中全局符号的引用,即使有定义可用也是如此。此模式允许可执行文件或其他共享目标文件中的相同符号的定义覆盖该目标文件自己的定义。ld 将对未定义的符号发出警告,除非 -z defs 覆盖定义。

-B symbolic 选项旨在用于专用动态目标文件,不建议用于一般用途。要缩减目标文件所需的运行时重定位处理,建议创建版本定义并使用直接绑定。请参见 -B direct 选项。

-d y | n

如果指定 -d y(缺省情况),ld 将使用动态链接。如果指定 -d nld 将使用静态链接。请参见“描述”部分的“静态可执行文件”以及 -B dynamic|static

-I name
--dynamic-linker name

在构建可执行文件时,使用 name 作为要写入程序头的解释程序的路径名。在静态模式下,缺省为没有解释程序。在动态模式下,缺省为运行时链接程序 ld.so.1(1) 的名称。任何一种情况都可以由 -I name 覆盖。exec(2) 在装入 a.out 时会装入此解释程序,并将控件传递给该解释程序而不是直接传递给 a.out

-z absexec

仅当构建动态可执行文件时才使用。指定应立即解析外部绝对符号的引用而不是留到运行时进行解析。在非常专业化的情况下,此选项将删除可能导致可执行文件要求的交互空间过大的文本重定位。

-z combreloc | nocombreloc

缺省情况下,当构建可执行文件或共享目标文件时,ld 会合并多个重定位部分。此部分合并不同于可重定位目标文件合并,在部分合并中,重定位部分与必须应用重定位的部分维持一一对应的关系。-z nocombreloc 选项禁止合并重定位部分,并保持在原始可重定位目标文件中找到的一一对应关系。

ld 按数据重定位部分条目的符号引用对这些条目进行排序。此排序会减少运行时符号查找。在合并多个重定位部分时,此排序在将目标文件装入内存时可能产生最少的重定位系统开销,并加快动态目标文件的运行时装入。

历史上,单个重定位部分已转入任何可执行文件或共享目标文件中,并且需要 -z combreloc 选项才能启用前面所述的重定位部分合并。重定位部分合并现在是缺省设置。由于旧版本环境的好处,-z combreloc 选项仍可接受,但该选项不是必需的,且不起作用。

-z groupperm | nogroupperm

分配或取消分配跟在唯一组后的每个依赖项。将依赖项分配给组的作用就如同使用 -B group 选项构建依赖项。

-z nocompstrtab

禁用 ELF 字符串表和注释部分的压缩。缺省情况下,字符串压缩适用于 SHT_STRTAB 部分、设置了 SHF_MERGESHF_STRINGS 节标志的 SHT_PROGBITS 部分以及注释部分。

mcs(1) 实用程序搭配 -c 选项时,可用于在构建目标文件后压缩注释部分。

-z nodefaultlib

标记目标文件以忽略在任何 LD_LIBRARY_PATH 或 runpaths 后使用的运行时缺省库搜索路径。此选项表明可以通过目标文件的 runpath 来满足目标文件的所有依赖项。

-z noldynsym

禁止在动态可执行文件或共享目标文件中包含 .SUNW_ldynsym 部分。.SUNW_ldynsym 部分通过为本地函数提供符号来增大 .dynsym 部分。本地函数符号允许调试器在精简程序的栈跟踪中显示本地函数名称。同样,dladdr(3C) 能够提供更准确的结果。

-z noldynsym 选项还禁止包含与 .SUNW_ldynsym 部分相关的两个符号排序部分。.SUNW_dynsymsort 部分提供对正则函数和变量符号的有序访问。.SUNW_dyntlssort 部分提供对线程本地存储 (TLS) 变量符号的有序访问。

成为所生成文件的可分配文本段一部分的 .SUNW_ldynsym.SUNW_dynsymsort.SUNW_dyntlssort 部分无法通过 strip(1) 删除。因此,-z noldynsym 选项是禁止其包含的唯一方式。

-z nopartial

在要生成的输出文件中展开在可重定位目标文件中定义的部分初始化的符号。

-z now

将目标文件标记为需要 non-lazy 运行时绑定。此模式类似于通过组合使用 dlopen(3C)RTLD_NOW 模式将目标文件添加到进程中。此模式还类似于使 LD_BIND_NOW 环境变量起作用。请参见 ld.so.1(1)

-z origin

将目标文件标记为需要在运行时立即进行 $ORIGIN 处理。维护此选项只是为了历史兼容性,因为现在缺省提供目标文件的运行时分析以进行 $ORIGIN 处理。

-z redlocsym

删除所有本地符号,但符号表 SHT_SYMTAB 中的 SECT 符号除外。引用本地符号的所有重定位将更新为引用相应的 SECT 符号。通过此选项,专用目标文件可显著减小其符号表大小。另请参见 -z strip-class-z noldynsym 选项。

尽管 -z redlocsym 选项对特殊目标文件(例如在操作系统内核中使用的那些目标文件)很有用,但不建议将该选项用于一般用途。符号表 SHT_SYMTAB 的大小不影响运行时行为,而删除本地符号可能会对过程观察产生负面影响。删除本地符号可以减少使用编译器驱动程序 -g 选项生成的调试信息。删除本地符号还会删除正常写入到 .SUNW_ldynsym 部分中的信息,从而会降低调试器和工具(如 pstack(1)truss(1))的效用。

-z rescan

一个与位置无关的选项,可导致重新扫描提供给链接编辑的归档文件。链接编辑器会将重新扫描操作推迟到在它处理整个命令行之后再进行,然后开始对命令行上显示的所有归档执行最终重新扫描操作。-z rescan 操作可与包含初始化 (.init) 或终结化 (.fini) 部分的目标文件进行不正确地交互,从而禁止这些部分中的代码运行。由于此原因,-z rescan 已过时,建议使用 -z rescan-now

环境变量

LD_ALTEXEC

备用链接编辑器路径名。ld 执行并传递对此备用链接编辑器的控制。此环境变量提供用于覆盖从各种编译器驱动程序调用的缺省链接编辑器的通用方法。请参见 -z altexec64 选项。

LD_LIBRARY_PATH

要在其中搜索使用 -l 选项指定的库的目录列表。多个目录之间用冒号分隔。在最普遍的情况中,此环境变量包含两个由分号分隔的目录列表。

dirlist1;dirlist2

如果使用出现的任意数量的 -L 来调用 ld,如下所示:

ld ... -Lpath1 ... -Lpathn ...

则搜索路径顺序为:

dirlist1 path1 ... pathn dirlist2 LIBPATH

如果目录列表不包含分号,该列表将被解释为 dirlist2

LD_LIBRARY_PATH 环境变量还会影响动态依赖项的运行时链接程序搜索。

可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于 32 位或 64 位进程,并覆盖任何有效的无后缀版的环境变量。

LD_NOEXEC_64

禁止自动执行 64 位链接编辑器。如果第一个可重定位目标文件的 ELF 类标识 64 位目标文件,缺省情况下链接编辑器将执行 64 位版本。32 位链接编辑器可以创建的 64 位映像具有一些限制。但是,某些链接编辑可能会发现使用 32 位链接编辑器的速度更快。

LD_OPTIONS

ld 的缺省选项集合。LD_OPTIONSld 解释,就好像已在命令行上设置其值,紧跟在用来调用 ld 的名称后,如下所示:

ld $LD_OPTIONS ... other-arguments ...
LD_RUN_PATH

用于指定链接编辑器的 runpath 的备用机制。请参见 -R 选项。如果同时指定 LD_RUN_PATH-R 选项,-R 将取代另一个选项。

SGS_SUPPORT

提供使用链接编辑器装入的共享目标文件的冒号分隔列表以及有关链接进程的给定信息。可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于 ld 的 32 位或 64 位类,并覆盖任何有效的无后缀版的环境变量。请参见 -S 选项。

请注意,以字符 "LD_" 开头的环境变量名称是保留名称,供将来可能提升 ldld.so.1(1) 时使用。

文件

libx.so

共享目标文件库。

libx.a

归档库。

a.out

缺省输出文件。

LIBPATH

对于 32 位库,缺省搜索路径为 /lib,后跟 /usr/lib。对于 64 位库,缺省搜索路径为 /lib/64,后跟 /usr/lib/64

/usr/lib/ld

包含多个可在链接编辑期间使用的 mapfile 的目录。这些 mapfile 提供多种功能,例如定义内存布局、对齐 bss 以及定义不可执行栈。

属性

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

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

另请参见

as(1)crle(1)gprof(1)ld.so.1(1)ldd(1)mcs(1)pvs(1)strip(1)exec(2)stat(2)dlopen(3C)dldump(3C)elf(3ELF)ar.h(3HEAD)a.out(4)attributes(5)

《链接程序和库指南》

附注

由于历史原因,维护由 ld 应用的缺省选项。在今天的编程环境中,动态目标文件占主导地位,备用缺省选项通常会更有意义。但是,必须维护历史缺省选项以确保与现有程序开发环境的兼容性。本手册中在可能的地方提到了历史缺省选项。有关最新推荐的选项的描述,请参见《链接程序和库指南》中的第 7  章 "链接编辑器快速参考"

如果由 ld 创建的文件已经存在,则在处理完所有输入文件后,该文件将解除链接。然后,将创建具有指定名称的新文件。这允许 ld 创建新版本的文件,同时允许正在访问旧文件内容的现有进程继续运行。如果旧文件没有其他链接,则当最后一个引用文件的进程终止时,将释放已删除文件的磁盘空间。

在 Oracle Solaris 11 中,对于所创建的文件已存在的情况,ld 的行为已更改。在早期版本中,将现有文件重写到适当的位置,这种方法可能会损坏任何使用该文件的正在运行的进程。此更改对于在文件系统中具有多个硬链接的输出文件有意义。以前,所有链接都保持不变,而且所有链接都可以访问新文件内容。新的 ld 行为中断了此类链接,其结果是只有指定的输出文件名才能引用新文件。所有其他链接继续引用旧文件。为了确保行为一致,依赖于指向链接程序输出文件的多个硬链接的应用程序应该明确删除其他文件名,然后再重新链接这些文件名。