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
感谢您的反馈!

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

appcert

- 用于检查应用程序级产品对 Solaris 接口的不稳定使用。

用法概要

appcert [-h] [-n] [-f infile] [-w working_dir] [-B] [-L] 
     [-S] {obj | dir}...

描述

appcert 实用程序用于检查应用程序是否与 Solaris 应用程序二进制接口 (Application Binary Interface, ABI) 兼容。Solaris ABI 定义了 Solaris 中可以供应用程序安全稳定地使用的运行时库接口。更准确地说,appcert 实用程序能够识别依赖于不稳定运行时接口的依赖项以及可能导致产品在 Solaris 的未来发行版中运行失败的其他特定风险。

appcert 可检查:

如果产品是很多程序和支持共享目标文件的集合,通过让 appcert 引用应用程序的安装目录,可以很容易地利用 appcert 检查整个应用程序。

为执行该任务,appcert 将为产品内的每个目标文件(不管是可执行目标文件还是共享目标文件)构建一个接口依赖项配置文件,以确定该产品依赖的所有 Solaris 系统接口。(注:appcert 使用 Solaris 运行时链接程序来执行该确定操作。)然后,这些依赖项配置文件将与 Solaris ABI 的定义进行比较以确定是否存在专用接口(这些专用接口在应用程序级使用时不安全且不稳定)。

appcert 会生成一个简单的汇总报告,其中指出产品的哪些组件有缺陷(如果有)以及它们的缺陷是什么。该报告对正在检查其产品的发行版间稳定性的开发人员很有帮助。

注意,appcert 生成的是完整的接口依赖项信息,包括公用的 Solaris 接口(安全稳定)和专用(非 ABI)接口。如有需要,还可以为每个产品组件检查该信息。

重要说明:appcert 必须与被检查的应用程序在同一环境中运行。请参见“附注”部分。

选项

支持以下选项:

-B

如果 appcert 在批处理模式下运行,则输出报告中将为每个二进制目标文件包含一行,以 PASS 开头表示没有检测到该二进制目标文件的问题,以 FAIL 开头表示发现问题,以 INC 开头表示无法完整检查该二进制目标文件。解析这些标签时不要太拘泥于字面意义。例如,PASS 只是意味着未触发任何 appcert 警告。这些字符串是左对齐的,因此可以使用 grep^FAIL ... 等进行选定。

-f infile

指定包含要检查的文件(每个文件一行)的列表的 infile。该文件列表将附加到到由命令行操作数确定的列表中(请参见下文的“操作数”部分)。

-h

输出 appcert 的用法信息。

-L

appcert 检查产品中是否存在共享目标文件。如果找到一些共享目标文件,appcert 会将共享目标文件所驻留的目录附加到 LD_LIBRARY_PATH。使用 –L 标志可以阻止 appcert 的这一行为。

-n

当在目录中搜索要检查的二进制目标文件时,该选项不跟踪符号链接。请参见 find(1)

-S

将 Solaris 库目录(即 /usr/openwin/lib:/usr/dt/lib)附加到 LD_LIBRARY_PATH

-w working_dir

指定要在其中运行库组件并创建临时文件的目录(缺省目录为 /tmp)。

操作数

支持下列操作数:

{obj | dir} ...

要检查的目标文件的完整列表和/或包含构成要检查的产品的目标文件的目录完整列表。appcert 以递归方式搜索目录来查找目标文件;非目标文件将被忽略。

退出状态

将返回以下退出值:

0

appcert 运行成功,未发现潜在的二进制稳定性问题。

1

appcert 未能成功运行。

2

某些已检查的目标文件存在潜在的二进制稳定性问题。

3

未找到任何可检查的二进制目标文件。

限制

如果要检查的目标文件依赖于库,必须在目标文件中记录这些依赖项(使用编译器的 -l 开关)。

如果要检查的目标文件依赖于其他共享库,则在运行 appcert 时必须能够通过 LD_LIBRARY_PATHRUNPATH 访问这些库。

要检查 64 位应用程序,计算机必须运行 64 位 Solaris 内核。请参见 isalist(1)。另外,当前不能对 64 位应用程序执行静态链接检查。?

appcert 不能检查以下内容:

输出文件

appcert 会将结果记录到工作目录(缺省为 /tmp/appcert.?????)中的下列文件。

Index

所检查的二进制目标文件与工作目录中此二进制目标文件的特定输出所在子目录之间的映射。

Report

运行 appcert 时在 stdout 上显示的汇总报告的副本。

Skipped

包含要求 appcert 检查但强制跳过的二进制目标文件的列表以及跳过每个二进制目标文件的简单原因。

此外,在 appcert.?????/objects/ 目录下的子目录中还包括针对每个目标文件的信息,这些信息在以下文件中:

check.demoted_symbols

包含怀疑为降级的 Solaris 符号的符号列表。

check.dynamic.private

包含与目标文件直接绑定的专用 Solaris 符号的列表。

check.dynamic.public

包含与目标文件直接绑定的公用 Solaris 符号的列表。

check.dynamic.unbound

包含运行 ldd -r 时动态链接程序没有绑定的符号的列表。为方便起见,还包括 ldd 输出的包含 file not found 的行。

summary.dynamic

所检查目标文件的动态绑定的格式整齐的摘要,其中包括从每个 Solaris 库使用的公用符号和专用符号的表。

其他文件是 appcert 在内部使用的临时文件。

输出消息

专用符号的使用

专用符号是 Solaris 库中的一些不打算供开发者或外部使用的函数或数据变量。这些符号是 Solaris 库之间进行互相调用和通信的接口。在 pvs(1) 输出中,这些符号的符号版本名称标记为 SUNWprivate

专用符号可能会改变其语义行为或者甚至完全消失(降级的或者废弃的符号)。因此,您的应用程序不应依赖于任何专用符号。

降级的符号

降级符号是某个 Solaris 库中曾经专用于该库,但在后续 Solaris 发行版中已经删除(或其作用域被限制为该库本地)的函数或数据变量。如果应用程序直接调用了某个降级的符号,则该应用程序在删除了该符号的发行版中及后续发行版中将无法运行(重定位错误)。

在极少数情况下,在某个后续发行版中会恢复某个降级的符号。尽管如此,应用程序仍不能在某些发行版中运行。

在从 Solaris 2.5.1 到 2.6 的转换中,Oracle Corporation 完成了大部分库作用域限定工作。这一措施是为了提高二进制文件稳定性。通过使这些完全内部的接口不可见(即它们无法被动态链接),开发者无法有意或无意地调用这些接口。有关更多信息,请参见《链接程序和库指南》,特别是介绍版本控制的章节。

未绑定的符号

未绑定的符号是指在应用程序引用的库符号中,在运行 appcert 时动态链接程序无法解析的那些库符号。注:appcert 并不真正运行应用程序,因此,影响动态链接的某个环境方面可能没有正确设置。

未绑定的符号不是一定表明存在潜在的二进制稳定性问题。它们唯一表明的是在运行 appcert 时,运行时动态链接程序无法解析这些符号。

存在未绑定的符号的原因可能是 LD_LIBRARY_PATH 设置得不正确。请确保正确设置该变量,这样您所有的二进制目标文件才能找到它们依赖的所有库(您的产品自己的库,Solaris 库,或者第三方的库)。然后,重新运行 appcert

您可能会发现编写一个 shell 脚本,使用该脚本来正确设置环境并针对您要检查的二进制目标文件运行 appcert 比较方便。

存在未绑定的符号的另一个常见原因是测试中的共享目标文件未记录其动态依赖项,也就是说,在构建时没有-l 开关提供给编译器和 ld(1)。因此,共享目标文件要求基于它链接的可执行文件记录正确的依赖项。

注意,这样的共享目标文件可以通过标准形式进行链接(即在构建可执行文件时指定)或者动态打开(例如,可执行文件在运行时可能会针对共享目标文件调用 dlopen(3C)。在以上两种情况下,运行 appcert 时都会存在未绑定的符号。在第一种情况下,可通过在运行 appcert 之前正确设置 LD_LIBRARY_PATH 来解决未绑定的符号问题。在第二种情况 (dlopen) 下,很难解决未绑定的符号问题。在某些情况下,可以正确设置 LD_PRELOAD 来预装入所需的库,但该过程并不是总能奏效。

如何了解环境是否已经正确设置并可以避免出现未绑定的符号?如果运行 ldd -r 时未出现 "file not found" 或 "symbol not found" 错误,表明环境已经正确设置。有关动态链接的更多信息,请参见 ld.so.1(1)ldd(1)

在任何情况下,appcert 都会将未绑定的符号标记为警告,以防还暗藏着更严重的问题。未绑定的符号可能表明存在依赖于降级的符号(已从库中删除的符号或作用域调整为该库本地的符号)的依赖项。依赖于降级的符号的依赖项会导致严重的二进制稳定性问题。

不过,正确地设置环境应该能够消除大多数未绑定的符号。通常,比较好的做法是尽可能地在构建时记录库的依赖项,这样有助于更好地定义二进制目标文件并使其成为自包含的。另外,建议在构建共享目标文件时使用 -z defs 标志来强制在编译时解析所有符号。有关更多信息,请参见 ld(1)

找不到绑定

appcert 针对每个要测试的二进制目标文件运行 /bin/ldd -r。该命令对环境变量进行如下设置:LD_DEBUG="files,bindings"。(有关更多信息,请参见 ldd(1) 和 ld.so.1(1))。如果该命令由于某种原因而失败,appcert 将不能获得任何动态符号绑定信息并将找不到绑定

存在以下任一情况时,appcert 可能会失败:

同样,还存在其他一些情况,如内存不足。通常,该标志意味着由于权限或环境问题,appcert 无法完整地检查目标文件。请尝试修改权限或环境以便能够记录动态绑定。

过时的库

过时的库是指已不赞成使用并且可能会在将来的某个发行版中从 Solaris 中完全删除的库。appcert 将这些库标出是因为依赖于此类库的应用程序可能无法在将来的 Solaris 发行版中运行。过时的库中的所有接口(包括专用接口)都被冻结且不会更改。

sys_errlist 或 sys_nerr 的使用

直接使用 sys_errlistsys_nerr 符号会存在风险,导致引用可能超出 sys_errlist 数组的结尾。这些符号在 32 位版本的 Solaris 中不赞成使用,而在 64 位版本中完全不存在。请改用 strerror(3C)

强符号与弱符号的使用

与弱符号(如 socket)关联的强符号(如 _socket)保留为专用符号(其行为在将来可能会改变)。您的应用程序只应直接引用弱符号(强符号通常以 "_" 开头)。

注:在某些构建环境下,尽管源代码看起来没有引用专用符号,也会在您的二进制代码中记录强符号/专用符号依赖性而不是记录弱符号/公用符号依赖性。不过,应采取措施来弄清发生此情况的原因并纠正此依赖性。

附注

appcert 应该与要检查的应用程序在相同的环境中运行。否则,它将无法将引用正确解析到 Solaris 库中的接口。请采取下列步骤:

  1. 确保将 LD_LIBRARY_PATH 及环境的任何其他方面设置为应用程序在运行时使用的设置。另外,请确保该设置包含产品中的任何非 Solaris 共享目标文件所在的目录,以确保在引用这些目标文件时可以找到它们。

  2. 确保要检查的所有二进制目标文件满足以下条件:

    • 是动态链接的 ELF 目标文件

    • 设置了对可执行文件的执行权限(共享目标文件不必满足此条件)。

    • 不是 SUID root 用户(否则,必须是 root 用户才能检查;必要时,请创建非 SUID 副本并检查这些副本)。

您可能会发现编写一个 shell 脚本,使用该脚本来正确设置环境并运行 appcert 比较方便。

可能会遇到下面一些潜在的问题:

已知问题

遗憾的是,将术语“公用”和“专用”分别等同于“稳定”和“不稳定”让人有点困惑。需要特别说明的是,实验性的或者发展中的接口从某种意义上来说是公用的,因为它们是记录在案的并且鼓励使用它们。但这些接口是不稳定的,因为构建有这些接口的应用程序可能无法在后续发行版中运行。因此,为了方便 appcert 检查,这些接口被归类为专用接口,直到它们不再改进。与此相反,过时的接口最终将会消失,因此是不稳定的,即使它们在过去是公用且稳定的并且 appcert 当前仍将其视为公用接口。幸运的是,这两种情况极少见。

属性

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

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

另请参见

cc(1)、find(1)isalist(1)ld(1)ldd(1)ld.so.1(1)pvs(1)dlopen(3C)strerror(3C)Intro(4)attributes(5)