OpenSolaris Launch
diff --git a/usr/src/Makefile b/usr/src/Makefile
new file mode 100644
index 0000000..bea88dd
--- /dev/null
+++ b/usr/src/Makefile
@@ -0,0 +1,357 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Makefile for system source
+#
+# include global definitions
+include Makefile.master
+#
+# the Targetdirs file is the AT&T target.dirs file in a makefile format.
+# it defines TARGETDIRS and ROOTDIRS.
+include Targetdirs
+
+COMMON_SUBDIRS= uts lib cmd ucblib ucbcmd
+
+#
+# sparc needs to build both stand and psm, in that order
+# x86 needs to build psm and GRUB
+#
+sparc_SUBDIRS= stand psm
+i386_SUBDIRS= psm grub
+
+SUBDIRS= $(COMMON_SUBDIRS) $($(MACH)_SUBDIRS)
+
+HDRSUBDIRS= uts head lib cmd ucbhead
+
+# UCB headers are bug-for-bug compatible and not checkable against the header
+# standards.
+#
+CHKHDRSUBDIRS= head uts lib
+
+# The check target also causes smf(5) service manifests to be validated.
+CHKMFSTSUBDIRS= cmd
+
+MSGSUBDIRS= cmd ucbcmd lib
+DOMAINS= \
+ SUNW_OST_ADMIN \
+ SUNW_OST_NETRPC \
+ SUNW_OST_OSCMD \
+ SUNW_OST_OSLIB \
+ SUNW_OST_UCBCMD \
+ SUNW_OST_ZONEINFO
+
+MSGDDIRS= $(DOMAINS:%=$(MSGROOT)/%)
+MSGDIRS= $(MSGROOT) $(MSGDDIRS) $(MSGROOT)/LC_TIME
+
+all all_xmod := TARGET= all
+install install_xmod := TARGET= install
+install_h := TARGET= install_h
+clean := TARGET= clean
+clobber := TARGET= clobber
+check := TARGET= check
+_msg := TARGET= _msg
+
+
+.KEEP_STATE:
+
+#
+# Note: install only builds the all target for the pkgdefs
+# directory. We are not yet ready to have an install
+# build create 'packages' also. To build packages
+# cd pkgdefs and do a 'make install'
+#
+all: sgs .WAIT $(SUBDIRS) pkg_all
+install: sgs .WAIT $(SUBDIRS) pkg_all .WAIT _msg
+ @cd pkgdefs/SUNW0on; pwd; $(MAKE) _msg
+ @rm -rf "$(ROOT)/catalog"
+
+clean clobber: $(SUBDIRS) head pkgdefs
+_msg: _msgdirs rootdirs $(MSGSUBDIRS)
+
+# for a complete build from scratch
+crankturn: sgs uts pkg_all
+ @cd lib; pwd; $(MAKE) install
+ @cd cmd; pwd; $(MAKE) all
+ @cd ucblib; pwd; $(MAKE) install
+ @cd ucbcmd; pwd; $(MAKE) all
+
+pkg_all:
+ @cd pkgdefs; pwd; $(MAKE) all
+
+#
+# target for building a proto area for reference via the ROOT macro
+#
+protolibs: rootlibs ucblibs
+
+# build all ucb libraries
+#
+ucblibs:
+ @cd ucblib; pwd; $(MAKE) install
+
+# Base subset of rootproto, excluding ucb libraries
+#
+rootlibs: sgs
+ @cd lib; pwd; $(MAKE) install
+
+$(SUBDIRS) head ucbhead pkgdefs: FRC
+ @cd $@; pwd; $(MAKE) $(TARGET)
+
+.PARALLEL: sysheaders userheaders libheaders ucbheaders cmdheaders
+
+# librpcsvc has a dependency on headers installed by
+# userheaders, hence the .WAIT before libheaders.
+sgs: rootdirs .WAIT sysheaders userheaders .WAIT \
+ libheaders ucbheaders cmdheaders
+
+#
+# top-level setup target (headers/tools)
+setup: sgs
+ @cd tools; pwd; $(MAKE) install
+
+# /var/mail/:saved is a special case because of the colon in the name.
+#
+rootdirs: $(ROOTDIRS)
+ $(INS) -d -m 775 $(ROOT)/var/mail/:saved
+ $(CH)$(CHOWN) root $(ROOT)/var/mail/:saved
+ $(CH)$(CHGRP) mail $(ROOT)/var/mail/:saved
+
+lint: FRC
+ $(MAKE) -f Makefile.lint
+
+_msgdirs: $(MSGDIRS)
+
+$(ROOTDIRS) $(MSGDIRS):
+ $(INS.dir)
+
+userheaders: FRC
+ @cd head; pwd; $(MAKE) install_h
+
+libheaders: FRC
+ @cd lib; pwd; $(MAKE) install_h
+
+sysheaders: FRC
+ @cd uts; pwd; $(MAKE) install_h
+
+ucbheaders: FRC
+ @cd ucbhead; pwd; $(MAKE) install_h
+
+cmdheaders: FRC
+ @cd cmd/fm; pwd; $(MAKE) install_h
+ @cd cmd/mdb; pwd; $(MAKE) install_h
+
+# each xmod target depends on a corresponding MACH-specific pseudotarget
+# before doing common xmod work
+#
+all_xmod install_xmod: $$@_$(MACH)
+ @cd uts/common/sys; pwd; $(MAKE) svvs_h
+
+all_xmod_sparc install_xmod_sparc: FRC
+ @cd uts/sparc; pwd; \
+ $(MAKE) TARGET=$(TARGET) svvs pm wsdrv
+
+all_xmod_i386 install_xmod_i386: FRC
+ @cd uts/i86; pwd; $(MAKE) TARGET=$(TARGET) svvs
+
+check: $(CHKHDRSUBDIRS) $(CHKMFSTSUBDIRS)
+
+#
+# Cross-reference customization: skip all of the subdirectories that
+# don't contain actual source code.
+#
+XRPRUNE = spec pkgdefs prototypes xmod
+XRINCDIRS = uts/common head ucbhead
+
+cscope.out tags: FRC
+ $(XREF) -f -x $@
+
+FRC:
+
+# EXPORT DELETE START
+
+XMOD_DELETE_FILES:sh = cat xmod/xmod_files
+
+EXPORT_SRC:
+ @cd cmd/cmd-inet/usr.lib/in.iked; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/cmd-inet/usr.lib/ike-certutils; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/cmd-inet/usr.sbin; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/cmd-crypto/etc; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/crypt; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/gss/gssd; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/krb5/kadmin; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/sendmail/src; pwd; $(MAKE) EXPORT_SRC
+ @cd cmd/xntpd; pwd; $(MAKE) EXPORT_SRC
+ @cd common/crypto/aes; pwd; $(MAKE) EXPORT_SRC
+ @cd common/crypto/arcfour; pwd; $(MAKE) EXPORT_SRC
+ @cd common/crypto/blowfish; pwd; $(MAKE) EXPORT_SRC
+ @cd common/crypto/des; pwd; $(MAKE) EXPORT_SRC
+ @cd common/crypto/rsa; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/crypt_modules/bsdbf; pwd ; $(MAKE) EXPORT_SRC
+ @cd lib/gss_mechs/mech_dummy; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/gss_mechs/mech_dh/backend; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/gss_mechs/mech_krb5; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/gss_mechs/mech_spnego; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libcrypt; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libelfsign; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libgss; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libike; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libnsl; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/openssl; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/pkcs11/pkcs11_softtoken/common; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/pkcs11/libpkcs11; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/pkcs11; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libsldap; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libsasl; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/sasl_plugins; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/smartcard; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/pam_modules/krb5; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/udapl; pwd; $(MAKE) EXPORT_SRC
+ @cd lib/libresolv2; pwd; $(MAKE) EXPORT_SRC
+ @cd tools/elfsign; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/crypto/io; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/des; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/inet; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/inet/ip; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/rpc; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/sys; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/gssapi/include; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/gssapi; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/gssapi/mechs/dummy; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common/gssapi/mechs/krb5; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/common; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sparc; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/forthdebug; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/intel; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/chalupa; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/cherrystone; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/daktari; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/enchilada; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/ents; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/excalibur; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/chicago; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/littleneck; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/lw2plus; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/lw8; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/mpxu; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/serengeti; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/starcat; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4u/taco; pwd; $(MAKE) EXPORT_SRC
+ @cd uts/sun4v/io/ncp; pwd; $(MAKE) EXPORT_SRC
+ @cd pkgdefs; pwd; $(MAKE) EXPORT_SRC
+ $(RM) -r $(XMOD_DELETE_FILES)
+ $(RM) Targetdirs+
+ sed -e "/^# EXPORT DELETE START/,/^# EXPORT DELETE END/d" \
+ < Targetdirs > Targetdirs+
+ $(MV) Targetdirs+ Targetdirs
+ $(CHMOD) 444 Targetdirs
+ $(RM) Makefile+
+ sed -e "/^# EXPORT DELETE START/,/^# EXPORT DELETE END/d" \
+ < Makefile > Makefile+
+ $(MV) Makefile+ Makefile
+ $(CHMOD) 444 Makefile
+ $(RM) Makefile.master+
+ sed -e "/^# EXPORT DELETE START/,/^# EXPORT DELETE END/d" \
+ < Makefile.master > Makefile.master+
+ $(MV) Makefile.master+ Makefile.master
+ $(CHMOD) 444 Makefile.master
+
+CRYPT_SRC:
+ @cd cmd/cmd-inet/usr.lib/in.iked; pwd; $(MAKE) CRYPT_SRC
+ @cd cmd/cmd-inet/usr.lib/ike-certutils; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/crypt_modules/bsdbf; pwd ; $(MAKE) CRYPT_SRC
+ @cd lib/gss_mechs/mech_dummy; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/gss_mechs/mech_dh/backend; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/gss_mechs/mech_krb5; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/gss_mechs/mech_spnego; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/libelfsign; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/libike; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/libnsl; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/libsasl; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/libresolv2; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/sasl_plugins; pwd; $(MAKE) CRYPT_SRC
+ @cd lib/pam_modules/krb5; pwd; $(MAKE) CRYPT_SRC
+ @cd tools/elfsign; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/inet; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/inet/ip; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/gssapi; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/gssapi/include; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/gssapi/mechs/dummy; pwd; $(MAKE) CRYPT_SRC
+ @cd uts/common/gssapi/mechs/krb5; pwd; $(MAKE) CRYPT_SRC
+ $(RM) Makefile+
+ sed -e "/^# EXPORT DELETE START/,/^# EXPORT DELETE END/d" \
+ < Makefile > Makefile+
+ $(MV) Makefile+ Makefile
+ $(CHMOD) 444 Makefile
+ $(RM) Makefile.master+
+ sed -e "/^# EXPORT DELETE START/,/^# EXPORT DELETE END/d" \
+ < Makefile.master > Makefile.master+
+ $(MV) Makefile.master+ Makefile.master
+ $(CHMOD) 444 Makefile.master
+
+# EXPORT DELETE END
+
+ONC_PLUS:
+ @cd cmd/login; pwd; $(MAKE) ONC_PLUS
+ @cd uts; pwd; $(MAKE) ONC_PLUS
+
+#
+# Targets for reporting compiler versions; nightly uses these.
+#
+
+cc-version:
+ @if [ -x "$($(MACH)_CC)" ]; then \
+ $(ECHO) $($(MACH)_CC); \
+ $($(MACH)_CC) -V 2>&1 | head -1; \
+ elif [ -x "$(SPRO_VROOT)/bin/cc" ]; then \
+ $(ECHO) $(SPRO_VROOT)/bin/cc; \
+ $(SPRO_VROOT)/bin/cc -V 2>&1 | head -1; \
+ else \
+ $(ECHO) No compiler found; \
+ exit 1; \
+ fi
+
+cc64-version:
+ @if [ -x "$($(MACH64)_CC)" ]; then \
+ $(ECHO) 64-bit compiler; \
+ $(ECHO) $($(MACH64)_CC); \
+ $($(MACH64)_CC) -V 2>&1 | head -1; \
+ elif [ -x "$(GNU_ROOT)/bin/gcc" ]; then \
+ $(ECHO) 64-bit compiler; \
+ $(ECHO) $(GNU_ROOT)/bin/gcc; \
+ $(GNU_ROOT)/bin/gcc --version 2>&1 | head -1; \
+ else \
+ $(ECHO) No 64-bit compiler found; \
+ fi
+
+java-version:
+ @if [ -x "$(JAVAC)" ]; then \
+ $(ECHO) $(JAVAC); \
+ $(JAVA_ROOT)/bin/java -fullversion 2>&1 | head -1; \
+ else \
+ $(ECHO) No Java compiler found; \
+ exit 1; \
+ fi
diff --git a/usr/src/Makefile.lint b/usr/src/Makefile.lint
new file mode 100644
index 0000000..665ef97
--- /dev/null
+++ b/usr/src/Makefile.lint
@@ -0,0 +1,373 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+# include global definitions
+include Makefile.master
+
+#
+# As pieces are made lint-clean, add them here so the nightly build
+# can be used to keep them that way.
+#
+COMMON_SUBDIRS = \
+ cmd/acctadm \
+ cmd/asa \
+ cmd/amt \
+ cmd/audit \
+ cmd/auditconfig \
+ cmd/auditd \
+ cmd/auditreduce \
+ cmd/auditstat \
+ cmd/auths \
+ cmd/autopush \
+ cmd/banner \
+ cmd/bart \
+ cmd/basename \
+ cmd/bdiff \
+ cmd/bfs \
+ cmd/busstat \
+ cmd/boot \
+ cmd/cal \
+ cmd/captoinfo \
+ cmd/cat \
+ cmd/cdrw \
+ cmd/cfgadm \
+ cmd/checkeq \
+ cmd/checknr \
+ cmd/chgrp \
+ cmd/chmod \
+ cmd/chown \
+ cmd/chroot \
+ cmd/cksum \
+ cmd/clinfo \
+ cmd/cmd-crypto \
+ cmd/cmd-inet/sbin \
+ cmd/cmd-inet/usr.bin \
+ cmd/cmd-inet/usr.lib/dsvclockd \
+ cmd/cmd-inet/usr.lib/in.dhcpd \
+ cmd/cmd-inet/usr.lib/in.iked \
+ cmd/cmd-inet/usr.lib/in.mpathd \
+ cmd/cmd-inet/usr.lib/inetd \
+ cmd/cmd-inet/usr.lib/mipagent \
+ cmd/cmd-inet/usr.lib/pppoe \
+ cmd/cmd-inet/usr.lib/slpd \
+ cmd/cmd-inet/usr.lib/wanboot \
+ cmd/cmd-inet/usr.sadm \
+ cmd/cmd-inet/usr.sbin \
+ cmd/cmp \
+ cmd/col \
+ cmd/comm \
+ cmd/compress \
+ cmd/consadm \
+ cmd/coreadm \
+ cmd/cpc \
+ cmd/crypt \
+ cmd/csplit \
+ cmd/ctrun \
+ cmd/ctstat \
+ cmd/ctwatch \
+ cmd/cut \
+ cmd/date \
+ cmd/dd \
+ cmd/deroff \
+ cmd/devctl \
+ cmd/devfsadm \
+ cmd/devinfo \
+ cmd/devmgmt \
+ cmd/dfs.cmds \
+ cmd/diff3 \
+ cmd/diskscan \
+ cmd/dispadmin \
+ cmd/dladm \
+ cmd/dtrace \
+ cmd/du \
+ cmd/dumpadm \
+ cmd/dumpcs \
+ cmd/echo \
+ cmd/env \
+ cmd/expand \
+ cmd/fdformat \
+ cmd/fgrep \
+ cmd/file \
+ cmd/find \
+ cmd/fmthard \
+ cmd/fmtmsg \
+ cmd/fold \
+ cmd/fm \
+ cmd/format \
+ cmd/fs.d/fd \
+ cmd/fs.d/lofs/mount \
+ cmd/fs.d/mntfs \
+ cmd/fs.d/pcfs/mount \
+ cmd/fs.d/proc \
+ cmd/fs.d/tmpfs \
+ cmd/fs.d/udfs/mount \
+ cmd/fs.d/ufs/mount \
+ cmd/fuser \
+ cmd/gcore \
+ cmd/getconf \
+ cmd/getdevpolicy \
+ cmd/getfacl \
+ cmd/getopt \
+ cmd/gettext \
+ cmd/grep \
+ cmd/grep_xpg4 \
+ cmd/groups \
+ cmd/halt \
+ cmd/head \
+ cmd/init \
+ cmd/intrstat \
+ cmd/ipcrm \
+ cmd/ipcs \
+ cmd/isaexec \
+ cmd/isalist \
+ cmd/join \
+ cmd/kbd \
+ cmd/killall \
+ cmd/last \
+ cmd/lastcomm \
+ cmd/ldapcachemgr \
+ cmd/line \
+ cmd/link \
+ cmd/locator \
+ cmd/lockstat \
+ cmd/lofiadm \
+ cmd/logadm \
+ cmd/logger \
+ cmd/login \
+ cmd/logname \
+ cmd/ls \
+ cmd/lvm \
+ cmd/machid \
+ cmd/makekey \
+ cmd/mdb \
+ cmd/mesg \
+ cmd/mkdir \
+ cmd/mkfifo \
+ cmd/mkfile \
+ cmd/mkmsgs \
+ cmd/mknod \
+ cmd/msgfmt \
+ cmd/msgid \
+ cmd/mt \
+ cmd/mv \
+ cmd/newtask \
+ cmd/nice \
+ cmd/nispasswd \
+ cmd/nl \
+ cmd/nohup \
+ cmd/pagesize \
+ cmd/passwd \
+ cmd/pathchk \
+ cmd/pax \
+ cmd/pbind \
+ cmd/pfexec \
+ cmd/pgrep \
+ cmd/picl/picld \
+ cmd/picl/prtpicl \
+ cmd/plockstat \
+ cmd/pools \
+ cmd/ppgsz \
+ cmd/praudit \
+ cmd/prctl \
+ cmd/priocntl \
+ cmd/profiles \
+ cmd/prstat \
+ cmd/prtconf \
+ cmd/prtdiag \
+ cmd/prtvtoc \
+ cmd/ps \
+ cmd/psradm \
+ cmd/psrinfo \
+ cmd/psrset \
+ cmd/ptools \
+ cmd/pwck \
+ cmd/ramdiskadm \
+ cmd/rcap \
+ cmd/rcm_daemon \
+ cmd/rctladm \
+ cmd/renice \
+ cmd/rm \
+ cmd/rmdir \
+ cmd/rmformat \
+ cmd/rmt \
+ cmd/roles \
+ cmd/rpcsvc/rpc.bootparamd \
+ cmd/runat \
+ cmd/sed_xpg4 \
+ cmd/smartcard \
+ cmd/smserverd \
+ cmd/sort \
+ cmd/split \
+ cmd/ssh \
+ cmd/stat \
+ cmd/strings \
+ cmd/su \
+ cmd/sulogin \
+ cmd/sum \
+ cmd/svc \
+ cmd/swap \
+ cmd/sync \
+ cmd/syseventadm \
+ cmd/syseventd \
+ cmd/tail \
+ cmd/tee \
+ cmd/th_tools \
+ cmd/touch \
+ cmd/tr \
+ cmd/truss \
+ cmd/tty \
+ cmd/uadmin \
+ cmd/valtools \
+ cmd/wall \
+ cmd/wbem \
+ cmd/wc \
+ cmd/who \
+ cmd/whodo \
+ cmd/wracct \
+ cmd/xargs \
+ cmd/yes \
+ cmd/yppasswd \
+ cmd/zdump \
+ cmd/zlogin \
+ cmd/zoneadm \
+ cmd/zoneadmd \
+ cmd/zonecfg \
+ cmd/zonename \
+ lib/abi \
+ lib/auditd_plugins \
+ lib/crypt_modules \
+ lib/libadt_jni \
+ lib/libaio \
+ lib/libavl \
+ lib/libbsm \
+ lib/libc \
+ lib/libc_db \
+ lib/libcfgadm \
+ lib/libcmdutils \
+ lib/libcontract \
+ lib/libcryptoutil \
+ lib/libctf \
+ lib/libdevice \
+ lib/libdevid \
+ lib/libdevinfo \
+ lib/libdhcpagent \
+ lib/libdhcpdu \
+ lib/libdhcpsvc \
+ lib/libdhcputil \
+ lib/libdiskmgt \
+ lib/libdladm \
+ lib/libdlpi \
+ lib/libdoor \
+ lib/libdtrace \
+ lib/libefi \
+ lib/libelfsign \
+ lib/libexacct \
+ lib/libgen \
+ lib/libgss \
+ lib/libinetcfg \
+ lib/libinetutil \
+ lib/libipmp \
+ lib/libipp \
+ lib/libipsecutil \
+ lib/libkstat \
+ lib/liblaadm \
+ lib/liblgrp \
+ lib/liblm \
+ lib/libmacadm \
+ lib/libmalloc \
+ lib/libmd5 \
+ lib/libmp \
+ lib/libnvpair \
+ lib/libpam \
+ lib/libpctx \
+ lib/libpicl \
+ lib/libpicltree \
+ lib/libplot \
+ lib/libpool \
+ lib/libproc \
+ lib/libpthread \
+ lib/librcm \
+ lib/librestart \
+ lib/librt \
+ lib/libscf \
+ lib/libsec \
+ lib/libsecdb \
+ lib/libsendfile \
+ lib/libsldap \
+ lib/libslp \
+ lib/libsmedia \
+ lib/libthread \
+ lib/libumem \
+ lib/libuutil \
+ lib/libwanboot \
+ lib/libwanbootutil \
+ lib/libxnet \
+ lib/libzonecfg \
+ lib/libzoneinfo \
+ lib/lvm \
+ lib/madv \
+ lib/mpss \
+ lib/nametoaddr \
+ lib/ncad_addr \
+ lib/pam_modules \
+ lib/passwdutil \
+ lib/pkcs11 \
+ lib/smartcard \
+ lib/fm \
+ lib/udapl
+
+i386_SUBDIRS= \
+ cmd/biosdev \
+ cmd/rtc \
+ cmd/fs.d/xmemfs
+
+sparc_SUBDIRS= \
+ cmd/datadm \
+ cmd/dcs \
+ cmd/fruadm \
+ cmd/mtst \
+ cmd/prtfru \
+ cmd/raidctl \
+ cmd/sckmd \
+ cmd/wrsmconf \
+ cmd/wrsmstat \
+ lib/libwrsmconf \
+ lib/wrsm
+
+LINTSUBDIRS= $(COMMON_SUBDIRS) $($(MACH)_SUBDIRS)
+
+.PARALLEL: $(LINTSUBDIRS)
+
+lint: uts .WAIT subdirs
+
+subdirs: $(LINTSUBDIRS)
+
+uts $(LINTSUBDIRS): FRC
+ @cd $@; pwd; $(MAKE) lint
+
+FRC:
diff --git a/usr/src/Makefile.master b/usr/src/Makefile.master
new file mode 100644
index 0000000..4ec58f1
--- /dev/null
+++ b/usr/src/Makefile.master
@@ -0,0 +1,928 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Makefile.master, global definitions for system source
+#
+ROOT= /proto
+
+# Historically, ON builds were always done with root permissions, and the
+# owner/group information was duplicated in the Makefiles and the packaging
+# data and kept in sync by manual intervention. This is no longer true.
+# The only source of this information is packaging. The proto area ($ROOT)
+# does not have definitive onwer/group information, and no Makefile should
+# attempt to set this. CH once toggled operations restricted to root. It
+# is now just set to `#'.
+#
+# At some point in the future, CH, CHOWN, CHGRP, OWNER, and GROUP should all
+# be stripped completely from the source base. They are kept for now until
+# on10-based projects can merge and transition away from them.
+#
+# RELEASE_BUILD should be cleared for final release builds. This is completely
+# independent of CH. NOT_RELEASE_BUILD is exactly what the name implies.
+#
+# INTERNAL_RELEASE_BUILD is a subset of RELEASE_BUILD. It mostly controls
+# identification strings. Enabling RELEASE_BUILD automatically enables
+# INTERNAL_RELEASE_BUILD.
+#
+# EXPORT_RELEASE_BUILD controls whether binaries are built in a form that
+# can be released for export under a binary license. It is orthogonal to
+# the other *RELEASE_BUILD settings.
+#
+# STRIP_COMMENTS toggles comment section striping. Generally the same setting
+# as INTERNAL_RELEASE_BUILD.
+#
+# STRIPFLAG is similar. It is set here for use in lower level Makefiles to
+# allow a single point change to affect the entire build.
+#
+# __GNUC toggles the building of ON components using gcc and related tools.
+# Normally set to `#', set it to `' to do gcc build.
+#
+# The declaration POUND_SIGN is always '#'. This is needed to get around the
+# make feature that '#' is always a comment delimiter, even when escaped or
+# quoted. The only way of generating this is the :sh macro mechanism. Note
+# however that in general :sh macros should be avoided in makefiles that are
+# widely included into other makefiles, as the resulting shell executions can
+# cause a noticable slowdown in build times.
+#
+POUND_SIGN:sh= echo \\043
+CH= $(POUND_SIGN)
+
+NOT_RELEASE_BUILD=
+INTERNAL_RELEASE_BUILD= $(POUND_SIGN)
+RELEASE_BUILD= $(POUND_SIGN)
+EXPORT_RELEASE_BUILD=
+$(RELEASE_BUILD)NOT_RELEASE_BUILD= $(POUND_SIGN)
+$(RELEASE_BUILD)INTERNAL_RELEASE_BUILD=
+PATCH_BUILD= $(POUND_SIGN)
+
+# SPARC_BLD is '#' for an Intel build.
+# INTEL_BLD is '#' for a Sparc build.
+SPARC_BLD_1= $(MACH:i386=$(POUND_SIGN))
+SPARC_BLD= $(SPARC_BLD_1:sparc=)
+INTEL_BLD_1= $(MACH:sparc=$(POUND_SIGN))
+INTEL_BLD= $(INTEL_BLD_1:i386=)
+
+STRIP_COMMENTS= $(INTERNAL_RELEASE_BUILD)
+
+# Historical notes: at one point, STRIPFLAG was set to '-s' for root builds,
+# and empty for non-root. It's now set empty all the time, so that builds
+# using manual invocation of "make install" will have debug data (as they did
+# when run as non-root before). The 'nightly' script overrides DEF_STRIPFLAG
+# with '-s' so that nightly builds are stripped -- since nightlies were once
+# done only as root, that preserves the known nightly behavior. The
+# non-nightly behavior can always be overridden by putting "STRIPFLAG=" in the
+# environment, on the 'make' command line, or by overriding STRIPFLAG in the
+# subsystem Makefile itself. STRIP_COMMENTS, although similar in nature, has
+# always been controlled by INTERNAL_RELEASE_BUILD (always set by nightly).
+
+DEF_STRIPFLAG=
+STRIPFLAG=$(DEF_STRIPFLAG)
+
+# set __GNUC= in the environment to build 32-bit with the gcc compiler.
+__GNUC= $(POUND_SIGN)
+
+# set __GNUC64 to '#' in the environment to build 64-bit with the Studio
+# compiler.
+__GNUC64=
+
+# BUILD_TOOLS is the root of all tools including compilers.
+# ONBLD_TOOLS is the root of all the tools that are part of SUNWonbld.
+
+BUILD_TOOLS= /ws/onnv-tools
+ONBLD_TOOLS= $(BUILD_TOOLS)/onbld
+
+JAVA_ROOT= /usr/java
+
+SFW_ROOT= /usr/sfw
+SFWLIBDIR= $(SFW_ROOT)/lib
+SFWLIBDIR64= $(SFW_ROOT)/lib/$(MACH64)
+
+RPCGEN= /usr/bin/rpcgen
+STABS= $(ONBLD_TOOLS)/bin/$(MACH)/stabs
+ECHO= echo
+INS= install
+TRUE= true
+SYMLINK= /usr/bin/ln -s
+LN= /usr/bin/ln
+CHMOD= /usr/bin/chmod
+CHOWN= $(TRUE)
+CHGRP= $(TRUE)
+MV= /usr/bin/mv -f
+RM= /usr/bin/rm -f
+GREP= /usr/bin/grep
+SED= /usr/bin/sed
+NAWK= /usr/bin/nawk
+CP= /usr/bin/cp -f
+MCS= /usr/ccs/bin/mcs
+CAT= /usr/bin/cat
+M4= /usr/ccs/bin/m4
+STRIP= /usr/ccs/bin/strip
+LEX= /usr/ccs/bin/lex
+YACC= /usr/ccs/bin/yacc
+CPP= /usr/lib/cpp
+JAVAC= $(JAVA_ROOT)/bin/javac
+JAVAH= $(JAVA_ROOT)/bin/javah
+JAVADOC= $(JAVA_ROOT)/bin/javadoc
+RMIC= $(JAVA_ROOT)/bin/rmic
+JAR= $(JAVA_ROOT)/bin/jar
+CTFCONVERT= $(ONBLD_TOOLS)/bin/$(MACH)/ctfconvert
+CTFMERGE= $(ONBLD_TOOLS)/bin/$(MACH)/ctfmerge
+CTFSTABS= $(ONBLD_TOOLS)/bin/$(MACH)/ctfstabs
+GENOFFSETS= $(ONBLD_TOOLS)/bin/genoffsets
+CTFCVTPTBL= $(ONBLD_TOOLS)/bin/ctfcvtptbl
+CTFFINDMOD= $(ONBLD_TOOLS)/bin/ctffindmod
+XREF= $(ONBLD_TOOLS)/bin/xref
+FIND= /usr/bin/find
+PERL= /usr/bin/perl
+SORT= /usr/bin/sort
+TOUCH= /usr/bin/touch
+WC= /usr/bin/wc
+XARGS= /usr/bin/xargs
+ELFSIGN= /usr/bin/elfsign
+DTRACE= /usr/sbin/dtrace
+
+FILEMODE= 644
+DIRMODE= 755
+
+# Note: owner and group for proto area objects is no longer set by
+# Makefiles at all. These have no real effect and are kept here for
+# transition purposes. They (along with CH, CHOWN, and CHGRP) should be
+# removed early in the s11 development cycle.
+OWNER= root
+GROUP= bin
+
+#
+# The version of the patch makeup table optimized for build-time use. Used
+# during patch builds only.
+$(PATCH_BUILD)PMTMO_FILE=$(SRC)/patch_makeup_table.mo
+
+# Declare that nothing should be built in parallel.
+# Individual Makefiles can use the .PARALLEL target to declare otherwise.
+.NO_PARALLEL:
+
+# For stylistic checks
+#
+# Note that the X and C checks are not used at this time and may need
+# modification when they are actually used.
+#
+CSTYLE= cstyle
+CSTYLE_TAIL=
+HDRCHK= hdrchk
+HDRCHK_TAIL=
+JSTYLE= jstyle
+
+DOT_H_CHECK= \
+ @$(ECHO) "checking $<"; $(CSTYLE) $< $(CSTYLE_TAIL); \
+ $(HDRCHK) $< $(HDRCHK_TAIL)
+
+DOT_X_CHECK= \
+ @$(ECHO) "checking $<"; $(RPCGEN) -C -h $< | $(CSTYLE) $(CSTYLE_TAIL); \
+ $(RPCGEN) -C -h $< | $(HDRCHK) $< $(HDRCHK_TAIL)
+
+DOT_C_CHECK= \
+ @$(ECHO) "checking $<"; $(CSTYLE) $< $(CSTYLE_TAIL)
+
+MANIFEST_CHECK= \
+ @$(ECHO) "checking $<"; \
+ SVCCFG_DTD=$(SRC)/cmd/svc/dtd/service_bundle.dtd.1 \
+ $(SRC)/cmd/svc/svccfg/svccfg-native validate $<
+
+INS.file= $(RM) $@; $(INS) -s -m $(FILEMODE) -f $(@D) $<
+INS.dir= $(INS) -s -d -m $(DIRMODE) $@
+# installs and renames at once
+#
+INS.rename= $(INS.file); $(MV) $(@D)/$(<F) $@
+
+# install a link
+INSLINKTARGET= $<
+INS.link= $(RM) $@; $(LN) $(INSLINKTARGET) $@
+
+# MACH must be set in the shell environment per uname -p on the build host
+# More specific architecture variables should be set in lower makefiles.
+#
+# MACH64 is derived from MACH, and BUILD64 is set to `#' for
+# architectures on which we do not build 64-bit versions.
+# (There are no such architectures at the moment.)
+#
+# Set BUILD64=# in the environment to disable 64-bit amd64
+# builds on i386 machines.
+
+MACH64_1= $(MACH:sparc=sparcv9)
+MACH64= $(MACH64_1:i386=amd64)
+
+MACH32_1= $(MACH:sparc=sparcv7)
+MACH32= $(MACH32_1:i386=i86)
+
+sparc_BUILD64=
+i386_BUILD64=
+BUILD64= $($(MACH)_BUILD64)
+
+#
+# C compiler mode. Future compilers may change the default on us,
+# so force extended ANSI mode globally. Lower level makefiles can
+# override this by setting CCMODE.
+#
+CCMODE= -Xa
+CCMODE64= -Xa
+
+#
+# C compiler verbose mode. This is so we can enable it globally,
+# but turn it off in the lower level makefiles of things we cannot
+# (or aren't going to) fix.
+#
+CCVERBOSE= -v
+
+# set this to the secret flag "-Wc,-Qiselect-v9abiwarn=1" to get warnings
+# from the compiler about places the -xarch=v9 may differ from -xarch=v9c.
+V9ABIWARN=
+
+# set this to the secret flag "-Wc,-Qiselect-regsym=0" to disable register
+# symbols (used to detect conflicts between objects that use global registers)
+# we disable this now for safety, and because genunix doesn't link with
+# this feature (the v9 default) enabled.
+#
+# REGSYM is separate since the C++ driver syntax is different.
+CCREGSYM= -Wc,-Qiselect-regsym=0
+CCCREGSYM= -Qoption cg -Qiselect-regsym=0
+
+#
+# generate 32-bit addresses in the v9 kernel. Saves memory.
+CCABS32= -Wc,-xcode=abs32
+
+# One optimization the compiler might perform is to turn this:
+# #pragma weak foo
+# extern int foo;
+# if (&foo)
+# foo = 5;
+# into
+# foo = 5;
+# Since we do some of this (foo might be referenced in common kernel code
+# but provided only for some cpu modules or platforms), we disable this
+# optimization.
+#
+sparc_CCUNBOUND = -Wd,-xsafe=unboundsym
+i386_CCUNBOUND =
+CCUNBOUND = $($(MACH)_CCUNBOUND)
+
+#
+# compiler '-xarch' flag. This is here to centralize it and make it
+# overridable for testing.
+sparc_XARCH= -xarch=v8
+sparcv9_XARCH= -xarch=v9
+i386_XARCH=
+amd64_XARCH= -xarch=amd64 -Ui386 -U__i386
+
+# assembler '-xarch' flag. Different from compiler '-xarch' flag.
+sparc_AS_XARCH= -xarch=v8
+sparcv9_AS_XARCH= -xarch=v9
+i386_AS_XARCH=
+amd64_AS_XARCH= -xarch=amd64 -P -Ui386 -U__i386
+
+#
+# These flags define what we need to be 'standalone' i.e. -not- part
+# of the rather more cosy userland environment. This basically means
+# the kernel.
+#
+# XX64 future versions of gcc will make -mcmodel=kernel imply -mno-red-zone
+#
+sparc_STAND_FLAGS=
+sparcv9_STAND_FLAGS=
+i386_STAND_FLAGS= -_gcc=-ffreestanding
+amd64_STAND_FLAGS= -Wu,-xmodel=kernel
+
+SAVEARGS= -Wu,-save_args
+$(__GNUC64)SAVEARGS=
+amd64_STAND_FLAGS += $(SAVEARGS)
+
+STAND_FLAGS_32 = $($(MACH)_STAND_FLAGS)
+STAND_FLAGS_64 = $($(MACH64)_STAND_FLAGS)
+
+#
+# disable the incremental linker
+ILDOFF= -xildoff
+#
+XDEPEND= -xdepend
+XFFLAG= -xF
+XESS= -xs
+XSTRCONST= -xstrconst
+
+#
+# turn warnings into errors (C)
+CERRWARN = -errtags=yes -errwarn=%all
+CERRWARN += -erroff=E_EMPTY_TRANSLATION_UNIT
+CERRWARN += -erroff=E_STATEMENT_NOT_REACHED
+
+#
+# turn warnings into errors (C++)
+CCERRWARN= -xwe
+
+# C99 mode
+C99_ENABLE= -xc99=%all
+C99_DISABLE= -xc99=%none
+C99MODE= $(C99_DISABLE)
+C99LMODE= -Xc99=%none
+
+# In most places, assignments to these macros should be appended with +=
+# (CPPFLAGS.master allows values to be prepended to CPPFLAGS).
+sparc_CFLAGS= $(sparc_XARCH)
+sparcv9_CFLAGS= $(sparcv9_XARCH) -dalign $(CCVERBOSE) $(V9ABIWARN) $(CCREGSYM)
+i386_CFLAGS= $(i386_XARCH)
+amd64_CFLAGS= $(amd64_XARCH)
+
+sparc_ASFLAGS= $(sparc_AS_XARCH)
+sparcv9_ASFLAGS=$(sparcv9_AS_XARCH)
+i386_ASFLAGS= $(i386_AS_XARCH)
+amd64_ASFLAGS= $(amd64_AS_XARCH)
+
+#
+sparc_COPTFLAG= -xO3
+sparcv9_COPTFLAG= -xO3
+i386_COPTFLAG= -O
+amd64_COPTFLAG= -O
+
+COPTFLAG= $($(MACH)_COPTFLAG)
+COPTFLAG64= $($(MACH64)_COPTFLAG)
+
+# When -g is used, the compiler globalizes static objects
+# (gives them a unique prefix). Disable that.
+CNOGLOBAL= -W0,-noglobal
+
+#
+# Flags used to build in debug mode for ctf generation. Bugs in the Devpro
+# compilers currently prevent us from building with cc-emitted DWARF.
+#
+CTF_FLAGS_sparc = -g -Wc,-Qiselect-T1 $(C99MODE) $(CNOGLOBAL)
+CTF_FLAGS_i386 = -g $(C99MODE) $(CNOGLOBAL)
+CTF_FLAGS = $(CTF_FLAGS_$(MACH))
+
+#
+# Flags used with genoffsets
+#
+GOFLAGS =
+$(INTEL_BLD)GOFLAGS = -_noecho \
+ -_gcc=-fno-eliminate-unused-debug-symbols \
+ -_gcc=-fno-eliminate-unused-debug-types
+
+OFFSETS_CREATE = $(GENOFFSETS) -s $(CTFSTABS) -r $(CTFCONVERT) \
+ $(CC) $(GOFLAGS) $(CFLAGS) $(CPPFLAGS)
+
+OFFSETS_CREATE64 = $(GENOFFSETS) -s $(CTFSTABS) -r $(CTFCONVERT) \
+ $(CC) $(GOFLAGS) $(CFLAGS64) $(CPPFLAGS)
+
+#
+# tradeoff time for space (smaller is better)
+#
+sparc_SPACEFLAG = -xspace -W0,-Lt -W2,-Rcond_elim
+sparcv9_SPACEFLAG = -xspace -W0,-Lt -W2,-Rcond_elim
+i386_SPACEFLAG = -xspace
+amd64_SPACEFLAG =
+
+SPACEFLAG = $($(MACH)_SPACEFLAG)
+SPACEFLAG64 = $($(MACH64)_SPACEFLAG)
+
+sparc_XREGSFLAG = -xregs=no%appl
+sparcv9_XREGSFLAG = -xregs=no%appl
+i386_XREGSFLAG =
+amd64_XREGSFLAG =
+
+XREGSFLAG = $($(MACH)_XREGSFLAG)
+XREGSFLAG64 = $($(MACH64)_XREGSFLAG)
+
+CFLAGS= $(COPTFLAG) $($(MACH)_CFLAGS) $(SPACEFLAG) $(CCMODE) \
+ $(ILDOFF) $(CERRWARN) $(C99MODE) $(CCUNBOUND)
+CFLAGS64= $(COPTFLAG64) $($(MACH64)_CFLAGS) $(SPACEFLAG64) $(CCMODE64) \
+ $(ILDOFF) $(CERRWARN) $(C99MODE) $(CCUNBOUND)
+NATIVE_CFLAGS= $(COPTFLAG) $($(NATIVE_MACH)_CFLAGS) $(CCMODE) \
+ $(ILDOFF) $(CERRWARN) $(C99MODE) $($(NATIVE_MACH)_CCUNBOUND)
+
+DTEXTDOM=-DTEXT_DOMAIN=\"$(TEXT_DOMAIN)\" # For messaging.
+DTS_ERRNO=-D_TS_ERRNO
+CPPFLAGS.master=$(DTEXTDOM) $(DTS_ERRNO) \
+ $(ENVCPPFLAGS1) $(ENVCPPFLAGS2) $(ENVCPPFLAGS3) $(ENVCPPFLAGS4)
+CPPFLAGS= $(CPPFLAGS.master)
+AS_CPPFLAGS= $(CPPFLAGS.master)
+JAVAFLAGS= -deprecation
+
+#
+# For source message catalogue
+#
+.SUFFIXES: $(SUFFIXES) .i .po
+MSGROOT= $(ROOT)/catalog
+MSGDOMAIN= $(MSGROOT)/$(TEXT_DOMAIN)
+MSGDOMAINPOFILE = $(MSGDOMAIN)/$(POFILE)
+DCMSGDOMAIN= $(MSGROOT)/LC_TIME/$(TEXT_DOMAIN)
+DCMSGDOMAINPOFILE = $(DCMSGDOMAIN)/$(DCFILE:.dc=.po)
+
+CLOBBERFILES += $(POFILE) $(POFILES)
+COMPILE.cpp= $(CC) -E -C $(CFLAGS) $(CPPFLAGS)
+XGETTEXT= /usr/bin/xgettext
+XGETFLAGS= -c TRANSLATION_NOTE
+BUILD.po= $(XGETTEXT) $(XGETFLAGS) -d $(<F) $<.i ;\
+ $(RM) $@ ;\
+ sed "/^domain/d" < $(<F).po > $@ ;\
+ $(RM) $(<F).po $<.i
+#
+# This is overwritten by local Makefile when PROG is a list.
+#
+POFILE= $(PROG).po
+
+sparc_CCFLAGS= -cg92 -compat=4 \
+ -Qoption ccfe -messages=no%anachronism \
+ $(CCERRWARN)
+sparcv9_CCFLAGS= $(sparcv9_XARCH) -dalign -compat=5 \
+ -Qoption ccfe -messages=no%anachronism \
+ -Qoption ccfe -features=no%conststrings \
+ $(CCCREGSYM) \
+ $(CCERRWARN)
+i386_CCFLAGS= -compat=4 \
+ -Qoption ccfe -messages=no%anachronism \
+ -Qoption ccfe -features=no%conststrings \
+ $(CCERRWARN)
+amd64_CCFLAGS= $(amd64_XARCH) -compat=5 \
+ -Qoption ccfe -messages=no%anachronism \
+ -Qoption ccfe -features=no%conststrings \
+ $(CCERRWARN)
+
+sparc_CCOPTFLAG= -O
+sparcv9_CCOPTFLAG= -O
+i386_CCOPTFLAG= -O
+amd64_CCOPTFLAG= -O
+
+CCOPTFLAG= $($(MACH)_CCOPTFLAG)
+CCOPTFLAG64= $($(MACH64)_CCOPTFLAG)
+CCFLAGS= $(CCOPTFLAG) $($(MACH)_CCFLAGS)
+CCFLAGS64= $(CCOPTFLAG64) $($(MACH64)_CCFLAGS)
+#
+# Used by Makefile.cmd, Makefile.lib and Makefile.ucbcmd
+#
+PGA_MAPFILE = $(SRC)/cmd/sgs/mapfiles/$(MACH)/map.pagealign
+#
+#
+# LDLIBS32 can be set in the environment to override the following assignment.
+# LDLIBS64 can be set to override the assignment made in Makefile.master.64.
+# These environment settings make sure that no libraries are searched outside
+# of the local workspace proto area:
+# LDLIBS32=-YP,$ROOT/lib:$ROOT/usr/lib
+# LDLIBS64=-YP,$ROOT/lib/$MACH64:$ROOT/usr/lib/$MACH64
+#
+LDLIBS32 = $(ENVLDLIBS1) $(ENVLDLIBS2) $(ENVLDLIBS3)
+LDLIBS.cmd = $(LDLIBS32)
+LDLIBS.lib = $(LDLIBS32)
+#
+# Define compilation macros.
+#
+COMPILE.c= $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE64.c= $(CC) $(CFLAGS64) $(CPPFLAGS) -c
+COMPILE.cc= $(CCC) $(CCFLAGS) $(CPPFLAGS) -c
+COMPILE64.cc= $(CCC) $(CCFLAGS64) $(CPPFLAGS) -c
+COMPILE.s= $(AS) $(ASFLAGS) $(AS_CPPFLAGS)
+COMPILE64.s= $(AS) $(ASFLAGS) $($(MACH64)_AS_XARCH) $(AS_CPPFLAGS)
+COMPILE.d= $(DTRACE) -G -32
+COMPILE64.d= $(DTRACE) -G -64
+
+CLASSPATH= .
+COMPILE.java= $(JAVAC) $(JAVAFLAGS) -classpath $(CLASSPATH)
+
+#
+# Link time macros
+#
+CCNEEDED = -lC
+# XX64 What to do about libstdc++ for g++ ???
+
+LINK.c= $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
+LINK64.c= $(CC) $(CFLAGS64) $(CPPFLAGS) $(LDFLAGS)
+NORUNPATH= -norunpath -nolib
+LINK.cc= $(CCC) $(CCFLAGS) $(CPPFLAGS) $(NORUNPATH) \
+ $(LDFLAGS) $(CCNEEDED)
+LINK64.cc= $(CCC) $(CCFLAGS64) $(CPPFLAGS) $(NORUNPATH) \
+ $(LDFLAGS) $(CCNEEDED)
+
+#
+# lint macros
+#
+# Note that the undefine of __PRAGMA_REDEFINE_EXTNAME can be removed once
+# ON is built with a version of lint that has the fix for 4484186.
+#
+ALWAYS_LINT_DEFS = -errtags=yes -s
+ALWAYS_LINT_DEFS += -erroff=E_PTRDIFF_OVERFLOW
+ALWAYS_LINT_DEFS += -erroff=E_ASSIGN_NARROW_CONV
+ALWAYS_LINT_DEFS += -U__PRAGMA_REDEFINE_EXTNAME
+ALWAYS_LINT_DEFS += $(C99LMODE)
+ALWAYS_LINT_DEFS += -errsecurity=$(SECLEVEL)
+ALWAYS_LINT_DEFS += -erroff=E_SEC_CREAT_WITHOUT_EXCL
+ALWAYS_LINT_DEFS += -erroff=E_SEC_FORBIDDEN_WARN_CREAT
+# XX64 -- really only needed for amd64 lint
+ALWAYS_LINT_DEFS += -erroff=E_ASSIGN_INT_TO_SMALL_INT
+ALWAYS_LINT_DEFS += -erroff=E_CAST_INT_CONST_TO_SMALL_INT
+ALWAYS_LINT_DEFS += -erroff=E_CAST_INT_TO_SMALL_INT
+ALWAYS_LINT_DEFS += -erroff=E_CAST_TO_PTR_FROM_INT
+ALWAYS_LINT_DEFS += -erroff=E_COMP_INT_WITH_LARGE_INT
+ALWAYS_LINT_DEFS += -erroff=E_INTEGRAL_CONST_EXP_EXPECTED
+ALWAYS_LINT_DEFS += -erroff=E_PASS_INT_TO_SMALL_INT
+ALWAYS_LINT_DEFS += -erroff=E_PTR_CONV_LOSES_BITS
+
+SECLEVEL= core
+LINT.c= $(LINT) $(LINTFLAGS) $(CPPFLAGS) $(ALWAYS_LINT_DEFS)
+LINT64.c= $(LINT) $(LINTFLAGS64) $(CPPFLAGS) $(ALWAYS_LINT_DEFS)
+LINT.s= $(LINT.c)
+
+# For some future builds, NATIVE_MACH and MACH might be different.
+# Therefore, NATIVE_MACH needs to be redefined in the
+# environment as `uname -p` to override this macro.
+#
+# For now at least, we cross-compile amd64 on i386 machines.
+NATIVE_MACH= $(MACH:amd64=i386)
+
+# Define native compilation macros
+#
+
+# Base directory where compilers are loaded.
+# Defined here so it can be overridden by developer.
+#
+SPRO_ROOT= $(BUILD_TOOLS)/SUNWspro
+SPRO_VROOT= $(SPRO_ROOT)/SOS8
+GNU_ROOT= $(SFW_ROOT)
+
+# Specify platform compiler versions for languages
+# that we use (currently only c and c++).
+#
+sparc_CC= $(SPRO_VROOT)/bin/cc
+sparc_CCC= $(SPRO_VROOT)/bin/CC
+sparc_CPP= /usr/ccs/lib/cpp
+sparc_AS= /usr/ccs/bin/as -xregsym=no
+sparc_LD= /usr/ccs/bin/ld
+sparc_LINT= $(SPRO_VROOT)/bin/lint
+
+sparcv9_CC= $(SPRO_VROOT)/bin/cc
+sparcv9_CCC= $(SPRO_VROOT)/bin/CC
+sparcv9_CPP= /usr/ccs/lib/cpp
+sparcv9_AS= /usr/ccs/bin/as -xregsym=no
+sparcv9_LD= /usr/ccs/bin/ld
+sparcv9_LINT= $(SPRO_VROOT)/bin/lint
+
+# We compile 32-bit objects with cc by default
+i386_CC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_cc
+$(__GNUC)i386_CC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_gcc
+i386_CCC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_CC
+$(__GNUC)i386_CCC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_g++
+i386_CPP= /usr/ccs/lib/cpp
+i386_AS= /usr/ccs/bin/as
+$(__GNUC)i386_AS= $(ONBLD_TOOLS)/bin/$(MACH)/aw
+i386_LD= /usr/ccs/bin/ld
+i386_LINT= $(SPRO_VROOT)/bin/lint
+
+# We compile 64-bit objects with gcc
+amd64_CC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_cc
+$(__GNUC64)amd64_CC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_gcc
+amd64_CCC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_CC
+$(__GNUC64)amd64_CCC= $(ONBLD_TOOLS)/bin/$(MACH)/cw -_g++
+amd64_CPP= /usr/ccs/lib/cpp
+amd64_AS= $(ONBLD_TOOLS)/bin/$(MACH)/aw
+amd64_LD= /usr/ccs/bin/ld
+amd64_LINT= $(SPRO_ROOT)/SOS10-EA/bin/lint
+
+NATIVECC= $($(NATIVE_MACH)_CC)
+NATIVECCC= $($(NATIVE_MACH)_CCC)
+NATIVECPP= $($(NATIVE_MACH)_CPP)
+NATIVEAS= $($(NATIVE_MACH)_AS)
+NATIVELD= $($(NATIVE_MACH)_LD)
+NATIVELINT= $($(NATIVE_MACH)_LINT)
+
+#
+# Makefile.master.64 overrides these settings
+#
+CC= $(NATIVECC)
+CCC= $(NATIVECCC)
+CPP= $(NATIVECPP)
+AS= $(NATIVEAS)
+LD= $(NATIVELD)
+LINT= $(NATIVELINT)
+
+# Pass -Y flag to cpp (method of which is release-dependent)
+CCYFLAG= -Y I,
+
+BDIRECT= -Bdirect
+BDYNAMIC= -Bdynamic
+BLOCAL= -Blocal
+BREDUCE= -Breduce
+BSTATIC= -Bstatic
+BSYMBOLIC= -Bsymbolic
+
+ZCOMBRELOC= -zcombreloc
+ZDEFS= -zdefs
+ZIGNORE= -zignore
+ZINITFIRST= -zinitfirst
+ZINTERPOSE= -zinterpose
+ZLAZYLOAD= -zlazyload
+ZLOADFLTR= -zloadfltr
+ZMULDEFS= -zmuldefs
+ZNODEFAULTLIB= -znodefaultlib
+ZNODEFS= -znodefs
+ZNODELETE= -znodelete
+ZNODLOPEN= -znodlopen
+ZNODUMP= -znodump
+ZNOLAZYLOAD= -znolazyload
+ZNOVERSION= -znoversion
+ZREDLOCSYM= -zredlocsym
+ZTEXT= -ztext
+
+GSHARED= -G
+CCMT= -mt
+
+# Handle different PIC models on different ISAs
+# (May be overridden by lower-level Makefiles)
+
+sparc_C_PICFLAGS = -K pic
+sparcv9_C_PICFLAGS = -K pic
+i386_C_PICFLAGS = -K pic
+amd64_C_PICFLAGS = -K pic
+C_PICFLAGS = $($(MACH)_C_PICFLAGS)
+C_PICFLAGS64 = $($(MACH64)_C_PICFLAGS)
+
+sparc_C_BIGPICFLAGS = -K PIC
+sparcv9_C_BIGPICFLAGS = -K PIC
+i386_C_BIGPICFLAGS = -K PIC
+amd64_C_BIGPICFLAGS = -K PIC
+C_BIGPICFLAGS = $($(MACH)_C_BIGPICFLAGS)
+C_BIGPICFLAGS64 = $($(MACH64)_C_BIGPICFLAGS)
+
+# CC requires there to be no space between '-K' and 'pic' or 'PIC'.
+sparc_CC_PICFLAGS = -Kpic
+sparcv9_CC_PICFLAGS = -KPIC
+i386_CC_PICFLAGS = -Kpic
+amd64_CC_PICFLAGS = -Kpic
+CC_PICFLAGS = $($(MACH)_CC_PICFLAGS)
+CC_PICFLAGS64 = $($(MACH64)_CC_PICFLAGS)
+
+AS_PICFLAGS= $(C_PICFLAGS)
+AS_BIGPICFLAGS= $(C_BIGPICFLAGS)
+
+#
+# Default label for CTF sections
+#
+CTFCVTFLAGS= -i -L VERSION
+
+#
+# Override to pass module-specific flags to ctfmerge. Currently used
+# only by krtld to turn on fuzzy matching.
+#
+CTFMRGFLAGS=
+
+CTFCONVERT_O = $(CTFCONVERT) $(CTFCVTFLAGS) $@
+
+ELFSIGN_O= $(TRUE)
+ELFSIGN_CRYPTO= $(ELFSIGN_O)
+ELFSIGN_OBJECT= $(ELFSIGN_O)
+# EXPORT DELETE START
+# Note: The setting of ELFSIGN_O, etc. to $(TRUE) above must stay outside
+# of the export src markers. The real setting for non source product builds
+# is inside the markers.
+# This is needed to reduce the amount of changes to Makefiles elsewhere
+# in the source tree (particularly in uts/{sparc,intel})
+ELFSIGN_O = $(ELFSIGN)
+ELFSIGN_KEY = $(SRC)/cmd/cmd-crypto/etc/keys/SUNWosnet
+ELFSIGN_CERT= $(SRC)/cmd/cmd-crypto/etc/certs/SUNWosnet
+ELFSIGN_SEKEY = $(SRC)/cmd/cmd-crypto/etc/keys/SUNWosnetSolaris
+ELFSIGN_SECERT= $(SRC)/cmd/cmd-crypto/etc/certs/SUNWosnetSolaris
+ELFSIGN_CRYPTO= $(ELFSIGN_O) sign $(ELFSIGN_FORMAT_OPTION) \
+ -k $(ELFSIGN_KEY) -c $(ELFSIGN_CERT) -e $@
+ELFSIGN_OBJECT= $(ELFSIGN_O) sign $(ELFSIGN_FORMAT_OPTION) \
+ -k $(ELFSIGN_SEKEY) -c $(ELFSIGN_SECERT) -e $@
+# EXPORT DELETE END
+
+# Rules (normally from make.rules) and macros which are used for post
+# processing files. Normally, these do stripping of the comment section
+# automatically.
+# RELEASE_CM: Should be editted to reflect the release.
+# POST_PROCESS_O: Post-processing for `.o' files.
+# POST_PROCESS_A: Post-processing for `.a' files (currently null).
+# POST_PROCESS_SO: Post-processing for `.so' files.
+# POST_PROCESS: Post-processing for executable files (no suffix).
+# Note that these macros are not completely generalized as they are to be
+# used with the file name to be processed following.
+#
+# It is left as an exercise to Release Engineering to embellish the generation
+# of the release comment string.
+#
+# If this is a standard development build:
+# compress the comment section (mcs -c)
+# add the standard comment (mcs -a $(RELEASE_CM))
+# add the development specific comment (mcs -a $(DEV_CM))
+#
+# If this is an installation build:
+# delete the comment section (mcs -d)
+# add the standard comment (mcs -a $(RELEASE_CM))
+# add the development specific comment (mcs -a $(DEV_CM))
+#
+# If this is an release build:
+# delete the comment section (mcs -d)
+# add the standard comment (mcs -a $(RELEASE_CM))
+#
+# The ONVERS macro sets the default value for the VERSION string
+# within pkginfo.
+#
+# The following list of macros are used in the definition of RELEASE_CM
+# which is used to label all binaries in the build:
+#
+# RELEASE Specific release of the build, eg: 5.2
+# VERSION Version of the build (alpha, beta, Generic)
+# PATCHID If this is a patch this value should contain
+# the patchid value (eg: "Generic 100832-01"), otherwise
+# it will be set to $(VERSION)
+# RELEASE_DATE Date of the Release Build
+# PATCH_DATE Date the patch was created, if this is blank it
+# will default to the RELEASE_DATE
+#
+ONVERS= "11.11"
+RELEASE= 5.11
+VERSION= SunOS Development
+PATCHID= $(VERSION)
+RELEASE_DATE= October 2007
+PATCH_DATE= $(RELEASE_DATE)
+RELEASE_CM= "@($(POUND_SIGN))SunOS $(RELEASE) $(PATCHID) $(PATCH_DATE)"
+DEV_CM= "@($(POUND_SIGN))SunOS Internal Development: \
+`$(ECHO) $$LOGNAME` `date +%Y-%m-%d` `$(ECHO) [\`basename $$CODEMGR_WS\`]`"
+
+PROCESS_COMMENT= @?${MCS} -c -a $(RELEASE_CM) -a $(DEV_CM)
+$(STRIP_COMMENTS)PROCESS_COMMENT= @?${MCS} -d -a $(RELEASE_CM) -a $(DEV_CM)
+$(RELEASE_BUILD)PROCESS_COMMENT= @?${MCS} -d -a $(RELEASE_CM)
+
+STRIP_STABS= :
+$(RELEASE_BUILD)STRIP_STABS= $(STRIP) -x $@
+
+POST_PROCESS_O= $(PROCESS_COMMENT) $@
+POST_PROCESS_A=
+POST_PROCESS_SO= $(PROCESS_COMMENT) $@ ; $(STRIP_STABS) ; \
+ $(ELFSIGN_OBJECT)
+POST_PROCESS= $(PROCESS_COMMENT) $@ ; $(ELFSIGN_OBJECT)
+
+#
+# The PKGDEFS macro points to the source directory containing the majority
+# of ON's package definitions plus Makefiles with general package creation
+# rules.
+#
+# PKGARCHIVE specifies the default location where packages should be
+# placed if built.
+#
+PKGDEFS=$(SRC)/pkgdefs
+$(RELEASE_BUILD)PKGARCHIVESUFFIX= -nd
+PKGARCHIVE=$(SRC)/../../packages/$(MACH)/nightly$(PKGARCHIVESUFFIX)
+
+# Default build rules which perform comment section post-processing.
+#
+.c:
+ $(LINK.c) -o $@ $< $(LDLIBS)
+ $(POST_PROCESS)
+.c.o:
+ $(COMPILE.c) $(OUTPUT_OPTION) $< $(CTFCONVERT_HOOK)
+ $(POST_PROCESS_O)
+.c.a:
+ $(COMPILE.c) -o $% $<
+ $(PROCESS_COMMENT) $%
+ $(AR) $(ARFLAGS) $@ $%
+ $(RM) $%
+.s.o:
+ $(COMPILE.s) -o $@ $<
+ $(POST_PROCESS_O)
+.s.a:
+ $(COMPILE.s) -o $% $<
+ $(PROCESS_COMMENT) $%
+ $(AR) $(ARFLAGS) $@ $%
+ $(RM) $%
+.cc:
+ $(LINK.cc) -o $@ $< $(LDLIBS)
+ $(POST_PROCESS)
+.cc.o:
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+ $(POST_PROCESS_O)
+.cc.a:
+ $(COMPILE.cc) -o $% $<
+ $(AR) $(ARFLAGS) $@ $%
+ $(PROCESS_COMMENT) $%
+ $(RM) $%
+.y:
+ $(YACC.y) $<
+ $(LINK.c) -o $@ y.tab.c $(LDLIBS)
+ $(POST_PROCESS)
+ $(RM) y.tab.c
+.y.o:
+ $(YACC.y) $<
+ $(COMPILE.c) -o $@ y.tab.c $(CTFCONVERT_HOOK)
+ $(POST_PROCESS_O)
+ $(RM) y.tab.c
+.l:
+ $(RM) $*.c
+ $(LEX.l) $< > $*.c
+ $(LINK.c) -o $@ $*.c -ll $(LDLIBS)
+ $(POST_PROCESS)
+ $(RM) $*.c
+.l.o:
+ $(RM) $*.c
+ $(LEX.l) $< > $*.c
+ $(COMPILE.c) -o $@ $*.c $(CTFCONVERT_HOOK)
+ $(POST_PROCESS_O)
+ $(RM) $*.c
+
+.java.class:
+ $(COMPILE.java) $<
+
+#
+# Rules to create message catalogue files from .sh, .c, .y, and .l files.
+# For .sh files, we extract all gettext strings with sed(1) (being careful
+# to permit multiple gettext strings on the same line), weed out the dups,
+# and build the catalogue with awk(1).
+#
+
+.sh.po:
+ $(SED) -n -e ":a" \
+ -e "h" \
+ -e "s/.*gettext *\(\"[^\"]*\"\).*/\1/p" \
+ -e "x" \
+ -e "s/\(.*\)gettext *\"[^\"]*\"\(.*\)/\1\2/" \
+ -e "t a" \
+ $< | sort -u | awk '{ print "msgid\t" $$0 "\nmsgstr" }' > $@
+
+#
+# When using xgettext, we want messages to go to the default domain,
+# rather than the specified one. This special version of the
+# COMPILE.cpp macro effectively prevents expansion of TEXT_DOMAIN,
+# causing xgettext to put all messages into the default domain.
+#
+CPPFORPO=$(COMPILE.cpp:\"$(TEXT_DOMAIN)\"=TEXT_DOMAIN)
+
+.c.i:
+ $(CPPFORPO) $< > $@
+
+.h.i:
+ $(CPPFORPO) $< > $@
+
+.y.i:
+ $(YACC) -d $<
+ $(CPPFORPO) y.tab.c > $@
+ $(RM) y.tab.c
+
+.l.i:
+ $(LEX) $<
+ $(CPPFORPO) lex.yy.c > $@
+ $(RM) lex.yy.c
+
+.c.po:
+ $(CPPFORPO) $< > $<.i
+ $(BUILD.po)
+
+.y.po:
+ $(YACC) -d $<
+ $(CPPFORPO) y.tab.c > $<.i
+ $(BUILD.po)
+ $(RM) y.tab.c
+
+.l.po:
+ $(LEX) $<
+ $(CPPFORPO) lex.yy.c > $<.i
+ $(BUILD.po)
+ $(RM) lex.yy.c
+
+#
+# Rules to perform stylistic checks
+#
+.SUFFIXES: $(SUFFIXES) .x .xml .check .xmlchk
+
+.h.check:
+ $(DOT_H_CHECK)
+
+.x.check:
+ $(DOT_X_CHECK)
+
+.xml.xmlchk:
+ $(MANIFEST_CHECK)
+
+#
+# Rules to process ONC+ Source partial files
+#
+%_onc_plus: %
+ @$(ECHO) "extracting code from $< ... "
+ sed -n -e '/ONC_PLUS EXTRACT START/,/ONC_PLUS EXTRACT END/p' $< > $@
diff --git a/usr/src/Makefile.master.64 b/usr/src/Makefile.master.64
new file mode 100644
index 0000000..c14ec18
--- /dev/null
+++ b/usr/src/Makefile.master.64
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+# rebind basic build macros to 64-bit versions
+
+CFLAGS= $(CFLAGS64)
+CCFLAGS= $(CCFLAGS64)
+COPTFLAG= $(COPTFLAG64)
+CCOPTFLAG= $(CCOPTFLAG64)
+COMPILE.c= $(COMPILE64.c)
+COMPILE.cc= $(COMPILE64.cc)
+COMPILE.s= $(COMPILE64.s)
+COMPILE.d= $(COMPILE64.d)
+LINK.c= $(LINK64.c)
+LINK.cc= $(LINK64.cc)
+LINT.c= $(LINT64.c)
+
+OFFSETS_CREATE= $(OFFSETS_CREATE64)
+
+#
+# Some library path hackery, to allow building of partial workspaces
+# and properly set the 64-bit library paths with 'ws'
+#
+LDLIBS1= $(ENVLDLIBS1:%=%/$(MACH64))
+LDLIBS2= $(ENVLDLIBS2:%=%/$(MACH64))
+LDLIBS3= $(ENVLDLIBS3:%=%/$(MACH64))
+LDLIBS64 = $(LDLIBS1) $(LDLIBS2) $(LDLIBS3)
+#
+# Moved these up to the top level here, so they can be overridden
+#
+LDLIBS.cmd = $(LDLIBS64)
+LDLIBS.lib = $(LDLIBS64)
+
+#
+# Override Makefile.master's settings of SFWLIBDIR
+#
+SFWLIBDIR= $(SFWLIBDIR64)
+
+#
+# Override Makefile.master's settings of CC, CCC, AS and LINT
+#
+CC= $($(MACH64)_CC)
+CCC= $($(MACH64)_CCC)
+CPP= $($(MACH64)_CPP)
+AS= $($(MACH64)_AS)
+LD= $($(MACH64)_LD)
+LINT= $($(MACH64)_LINT)
+
+BUILD.SO= $(CC) $(CFLAGS) -o $@ $(GSHARED) $(DYNFLAGS) \
+ $(PICS) -L $(ROOTLIBDIR64) $(LDLIBS)
+
+CCNEEDED = -lCrun
+# XX64 What to do about libstdc++ for g++ ???
+
+BUILDCCC.SO= $(CCC) -o $@ $(GSHARED) $(DYNFLAGS) $(PICS) $(LDLIBS) $(CCNEEDED)
diff --git a/usr/src/Makefile.msg.targ b/usr/src/Makefile.msg.targ
new file mode 100644
index 0000000..0559789
--- /dev/null
+++ b/usr/src/Makefile.msg.targ
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2001-2003 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Makefile.msg.targ
+#
+
+#
+# This file contains common targets for building message catalogues.
+# Over time, existing Makefiles should be rewritten to include this file
+# rather than use their own private copy of these rules.
+#
+
+.PARALLEL: $(POFILES) $(MSGFILES)
+
+$(MSGDOMAIN) $(DCMSGDOMAIN):
+ $(INS.dir)
+
+$(MSGDOMAINPOFILE): $(MSGDOMAIN) $(POFILE)
+ $(RM) $@; $(CP) $(POFILE) $@
+
+$(DCMSGDOMAINPOFILE): $(DCMSGDOMAIN) $(DCFILE)
+ $(RM) $@; $(CP) $(DCFILE) $@
+
+BUILDPO.msgfiles = \
+ $(RM) messages.po $(TEXT_DOMAIN).po; \
+ $(TOUCH) $(TEXT_DOMAIN).po; \
+ $(XGETTEXT) $(XGETFLAGS) $(MSGFILES); \
+ $(SED) -e '/^\# msgid/,/^\# msgstr/d' -e '/^domain/d' \
+ messages.po $(TEXT_DOMAIN).po > $(POFILE); \
+ $(RM) messages.po $(TEXT_DOMAIN).po
+
+BUILDPO.pofiles = \
+ $(RM) $(POFILE); \
+ $(NAWK) '\
+ FNR == 1 { print "\# Messages from " FILENAME; } \
+ /^domain/ { next; } \
+ /^msgid/, /^msgstr/ { msg = msg "\n" $$0; \
+ if ( $$0 !~ /^msgstr/ ) next; \
+ if (msg in messages) { \
+ gsub(/\n/, "\n\# ", msg); \
+ } else { \
+ messages[msg] = 1; \
+ } \
+ sub(/^\n/, "", msg); \
+ print msg; \
+ msg = ""; \
+ next; \
+ } \
+ /^\# [\.]*Messages/ { sub(/Messages/, "...Messages"); } \
+ { print; }' $(POFILES) > $(POFILE)
+
+pofile_MSGFILES:
+ $(BUILDPO.msgfiles)
+
+pofile_POFILES:
+ $(BUILDPO.pofiles)
diff --git a/usr/src/Makefile.psm b/usr/src/Makefile.psm
new file mode 100644
index 0000000..b242148
--- /dev/null
+++ b/usr/src/Makefile.psm
@@ -0,0 +1,210 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 1999-2003 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# usr/src/Makefile.psm
+#
+# Makefile.psm, global definitions for platform specific modules
+
+#
+# The distinction between root.sys and root.bin is largely historical;
+# the files in group bin used to be owned by user bin.
+#
+INS.dir.root.sys= $(INS) -s -d -m $(DIRMODE) $@
+$(CH)INS.dir.root.sys= $(INS) -s -d -m $(DIRMODE) -u root -g sys $@
+INS.dir.root.bin= $(INS) -s -d -m $(DIRMODE) $@
+$(CH)INS.dir.root.bin= $(INS) -s -d -m $(DIRMODE) -u root -g bin $@
+
+#
+#
+#
+ROOT_PLAT_DIR = $(ROOT)/platform
+
+ROOT_PSM_DIR = $(ROOT_PLAT_DIR)/$(PLATFORM)
+
+ROOT_PSM_MOD_DIR = $(ROOT_PSM_DIR)/kernel
+ROOT_PSM_LIB_DIR = $(ROOT_PSM_DIR)/lib
+ROOT_PSM_LIB64_DIR = $(ROOT_PSM_LIB_DIR)/$(MACH64)
+ROOT_PSM_SBIN_DIR = $(ROOT_PSM_DIR)/sbin
+
+ROOT_PSM_KERN_DIR_32 = $(ROOT_PSM_MOD_DIR)
+ROOT_PSM_DRV_DIR_32 = $(ROOT_PSM_MOD_DIR)/drv
+ROOT_PSM_EXEC_DIR_32 = $(ROOT_PSM_MOD_DIR)/exec
+ROOT_PSM_FS_DIR_32 = $(ROOT_PSM_MOD_DIR)/fs
+ROOT_PSM_SCHED_DIR_32 = $(ROOT_PSM_MOD_DIR)/sched
+ROOT_PSM_STRMOD_DIR_32 = $(ROOT_PSM_MOD_DIR)/strmod
+ROOT_PSM_SYS_DIR_32 = $(ROOT_PSM_MOD_DIR)/sys
+ROOT_PSM_MISC_DIR_32 = $(ROOT_PSM_MOD_DIR)/misc
+ROOT_PSM_KGSS_DIR_32 = $(ROOT_PSM_MOD_DIR)/misc/kgss
+ROOT_PSM_MACH_DIR_32 = $(ROOT_PSM_MOD_DIR)/mach
+ROOT_PSM_CPU_DIR_32 = $(ROOT_PSM_MOD_DIR)/cpu
+ROOT_PSM_PLAT_DIR_32 = $(ROOT_PSM_MOD_DIR)/misc
+ROOT_PSM_TOD_DIR_32 = $(ROOT_PSM_MOD_DIR)/tod
+ROOT_PSM_MMU_DIR_32 = $(ROOT_PSM_MOD_DIR)/mmu
+ROOT_PSM_DACF_DIR_32 = $(ROOT_PSM_MOD_DIR)/dacf
+ROOT_PSM_CRYPTO_DIR_32 = $(ROOT_PSM_MOD_DIR)/crypto
+
+ROOT_PSM_KERN_DIR_64 = $(ROOT_PSM_MOD_DIR)/$(SUBDIR64)
+ROOT_PSM_DRV_DIR_64 = $(ROOT_PSM_MOD_DIR)/drv/$(SUBDIR64)
+ROOT_PSM_EXEC_DIR_64 = $(ROOT_PSM_MOD_DIR)/exec/$(SUBDIR64)
+ROOT_PSM_FS_DIR_64 = $(ROOT_PSM_MOD_DIR)/fs/$(SUBDIR64)
+ROOT_PSM_SCHED_DIR_64 = $(ROOT_PSM_MOD_DIR)/sched/$(SUBDIR64)
+ROOT_PSM_STRMOD_DIR_64 = $(ROOT_PSM_MOD_DIR)/strmod/$(SUBDIR64)
+ROOT_PSM_SYS_DIR_64 = $(ROOT_PSM_MOD_DIR)/sys/$(SUBDIR64)
+ROOT_PSM_MISC_DIR_64 = $(ROOT_PSM_MOD_DIR)/misc/$(SUBDIR64)
+ROOT_PSM_KGSS_DIR_64 = $(ROOT_PSM_MOD_DIR)/misc/kgss/$(SUBDIR64)
+ROOT_PSM_MACH_DIR_64 = $(ROOT_PSM_MOD_DIR)/mach/$(SUBDIR64)
+ROOT_PSM_CPU_DIR_64 = $(ROOT_PSM_MOD_DIR)/cpu/$(SUBDIR64)
+ROOT_PSM_PLAT_DIR_64 = $(ROOT_PSM_MOD_DIR)/misc/$(SUBDIR64)
+ROOT_PSM_TOD_DIR_64 = $(ROOT_PSM_MOD_DIR)/tod/$(SUBDIR64)
+ROOT_PSM_MMU_DIR_64 = $(ROOT_PSM_MOD_DIR)/mmu/$(SUBDIR64)
+ROOT_PSM_DACF_DIR_64 = $(ROOT_PSM_MOD_DIR)/dacf/$(SUBDIR64)
+ROOT_PSM_CRYPTO_DIR_64 = $(ROOT_PSM_MOD_DIR)/crypto/$(SUBDIR64)
+
+ROOT_PSM_KERN_DIR = $(ROOT_PSM_KERN_DIR_$(CLASS))
+ROOT_PSM_DRV_DIR = $(ROOT_PSM_DRV_DIR_$(CLASS))
+ROOT_PSM_EXEC_DIR = $(ROOT_PSM_EXEC_DIR_$(CLASS))
+ROOT_PSM_FS_DIR = $(ROOT_PSM_FS_DIR_$(CLASS))
+ROOT_PSM_SCHED_DIR = $(ROOT_PSM_SCHED_DIR_$(CLASS))
+ROOT_PSM_STRMOD_DIR = $(ROOT_PSM_STRMOD_DIR_$(CLASS))
+ROOT_PSM_SYS_DIR = $(ROOT_PSM_SYS_DIR_$(CLASS))
+ROOT_PSM_MISC_DIR = $(ROOT_PSM_MISC_DIR_$(CLASS))
+ROOT_PSM_KGSS_DIR = $(ROOT_PSM_KGSS_DIR_$(CLASS))
+ROOT_PSM_MACH_DIR = $(ROOT_PSM_MACH_DIR_$(CLASS))
+ROOT_PSM_CPU_DIR = $(ROOT_PSM_CPU_DIR_$(CLASS))
+ROOT_PSM_PLAT_DIR = $(ROOT_PSM_PLAT_DIR_$(CLASS))
+ROOT_PSM_TOD_DIR = $(ROOT_PSM_TOD_DIR_$(CLASS))
+ROOT_PSM_MMU_DIR = $(ROOT_PSM_MMU_DIR_$(CLASS))
+ROOT_PSM_DACF_DIR = $(ROOT_PSM_DACF_DIR_$(CLASS))
+ROOT_PSM_CRYPTO_DIR = $(ROOT_PSM_CRYPTO_DIR_$(CLASS))
+
+ROOT_PSM_MOD_DIRS_32 = $(ROOT_PSM_DRV_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_EXEC_DIR_32) $(ROOT_PSM_FS_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_SCHED_DIR_32) $(ROOT_PSM_STRMOD_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_SYS_DIR_32) $(ROOT_PSM_MISC_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_KGSS_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_MACH_DIR_32) $(ROOT_PSM_CPU_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_TOD_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_MMU_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_DACF_DIR_32)
+ROOT_PSM_MOD_DIRS_32 += $(ROOT_PSM_CRYPTO_DIR_32)
+
+USR_PLAT_DIR = $(ROOT)/usr/platform
+
+USR_PSM_DIR = $(USR_PLAT_DIR)/$(PLATFORM)
+
+USR_PSM_MOD_DIR = $(USR_PSM_DIR)/kernel
+USR_PSM_INCL_DIR = $(USR_PSM_DIR)/include
+USR_PSM_LIB_DIR = $(USR_PSM_DIR)/lib
+USR_PSM_LIB64_DIR = $(USR_PSM_LIB_DIR)/$(MACH64)
+USR_PSM_SBIN_DIR = $(USR_PSM_DIR)/sbin
+
+USR_PSM_ISYS_DIR = $(USR_PSM_INCL_DIR)/sys
+USR_PSM_IVM_DIR = $(USR_PSM_INCL_DIR)/vm
+
+USR_PSM_LIB_ABI_DIR = $(USR_PSM_LIB_DIR)/abi
+USR_PSM_LIB_ABI_DIR_64 = $(USR_PSM_LIB_ABI_DIR)/$(MACH64)
+
+USR_PSM_LIB_FS_DIR = $(USR_PSM_LIB_DIR)/fs
+USR_PSM_LIB_UFS_DIR = $(USR_PSM_LIB_FS_DIR)/ufs
+USR_PSM_LIB_NFS_DIR = $(USR_PSM_LIB_FS_DIR)/nfs
+USR_PSM_LIB_HSFS_DIR = $(USR_PSM_LIB_FS_DIR)/hsfs
+
+USR_PSM_DRV_DIR_32 = $(USR_PSM_MOD_DIR)/drv
+USR_PSM_EXEC_DIR_32 = $(USR_PSM_MOD_DIR)/exec
+USR_PSM_FS_DIR_32 = $(USR_PSM_MOD_DIR)/fs
+USR_PSM_SCHED_DIR_32 = $(USR_PSM_MOD_DIR)/sched
+USR_PSM_STRMOD_DIR_32 = $(USR_PSM_MOD_DIR)/strmod
+USR_PSM_SYS_DIR_32 = $(USR_PSM_MOD_DIR)/sys
+USR_PSM_MISC_DIR_32 = $(USR_PSM_MOD_DIR)/misc
+USR_PSM_DACF_DIR_32 = $(USR_PSM_MOD_DIR)/dacf
+
+USR_PSM_DRV_DIR_64 = $(USR_PSM_MOD_DIR)/drv/$(SUBDIR64)
+USR_PSM_EXEC_DIR_64 = $(USR_PSM_MOD_DIR)/exec/$(SUBDIR64)
+USR_PSM_FS_DIR_64 = $(USR_PSM_MOD_DIR)/fs/$(SUBDIR64)
+USR_PSM_SCHED_DIR_64 = $(USR_PSM_MOD_DIR)/sched/$(SUBDIR64)
+USR_PSM_STRMOD_DIR_64 = $(USR_PSM_MOD_DIR)/strmod/$(SUBDIR64)
+USR_PSM_SYS_DIR_64 = $(USR_PSM_MOD_DIR)/sys/$(SUBDIR64)
+USR_PSM_MISC_DIR_64 = $(USR_PSM_MOD_DIR)/misc/$(SUBDIR64)
+USR_PSM_DACF_DIR_64 = $(USR_PSM_MOD_DIR)/dacf/$(SUBDIR64)
+
+USR_PSM_DRV_DIR = $(USR_PSM_DRV_DIR_$(CLASS))
+USR_PSM_EXEC_DIR = $(USR_PSM_EXEC_DIR_$(CLASS))
+USR_PSM_FS_DIR = $(USR_PSM_FS_DIR_$(CLASS))
+USR_PSM_SCHED_DIR = $(USR_PSM_SCHED_DIR_$(CLASS))
+USR_PSM_STRMOD_DIR = $(USR_PSM_STRMOD_DIR_$(CLASS))
+USR_PSM_SYS_DIR = $(USR_PSM_SYS_DIR_$(CLASS))
+USR_PSM_MISC_DIR = $(USR_PSM_MISC_DIR_$(CLASS))
+USR_PSM_DACF_DIR = $(USR_PSM_DACF_DIR_$(CLASS))
+
+USR_PSM_MOD_DIRS_32 = $(USR_PSM_DRV_DIR_32)
+USR_PSM_MOD_DIRS_32 += $(USR_PSM_EXEC_DIR_32) $(USR_PSM_FS_DIR_32)
+USR_PSM_MOD_DIRS_32 += $(USR_PSM_SCHED_DIR_32) $(USR_PSM_STRMOD_DIR_32)
+USR_PSM_MOD_DIRS_32 += $(USR_PSM_SYS_DIR_32) $(USR_PSM_MISC_DIR_32)
+USR_PSM_MOD_DIRS_32 += $(USR_PSM_DACF_DIR_32)
+
+#
+# UltraSparc III crypto modules
+#
+ROOT_US3_DIR = $(ROOT_PLAT_DIR)/sun4u-us3
+ROOT_US3_MOD_DIR = $(ROOT_US3_DIR)/kernel
+ROOT_US3_CRYPTO_DIR_32 = $(ROOT_US3_MOD_DIR)/crypto
+ROOT_US3_CRYPTO_DIR_64 = $(ROOT_US3_MOD_DIR)/crypto/$(SUBDIR64)
+ROOT_US3_CRYPTO_DIR = $(ROOT_US3_CRYPTO_DIR_$(CLASS))
+ROOT_US3_CRYPTO_LINK = $(ROOT_US3_CRYPTO_DIR_64:$(ROOT_PLAT_DIR)%=../../../..%)
+
+#
+# The following are for the installation of objects in PSM directories.
+#
+ROOT_PSM_PROG= $(PROG:%=$(ROOT_PSM_DIR)/%)
+USR_PSM_PROG= $(PROG:%=$(USR_PSM_DIR)/%)
+
+ROOT_PSM_SBIN_PROG= $(PROG:%=$(ROOT_PSM_SBIN_DIR)/%)
+USR_PSM_SBIN_PROG= $(PROG:%=$(USR_PSM_SBIN_DIR)/%)
+
+ROOT_PSM_LIBS= $(LIBS:%=$(ROOT_PSM_LIB_DIR)/%)
+USR_PSM_LIBS= $(LIBS:%=$(USR_PSM_LIB_DIR)/%)
+$(ROOT_PSM_LIB_DIR)/$(DYNLIB) := FILEMODE= 755
+$(ROOT_PSM_LIB64_DIR)/$(DYNLIB) := FILEMODE= 755
+$(USR_PSM_LIB_DIR)/$(DYNLIB) := FILEMODE= 755
+$(USR_PSM_LIB64_DIR)/$(DYNLIB) := FILEMODE= 755
+
+#
+# The following are used to link objects between platforms (for platforms
+# which wish to share some objects, but not everything).
+#
+ROOT_PSM_PROG_LINKS= $(PLATLINKS:%=$(ROOT_PLAT_DIR)/%/$(PROG))
+USR_PSM_PROG_LINKS= $(PLATLINKS:%=$(USR_PLAT_DIR)/%/$(PROG))
+
+ROOT_PSM_SBIN_PROG_LINKS= $(PLATLINKS:%=$(ROOT_PLAT_DIR)/%/sbin/$(PROG))
+USR_PSM_SBIN_PROG_LINKS= $(PLATLINKS:%=$(USR_PLAT_DIR)/%/sbin/$(PROG))
+
+#
+# The following are for the creation of the link between the generic name
+# of a library and the versioned instance of it.
+#
+ROOT_PSM_LIB_VERLINKS= $(ROOT_PSM_LIB_DIR)/$(LIBLINKS)
+USR_PSM_LIB_VERLINKS= $(USR_PSM_LIB_DIR)/$(LIBLINKS)
diff --git a/usr/src/Makefile.psm.targ b/usr/src/Makefile.psm.targ
new file mode 100644
index 0000000..9c0e149
--- /dev/null
+++ b/usr/src/Makefile.psm.targ
@@ -0,0 +1,229 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Makefile.psm.targ, global targets for platform specific modules
+
+#
+# Installation targets and rules:
+#
+$(ROOT_PLAT_DIR) $(USR_PLAT_DIR):
+ -$(INS.dir.root.sys)
+
+$(ROOT_PSM_DIR): $(ROOT_PLAT_DIR)
+ -$(INS.dir.root.sys)
+
+$(ROOT_PSM_LIB_DIR) \
+$(ROOT_PSM_SBIN_DIR): $(ROOT_PSM_DIR)
+ -$(INS.dir.root.sys)
+
+$(ROOT_PSM_LIB64_DIR): $(ROOT_PSM_LIB_DIR)
+ -$(INS.dir.root.bin)
+
+$(ROOT_PSM_MOD_DIR): $(ROOT_PSM_DIR)
+ -$(INS.dir.root.sys)
+
+$(ROOT_PSM_MOD_DIRS_32): $(ROOT_PSM_MOD_DIR)
+ -$(INS.dir.root.sys)
+
+$(ROOT_PSM_DIR)/%: % $(ROOT_PSM_DIR)
+ $(INS.file)
+
+$(ROOT_PSM_LIB_DIR)/%: % $(ROOT_PSM_LIB_DIR)
+ $(INS.file)
+
+$(ROOT_PSM_LIB64_DIR)/%: % $(ROOT_PSM_LIB64_DIR)
+ $(INS.file)
+
+$(ROOT_PSM_SBIN_DIR)/%: % $(ROOT_PSM_SBIN_DIR)
+ $(INS.file)
+
+$(ROOT_PSM_KERN_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_KERN_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_DRV_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_DRV_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_EXEC_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_EXEC_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_FS_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_FS_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_SCHED_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_SCHED_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_STRMOD_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_STRMOD_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_SYS_DIR)/%: $(OBJS_DIR)% $(ROOT_PSM_SYS_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_MISC_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_MISC_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_KGSS_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_KGSS_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_MACH_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_MACH_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_CPU_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_CPU_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_TOD_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_TOD_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_MMU_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_MMU_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_DACF_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_DACF_DIR) FRC
+ $(INS.file)
+
+$(ROOT_PSM_CRYPTO_DIR)/%: $(OBJS_DIR)/% $(ROOT_PSM_CRYPTO_DIR) FRC
+ $(INS.file)
+
+#
+#
+#
+$(USR_PSM_DIR): $(USR_PLAT_DIR)
+ -$(INS.dir.root.sys)
+
+$(USR_PSM_INCL_DIR) \
+$(USR_PSM_LIB_DIR) \
+$(USR_PSM_SBIN_DIR): $(USR_PSM_DIR)
+ -$(INS.dir.root.bin)
+
+$(USR_PSM_LIB64_DIR): $(USR_PSM_LIB_DIR)
+ -$(INS.dir.root.bin)
+
+$(USR_PSM_LIB_FS_DIR): $(USR_PSM_LIB_DIR) $(LINKED_LIB_FS_DIRS)
+ -$(INS.dir.root.bin)
+
+$(USR_PSM_LIB_UFS_DIR) \
+$(USR_PSM_LIB_NFS_DIR) \
+$(USR_PSM_LIB_HSFS_DIR): $(USR_PSM_LIB_FS_DIR)
+ -$(INS.dir.root.bin)
+
+$(USR_PSM_MOD_DIR): $(USR_PSM_DIR)
+ -$(INS.dir.root.sys)
+
+$(USR_PSM_MOD_DIRS_32): $(USR_PSM_MOD_DIR)
+ -$(INS.dir.root.sys)
+
+$(USR_PSM_ISYS_DIR) \
+$(USR_PSM_IVM_DIR): $(USR_PSM_INCL_DIR)
+ -$(INS.dir.root.bin)
+
+$(USR_PSM_INCL_DIR)/%: % $(USR_PSM_INCL_DIR)
+ $(INS.file)
+
+$(USR_PSM_LIB_DIR)/%: % $(USR_PSM_LIB_DIR)
+ $(INS.file)
+
+$(USR_PSM_SBIN_DIR)/%: % $(USR_PSM_SBIN_DIR)
+ $(INS.file)
+
+$(USR_PSM_ISYS_DIR)/%: % $(USR_PSM_ISYS_DIR)
+ $(INS.file)
+
+$(USR_PSM_IVM_DIR)/%: % $(USR_PSM_IVM_DIR)
+ $(INS.file)
+
+$(USR_PSM_LIB64_DIR)/%: % $(USR_PSM_LIB64_DIR)
+ $(INS.file)
+
+$(USR_PSM_LIB_UFS_DIR)/%: % $(USR_PSM_LIB_UFS_DIR)
+ $(INS.file)
+
+$(USR_PSM_LIB_NFS_DIR)/%: % $(USR_PSM_LIB_NFS_DIR)
+ $(INS.file)
+
+$(USR_PSM_LIB_HSFS_DIR)/%: % $(USR_PSM_LIB_HSFS_DIR)
+ $(INS.file)
+
+$(USR_PSM_MOD_DIR)/%: % $(USR_PSM_MOD_DIR)
+ $(INS.file)
+
+$(USR_PSM_DRV_DIR)/%: % $(USR_PSM_DRV_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_EXEC_DIR)/%: % $(USR_PSM_EXEC_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_FS_DIR)/%: % $(USR_PSM_FS_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_SCHED_DIR)/%: % $(USR_PSM_SCHED_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_STRMOD_DIR)/%: % $(USR_PSM_STRMOD_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_SYS_DIR)/%: % $(USR_PSM_SYS_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_MISC_DIR)/%: % $(USR_PSM_MISC_DIR) FRC
+ $(INS.file)
+
+$(USR_PSM_DACF_DIR)/%: % $(USR_PSM_DACF_DIR) FRC
+ $(INS.file)
+
+#
+# links in /usr/platform
+#
+$(LINKED_DIRS): $(USR_PLAT_DIR)
+ -$(INS.dir.root.sys)
+
+$(LINKED_LIB_DIRS): $(LINKED_DIRS)
+ -$(INS.dir.root.sys)
+
+$(LINKED_ADB_DIRS): $(LINKED_LIB_DIRS)
+ -$(INS.slink6)
+
+$(LINKED_CFG_DIRS): $(LINKED_LIB_DIRS)
+ -$(INS.slink6)
+
+$(LINKED_LIB_FS_DIRS): $(LINKED_LIB_DIRS)
+ -$(INS.slink6)
+
+#
+# Set ownership on links.
+#
+CHOWNLINK=
+$(CH)CHOWNLINK= ; $(CHOWN) $(OWNER) $@
+CHGRPLINK=
+$(CH)CHGRPLINK= ; $(CHGRP) $(GROUP) $@
+
+#
+#
+#
+$(ROOT_PSM_PROG_LINKS) $(USR_PSM_PROG_LINKS):
+ $(RM) $@; $(SYMLINK) ../$(PLATFORM)/$(PROG) $@ $(CHOWNLINK) $(CHGRPLINK)
+
+$(ROOT_PSM_SBIN_PROG_LINKS) $(USR_PSM_SBIN_PROG_LINKS):
+ $(RM) $@; $(SYMLINK) ../../$(PLATFORM)/sbin/$(PROG) $@ $(CHOWNLINK) $(CHGRPLINK)
+
diff --git a/usr/src/OPENSOLARIS.LICENSE b/usr/src/OPENSOLARIS.LICENSE
new file mode 100644
index 0000000..535dec2
--- /dev/null
+++ b/usr/src/OPENSOLARIS.LICENSE
@@ -0,0 +1,385 @@
+Unless otherwise noted, all files in this distribution are released
+under the Common Development and Distribution License (CDDL),
+Version 1.0 only. Exceptions are noted within the associated
+source files.
+
+--------------------------------------------------------------------
+
+
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0
+
+1. Definitions.
+
+ 1.1. "Contributor" means each individual or entity that creates
+ or contributes to the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Software, prior Modifications used by a Contributor (if any),
+ and the Modifications made by that particular Contributor.
+
+ 1.3. "Covered Software" means (a) the Original Software, or (b)
+ Modifications, or (c) the combination of files containing
+ Original Software with files containing Modifications, in
+ each case including portions thereof.
+
+ 1.4. "Executable" means the Covered Software in any form other
+ than Source Code.
+
+ 1.5. "Initial Developer" means the individual or entity that first
+ makes Original Software available under this License.
+
+ 1.6. "Larger Work" means a work which combines Covered Software or
+ portions thereof with code not governed by the terms of this
+ License.
+
+ 1.7. "License" means this document.
+
+ 1.8. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed
+ herein.
+
+ 1.9. "Modifications" means the Source Code and Executable form of
+ any of the following:
+
+ A. Any file that results from an addition to, deletion from or
+ modification of the contents of a file containing Original
+ Software or previous Modifications;
+
+ B. Any new file that contains any part of the Original
+ Software or previous Modifications; or
+
+ C. Any new file that is contributed or otherwise made
+ available under the terms of this License.
+
+ 1.10. "Original Software" means the Source Code and Executable
+ form of computer software code that is originally released
+ under this License.
+
+ 1.11. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by
+ grantor.
+
+ 1.12. "Source Code" means (a) the common form of computer software
+ code in which modifications are made and (b) associated
+ documentation included in or with such code.
+
+ 1.13. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms
+ of, this License. For legal entities, "You" includes any
+ entity which controls, is controlled by, or is under common
+ control with You. For purposes of this definition,
+ "control" means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty
+ percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants.
+
+ 2.1. The Initial Developer Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and
+ subject to third party intellectual property claims, the Initial
+ Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer, to use,
+ reproduce, modify, display, perform, sublicense and
+ distribute the Original Software (or portions thereof),
+ with or without Modifications, and/or as part of a Larger
+ Work; and
+
+ (b) under Patent Claims infringed by the making, using or
+ selling of Original Software, to make, have made, use,
+ practice, sell, and offer for sale, and/or otherwise
+ dispose of the Original Software (or portions thereof).
+
+ (c) The licenses granted in Sections 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ or otherwise makes the Original Software available to a
+ third party under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: (1) for code that You delete from the Original
+ Software, or (2) for infringements caused by: (i) the
+ modification of the Original Software, or (ii) the
+ combination of the Original Software with other software
+ or devices.
+
+ 2.2. Contributor Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and
+ subject to third party intellectual property claims, each
+ Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor to use, reproduce,
+ modify, display, perform, sublicense and distribute the
+ Modifications created by such Contributor (or portions
+ thereof), either on an unmodified basis, with other
+ Modifications, as Covered Software and/or as part of a
+ Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either
+ alone and/or in combination with its Contributor Version
+ (or portions of such combination), to make, use, sell,
+ offer for sale, have made, and/or otherwise dispose of:
+ (1) Modifications made by that Contributor (or portions
+ thereof); and (2) the combination of Modifications made by
+ that Contributor with its Contributor Version (or portions
+ of such combination).
+
+ (c) The licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first distributes or
+ otherwise makes the Modifications available to a third
+ party.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: (1) for any code that Contributor has deleted
+ from the Contributor Version; (2) for infringements caused
+ by: (i) third party modifications of Contributor Version,
+ or (ii) the combination of Modifications made by that
+ Contributor with other software (except as part of the
+ Contributor Version) or other devices; or (3) under Patent
+ Claims infringed by Covered Software in the absence of
+ Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Availability of Source Code.
+
+ Any Covered Software that You distribute or otherwise make
+ available in Executable form must also be made available in Source
+ Code form and that Source Code form must be distributed only under
+ the terms of this License. You must include a copy of this
+ License with every copy of the Source Code form of the Covered
+ Software You distribute or otherwise make available. You must
+ inform recipients of any such Covered Software in Executable form
+ as to how they can obtain such Covered Software in Source Code
+ form in a reasonable manner on or through a medium customarily
+ used for software exchange.
+
+ 3.2. Modifications.
+
+ The Modifications that You create or to which You contribute are
+ governed by the terms of this License. You represent that You
+ believe Your Modifications are Your original creation(s) and/or
+ You have sufficient rights to grant the rights conveyed by this
+ License.
+
+ 3.3. Required Notices.
+
+ You must include a notice in each of Your Modifications that
+ identifies You as the Contributor of the Modification. You may
+ not remove or alter any copyright, patent or trademark notices
+ contained within the Covered Software, or any notices of licensing
+ or any descriptive text giving attribution to any Contributor or
+ the Initial Developer.
+
+ 3.4. Application of Additional Terms.
+
+ You may not offer or impose any terms on any Covered Software in
+ Source Code form that alters or restricts the applicable version
+ of this License or the recipients' rights hereunder. You may
+ choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of
+ Covered Software. However, you may do so only on Your own behalf,
+ and not on behalf of the Initial Developer or any Contributor.
+ You must make it absolutely clear that any such warranty, support,
+ indemnity or liability obligation is offered by You alone, and You
+ hereby agree to indemnify the Initial Developer and every
+ Contributor for any liability incurred by the Initial Developer or
+ such Contributor as a result of warranty, support, indemnity or
+ liability terms You offer.
+
+ 3.5. Distribution of Executable Versions.
+
+ You may distribute the Executable form of the Covered Software
+ under the terms of this License or under the terms of a license of
+ Your choice, which may contain terms different from this License,
+ provided that You are in compliance with the terms of this License
+ and that the license for the Executable form does not attempt to
+ limit or alter the recipient's rights in the Source Code form from
+ the rights set forth in this License. If You distribute the
+ Covered Software in Executable form under a different license, You
+ must make it absolutely clear that any terms which differ from
+ this License are offered by You alone, not by the Initial
+ Developer or Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred
+ by the Initial Developer or such Contributor as a result of any
+ such terms You offer.
+
+ 3.6. Larger Works.
+
+ You may create a Larger Work by combining Covered Software with
+ other code not governed by the terms of this License and
+ distribute the Larger Work as a single product. In such a case,
+ You must make sure the requirements of this License are fulfilled
+ for the Covered Software.
+
+4. Versions of the License.
+
+ 4.1. New Versions.
+
+ Sun Microsystems, Inc. is the initial license steward and may
+ publish revised and/or new versions of this License from time to
+ time. Each version will be given a distinguishing version number.
+ Except as provided in Section 4.3, no one other than the license
+ steward has the right to modify this License.
+
+ 4.2. Effect of New Versions.
+
+ You may always continue to use, distribute or otherwise make the
+ Covered Software available under the terms of the version of the
+ License under which You originally received the Covered Software.
+ If the Initial Developer includes a notice in the Original
+ Software prohibiting it from being distributed or otherwise made
+ available under any subsequent version of the License, You must
+ distribute and make the Covered Software available under the terms
+ of the version of the License under which You originally received
+ the Covered Software. Otherwise, You may also choose to use,
+ distribute or otherwise make the Covered Software available under
+ the terms of any subsequent version of the License published by
+ the license steward.
+
+ 4.3. Modified Versions.
+
+ When You are an Initial Developer and You want to create a new
+ license for Your Original Software, You may create and use a
+ modified version of this License if You: (a) rename the license
+ and remove any references to the name of the license steward
+ (except to note that the license differs from this License); and
+ (b) otherwise make it clear that the license contains terms which
+ differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+ COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+ BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+ INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+ SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+ PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+ PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+ COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+ INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+ NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+ WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+ DISCLAIMER.
+
+6. TERMINATION.
+
+ 6.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to
+ cure such breach within 30 days of becoming aware of the breach.
+ Provisions which, by their nature, must remain in effect beyond
+ the termination of this License shall survive.
+
+ 6.2. If You assert a patent infringement claim (excluding
+ declaratory judgment actions) against Initial Developer or a
+ Contributor (the Initial Developer or Contributor against whom You
+ assert such claim is referred to as "Participant") alleging that
+ the Participant Software (meaning the Contributor Version where
+ the Participant is a Contributor or the Original Software where
+ the Participant is the Initial Developer) directly or indirectly
+ infringes any patent, then any and all rights granted directly or
+ indirectly to You by such Participant, the Initial Developer (if
+ the Initial Developer is not the Participant) and all Contributors
+ under Sections 2.1 and/or 2.2 of this License shall, upon 60 days
+ notice from Participant terminate prospectively and automatically
+ at the expiration of such 60 day notice period, unless if within
+ such 60 day period You withdraw Your claim with respect to the
+ Participant Software against such Participant either unilaterally
+ or pursuant to a written agreement with Participant.
+
+ 6.3. In the event of termination under Sections 6.1 or 6.2 above,
+ all end user licenses that have been validly granted by You or any
+ distributor hereunder prior to termination (excluding licenses
+ granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+ INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+ COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+ LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+ CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+ LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+ STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+ INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+ APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+ NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+ APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+ The Covered Software is a "commercial item," as that term is
+ defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+ computer software" (as that term is defined at 48
+ C.F.R. 252.227-7014(a)(1)) and "commercial computer software
+ documentation" as such terms are used in 48 C.F.R. 12.212
+ (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48
+ C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all
+ U.S. Government End Users acquire Covered Software with only those
+ rights set forth herein. This U.S. Government Rights clause is in
+ lieu of, and supersedes, any other FAR, DFAR, or other clause or
+ provision that addresses Government rights in computer software
+ under this License.
+
+9. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed
+ by the law of the jurisdiction specified in a notice contained
+ within the Original Software (except to the extent applicable law,
+ if any, provides otherwise), excluding such jurisdiction's
+ conflict-of-law provisions. Any litigation relating to this
+ License shall be subject to the jurisdiction of the courts located
+ in the jurisdiction and venue specified in a notice contained
+ within the Original Software, with the losing party responsible
+ for costs, including, without limitation, court costs and
+ reasonable attorneys' fees and expenses. The application of the
+ United Nations Convention on Contracts for the International Sale
+ of Goods is expressly excluded. Any law or regulation which
+ provides that the language of a contract shall be construed
+ against the drafter shall not apply to this License. You agree
+ that You alone are responsible for compliance with the United
+ States export administration regulations (and the export control
+ laws and regulation of any other countries) when You use,
+ distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or
+ indirectly, out of its utilization of rights under this License
+ and You agree to work with Initial Developer and Contributors to
+ distribute such responsibility on an equitable basis. Nothing
+ herein is intended or shall be deemed to constitute any admission
+ of liability.
+
+--------------------------------------------------------------------
+
+NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND
+DISTRIBUTION LICENSE (CDDL)
+
+For Covered Software in this distribution, this License shall
+be governed by the laws of the State of California (excluding
+conflict-of-law provisions).
+
+Any litigation relating to this License shall be subject to the
+jurisdiction of the Federal Courts of the Northern District of
+California and the state courts of the State of California, with
+venue lying in Santa Clara County, California.
diff --git a/usr/src/Targetdirs b/usr/src/Targetdirs
new file mode 100644
index 0000000..d2e0411
--- /dev/null
+++ b/usr/src/Targetdirs
@@ -0,0 +1,1703 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# The list is built of owner-group combinations. ROOT.SYS occurs twice
+# because some directories owned by root and in group sys are subdirectories
+# of directories having other owner-group attributes.
+#
+# It is easier to think in terms of directory names without the ROOT macro
+# prefix. ROOTDIRS is TARGETDIRS with ROOT prefixes. It is necessary
+# to work with ROOT prefixes when controlling conditional assignments.
+#
+# The macro SYM.ROOT.SYS means symlinks with owner root and group sys.
+
+SYMLINKS= $(SYM.ROOT.SYS) $(SYM.ROOT.BIN) $(SYM.OTHERS)
+
+TARGETDIRS= $(ROOT.SYS) $(ROOT.BIN) $(ROOT.SYS2) \
+ $(UUCP.UUCP) $(OTHERS) $(SYM.USRCCSLIB) $(SYM.USRLIB) \
+ $(ROOT.SFW)
+
+$(BUILD64) TARGETDIRS += $(ROOT.SYS64.2) $(ROOT.BIN64) \
+ $(SYM.USRCCSLIB64) $(SYM.USRLIB64) $(ROOT.SFW64)
+
+$(BUILD64) SYMLINKS += $(SYM.ROOT.BIN64) $(SYM.ROOT.SFW64)
+
+TARGETDIRS += $(SYMLINKS)
+
+i386_ROOT.SYS= \
+ /boot \
+ /boot/acpi \
+ /boot/acpi/tables \
+ /boot/grub \
+ /boot/grub/bin \
+ /boot/solaris \
+ /boot/solaris/bin
+
+sparc_ROOT.SYS=
+
+ROOT.SYS= \
+ $($(MACH)_ROOT.SYS) \
+ /dev \
+ /dev/dsk \
+ /dev/fd \
+ /dev/rdsk \
+ /dev/rmt \
+ /dev/pts \
+ /dev/sad \
+ /dev/swap \
+ /devices \
+ /devices/pseudo \
+ /etc \
+ /etc/certs \
+ /etc/cron.d \
+ /etc/crypto \
+ /etc/crypto/certs \
+ /etc/crypto/crls \
+ /etc/default \
+ /etc/devices \
+ /etc/dfs \
+ /etc/fs \
+ /etc/fs/nfs \
+ /etc/ftpd \
+ /etc/rpcsec \
+ /etc/security \
+ /etc/gss \
+ /etc/init.d \
+ /etc/lib \
+ /etc/opt \
+ /etc/rc0.d \
+ /etc/rc1.d \
+ /etc/rc2.d \
+ /etc/rc3.d \
+ /etc/rcS.d \
+ /etc/sasl \
+ /etc/sfw \
+ /etc/svc \
+ /etc/svc/volatile \
+ /etc/tm \
+ /etc/usb \
+ /etc/zones \
+ /export \
+ /home \
+ /kernel \
+ /mnt \
+ /opt \
+ /platform \
+ /proc \
+ /sbin \
+ /system \
+ /system/contract \
+ /system/object \
+ /usr \
+ /usr/kernel \
+ /usr/platform \
+ /usr/share \
+ /var \
+ /var/adm \
+ /var/adm/pool \
+ /var/adm/sm.bin \
+ /var/adm/streams \
+ /var/cron \
+ /var/krb5 \
+ /var/krb5/rcache \
+ /var/krb5/rcache/root \
+ /var/log \
+ /var/log/pool \
+ /var/sadm \
+ /var/opt \
+ /var/run \
+ /var/svc \
+ /var/svc/log \
+ /var/svc/manifest \
+ /var/svc/manifest/milestone \
+ /var/svc/manifest/device \
+ /var/svc/manifest/system \
+ /var/svc/manifest/system/device \
+ /var/svc/manifest/system/filesystem \
+ /var/svc/manifest/system/security \
+ /var/svc/manifest/system/svc \
+ /var/svc/manifest/network \
+ /var/svc/manifest/network/dns \
+ /var/svc/manifest/network/ldap \
+ /var/svc/manifest/network/nfs \
+ /var/svc/manifest/network/nis \
+ /var/svc/manifest/network/rpc \
+ /var/svc/manifest/network/security \
+ /var/svc/manifest/application \
+ /var/svc/manifest/application/management \
+ /var/svc/manifest/application/security \
+ /var/svc/manifest/application/print \
+ /var/svc/manifest/platform \
+ /var/svc/manifest/platform/i86pc \
+ /var/svc/manifest/platform/sun4u \
+ /var/svc/manifest/site \
+ /var/svc/profile
+
+# EXPORT DELETE START
+XROOT.BIN= \
+ /etc/sfw/openssl \
+ /etc/sfw/openssl/certs \
+ /etc/sfw/openssl/private \
+ /usr/lib/inet/wanboot
+# EXPORT DELETE END
+
+ROOT.BIN= \
+ /etc/saf \
+ /lib \
+ /lib/secure \
+ /lib/svc \
+ /lib/svc/bin \
+ /lib/svc/capture \
+ /lib/svc/method \
+ /lib/svc/monitor \
+ /lib/svc/seed \
+ /lib/svc/share \
+ /usr/4lib \
+ /usr/bin \
+ /usr/bin/$(MACH32) \
+ /usr/ccs \
+ /usr/ccs/bin \
+ /usr/ccs/lib \
+ /usr/demo \
+ /usr/demo/SOUND \
+ /usr/games \
+ /usr/include \
+ /usr/kvm \
+ /usr/include/sys/crypto \
+ /usr/include/fm \
+ /usr/include/gssapi \
+ /usr/include/kerberosv5 \
+ /usr/include/libmilter \
+ /usr/include/sasl \
+ /usr/lib \
+ /usr/lib/abi \
+ /usr/lib/class \
+ /usr/lib/class/FSS \
+ /usr/lib/class/FX \
+ /usr/lib/class/IA \
+ /usr/lib/class/RT \
+ /usr/lib/class/TS \
+ /usr/lib/crypto \
+ /usr/lib/drv \
+ /usr/lib/font \
+ /usr/lib/fp \
+ /usr/lib/fp/libp \
+ /usr/lib/inet \
+ /usr/lib/inet/dhcp \
+ /usr/lib/inet/dhcp/nsu \
+ /usr/lib/inet/dhcp/svc \
+ /usr/lib/inet/dhcp/svcadm \
+ $(XROOT.BIN) \
+ /usr/lib/fm \
+ /usr/lib/gss \
+ /usr/lib/krb5 \
+ /usr/lib/link_audit \
+ /usr/lib/libp \
+ /usr/lib/localedef \
+ /usr/lib/localedef/extensions \
+ /usr/lib/localedef/src \
+ /usr/lib/lwp \
+ /usr/lib/pool \
+ /usr/lib/rcap \
+ /usr/lib/rcap/$(MACH32) \
+ /usr/lib/saf \
+ /usr/lib/sasl \
+ /usr/lib/secure \
+ /usr/lib/security \
+ /usr/lib/term \
+ /usr/lib/zones \
+ /usr/old \
+ /usr/openwin \
+ /usr/proc \
+ /usr/proc/bin \
+ /usr/sadm \
+ /usr/sadm/install \
+ /usr/sadm/install/scripts \
+ /usr/sadm/sysadm \
+ /usr/sadm/sysadm/add-ons \
+ /usr/snadm \
+ /usr/snadm/lib \
+ /usr/sbin \
+ /usr/sbin/$(MACH32) \
+ /usr/share/audio \
+ /usr/share/audio/samples \
+ /usr/share/audio/samples/au \
+ /usr/share/man \
+ /usr/share/man/man1m \
+ /usr/ucb \
+ /usr/ucb/$(MACH32) \
+ /usr/ucblib \
+ /usr/xpg4 \
+ /usr/xpg4/bin \
+ /usr/xpg4/include \
+ /usr/xpg4/lib \
+ /usr/xpg6 \
+ /usr/xpg6/bin \
+ /var/ld \
+ /var/news \
+ /var/preserve \
+ /var/saf \
+ /var/spool
+
+sparcv9_ROOT.BIN64= \
+ /platform/sun4u/sbin \
+ /platform/sun4u/lib \
+ /platform/sun4u/lib/$(MACH64) \
+ /usr/platform/sun4u/sbin \
+ /usr/platform/sun4u/lib \
+ /usr/platform/sun4u/lib/$(MACH64) \
+ /platform/sun4v/lib \
+ /platform/sun4v/lib/$(MACH64) \
+ /usr/platform/sun4v/sbin \
+ /usr/platform/sun4v/lib \
+ /usr/platform/sun4u-us3/lib
+
+amd64_ROOT.BIN64=
+
+ROOT.BIN64= \
+ $($(MACH64)_ROOT.BIN64) \
+ /lib/$(MACH64) \
+ /lib/secure/$(MACH64) \
+ /usr/bin/$(MACH64) \
+ /usr/ccs/bin/$(MACH64) \
+ /usr/ccs/lib/$(MACH64) \
+ /usr/lib/$(MACH64) \
+ /usr/lib/$(MACH64)/gss \
+ /usr/lib/fm/$(MACH64) \
+ /usr/lib/fp/libp/$(MACH64) \
+ /usr/lib/krb5/$(MACH64) \
+ /usr/lib/libp/$(MACH64) \
+ /usr/lib/link_audit/$(MACH64) \
+ /usr/lib/lwp/$(MACH64) \
+ /usr/lib/rcap/$(MACH64) \
+ /usr/lib/sasl/$(MACH64) \
+ /usr/lib/secure/$(MACH64) \
+ /usr/lib/security/$(MACH64) \
+ /usr/lib/abi/$(MACH64) \
+ /usr/sbin/$(MACH64) \
+ /usr/ucb/$(MACH64) \
+ /usr/ucblib/$(MACH64) \
+ /usr/xpg4/lib/$(MACH64) \
+ /var/ld/$(MACH64)
+
+ROOT.SYS2= \
+ /usr/lib/fs \
+ /usr/lib/fs/nfs \
+ /usr/lib/fs/proc \
+ /usr/lib/mdb \
+ /usr/lib/mdb/kvm \
+ /usr/lib/mdb/proc \
+ /usr/lib/mdb/disasm \
+ /usr/lib/nfs \
+ /usr/net \
+ /usr/net/servers \
+ /usr/share/lib \
+ /usr/share/lib/xml \
+ /usr/share/lib/xml/dtd \
+ /usr/share/src \
+ /var/spool/cron \
+ /var/spool/cron/atjobs \
+ /var/spool/cron/crontabs
+
+sparcv9_ROOT.SYS64.2 = \
+ /platform/sun4u \
+ /usr/platform/sun4u
+
+amd64_ROOT.SYS64.2 =
+
+ROOT.SYS64.2 = \
+ $($(MACH64)_ROOT.SYS64.2) \
+ /usr/lib/mdb/kvm/$(MACH64) \
+ /usr/lib/mdb/proc/$(MACH64)
+
+UUCP.UUCP= \
+ /var/spool/uucp \
+ /var/spool/uucppublic \
+ /var/uucp
+
+ROOT.SFW= \
+ /usr/sfw/bin \
+ /usr/sfw/sbin \
+ /usr/sfw/include \
+ /usr/sfw/lib \
+ /usr/sfw/share
+
+ROOT.SFW64= \
+ /usr/sfw/lib/$(MACH64)
+
+# EXPORT DELETE START
+ROOT.SFW64+= \
+ /usr/sfw/bin/$(MACH64)
+# EXPORT DELETE END
+
+OTHERS= \
+ /dev/term \
+ /tmp \
+ /etc/mail \
+ /etc/mail/cf \
+ /etc/mail/cf/cf \
+ /etc/mail/cf/domain \
+ /etc/mail/cf/feature \
+ /etc/mail/cf/m4 \
+ /etc/mail/cf/mailer \
+ /etc/mail/cf/ostype \
+ /etc/mail/cf/sh \
+ /usr/lib/sa \
+ /usr/share/lib/tmac \
+ /var/adm/exacct \
+ /var/adm/log \
+ /var/adm/sa \
+ /var/mail \
+ /var/spool/lp \
+ /var/tmp
+
+# /var/mail/:saved is built directly by the rootdirs target in
+# /usr/src/Makefile because of the colon in its name.
+
+# macros for symbolic links
+
+SYM.ROOT.SYS= \
+ /dev/stdin \
+ /dev/stdout \
+ /dev/stderr \
+ /usr/adm \
+ /usr/lib/cron \
+ /usr/man \
+ /usr/pub
+
+SYM.ROOT.BIN= \
+ /bin \
+ /lib/32 \
+ /lib/secure/32 \
+ /etc/lib/ld.so.1 \
+ /etc/lib/libdl.so.1 \
+ /etc/lib/nss_files.so.1 \
+ /usr/spool \
+ /usr/lib/tmac \
+ /usr/ccs/lib/fp \
+ /usr/ccs/lib/link_audit \
+ /usr/news \
+ /usr/preserve \
+ /usr/src \
+ /usr/lib/32 \
+ /usr/lib/libp/32 \
+ /usr/lib/lwp/32 \
+ /usr/lib/link_audit/32 \
+ /usr/lib/secure/32 \
+ /var/ld/32
+
+SYM.ROOT.BIN64= \
+ /lib/64 \
+ /lib/secure/64 \
+ /usr/lib/64 \
+ /usr/lib/libp/64 \
+ /usr/lib/link_audit/64 \
+ /usr/lib/lwp/64 \
+ /usr/lib/secure/64 \
+ /usr/lib/security/64 \
+ /usr/xpg4/lib/64 \
+ /var/ld/64
+
+SYM.ROOT.SFW64= \
+ /usr/sfw/lib/64
+
+SYM.OTHERS= \
+ /etc/log \
+ /usr/mail \
+ /usr/tmp
+
+# prepend the ROOT prefix
+
+ROOTDIRS= $(TARGETDIRS:%=$(ROOT)%)
+
+# conditional assignments
+#
+# Target directories with non-default values for owner and group must
+# be referenced here, using their fully-prefixed names, and the non-
+# default values assigned. If a directory is mentioned above and not
+# mentioned below, it has default values for attributes.
+#
+# The default values for OWNER, GROUP, and DIRMODE are specified in
+# /usr/src/Makefile.master.
+#
+
+$(ROOT)/tmp \
+$(ROOT)/usr/tmp \
+$(ROOT)/var/tmp \
+$(ROOT)/var/adm/sa \
+$(ROOT.SYS:%=$(ROOT)%) \
+$(ROOT.SYS2:%=$(ROOT)%) \
+$(ROOT.SYS64.2:%=$(ROOT)%) \
+$(SYM.ROOT.SYS:%=$(ROOT)%):= GROUP= sys
+
+$(ROOT)/var/adm \
+$(ROOT)/var/adm/sa := DIRMODE= 775
+
+$(ROOT)/dev/term:= GROUP= root
+
+$(UUCP.UUCP:%=$(ROOT)%):= OWNER= uucp
+$(UUCP.UUCP:%=$(ROOT)%):= GROUP= uucp
+
+$(ROOT)/etc/log \
+$(ROOT)/usr/lib/sa \
+$(ROOT)/var/adm/exacct \
+$(ROOT)/var/adm/log \
+$(ROOT)/var/adm/sa:= OWNER= adm
+
+$(ROOT)/etc/log \
+$(ROOT)/var/adm/exacct \
+$(ROOT)/var/adm/log:= GROUP= adm
+
+$(ROOT)/etc/mail \
+$(ROOT)/etc/mail/cf \
+$(ROOT)/etc/mail/cf/cf \
+$(ROOT)/etc/mail/cf/domain \
+$(ROOT)/etc/mail/cf/feature \
+$(ROOT)/etc/mail/cf/m4 \
+$(ROOT)/etc/mail/cf/mailer \
+$(ROOT)/etc/mail/cf/ostype \
+$(ROOT)/etc/mail/cf/sh \
+$(ROOT)/usr/mail \
+$(ROOT)/var/mail := GROUP= mail
+
+$(ROOT)/var/spool/lp:= OWNER= lp
+$(ROOT)/var/spool/lp:= GROUP= lp
+$(ROOT)/var/spool/lp:= DIRMODE= 775
+
+# file mode
+#
+$(ROOT)/tmp \
+$(ROOT)/var/krb5/rcache \
+$(ROOT)/var/preserve \
+$(ROOT)/var/spool/pkg \
+$(ROOT)/var/spool/uucppublic \
+$(ROOT)/var/tmp:= DIRMODE= 1777
+
+$(ROOT)/var/krb5/rcache/root:= DIRMODE= 700
+
+$(ROOT)/etc/sfw/openssl/private:= DIRMODE= 700
+
+#
+# These permissions must match the ones set
+# internally by fdfs and autofs.
+#
+$(ROOT)/dev/fd \
+$(ROOT)/home:= DIRMODE= 555
+
+$(ROOT)/dev/fd \
+$(ROOT)/home:= GROUP= root
+
+$(ROOT)/var/mail:= DIRMODE=1777
+
+$(ROOT)/proc:= GROUP= root
+$(ROOT)/proc:= DIRMODE= 555
+
+$(ROOT)/system/contract:= DIRMODE= 555
+$(ROOT)/system/object:= DIRMODE= 555
+
+# symlink assignments, LINKDEST is the value of the symlink
+#
+$(ROOT)/usr/lib/cron:= LINKDEST=../../etc/cron.d
+$(ROOT)/bin:= LINKDEST=usr/bin
+$(ROOT)/lib/32:= LINKDEST=.
+$(ROOT)/lib/secure/32:= LINKDEST=.
+$(ROOT)/dev/stdin:= LINKDEST=fd/0
+$(ROOT)/dev/stdout:= LINKDEST=fd/1
+$(ROOT)/dev/stderr:= LINKDEST=fd/2
+$(ROOT)/usr/pub:= LINKDEST=share/lib/pub
+$(ROOT)/usr/man:= LINKDEST=share/man
+$(ROOT)/usr/src:= LINKDEST=share/src
+$(ROOT)/usr/adm:= LINKDEST=../var/adm
+$(ROOT)/etc/lib/ld.so.1:= LINKDEST=../../lib/ld.so.1
+$(ROOT)/etc/lib/libdl.so.1:= LINKDEST=../../lib/libdl.so.1
+$(ROOT)/etc/lib/nss_files.so.1:= LINKDEST=../../lib/nss_files.so.1
+$(ROOT)/etc/log:= LINKDEST=../var/adm/log
+$(ROOT)/usr/mail:= LINKDEST=../var/mail
+$(ROOT)/usr/news:= LINKDEST=../var/news
+$(ROOT)/usr/preserve:= LINKDEST=../var/preserve
+$(ROOT)/usr/spool:= LINKDEST=../var/spool
+$(ROOT)/usr/tmp:= LINKDEST=../var/tmp
+$(ROOT)/usr/lib/tmac:= LINKDEST=../share/lib/tmac
+$(ROOT)/usr/lib/32:= LINKDEST=.
+$(ROOT)/usr/lib/libp/32:= LINKDEST=.
+$(ROOT)/usr/lib/lwp/32:= LINKDEST=.
+$(ROOT)/usr/lib/link_audit/32:= LINKDEST=.
+$(ROOT)/usr/lib/secure/32:= LINKDEST=.
+$(ROOT)/usr/ccs/lib/fp:= LINKDEST=../../lib/fp
+$(ROOT)/usr/ccs/lib/link_audit:= LINKDEST=../../lib/link_audit
+$(ROOT)/var/ld/32:= LINKDEST=.
+
+
+$(BUILD64) $(ROOT)/lib/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/lib/secure/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/libp/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/lwp/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/link_audit/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/secure/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/lib/security/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/xpg4/lib/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/var/ld/64:= LINKDEST=$(MACH64)
+$(BUILD64) $(ROOT)/usr/sfw/lib/64:= LINKDEST=$(MACH64)
+
+# Installing a directory symlink calls for overriding INS.dir to install
+# a symlink.
+#
+$(SYMLINKS:%=$(ROOT)%):= \
+ INS.dir= -$(RM) -r $@; $(SYMLINK) $(LINKDEST) $@; \
+ $(CHOWN) $(OWNER) $@; $(CHGRP) $(GROUP) $@
+
+
+# Special symlinks to populate usr/ccs/lib, whose objects
+# have actually been moved to usr/lib
+# Rather than adding another set of rules, we add usr/lib/lwp files here
+$(ROOT)/usr/ccs/lib/libcurses.so:= REALPATH=../../../lib/libcurses.so.1
+$(ROOT)/usr/ccs/lib/llib-lcurses:= REALPATH=../../../lib/llib-lcurses
+$(ROOT)/usr/ccs/lib/llib-lcurses.ln:= REALPATH=../../../lib/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/libform.so:= REALPATH=../../lib/libform.so.1
+$(ROOT)/usr/ccs/lib/llib-lform:= REALPATH=../../lib/llib-lform
+$(ROOT)/usr/ccs/lib/llib-lform.ln:= REALPATH=../../lib/llib-lform.ln
+$(ROOT)/usr/ccs/lib/libgen.so:= REALPATH=../../../lib/libgen.so.1
+$(ROOT)/usr/ccs/lib/llib-lgen:= REALPATH=../../../lib/llib-lgen
+$(ROOT)/usr/ccs/lib/llib-lgen.ln:= REALPATH=../../../lib/llib-lgen.ln
+$(ROOT)/usr/ccs/lib/libmalloc.so:= REALPATH=../../lib/libmalloc.so.1
+$(ROOT)/usr/ccs/lib/libmenu.so:= REALPATH=../../lib/libmenu.so.1
+$(ROOT)/usr/ccs/lib/llib-lmenu:= REALPATH=../../lib/llib-lmenu
+$(ROOT)/usr/ccs/lib/llib-lmenu.ln:= REALPATH=../../lib/llib-lmenu.ln
+$(ROOT)/usr/ccs/lib/libpanel.so:= REALPATH=../../lib/libpanel.so.1
+$(ROOT)/usr/ccs/lib/llib-lpanel:= REALPATH=../../lib/llib-lpanel
+$(ROOT)/usr/ccs/lib/llib-lpanel.ln:= REALPATH=../../lib/llib-lpanel.ln
+$(ROOT)/usr/ccs/lib/libtermlib.so:= REALPATH=../../../lib/libcurses.so.1
+$(ROOT)/usr/ccs/lib/llib-ltermlib:= REALPATH=../../../lib/llib-lcurses
+$(ROOT)/usr/ccs/lib/llib-ltermlib.ln:= REALPATH=../../../lib/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/libtermcap.so:= REALPATH=../../../lib/libcurses.so.1
+$(ROOT)/usr/ccs/lib/llib-ltermcap:= REALPATH=../../../lib/llib-lcurses
+$(ROOT)/usr/ccs/lib/llib-ltermcap.ln:= REALPATH=../../../lib/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/values-Xa.o:= REALPATH=../../lib/values-Xa.o
+$(ROOT)/usr/ccs/lib/values-Xc.o:= REALPATH=../../lib/values-Xc.o
+$(ROOT)/usr/ccs/lib/values-Xs.o:= REALPATH=../../lib/values-Xs.o
+$(ROOT)/usr/ccs/lib/values-Xt.o:= REALPATH=../../lib/values-Xt.o
+$(ROOT)/usr/ccs/lib/values-xpg4.o:= REALPATH=../../lib/values-xpg4.o
+$(ROOT)/usr/ccs/lib/values-xpg6.o:= REALPATH=../../lib/values-xpg6.o
+$(ROOT)/usr/ccs/lib/libl.so:= REALPATH=../../lib/libl.so.1
+$(ROOT)/usr/ccs/lib/llib-ll.ln:= REALPATH=../../lib/llib-ll.ln
+$(ROOT)/usr/ccs/lib/liby.so:= REALPATH=../../lib/liby.so.1
+$(ROOT)/usr/ccs/lib/llib-ly.ln:= REALPATH=../../lib/llib-ly.ln
+$(ROOT)/usr/ccs/lib/libld.so.2:= REALPATH=../../../lib/libld.so.2
+$(ROOT)/usr/ccs/lib/libld.so.3:= REALPATH=../../../lib/libld.so.3
+$(ROOT)/usr/lib/libp/libc.so.1:= REALPATH=../../../lib/libc.so.1
+$(ROOT)/usr/lib/lwp/libthread.so.1:= REALPATH=../libthread.so.1
+$(ROOT)/usr/lib/lwp/libthread_db.so.1:= REALPATH=../libthread_db.so.1
+
+# symlinks to populate usr/ccs/lib/$(MACH64)
+$(ROOT)/usr/ccs/lib/$(MACH64)/libcurses.so:= \
+ REALPATH=../../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-lcurses.ln:= \
+ REALPATH=../../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libform.so:= \
+ REALPATH=../../../lib/$(MACH64)/libform.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-lform.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lform.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libgen.so:= \
+ REALPATH=../../../../lib/$(MACH64)/libgen.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-lgen.ln:= \
+ REALPATH=../../../../lib/$(MACH64)/llib-lgen.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libmalloc.so:= \
+ REALPATH=../../../lib/$(MACH64)/libmalloc.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/libmenu.so:= \
+ REALPATH=../../../lib/$(MACH64)/libmenu.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-lmenu.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lmenu.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libpanel.so:= \
+ REALPATH=../../../lib/$(MACH64)/libpanel.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-lpanel.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lpanel.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libtermlib.so:= \
+ REALPATH=../../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-ltermlib.ln:= \
+ REALPATH=../../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libtermcap.so:= \
+ REALPATH=../../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-ltermcap.ln:= \
+ REALPATH=../../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-Xa.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-Xa.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-Xc.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-Xc.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-Xs.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-Xs.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-Xt.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-Xt.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-xpg4.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-xpg4.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/values-xpg6.o:= \
+ REALPATH=../../../lib/$(MACH64)/values-xpg6.o
+$(ROOT)/usr/ccs/lib/$(MACH64)/libl.so:= \
+ REALPATH=../../../lib/$(MACH64)/libl.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-ll.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ll.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/liby.so:= \
+ REALPATH=../../../lib/$(MACH64)/liby.so.1
+$(ROOT)/usr/ccs/lib/$(MACH64)/llib-ly.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ly.ln
+$(ROOT)/usr/ccs/lib/$(MACH64)/libld.so.2:= \
+ REALPATH=../../../../lib/$(MACH64)/libld.so.2
+$(ROOT)/usr/ccs/lib/$(MACH64)/libld.so.3:= \
+ REALPATH=../../../../lib/$(MACH64)/libld.so.3
+$(ROOT)/usr/lib/libp/$(MACH64)/libc.so.1:= \
+ REALPATH=../../../../lib/$(MACH64)/libc.so.1
+$(ROOT)/usr/lib/lwp/$(MACH64)/libthread.so.1:= \
+ REALPATH=../../$(MACH64)/libthread.so.1
+$(ROOT)/usr/lib/lwp/$(MACH64)/libthread_db.so.1:= \
+ REALPATH=../../$(MACH64)/libthread_db.so.1
+
+SYM.USRCCSLIB= \
+ /usr/ccs/lib/libcurses.so \
+ /usr/ccs/lib/llib-lcurses \
+ /usr/ccs/lib/llib-lcurses.ln \
+ /usr/ccs/lib/libform.so \
+ /usr/ccs/lib/llib-lform \
+ /usr/ccs/lib/llib-lform.ln \
+ /usr/ccs/lib/libgen.so \
+ /usr/ccs/lib/llib-lgen \
+ /usr/ccs/lib/llib-lgen.ln \
+ /usr/ccs/lib/libmalloc.so \
+ /usr/ccs/lib/libmenu.so \
+ /usr/ccs/lib/llib-lmenu \
+ /usr/ccs/lib/llib-lmenu.ln \
+ /usr/ccs/lib/libpanel.so \
+ /usr/ccs/lib/llib-lpanel \
+ /usr/ccs/lib/llib-lpanel.ln \
+ /usr/ccs/lib/libtermlib.so \
+ /usr/ccs/lib/llib-ltermlib \
+ /usr/ccs/lib/llib-ltermlib.ln \
+ /usr/ccs/lib/libtermcap.so \
+ /usr/ccs/lib/llib-ltermcap \
+ /usr/ccs/lib/llib-ltermcap.ln \
+ /usr/ccs/lib/values-Xa.o \
+ /usr/ccs/lib/values-Xc.o \
+ /usr/ccs/lib/values-Xs.o \
+ /usr/ccs/lib/values-Xt.o \
+ /usr/ccs/lib/values-xpg4.o \
+ /usr/ccs/lib/values-xpg6.o \
+ /usr/ccs/lib/libl.so \
+ /usr/ccs/lib/llib-ll.ln \
+ /usr/ccs/lib/liby.so \
+ /usr/ccs/lib/llib-ly.ln \
+ /usr/ccs/lib/libld.so.2 \
+ /usr/lib/libp/libc.so.1 \
+ /usr/lib/lwp/libthread.so.1 \
+ /usr/lib/lwp/libthread_db.so.1
+
+SYM.USRCCSLIB64= \
+ /usr/ccs/lib/libld.so.3 \
+ /usr/ccs/lib/$(MACH64)/libcurses.so \
+ /usr/ccs/lib/$(MACH64)/llib-lcurses.ln \
+ /usr/ccs/lib/$(MACH64)/libform.so \
+ /usr/ccs/lib/$(MACH64)/llib-lform.ln \
+ /usr/ccs/lib/$(MACH64)/libgen.so \
+ /usr/ccs/lib/$(MACH64)/llib-lgen.ln \
+ /usr/ccs/lib/$(MACH64)/libmalloc.so \
+ /usr/ccs/lib/$(MACH64)/libmenu.so \
+ /usr/ccs/lib/$(MACH64)/llib-lmenu.ln \
+ /usr/ccs/lib/$(MACH64)/libpanel.so \
+ /usr/ccs/lib/$(MACH64)/llib-lpanel.ln \
+ /usr/ccs/lib/$(MACH64)/libtermlib.so \
+ /usr/ccs/lib/$(MACH64)/llib-ltermlib.ln \
+ /usr/ccs/lib/$(MACH64)/libtermcap.so \
+ /usr/ccs/lib/$(MACH64)/llib-ltermcap.ln \
+ /usr/ccs/lib/$(MACH64)/values-Xa.o \
+ /usr/ccs/lib/$(MACH64)/values-Xc.o \
+ /usr/ccs/lib/$(MACH64)/values-Xs.o \
+ /usr/ccs/lib/$(MACH64)/values-Xt.o \
+ /usr/ccs/lib/$(MACH64)/values-xpg4.o \
+ /usr/ccs/lib/$(MACH64)/values-xpg6.o \
+ /usr/ccs/lib/$(MACH64)/libl.so \
+ /usr/ccs/lib/$(MACH64)/llib-ll.ln \
+ /usr/ccs/lib/$(MACH64)/liby.so \
+ /usr/ccs/lib/$(MACH64)/llib-ly.ln \
+ /usr/ccs/lib/$(MACH64)/libld.so.2 \
+ /usr/ccs/lib/$(MACH64)/libld.so.3 \
+ /usr/lib/libp/$(MACH64)/libc.so.1 \
+ /usr/lib/lwp/$(MACH64)/libthread.so.1 \
+ /usr/lib/lwp/$(MACH64)/libthread_db.so.1
+
+
+$(SYM.USRCCSLIB:%=$(ROOT)%):= \
+ INS.dir= -$(RM) $@; $(SYMLINK) $(REALPATH) $@; \
+ $(CHOWN) $(OWNER) $@; $(CHGRP) $(GROUP) $@
+
+$(SYM.USRCCSLIB64:%=$(ROOT)%):= \
+ INS.dir= -$(RM) $@; $(SYMLINK) $(REALPATH) $@; \
+ $(CHOWN) $(OWNER) $@; $(CHGRP) $(GROUP) $@
+
+# Special symlinks to direct libraries that have been moved
+# from /usr/lib to /lib in order to live in the root filesystem.
+$(ROOT)/lib/libthread_db.so.1:= REALPATH=libc_db.so.1
+$(ROOT)/lib/libthread_db.so:= REALPATH=libc_db.so.1
+$(ROOT)/usr/lib/ld.so.1:= REALPATH=../../lib/ld.so.1
+$(ROOT)/usr/lib/libadm.so.1:= REALPATH=../../lib/libadm.so.1
+$(ROOT)/usr/lib/libadm.so:= REALPATH=../../lib/libadm.so.1
+$(ROOT)/usr/lib/libaio.so.1:= REALPATH=../../lib/libaio.so.1
+$(ROOT)/usr/lib/libaio.so:= REALPATH=../../lib/libaio.so.1
+$(ROOT)/usr/lib/libavl.so.1:= REALPATH=../../lib/libavl.so.1
+$(ROOT)/usr/lib/libavl.so:= REALPATH=../../lib/libavl.so.1
+$(ROOT)/usr/lib/libbsm.so.1:= REALPATH=../../lib/libbsm.so.1
+$(ROOT)/usr/lib/libbsm.so:= REALPATH=../../lib/libbsm.so.1
+$(ROOT)/usr/lib/libc.so.1:= REALPATH=../../lib/libc.so.1
+$(ROOT)/usr/lib/libc.so:= REALPATH=../../lib/libc.so.1
+$(ROOT)/usr/lib/libc_db.so.1:= REALPATH=../../lib/libc_db.so.1
+$(ROOT)/usr/lib/libc_db.so:= REALPATH=../../lib/libc_db.so.1
+$(ROOT)/usr/lib/libcmd.so.1:= REALPATH=../../lib/libcmd.so.1
+$(ROOT)/usr/lib/libcmd.so:= REALPATH=../../lib/libcmd.so.1
+$(ROOT)/usr/lib/libcmdutils.so.1:= REALPATH=../../lib/libcmdutils.so.1
+$(ROOT)/usr/lib/libcmdutils.so:= REALPATH=../../lib/libcmdutils.so.1
+$(ROOT)/usr/lib/libcontract.so.1:= REALPATH=../../lib/libcontract.so.1
+$(ROOT)/usr/lib/libcontract.so:= REALPATH=../../lib/libcontract.so.1
+$(ROOT)/usr/lib/libctf.so.1:= REALPATH=../../lib/libctf.so.1
+$(ROOT)/usr/lib/libctf.so:= REALPATH=../../lib/libctf.so.1
+$(ROOT)/usr/lib/libcurses.so.1:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libcurses.so:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libdevice.so.1:= REALPATH=../../lib/libdevice.so.1
+$(ROOT)/usr/lib/libdevice.so:= REALPATH=../../lib/libdevice.so.1
+$(ROOT)/usr/lib/libdevid.so.1:= REALPATH=../../lib/libdevid.so.1
+$(ROOT)/usr/lib/libdevid.so:= REALPATH=../../lib/libdevid.so.1
+$(ROOT)/usr/lib/libdevinfo.so.1:= REALPATH=../../lib/libdevinfo.so.1
+$(ROOT)/usr/lib/libdevinfo.so:= REALPATH=../../lib/libdevinfo.so.1
+$(ROOT)/usr/lib/libdhcpagent.so.1:= REALPATH=../../lib/libdhcpagent.so.1
+$(ROOT)/usr/lib/libdhcpagent.so:= REALPATH=../../lib/libdhcpagent.so.1
+$(ROOT)/usr/lib/libdhcputil.so.1:= REALPATH=../../lib/libdhcputil.so.1
+$(ROOT)/usr/lib/libdhcputil.so:= REALPATH=../../lib/libdhcputil.so.1
+$(ROOT)/usr/lib/libdl.so.1:= REALPATH=../../lib/libdl.so.1
+$(ROOT)/usr/lib/libdl.so:= REALPATH=../../lib/libdl.so.1
+$(ROOT)/usr/lib/libdoor.so.1:= REALPATH=../../lib/libdoor.so.1
+$(ROOT)/usr/lib/libdoor.so:= REALPATH=../../lib/libdoor.so.1
+$(ROOT)/usr/lib/libefi.so.1:= REALPATH=../../lib/libefi.so.1
+$(ROOT)/usr/lib/libefi.so:= REALPATH=../../lib/libefi.so.1
+$(ROOT)/usr/lib/libelf.so.1:= REALPATH=../../lib/libelf.so.1
+$(ROOT)/usr/lib/libelf.so:= REALPATH=../../lib/libelf.so.1
+$(ROOT)/usr/lib/libgen.so.1:= REALPATH=../../lib/libgen.so.1
+$(ROOT)/usr/lib/libgen.so:= REALPATH=../../lib/libgen.so.1
+$(ROOT)/usr/lib/libinetcfg.so.1:= REALPATH=../../lib/libinetcfg.so.1
+$(ROOT)/usr/lib/libinetcfg.so:= REALPATH=../../lib/libinetcfg.so.1
+$(ROOT)/usr/lib/libinetutil.so.1:= REALPATH=../../lib/libinetutil.so.1
+$(ROOT)/usr/lib/libinetutil.so:= REALPATH=../../lib/libinetutil.so.1
+$(ROOT)/usr/lib/libintl.so.1:= REALPATH=../../lib/libintl.so.1
+$(ROOT)/usr/lib/libintl.so:= REALPATH=../../lib/libintl.so.1
+$(ROOT)/usr/lib/libkstat.so.1:= REALPATH=../../lib/libkstat.so.1
+$(ROOT)/usr/lib/libkstat.so:= REALPATH=../../lib/libkstat.so.1
+$(ROOT)/usr/lib/libld.so.2:= REALPATH=../../lib/libld.so.2
+$(ROOT)/usr/lib/libld.so.3:= REALPATH=../../lib/libld.so.3
+$(ROOT)/usr/lib/liblddbg.so.4:= REALPATH=../../lib/liblddbg.so.4
+$(ROOT)/usr/lib/libmd5.so.1:= REALPATH=../../lib/libmd5.so.1
+$(ROOT)/usr/lib/libmd5.so:= REALPATH=../../lib/libmd5.so.1
+$(ROOT)/usr/lib/libmeta.so.1:= REALPATH=../../lib/libmeta.so.1
+$(ROOT)/usr/lib/libmeta.so:= REALPATH=../../lib/libmeta.so.1
+$(ROOT)/usr/lib/libmp.so.1:= REALPATH=../../lib/libmp.so.1
+$(ROOT)/usr/lib/libmp.so.2:= REALPATH=../../lib/libmp.so.2
+$(ROOT)/usr/lib/libmp.so:= REALPATH=../../lib/libmp.so.2
+$(ROOT)/usr/lib/libnsl.so.1:= REALPATH=../../lib/libnsl.so.1
+$(ROOT)/usr/lib/libnsl.so:= REALPATH=../../lib/libnsl.so.1
+$(ROOT)/usr/lib/libnvpair.so.1:= REALPATH=../../lib/libnvpair.so.1
+$(ROOT)/usr/lib/libnvpair.so:= REALPATH=../../lib/libnvpair.so.1
+$(ROOT)/usr/lib/libpam.so.1:= REALPATH=../../lib/libpam.so.1
+$(ROOT)/usr/lib/libpam.so:= REALPATH=../../lib/libpam.so.1
+$(ROOT)/usr/lib/libposix4.so.1:= REALPATH=../../lib/librt.so.1
+$(ROOT)/usr/lib/libposix4.so:= REALPATH=../../lib/librt.so.1
+$(ROOT)/usr/lib/libproc.so.1:= REALPATH=../../lib/libproc.so.1
+$(ROOT)/usr/lib/libproc.so:= REALPATH=../../lib/libproc.so.1
+$(ROOT)/usr/lib/libpthread.so.1:= REALPATH=../../lib/libpthread.so.1
+$(ROOT)/usr/lib/libresolv.so.1:= REALPATH=../../lib/libresolv.so.1
+$(ROOT)/usr/lib/libresolv.so.2:= REALPATH=../../lib/libresolv.so.2
+$(ROOT)/usr/lib/libresolv.so:= REALPATH=../../lib/libresolv.so.2
+$(ROOT)/usr/lib/libpthread.so:= REALPATH=../../lib/libpthread.so.1
+$(ROOT)/usr/lib/librestart.so.1:= REALPATH=../../lib/librestart.so.1
+$(ROOT)/usr/lib/librestart.so:= REALPATH=../../lib/librestart.so.1
+$(ROOT)/usr/lib/librpcsvc.so.1:= REALPATH=../../lib/librpcsvc.so.1
+$(ROOT)/usr/lib/librpcsvc.so:= REALPATH=../../lib/librpcsvc.so.1
+$(ROOT)/usr/lib/librt.so.1:= REALPATH=../../lib/librt.so.1
+$(ROOT)/usr/lib/librt.so:= REALPATH=../../lib/librt.so.1
+$(ROOT)/usr/lib/librtld.so.1:= REALPATH=../../lib/librtld.so.1
+$(ROOT)/usr/lib/librtld_db.so.1:= REALPATH=../../lib/librtld_db.so.1
+$(ROOT)/usr/lib/librtld_db.so:= REALPATH=../../lib/librtld_db.so.1
+$(ROOT)/usr/lib/libscf.so.1:= REALPATH=../../lib/libscf.so.1
+$(ROOT)/usr/lib/libscf.so:= REALPATH=../../lib/libscf.so.1
+$(ROOT)/usr/lib/libsec.so.1:= REALPATH=../../lib/libsec.so.1
+$(ROOT)/usr/lib/libsec.so:= REALPATH=../../lib/libsec.so.1
+$(ROOT)/usr/lib/libsecdb.so.1:= REALPATH=../../lib/libsecdb.so.1
+$(ROOT)/usr/lib/libsecdb.so:= REALPATH=../../lib/libsecdb.so.1
+$(ROOT)/usr/lib/libsendfile.so.1:= REALPATH=../../lib/libsendfile.so.1
+$(ROOT)/usr/lib/libsendfile.so:= REALPATH=../../lib/libsendfile.so.1
+$(ROOT)/usr/lib/libsocket.so.1:= REALPATH=../../lib/libsocket.so.1
+$(ROOT)/usr/lib/libsocket.so:= REALPATH=../../lib/libsocket.so.1
+$(ROOT)/usr/lib/libsysevent.so.1:= REALPATH=../../lib/libsysevent.so.1
+$(ROOT)/usr/lib/libsysevent.so:= REALPATH=../../lib/libsysevent.so.1
+$(ROOT)/usr/lib/libtermcap.so.1:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libtermcap.so:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libtermlib.so.1:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libtermlib.so:= REALPATH=../../lib/libcurses.so.1
+$(ROOT)/usr/lib/libthread.so.1:= REALPATH=../../lib/libthread.so.1
+$(ROOT)/usr/lib/libthread.so:= REALPATH=../../lib/libthread.so.1
+$(ROOT)/usr/lib/libthread_db.so.1:= REALPATH=../../lib/libc_db.so.1
+$(ROOT)/usr/lib/libthread_db.so:= REALPATH=../../lib/libc_db.so.1
+$(ROOT)/usr/lib/libumem.so.1:= REALPATH=../../lib/libumem.so.1
+$(ROOT)/usr/lib/libumem.so:= REALPATH=../../lib/libumem.so.1
+$(ROOT)/usr/lib/libuuid.so.1:= REALPATH=../../lib/libuuid.so.1
+$(ROOT)/usr/lib/libuuid.so:= REALPATH=../../lib/libuuid.so.1
+$(ROOT)/usr/lib/libuutil.so.1:= REALPATH=../../lib/libuutil.so.1
+$(ROOT)/usr/lib/libuutil.so:= REALPATH=../../lib/libuutil.so.1
+$(ROOT)/usr/lib/libw.so.1:= REALPATH=../../lib/libw.so.1
+$(ROOT)/usr/lib/libw.so:= REALPATH=../../lib/libw.so.1
+$(ROOT)/usr/lib/libxnet.so.1:= REALPATH=../../lib/libxnet.so.1
+$(ROOT)/usr/lib/libxnet.so:= REALPATH=../../lib/libxnet.so.1
+$(ROOT)/usr/lib/llib-ladm.ln:= REALPATH=../../lib/llib-ladm.ln
+$(ROOT)/usr/lib/llib-ladm:= REALPATH=../../lib/llib-ladm
+$(ROOT)/usr/lib/llib-laio.ln:= REALPATH=../../lib/llib-laio.ln
+$(ROOT)/usr/lib/llib-laio:= REALPATH=../../lib/llib-laio
+$(ROOT)/usr/lib/llib-lavl.ln:= REALPATH=../../lib/llib-lavl.ln
+$(ROOT)/usr/lib/llib-lavl:= REALPATH=../../lib/llib-lavl
+$(ROOT)/usr/lib/llib-lbsm.ln:= REALPATH=../../lib/llib-lbsm.ln
+$(ROOT)/usr/lib/llib-lbsm:= REALPATH=../../lib/llib-lbsm
+$(ROOT)/usr/lib/llib-lc.ln:= REALPATH=../../lib/llib-lc.ln
+$(ROOT)/usr/lib/llib-lc:= REALPATH=../../lib/llib-lc
+$(ROOT)/usr/lib/llib-lcmd.ln:= REALPATH=../../lib/llib-lcmd.ln
+$(ROOT)/usr/lib/llib-lcmd:= REALPATH=../../lib/llib-lcmd
+$(ROOT)/usr/lib/llib-lcmdutils.ln:= REALPATH=../../lib/llib-lcmdutils.ln
+$(ROOT)/usr/lib/llib-lcmdutils:= REALPATH=../../lib/llib-lcmdutils
+$(ROOT)/usr/lib/llib-lcontract.ln:= REALPATH=../../lib/llib-lcontract.ln
+$(ROOT)/usr/lib/llib-lcontract:= REALPATH=../../lib/llib-lcontract
+$(ROOT)/usr/lib/llib-lctf.ln:= REALPATH=../../lib/llib-lctf.ln
+$(ROOT)/usr/lib/llib-lctf:= REALPATH=../../lib/llib-lctf
+$(ROOT)/usr/lib/llib-lcurses.ln:= REALPATH=../../lib/llib-lcurses.ln
+$(ROOT)/usr/lib/llib-lcurses:= REALPATH=../../lib/llib-lcurses
+$(ROOT)/usr/lib/llib-ldevice.ln:= REALPATH=../../lib/llib-ldevice.ln
+$(ROOT)/usr/lib/llib-ldevice:= REALPATH=../../lib/llib-ldevice
+$(ROOT)/usr/lib/llib-ldevid.ln:= REALPATH=../../lib/llib-ldevid.ln
+$(ROOT)/usr/lib/llib-ldevid:= REALPATH=../../lib/llib-ldevid
+$(ROOT)/usr/lib/llib-ldevinfo.ln:= REALPATH=../../lib/llib-ldevinfo.ln
+$(ROOT)/usr/lib/llib-ldevinfo:= REALPATH=../../lib/llib-ldevinfo
+$(ROOT)/usr/lib/llib-ldhcpagent.ln:= REALPATH=../../lib/llib-ldhcpagent.ln
+$(ROOT)/usr/lib/llib-ldhcpagent:= REALPATH=../../lib/llib-ldhcpagent
+$(ROOT)/usr/lib/llib-ldhcputil.ln:= REALPATH=../../lib/llib-ldhcputil.ln
+$(ROOT)/usr/lib/llib-ldhcputil:= REALPATH=../../lib/llib-ldhcputil
+$(ROOT)/usr/lib/llib-ldl.ln:= REALPATH=../../lib/llib-ldl.ln
+$(ROOT)/usr/lib/llib-ldl:= REALPATH=../../lib/llib-ldl
+$(ROOT)/usr/lib/llib-ldoor.ln:= REALPATH=../../lib/llib-ldoor.ln
+$(ROOT)/usr/lib/llib-ldoor:= REALPATH=../../lib/llib-ldoor
+$(ROOT)/usr/lib/llib-lefi.ln:= REALPATH=../../lib/llib-lefi.ln
+$(ROOT)/usr/lib/llib-lefi:= REALPATH=../../lib/llib-lefi
+$(ROOT)/usr/lib/llib-lelf.ln:= REALPATH=../../lib/llib-lelf.ln
+$(ROOT)/usr/lib/llib-lelf:= REALPATH=../../lib/llib-lelf
+$(ROOT)/usr/lib/llib-lgen.ln:= REALPATH=../../lib/llib-lgen.ln
+$(ROOT)/usr/lib/llib-lgen:= REALPATH=../../lib/llib-lgen
+$(ROOT)/usr/lib/llib-linetcfg.ln:= REALPATH=../../lib/llib-linetcfg.ln
+$(ROOT)/usr/lib/llib-linetcfg:= REALPATH=../../lib/llib-linetcfg
+$(ROOT)/usr/lib/llib-linetutil.ln:= REALPATH=../../lib/llib-linetutil.ln
+$(ROOT)/usr/lib/llib-linetutil:= REALPATH=../../lib/llib-linetutil
+$(ROOT)/usr/lib/llib-lintl.ln:= REALPATH=../../lib/llib-lintl.ln
+$(ROOT)/usr/lib/llib-lintl:= REALPATH=../../lib/llib-lintl
+$(ROOT)/usr/lib/llib-lkstat.ln:= REALPATH=../../lib/llib-lkstat.ln
+$(ROOT)/usr/lib/llib-lkstat:= REALPATH=../../lib/llib-lkstat
+$(ROOT)/usr/lib/llib-lmd5.ln:= REALPATH=../../lib/llib-lmd5.ln
+$(ROOT)/usr/lib/llib-lmd5:= REALPATH=../../lib/llib-lmd5
+$(ROOT)/usr/lib/llib-lmeta.ln:= REALPATH=../../lib/llib-lmeta.ln
+$(ROOT)/usr/lib/llib-lmeta:= REALPATH=../../lib/llib-lmeta
+$(ROOT)/usr/lib/llib-lnsl.ln:= REALPATH=../../lib/llib-lnsl.ln
+$(ROOT)/usr/lib/llib-lnsl:= REALPATH=../../lib/llib-lnsl
+$(ROOT)/usr/lib/llib-lnvpair.ln:= REALPATH=../../lib/llib-lnvpair.ln
+$(ROOT)/usr/lib/llib-lnvpair:= REALPATH=../../lib/llib-lnvpair
+$(ROOT)/usr/lib/llib-lpam.ln:= REALPATH=../../lib/llib-lpam.ln
+$(ROOT)/usr/lib/llib-lpam:= REALPATH=../../lib/llib-lpam
+$(ROOT)/usr/lib/llib-lposix4.ln:= REALPATH=../../lib/llib-lrt.ln
+$(ROOT)/usr/lib/llib-lposix4:= REALPATH=../../lib/llib-lrt
+$(ROOT)/usr/lib/llib-lpthread.ln:= REALPATH=../../lib/llib-lpthread.ln
+$(ROOT)/usr/lib/llib-lpthread:= REALPATH=../../lib/llib-lpthread
+$(ROOT)/usr/lib/llib-lresolv.ln:= REALPATH=../../lib/llib-lresolv.ln
+$(ROOT)/usr/lib/llib-lresolv:= REALPATH=../../lib/llib-lresolv
+$(ROOT)/usr/lib/llib-lrt.ln:= REALPATH=../../lib/llib-lrt.ln
+$(ROOT)/usr/lib/llib-lrt:= REALPATH=../../lib/llib-lrt
+$(ROOT)/usr/lib/llib-lrtld_db.ln:= REALPATH=../../lib/llib-lrtld_db.ln
+$(ROOT)/usr/lib/llib-lrtld_db:= REALPATH=../../lib/llib-lrtld_db
+$(ROOT)/usr/lib/llib-lscf.ln:= REALPATH=../../lib/llib-lscf.ln
+$(ROOT)/usr/lib/llib-lscf:= REALPATH=../../lib/llib-lscf
+$(ROOT)/usr/lib/llib-lsec.ln:= REALPATH=../../lib/llib-lsec.ln
+$(ROOT)/usr/lib/llib-lsec:= REALPATH=../../lib/llib-lsec
+$(ROOT)/usr/lib/llib-lsecdb.ln:= REALPATH=../../lib/llib-lsecdb.ln
+$(ROOT)/usr/lib/llib-lsecdb:= REALPATH=../../lib/llib-lsecdb
+$(ROOT)/usr/lib/llib-lsendfile.ln:= REALPATH=../../lib/llib-lsendfile.ln
+$(ROOT)/usr/lib/llib-lsendfile:= REALPATH=../../lib/llib-lsendfile
+$(ROOT)/usr/lib/llib-lsocket.ln:= REALPATH=../../lib/llib-lsocket.ln
+$(ROOT)/usr/lib/llib-lsocket:= REALPATH=../../lib/llib-lsocket
+$(ROOT)/usr/lib/llib-lsysevent.ln:= REALPATH=../../lib/llib-lsysevent.ln
+$(ROOT)/usr/lib/llib-lsysevent:= REALPATH=../../lib/llib-lsysevent
+$(ROOT)/usr/lib/llib-ltermcap.ln:= REALPATH=../../lib/llib-lcurses.ln
+$(ROOT)/usr/lib/llib-ltermcap:= REALPATH=../../lib/llib-lcurses
+$(ROOT)/usr/lib/llib-ltermlib.ln:= REALPATH=../../lib/llib-lcurses.ln
+$(ROOT)/usr/lib/llib-ltermlib:= REALPATH=../../lib/llib-lcurses
+$(ROOT)/usr/lib/llib-lthread.ln:= REALPATH=../../lib/llib-lthread.ln
+$(ROOT)/usr/lib/llib-lthread:= REALPATH=../../lib/llib-lthread
+$(ROOT)/usr/lib/llib-lthread_db.ln:= REALPATH=../../lib/llib-lc_db.ln
+$(ROOT)/usr/lib/llib-lthread_db:= REALPATH=../../lib/llib-lc_db
+$(ROOT)/usr/lib/llib-lumem.ln:= REALPATH=../../lib/llib-lumem.ln
+$(ROOT)/usr/lib/llib-lumem:= REALPATH=../../lib/llib-lumem
+$(ROOT)/usr/lib/llib-luuid.ln:= REALPATH=../../lib/llib-luuid.ln
+$(ROOT)/usr/lib/llib-luuid:= REALPATH=../../lib/llib-luuid
+$(ROOT)/usr/lib/llib-lxnet.ln:= REALPATH=../../lib/llib-lxnet.ln
+$(ROOT)/usr/lib/llib-lxnet:= REALPATH=../../lib/llib-lxnet
+$(ROOT)/usr/lib/nss_compat.so.1:= REALPATH=../../lib/nss_compat.so.1
+$(ROOT)/usr/lib/nss_dns.so.1:= REALPATH=../../lib/nss_dns.so.1
+$(ROOT)/usr/lib/nss_files.so.1:= REALPATH=../../lib/nss_files.so.1
+$(ROOT)/usr/lib/nss_nis.so.1:= REALPATH=../../lib/nss_nis.so.1
+$(ROOT)/usr/lib/nss_nisplus.so.1:= REALPATH=../../lib/nss_nisplus.so.1
+$(ROOT)/usr/lib/nss_user.so.1:= REALPATH=../../lib/nss_user.so.1
+
+$(ROOT)/lib/$(MACH64)/libthread_db.so.1:= \
+ REALPATH=libc_db.so.1
+$(ROOT)/lib/$(MACH64)/libthread_db.so:= \
+ REALPATH=libc_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/ld.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/ld.so.1
+$(ROOT)/usr/lib/$(MACH64)/libadm.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libadm.so.1
+$(ROOT)/usr/lib/$(MACH64)/libadm.so:= \
+ REALPATH=../../../lib/$(MACH64)/libadm.so.1
+$(ROOT)/usr/lib/$(MACH64)/libaio.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libaio.so.1
+$(ROOT)/usr/lib/$(MACH64)/libaio.so:= \
+ REALPATH=../../../lib/$(MACH64)/libaio.so.1
+$(ROOT)/usr/lib/$(MACH64)/libavl.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libavl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libavl.so:= \
+ REALPATH=../../../lib/$(MACH64)/libavl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libbsm.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libbsm.so.1
+$(ROOT)/usr/lib/$(MACH64)/libbsm.so:= \
+ REALPATH=../../../lib/$(MACH64)/libbsm.so.1
+$(ROOT)/usr/lib/$(MACH64)/libc.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libc.so.1
+$(ROOT)/usr/lib/$(MACH64)/libc.so:= \
+ REALPATH=../../../lib/$(MACH64)/libc.so.1
+$(ROOT)/usr/lib/$(MACH64)/libc_db.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libc_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/libc_db.so:= \
+ REALPATH=../../../lib/$(MACH64)/libc_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcmd.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcmd.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcmd.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcmd.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcmdutils.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcmdutils.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcmdutils.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcmdutils.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcontract.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcontract.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcontract.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcontract.so.1
+$(ROOT)/usr/lib/$(MACH64)/libctf.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libctf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libctf.so:= \
+ REALPATH=../../../lib/$(MACH64)/libctf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcurses.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libcurses.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevice.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libdevice.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevice.so:= \
+ REALPATH=../../../lib/$(MACH64)/libdevice.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevid.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libdevid.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevid.so:= \
+ REALPATH=../../../lib/$(MACH64)/libdevid.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevinfo.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libdevinfo.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdevinfo.so:= \
+ REALPATH=../../../lib/$(MACH64)/libdevinfo.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdl.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libdl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdl.so:= \
+ REALPATH=../../../lib/$(MACH64)/libdl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdoor.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libdoor.so.1
+$(ROOT)/usr/lib/$(MACH64)/libdoor.so:= \
+ REALPATH=../../../lib/$(MACH64)/libdoor.so.1
+$(ROOT)/usr/lib/$(MACH64)/libefi.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libefi.so.1
+$(ROOT)/usr/lib/$(MACH64)/libefi.so:= \
+ REALPATH=../../../lib/$(MACH64)/libefi.so.1
+$(ROOT)/usr/lib/$(MACH64)/libelf.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libelf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libelf.so:= \
+ REALPATH=../../../lib/$(MACH64)/libelf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libgen.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libgen.so.1
+$(ROOT)/usr/lib/$(MACH64)/libgen.so:= \
+ REALPATH=../../../lib/$(MACH64)/libgen.so.1
+$(ROOT)/usr/lib/$(MACH64)/libinetutil.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libinetutil.so.1
+$(ROOT)/usr/lib/$(MACH64)/libinetutil.so:= \
+ REALPATH=../../../lib/$(MACH64)/libinetutil.so.1
+$(ROOT)/usr/lib/$(MACH64)/libintl.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libintl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libintl.so:= \
+ REALPATH=../../../lib/$(MACH64)/libintl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libkstat.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libkstat.so.1
+$(ROOT)/usr/lib/$(MACH64)/libkstat.so:= \
+ REALPATH=../../../lib/$(MACH64)/libkstat.so.1
+$(ROOT)/usr/lib/$(MACH64)/libld.so.2:= \
+ REALPATH=../../../lib/$(MACH64)/libld.so.2
+$(ROOT)/usr/lib/$(MACH64)/libld.so.3:= \
+ REALPATH=../../../lib/$(MACH64)/libld.so.3
+$(ROOT)/usr/lib/$(MACH64)/liblddbg.so.4:= \
+ REALPATH=../../../lib/$(MACH64)/liblddbg.so.4
+$(ROOT)/usr/lib/$(MACH64)/libmd5.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libmd5.so.1
+$(ROOT)/usr/lib/$(MACH64)/libmd5.so:= \
+ REALPATH=../../../lib/$(MACH64)/libmd5.so.1
+$(ROOT)/usr/lib/$(MACH64)/libmp.so.2:= \
+ REALPATH=../../../lib/$(MACH64)/libmp.so.2
+$(ROOT)/usr/lib/$(MACH64)/libmp.so:= \
+ REALPATH=../../../lib/$(MACH64)/libmp.so.2
+$(ROOT)/usr/lib/$(MACH64)/libnsl.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libnsl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libnsl.so:= \
+ REALPATH=../../../lib/$(MACH64)/libnsl.so.1
+$(ROOT)/usr/lib/$(MACH64)/libnvpair.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libnvpair.so.1
+$(ROOT)/usr/lib/$(MACH64)/libnvpair.so:= \
+ REALPATH=../../../lib/$(MACH64)/libnvpair.so.1
+$(ROOT)/usr/lib/$(MACH64)/libpam.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libpam.so.1
+$(ROOT)/usr/lib/$(MACH64)/libpam.so:= \
+ REALPATH=../../../lib/$(MACH64)/libpam.so.1
+$(ROOT)/usr/lib/$(MACH64)/libposix4.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librt.so.1
+$(ROOT)/usr/lib/$(MACH64)/libposix4.so:= \
+ REALPATH=../../../lib/$(MACH64)/librt.so.1
+$(ROOT)/usr/lib/$(MACH64)/libproc.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libproc.so.1
+$(ROOT)/usr/lib/$(MACH64)/libproc.so:= \
+ REALPATH=../../../lib/$(MACH64)/libproc.so.1
+$(ROOT)/usr/lib/$(MACH64)/libpthread.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libpthread.so.1
+$(ROOT)/usr/lib/$(MACH64)/libpthread.so:= \
+ REALPATH=../../../lib/$(MACH64)/libpthread.so.1
+$(ROOT)/usr/lib/$(MACH64)/libresolv.so.2:= \
+ REALPATH=../../../lib/$(MACH64)/libresolv.so.2
+$(ROOT)/usr/lib/$(MACH64)/libresolv.so:= \
+ REALPATH=../../../lib/$(MACH64)/libresolv.so.2
+$(ROOT)/usr/lib/$(MACH64)/librestart.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librestart.so.1
+$(ROOT)/usr/lib/$(MACH64)/librestart.so:= \
+ REALPATH=../../../lib/$(MACH64)/librestart.so.1
+$(ROOT)/usr/lib/$(MACH64)/librpcsvc.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librpcsvc.so.1
+$(ROOT)/usr/lib/$(MACH64)/librpcsvc.so:= \
+ REALPATH=../../../lib/$(MACH64)/librpcsvc.so.1
+$(ROOT)/usr/lib/$(MACH64)/librt.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librt.so.1
+$(ROOT)/usr/lib/$(MACH64)/librt.so:= \
+ REALPATH=../../../lib/$(MACH64)/librt.so.1
+$(ROOT)/usr/lib/$(MACH64)/librtld.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librtld.so.1
+$(ROOT)/usr/lib/$(MACH64)/librtld_db.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/librtld_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/librtld_db.so:= \
+ REALPATH=../../../lib/$(MACH64)/librtld_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/libscf.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libscf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libscf.so:= \
+ REALPATH=../../../lib/$(MACH64)/libscf.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsec.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libsec.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsec.so:= \
+ REALPATH=../../../lib/$(MACH64)/libsec.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsecdb.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libsecdb.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsecdb.so:= \
+ REALPATH=../../../lib/$(MACH64)/libsecdb.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsendfile.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libsendfile.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsendfile.so:= \
+ REALPATH=../../../lib/$(MACH64)/libsendfile.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsocket.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libsocket.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsocket.so:= \
+ REALPATH=../../../lib/$(MACH64)/libsocket.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsysevent.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libsysevent.so.1
+$(ROOT)/usr/lib/$(MACH64)/libsysevent.so:= \
+ REALPATH=../../../lib/$(MACH64)/libsysevent.so.1
+$(ROOT)/usr/lib/$(MACH64)/libtermcap.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libtermcap.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libtermlib.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libtermlib.so:= \
+ REALPATH=../../../lib/$(MACH64)/libcurses.so.1
+$(ROOT)/usr/lib/$(MACH64)/libthread.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libthread.so.1
+$(ROOT)/usr/lib/$(MACH64)/libthread.so:= \
+ REALPATH=../../../lib/$(MACH64)/libthread.so.1
+$(ROOT)/usr/lib/$(MACH64)/libthread_db.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libc_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/libthread_db.so:= \
+ REALPATH=../../../lib/$(MACH64)/libc_db.so.1
+$(ROOT)/usr/lib/$(MACH64)/libumem.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libumem.so.1
+$(ROOT)/usr/lib/$(MACH64)/libumem.so:= \
+ REALPATH=../../../lib/$(MACH64)/libumem.so.1
+$(ROOT)/usr/lib/$(MACH64)/libuuid.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libuuid.so.1
+$(ROOT)/usr/lib/$(MACH64)/libuuid.so:= \
+ REALPATH=../../../lib/$(MACH64)/libuuid.so.1
+$(ROOT)/usr/lib/$(MACH64)/libuutil.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libuutil.so.1
+$(ROOT)/usr/lib/$(MACH64)/libuutil.so:= \
+ REALPATH=../../../lib/$(MACH64)/libuutil.so.1
+$(ROOT)/usr/lib/$(MACH64)/libw.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libw.so.1
+$(ROOT)/usr/lib/$(MACH64)/libw.so:= \
+ REALPATH=../../../lib/$(MACH64)/libw.so.1
+$(ROOT)/usr/lib/$(MACH64)/libxnet.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/libxnet.so.1
+$(ROOT)/usr/lib/$(MACH64)/libxnet.so:= \
+ REALPATH=../../../lib/$(MACH64)/libxnet.so.1
+$(ROOT)/usr/lib/$(MACH64)/llib-ladm.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ladm.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-laio.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-laio.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lavl.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lavl.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lbsm.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lbsm.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lc.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lc.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lcmd.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcmd.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lcmdutils.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcmdutils.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lcontract.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcontract.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lctf.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lctf.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lcurses.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lcurses:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses
+$(ROOT)/usr/lib/$(MACH64)/llib-ldevice.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ldevice.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ldevid.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ldevid.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ldevinfo.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ldevinfo.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ldl.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ldl.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ldoor.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-ldoor.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lefi.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lefi.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lelf.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lelf.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lgen.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lgen.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-linetutil.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-linetutil.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lintl.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lintl.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lkstat.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lkstat.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lmd5.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lmd5.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lnsl.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lnsl.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lnvpair.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lnvpair.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lpam.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lpam.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lposix4.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lrt.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lpthread.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lpthread.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lresolv.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lresolv.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lrt.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lrt.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lrtld_db.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lrtld_db.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lscf.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lscf.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lsec.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lsec.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lsecdb.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lsecdb.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lsendfile.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lsendfile.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lsocket.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lsocket.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lsysevent.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lsysevent.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ltermcap.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ltermcap:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses
+$(ROOT)/usr/lib/$(MACH64)/llib-ltermlib.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-ltermlib:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lcurses
+$(ROOT)/usr/lib/$(MACH64)/llib-lthread.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lthread.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lthread_db.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lc_db.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lumem.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lumem.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-luuid.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-luuid.ln
+$(ROOT)/usr/lib/$(MACH64)/llib-lxnet.ln:= \
+ REALPATH=../../../lib/$(MACH64)/llib-lxnet.ln
+$(ROOT)/usr/lib/$(MACH64)/nss_compat.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_compat.so.1
+$(ROOT)/usr/lib/$(MACH64)/nss_dns.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_dns.so.1
+$(ROOT)/usr/lib/$(MACH64)/nss_files.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_files.so.1
+$(ROOT)/usr/lib/$(MACH64)/nss_nis.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_nis.so.1
+$(ROOT)/usr/lib/$(MACH64)/nss_nisplus.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_nisplus.so.1
+$(ROOT)/usr/lib/$(MACH64)/nss_user.so.1:= \
+ REALPATH=../../../lib/$(MACH64)/nss_user.so.1
+$(ROOT)/usr/platform/sun4u/lib/$(MACH64)/libwrsmconf.so.1:= \
+ REALPATH=../../../../../platform/sun4u/lib/$(MACH64)/libwrsmconf.so.1
+$(ROOT)/usr/platform/sun4u/lib/$(MACH64)/libwrsmconf.so:= \
+ REALPATH=../../../../../platform/sun4u/lib/$(MACH64)/libwrsmconf.so.1
+$(ROOT)/usr/platform/sun4u/lib/libwrsmconf.so.1:= \
+ REALPATH=../../../../platform/sun4u/lib/libwrsmconf.so.1
+$(ROOT)/usr/platform/sun4u/lib/libwrsmconf.so:= \
+ REALPATH=../../../../platform/sun4u/lib/libwrsmconf.so.1
+$(ROOT)/usr/platform/sun4u/sbin/wrsmconf:= \
+ REALPATH=../../../../platform/sun4u/sbin/wrsmconf
+
+SYM.USRLIB= \
+ /lib/libthread_db.so \
+ /lib/libthread_db.so.1 \
+ /usr/lib/ld.so.1 \
+ /usr/lib/libadm.so \
+ /usr/lib/libadm.so.1 \
+ /usr/lib/libaio.so \
+ /usr/lib/libaio.so.1 \
+ /usr/lib/libavl.so \
+ /usr/lib/libavl.so.1 \
+ /usr/lib/libbsm.so \
+ /usr/lib/libbsm.so.1 \
+ /usr/lib/libc.so \
+ /usr/lib/libc.so.1 \
+ /usr/lib/libc_db.so \
+ /usr/lib/libc_db.so.1 \
+ /usr/lib/libcmd.so \
+ /usr/lib/libcmd.so.1 \
+ /usr/lib/libcmdutils.so \
+ /usr/lib/libcmdutils.so.1 \
+ /usr/lib/libcontract.so \
+ /usr/lib/libcontract.so.1 \
+ /usr/lib/libctf.so \
+ /usr/lib/libctf.so.1 \
+ /usr/lib/libcurses.so \
+ /usr/lib/libcurses.so.1 \
+ /usr/lib/libdevice.so \
+ /usr/lib/libdevice.so.1 \
+ /usr/lib/libdevid.so \
+ /usr/lib/libdevid.so.1 \
+ /usr/lib/libdevinfo.so \
+ /usr/lib/libdevinfo.so.1 \
+ /usr/lib/libdhcpagent.so \
+ /usr/lib/libdhcpagent.so.1 \
+ /usr/lib/libdhcputil.so \
+ /usr/lib/libdhcputil.so.1 \
+ /usr/lib/libdl.so \
+ /usr/lib/libdl.so.1 \
+ /usr/lib/libdoor.so \
+ /usr/lib/libdoor.so.1 \
+ /usr/lib/libefi.so \
+ /usr/lib/libefi.so.1 \
+ /usr/lib/libelf.so \
+ /usr/lib/libelf.so.1 \
+ /usr/lib/libgen.so \
+ /usr/lib/libgen.so.1 \
+ /usr/lib/libinetcfg.so \
+ /usr/lib/libinetcfg.so.1 \
+ /usr/lib/libinetutil.so \
+ /usr/lib/libinetutil.so.1 \
+ /usr/lib/libintl.so \
+ /usr/lib/libintl.so.1 \
+ /usr/lib/libkstat.so \
+ /usr/lib/libkstat.so.1 \
+ /usr/lib/libld.so.2 \
+ /usr/lib/liblddbg.so.4 \
+ /usr/lib/libmd5.so \
+ /usr/lib/libmd5.so.1 \
+ /usr/lib/libmeta.so \
+ /usr/lib/libmeta.so.1 \
+ /usr/lib/libmp.so \
+ /usr/lib/libmp.so.1 \
+ /usr/lib/libmp.so.2 \
+ /usr/lib/libnsl.so \
+ /usr/lib/libnsl.so.1 \
+ /usr/lib/libnvpair.so \
+ /usr/lib/libnvpair.so.1 \
+ /usr/lib/libpam.so \
+ /usr/lib/libpam.so.1 \
+ /usr/lib/libposix4.so \
+ /usr/lib/libposix4.so.1 \
+ /usr/lib/libproc.so \
+ /usr/lib/libproc.so.1 \
+ /usr/lib/libpthread.so \
+ /usr/lib/libpthread.so.1 \
+ /usr/lib/libresolv.so \
+ /usr/lib/libresolv.so.1 \
+ /usr/lib/libresolv.so.2 \
+ /usr/lib/librestart.so \
+ /usr/lib/librestart.so.1 \
+ /usr/lib/librpcsvc.so \
+ /usr/lib/librpcsvc.so.1 \
+ /usr/lib/librt.so \
+ /usr/lib/librt.so.1 \
+ /usr/lib/librtld.so.1 \
+ /usr/lib/librtld_db.so \
+ /usr/lib/librtld_db.so.1 \
+ /usr/lib/libscf.so \
+ /usr/lib/libscf.so.1 \
+ /usr/lib/libsec.so \
+ /usr/lib/libsec.so.1 \
+ /usr/lib/libsecdb.so \
+ /usr/lib/libsecdb.so.1 \
+ /usr/lib/libsendfile.so \
+ /usr/lib/libsendfile.so.1 \
+ /usr/lib/libsocket.so \
+ /usr/lib/libsocket.so.1 \
+ /usr/lib/libtermcap.so \
+ /usr/lib/libtermcap.so.1 \
+ /usr/lib/libtermlib.so \
+ /usr/lib/libtermlib.so.1 \
+ /usr/lib/libthread.so \
+ /usr/lib/libthread.so.1 \
+ /usr/lib/libthread_db.so \
+ /usr/lib/libthread_db.so.1 \
+ /usr/lib/libsysevent.so \
+ /usr/lib/libsysevent.so.1 \
+ /usr/lib/libumem.so \
+ /usr/lib/libumem.so.1 \
+ /usr/lib/libuuid.so \
+ /usr/lib/libuuid.so.1 \
+ /usr/lib/libuutil.so \
+ /usr/lib/libuutil.so.1 \
+ /usr/lib/libw.so \
+ /usr/lib/libw.so.1 \
+ /usr/lib/libxnet.so \
+ /usr/lib/libxnet.so.1 \
+ /usr/lib/llib-ladm \
+ /usr/lib/llib-ladm.ln \
+ /usr/lib/llib-laio \
+ /usr/lib/llib-laio.ln \
+ /usr/lib/llib-lavl \
+ /usr/lib/llib-lavl.ln \
+ /usr/lib/llib-lbsm \
+ /usr/lib/llib-lbsm.ln \
+ /usr/lib/llib-lc \
+ /usr/lib/llib-lc.ln \
+ /usr/lib/llib-lcmd \
+ /usr/lib/llib-lcmd.ln \
+ /usr/lib/llib-lcmdutils \
+ /usr/lib/llib-lcmdutils.ln \
+ /usr/lib/llib-lcontract \
+ /usr/lib/llib-lcontract.ln \
+ /usr/lib/llib-lctf \
+ /usr/lib/llib-lctf.ln \
+ /usr/lib/llib-lcurses \
+ /usr/lib/llib-lcurses.ln \
+ /usr/lib/llib-ldevice \
+ /usr/lib/llib-ldevice.ln \
+ /usr/lib/llib-ldevid \
+ /usr/lib/llib-ldevid.ln \
+ /usr/lib/llib-ldevinfo \
+ /usr/lib/llib-ldevinfo.ln \
+ /usr/lib/llib-ldhcpagent \
+ /usr/lib/llib-ldhcpagent.ln \
+ /usr/lib/llib-ldhcputil \
+ /usr/lib/llib-ldhcputil.ln \
+ /usr/lib/llib-ldl \
+ /usr/lib/llib-ldl.ln \
+ /usr/lib/llib-ldoor \
+ /usr/lib/llib-ldoor.ln \
+ /usr/lib/llib-lefi \
+ /usr/lib/llib-lefi.ln \
+ /usr/lib/llib-lelf \
+ /usr/lib/llib-lelf.ln \
+ /usr/lib/llib-lgen \
+ /usr/lib/llib-lgen.ln \
+ /usr/lib/llib-linetcfg \
+ /usr/lib/llib-linetcfg.ln \
+ /usr/lib/llib-linetutil \
+ /usr/lib/llib-linetutil.ln \
+ /usr/lib/llib-lintl \
+ /usr/lib/llib-lintl.ln \
+ /usr/lib/llib-lkstat \
+ /usr/lib/llib-lkstat.ln \
+ /usr/lib/llib-lmd5 \
+ /usr/lib/llib-lmd5.ln \
+ /usr/lib/llib-lmeta \
+ /usr/lib/llib-lmeta.ln \
+ /usr/lib/llib-lnsl \
+ /usr/lib/llib-lnsl.ln \
+ /usr/lib/llib-lnvpair \
+ /usr/lib/llib-lnvpair.ln \
+ /usr/lib/llib-lpam \
+ /usr/lib/llib-lpam.ln \
+ /usr/lib/llib-lposix4 \
+ /usr/lib/llib-lposix4.ln \
+ /usr/lib/llib-lpthread \
+ /usr/lib/llib-lpthread.ln \
+ /usr/lib/llib-lresolv \
+ /usr/lib/llib-lresolv.ln \
+ /usr/lib/llib-lrt \
+ /usr/lib/llib-lrt.ln \
+ /usr/lib/llib-lrtld_db \
+ /usr/lib/llib-lrtld_db.ln \
+ /usr/lib/llib-lscf \
+ /usr/lib/llib-lscf.ln \
+ /usr/lib/llib-lsec \
+ /usr/lib/llib-lsec.ln \
+ /usr/lib/llib-lsecdb \
+ /usr/lib/llib-lsecdb.ln \
+ /usr/lib/llib-lsendfile \
+ /usr/lib/llib-lsendfile.ln \
+ /usr/lib/llib-lsocket \
+ /usr/lib/llib-lsocket.ln \
+ /usr/lib/llib-lsysevent \
+ /usr/lib/llib-lsysevent.ln \
+ /usr/lib/llib-ltermcap \
+ /usr/lib/llib-ltermcap.ln \
+ /usr/lib/llib-ltermlib \
+ /usr/lib/llib-ltermlib.ln \
+ /usr/lib/llib-lthread \
+ /usr/lib/llib-lthread.ln \
+ /usr/lib/llib-lthread_db \
+ /usr/lib/llib-lthread_db.ln \
+ /usr/lib/llib-lumem \
+ /usr/lib/llib-lumem.ln \
+ /usr/lib/llib-luuid \
+ /usr/lib/llib-luuid.ln \
+ /usr/lib/llib-lxnet \
+ /usr/lib/llib-lxnet.ln \
+ /usr/lib/nss_compat.so.1 \
+ /usr/lib/nss_dns.so.1 \
+ /usr/lib/nss_files.so.1 \
+ /usr/lib/nss_nis.so.1 \
+ /usr/lib/nss_nisplus.so.1 \
+ /usr/lib/nss_user.so.1
+
+sparcv9_SYM.USRLIB64= \
+ /usr/platform/sun4u/lib/$(MACH64)/libwrsmconf.so \
+ /usr/platform/sun4u/lib/$(MACH64)/libwrsmconf.so.1 \
+ /usr/platform/sun4u/lib/libwrsmconf.so \
+ /usr/platform/sun4u/lib/libwrsmconf.so.1 \
+ /usr/platform/sun4u/sbin/wrsmconf
+
+amd64_SYM.USRLIB64=
+
+SYM.USRLIB64= \
+ $($(MACH64)_SYM.USRLIB64) \
+ /lib/$(MACH64)/libthread_db.so \
+ /lib/$(MACH64)/libthread_db.so.1 \
+ /usr/lib/$(MACH64)/ld.so.1 \
+ /usr/lib/$(MACH64)/libadm.so \
+ /usr/lib/$(MACH64)/libadm.so.1 \
+ /usr/lib/$(MACH64)/libaio.so \
+ /usr/lib/$(MACH64)/libaio.so.1 \
+ /usr/lib/$(MACH64)/libavl.so \
+ /usr/lib/$(MACH64)/libavl.so.1 \
+ /usr/lib/$(MACH64)/libbsm.so \
+ /usr/lib/$(MACH64)/libbsm.so.1 \
+ /usr/lib/$(MACH64)/libc.so \
+ /usr/lib/$(MACH64)/libc.so.1 \
+ /usr/lib/$(MACH64)/libc_db.so \
+ /usr/lib/$(MACH64)/libc_db.so.1 \
+ /usr/lib/$(MACH64)/libcmd.so \
+ /usr/lib/$(MACH64)/libcmd.so.1 \
+ /usr/lib/$(MACH64)/libcmdutils.so \
+ /usr/lib/$(MACH64)/libcmdutils.so.1 \
+ /usr/lib/$(MACH64)/libcontract.so \
+ /usr/lib/$(MACH64)/libcontract.so.1 \
+ /usr/lib/$(MACH64)/libctf.so \
+ /usr/lib/$(MACH64)/libctf.so.1 \
+ /usr/lib/$(MACH64)/libcurses.so \
+ /usr/lib/$(MACH64)/libcurses.so.1 \
+ /usr/lib/$(MACH64)/libdevice.so \
+ /usr/lib/$(MACH64)/libdevice.so.1 \
+ /usr/lib/$(MACH64)/libdevid.so \
+ /usr/lib/$(MACH64)/libdevid.so.1 \
+ /usr/lib/$(MACH64)/libdevinfo.so \
+ /usr/lib/$(MACH64)/libdevinfo.so.1 \
+ /usr/lib/$(MACH64)/libdl.so \
+ /usr/lib/$(MACH64)/libdl.so.1 \
+ /usr/lib/$(MACH64)/libdoor.so \
+ /usr/lib/$(MACH64)/libdoor.so.1 \
+ /usr/lib/$(MACH64)/libefi.so \
+ /usr/lib/$(MACH64)/libefi.so.1 \
+ /usr/lib/$(MACH64)/libelf.so \
+ /usr/lib/$(MACH64)/libelf.so.1 \
+ /usr/lib/$(MACH64)/libgen.so \
+ /usr/lib/$(MACH64)/libgen.so.1 \
+ /usr/lib/$(MACH64)/libinetutil.so \
+ /usr/lib/$(MACH64)/libinetutil.so.1 \
+ /usr/lib/$(MACH64)/libintl.so \
+ /usr/lib/$(MACH64)/libintl.so.1 \
+ /usr/lib/$(MACH64)/libkstat.so \
+ /usr/lib/$(MACH64)/libkstat.so.1 \
+ /usr/lib/$(MACH64)/libld.so.2 \
+ /usr/lib/$(MACH64)/libld.so.3 \
+ /usr/lib/$(MACH64)/liblddbg.so.4 \
+ /usr/lib/$(MACH64)/libmd5.so \
+ /usr/lib/$(MACH64)/libmd5.so.1 \
+ /usr/lib/$(MACH64)/libmp.so \
+ /usr/lib/$(MACH64)/libmp.so.2 \
+ /usr/lib/$(MACH64)/libnsl.so \
+ /usr/lib/$(MACH64)/libnsl.so.1 \
+ /usr/lib/$(MACH64)/libnvpair.so \
+ /usr/lib/$(MACH64)/libnvpair.so.1 \
+ /usr/lib/$(MACH64)/libpam.so \
+ /usr/lib/$(MACH64)/libpam.so.1 \
+ /usr/lib/$(MACH64)/libposix4.so \
+ /usr/lib/$(MACH64)/libposix4.so.1 \
+ /usr/lib/$(MACH64)/libproc.so \
+ /usr/lib/$(MACH64)/libproc.so.1 \
+ /usr/lib/$(MACH64)/libpthread.so \
+ /usr/lib/$(MACH64)/libpthread.so.1 \
+ /usr/lib/$(MACH64)/libresolv.so \
+ /usr/lib/$(MACH64)/libresolv.so.2 \
+ /usr/lib/$(MACH64)/librestart.so \
+ /usr/lib/$(MACH64)/librestart.so.1 \
+ /usr/lib/$(MACH64)/librpcsvc.so \
+ /usr/lib/$(MACH64)/librpcsvc.so.1 \
+ /usr/lib/$(MACH64)/librt.so \
+ /usr/lib/$(MACH64)/librt.so.1 \
+ /usr/lib/$(MACH64)/librtld.so.1 \
+ /usr/lib/$(MACH64)/librtld_db.so \
+ /usr/lib/$(MACH64)/librtld_db.so.1 \
+ /usr/lib/$(MACH64)/libscf.so \
+ /usr/lib/$(MACH64)/libscf.so.1 \
+ /usr/lib/$(MACH64)/libsec.so \
+ /usr/lib/$(MACH64)/libsec.so.1 \
+ /usr/lib/$(MACH64)/libsecdb.so \
+ /usr/lib/$(MACH64)/libsecdb.so.1 \
+ /usr/lib/$(MACH64)/libsendfile.so \
+ /usr/lib/$(MACH64)/libsendfile.so.1 \
+ /usr/lib/$(MACH64)/libsocket.so \
+ /usr/lib/$(MACH64)/libsocket.so.1 \
+ /usr/lib/$(MACH64)/libsysevent.so \
+ /usr/lib/$(MACH64)/libsysevent.so.1 \
+ /usr/lib/$(MACH64)/libtermcap.so \
+ /usr/lib/$(MACH64)/libtermcap.so.1 \
+ /usr/lib/$(MACH64)/libtermlib.so \
+ /usr/lib/$(MACH64)/libtermlib.so.1 \
+ /usr/lib/$(MACH64)/libthread.so \
+ /usr/lib/$(MACH64)/libthread.so.1 \
+ /usr/lib/$(MACH64)/libthread_db.so \
+ /usr/lib/$(MACH64)/libthread_db.so.1 \
+ /usr/lib/$(MACH64)/libumem.so \
+ /usr/lib/$(MACH64)/libumem.so.1 \
+ /usr/lib/$(MACH64)/libuuid.so \
+ /usr/lib/$(MACH64)/libuuid.so.1 \
+ /usr/lib/$(MACH64)/libuutil.so \
+ /usr/lib/$(MACH64)/libuutil.so.1 \
+ /usr/lib/$(MACH64)/libw.so \
+ /usr/lib/$(MACH64)/libw.so.1 \
+ /usr/lib/$(MACH64)/libxnet.so \
+ /usr/lib/$(MACH64)/libxnet.so.1 \
+ /usr/lib/$(MACH64)/llib-ladm.ln \
+ /usr/lib/$(MACH64)/llib-laio.ln \
+ /usr/lib/$(MACH64)/llib-lavl.ln \
+ /usr/lib/$(MACH64)/llib-lbsm.ln \
+ /usr/lib/$(MACH64)/llib-lc.ln \
+ /usr/lib/$(MACH64)/llib-lcmd.ln \
+ /usr/lib/$(MACH64)/llib-lcmdutils.ln \
+ /usr/lib/$(MACH64)/llib-lcontract.ln \
+ /usr/lib/$(MACH64)/llib-lctf.ln \
+ /usr/lib/$(MACH64)/llib-lcurses \
+ /usr/lib/$(MACH64)/llib-lcurses.ln \
+ /usr/lib/$(MACH64)/llib-ldevice.ln \
+ /usr/lib/$(MACH64)/llib-ldevid.ln \
+ /usr/lib/$(MACH64)/llib-ldevinfo.ln \
+ /usr/lib/$(MACH64)/llib-ldl.ln \
+ /usr/lib/$(MACH64)/llib-ldoor.ln \
+ /usr/lib/$(MACH64)/llib-lefi.ln \
+ /usr/lib/$(MACH64)/llib-lelf.ln \
+ /usr/lib/$(MACH64)/llib-lgen.ln \
+ /usr/lib/$(MACH64)/llib-linetutil.ln \
+ /usr/lib/$(MACH64)/llib-lintl.ln \
+ /usr/lib/$(MACH64)/llib-lkstat.ln \
+ /usr/lib/$(MACH64)/llib-lmd5.ln \
+ /usr/lib/$(MACH64)/llib-lnsl.ln \
+ /usr/lib/$(MACH64)/llib-lnvpair.ln \
+ /usr/lib/$(MACH64)/llib-lpam.ln \
+ /usr/lib/$(MACH64)/llib-lposix4.ln \
+ /usr/lib/$(MACH64)/llib-lpthread.ln \
+ /usr/lib/$(MACH64)/llib-lresolv.ln \
+ /usr/lib/$(MACH64)/llib-lrt.ln \
+ /usr/lib/$(MACH64)/llib-lrtld_db.ln \
+ /usr/lib/$(MACH64)/llib-lscf.ln \
+ /usr/lib/$(MACH64)/llib-lsec.ln \
+ /usr/lib/$(MACH64)/llib-lsecdb.ln \
+ /usr/lib/$(MACH64)/llib-lsendfile.ln \
+ /usr/lib/$(MACH64)/llib-lsocket.ln \
+ /usr/lib/$(MACH64)/llib-lsysevent.ln \
+ /usr/lib/$(MACH64)/llib-ltermcap \
+ /usr/lib/$(MACH64)/llib-ltermcap.ln \
+ /usr/lib/$(MACH64)/llib-ltermlib \
+ /usr/lib/$(MACH64)/llib-ltermlib.ln \
+ /usr/lib/$(MACH64)/llib-lthread.ln \
+ /usr/lib/$(MACH64)/llib-lthread_db.ln \
+ /usr/lib/$(MACH64)/llib-lumem.ln \
+ /usr/lib/$(MACH64)/llib-luuid.ln \
+ /usr/lib/$(MACH64)/llib-lxnet.ln \
+ /usr/lib/$(MACH64)/nss_compat.so.1 \
+ /usr/lib/$(MACH64)/nss_dns.so.1 \
+ /usr/lib/$(MACH64)/nss_files.so.1 \
+ /usr/lib/$(MACH64)/nss_nis.so.1 \
+ /usr/lib/$(MACH64)/nss_nisplus.so.1 \
+ /usr/lib/$(MACH64)/nss_user.so.1 \
+ /usr/lib/libld.so.3
+
+$(SYM.USRLIB:%=$(ROOT)%):= \
+ INS.dir= -$(RM) $@; $(SYMLINK) $(REALPATH) $@; \
+ $(CHOWN) $(OWNER) $@; $(CHGRP) $(GROUP) $@
+
+$(SYM.USRLIB64:%=$(ROOT)%):= \
+ INS.dir= -$(RM) $@; $(SYMLINK) $(REALPATH) $@; \
+ $(CHOWN) $(OWNER) $@; $(CHGRP) $(GROUP) $@
+
diff --git a/usr/src/cmd/Adm/.proto b/usr/src/cmd/Adm/.proto
new file mode 100644
index 0000000..2e3929d
--- /dev/null
+++ b/usr/src/cmd/Adm/.proto
@@ -0,0 +1,28 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.2 */
+cd $d
+umask $m
+$<
diff --git a/usr/src/cmd/Adm/Makefile b/usr/src/cmd/Adm/Makefile
new file mode 100644
index 0000000..571fdc9
--- /dev/null
+++ b/usr/src/cmd/Adm/Makefile
@@ -0,0 +1,91 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+CRON_ENT= adm root sys
+CRON_LIB= .proto at.deny cron.deny queuedefs
+ETC_SCRIPT= group project ttysrch
+ZI_SPECIAL= zones-index
+SUBDIRS= sun
+
+include ../Makefile.cmd
+
+all:= TARGET= all
+install:= TARGET= install
+clean:= TARGET= clean
+clobber:= TARGET= clobber
+lint:= TARGET= lint
+
+CROND= $(ROOT)/var/spool/cron
+CRONTABD= $(ROOT)/var/spool/cron/crontabs
+CRONLIBD= $(ROOT)/etc/cron.d
+ETCZONESD= $(ROOT)/etc/zones
+DIRS= $(CROND) $(CRONTABD) $(CRONLIBD)
+
+CRONTABS= $(CRON_ENT:%=$(CRONTABD)/%)
+CRONLIBS= $(CRON_LIB:%=$(CRONLIBD)/%)
+ETCSCRIPTS= $(ETC_SCRIPT:%=$(ROOTETC)/%)
+ZISPECIALS= $(ETCZONESD)/index
+
+FILEMODE= 0644
+GROUP= sys
+
+$(CRONLIBD)/.proto := FILEMODE = 0744
+$(CRONTABD)/adm := FILEMODE = 0600
+$(CRONTABD)/sys := FILEMODE = 0600
+$(CRONTABD)/root := FILEMODE = 0600
+
+.KEEP_STATE:
+
+all: $(CRON_ENT) $(CRON_LIB) $(ETC_SCRIPT) $(SUBDIRS)
+
+install: all $(DIRS) $(CRONTABS) $(CRONLIBS) $(ETCSCRIPTS) $(ETCZONESD) \
+ $(SUBDIRS)
+
+$(CRONTABD)/% : %
+ $(INS.file)
+
+$(CRONLIBD)/% : %
+ $(INS.file)
+
+$(ETCZONESD): $(ZI_SPECIAL)
+ $(CP) -f $(ZI_SPECIAL) $(ZISPECIALS)
+ $(CHMOD) $(FILEMODE) $(ZISPECIALS)
+
+$(SUBDIRS): FRC
+ @cd $@; pwd; $(MAKE) $(MFLAGS) $(TARGET)
+
+$(DIRS):
+ $(INS.dir)
+
+FRC:
+
+clean:
+
+lint:
+
+clobber:
diff --git a/usr/src/cmd/Adm/adm b/usr/src/cmd/Adm/adm
new file mode 100644
index 0000000..7b87b41
--- /dev/null
+++ b/usr/src/cmd/Adm/adm
@@ -0,0 +1,26 @@
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.2 */
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# The adm crontab file should contain startup of performance collection if
+# the profiling and performance feature has been installed.
+#
diff --git a/usr/src/cmd/Adm/at.deny b/usr/src/cmd/Adm/at.deny
new file mode 100644
index 0000000..dda982d
--- /dev/null
+++ b/usr/src/cmd/Adm/at.deny
@@ -0,0 +1,3 @@
+daemon
+bin
+nuucp
diff --git a/usr/src/cmd/Adm/cron.deny b/usr/src/cmd/Adm/cron.deny
new file mode 100644
index 0000000..dda982d
--- /dev/null
+++ b/usr/src/cmd/Adm/cron.deny
@@ -0,0 +1,3 @@
+daemon
+bin
+nuucp
diff --git a/usr/src/cmd/Adm/group b/usr/src/cmd/Adm/group
new file mode 100644
index 0000000..20e9789
--- /dev/null
+++ b/usr/src/cmd/Adm/group
@@ -0,0 +1,19 @@
+root::0:
+other::1:root
+bin::2:root,daemon
+sys::3:root,bin,adm
+adm::4:root,daemon
+uucp::5:root
+mail::6:root
+tty::7:root,adm
+lp::8:root,adm
+nuucp::9:root
+staff::10:
+daemon::12:root
+sysadmin::14:
+smmsp::25:
+gdm::50:
+webservd::80:
+nobody::60001:
+noaccess::60002:
+nogroup::65534:
diff --git a/usr/src/cmd/Adm/project b/usr/src/cmd/Adm/project
new file mode 100644
index 0000000..615f5de
--- /dev/null
+++ b/usr/src/cmd/Adm/project
@@ -0,0 +1,5 @@
+system:0::::
+user.root:1::::
+noproject:2::::
+default:3::::
+group.staff:10::::
diff --git a/usr/src/cmd/Adm/queuedefs b/usr/src/cmd/Adm/queuedefs
new file mode 100644
index 0000000..05c95b0
--- /dev/null
+++ b/usr/src/cmd/Adm/queuedefs
@@ -0,0 +1,2 @@
+a.4j1n
+b.2j2n90w
diff --git a/usr/src/cmd/Adm/root b/usr/src/cmd/Adm/root
new file mode 100644
index 0000000..aaa964d
--- /dev/null
+++ b/usr/src/cmd/Adm/root
@@ -0,0 +1,32 @@
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# The root crontab should be used to perform accounting data collection.
+#
+#
+10 3 * * * /usr/sbin/logadm
+15 3 * * 0 /usr/lib/fs/nfs/nfsfind
+30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
diff --git a/usr/src/cmd/Adm/sun/Makefile b/usr/src/cmd/Adm/sun/Makefile
new file mode 100644
index 0000000..017f4ff
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/Makefile
@@ -0,0 +1,69 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1989, 1995, 1997 by Sun Microsystems, Inc.
+# All Rights Reserved
+#
+
+ETCFILES= ioctl.syscon passwd shadow motd
+KVMFILES= README
+
+include ../../Makefile.cmd
+
+ROOTETCFILES= $(ETCFILES:%=$(ROOTETC)/%)
+ROOTUSRKVMFILES= $(KVMFILES:%=$(ROOTUSRKVM)/%)
+
+FILEMODE= 0644
+OWNER= root
+GROUP= sys
+
+$(ROOTETC)/shadow := FILEMODE = 400
+
+.KEEP_STATE:
+
+all: $(ETCFILES) $(KVMFILES)
+
+install: all $(ROOTETCFILES) $(ROOTUSRKVMFILES)
+
+clean:
+
+lint:
+
+clobber:
+
+motd: FRC
+ @-$(ECHO) "rebuilding motd"
+ @$(RELEASE_BUILD)-$(ECHO) "Sun Microsystems Inc.\tSunOS $(RELEASE)\t$(VERSION)\t$(RELEASE_DATE)" > motd
+ @$(NOT_RELEASE_BUILD)-$(ECHO) "Sun Microsystems Inc.\tSunOS $(RELEASE)\t$(VERSION)\t`date +'%h. %d, %Y'`" > motd
+ @$(NOT_RELEASE_BUILD)-$(ECHO) $(DEV_CM) | sed -e "s/@(#)//" >> motd
+ @-$(CAT) release_info >> motd
+
+clean:
+
+lint:
+
+clobber:
+ $(RM) motd
+
+FRC:
diff --git a/usr/src/cmd/Adm/sun/README b/usr/src/cmd/Adm/sun/README
new file mode 100644
index 0000000..f333944
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/README
@@ -0,0 +1,87 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+Elimination of /usr/kvm
+=======================
+
+Copyright (c) 1995-2000 by Sun Microsystems, Inc.
+All rights reserved.
+
+#ident "%Z%%M% %I% %E% SMI"
+
+As of Solaris 2.5, the /usr/kvm directory is no longer needed by the
+operating environment. The mount point continues to be provided for
+backward compatibility although all of the contents have been removed.
+
+In earlier releases, /usr/kvm contained the platform specific implementations
+of programs and libraries. The interface to these platform specific
+implementations was generally advertized to be in a platform independent
+directory and a symbolic link was used to bind the advertized platform
+independent interface to the platform specific implementation in /usr/kvm.
+
+Implementation Interface(s)
+
+/usr/kvm/adb /usr/bin/adb
+
+/usr/kvm/arch /usr/ucb/arch
+
+ Note: Source Compatibility Package Component
+
+/usr/kvm/crash /usr/bin/mdb
+
+ Note: Solaris Modular Debugger Guide describes how to
+ transition from crash(1M) to mdb(1).
+
+/usr/kvm/eeprom /usr/sbin/eeprom
+
+/usr/kvm/i286,i386,i486,i860,i86pc,iAPX286,m68k,mc68000,mc68010,mc68020,
+ mc68030,mc68040,sparc,sun,sun2,sun3,sun3x,sun4,sun4c,sun4d,sun4e,
+ sun4m,u370,u3b,u3b15,u3b2,u3b5,vax
+ /usr/bin/i286,i386,i486,i860,i86pc,iAPX286,m68k,
+ mc68000,mc68010,mc68020,mc68030,mc68040,sparc,sun,
+ sun2,sun3,sun3x,sun4,sun4c,sun4d,sun4e,sun4m,u370,
+ u3b,u3b15,u3b2,u3b5,vax
+
+ Note: These are documented on the machid(1) manual
+ page. These are fully deprecated interfaces.
+
+/usr/kvm/libkvm.a /usr/lib/libkvm.a
+
+ Note: /usr/lib/libkvm.a is no longer a component
+ of SunOS.
+
+/usr/kvm/libkvm.so.1 /usr/lib/libkvm.so.1
+/usr/kvm/libkvm.so /usr/lib/libkvm.so
+
+
+The following platform specific objects were also delivered in previous
+releases of SunOS. They are only of use with specific platforms and
+it was always documented that the path to these objects was uncommitted.
+
+2.4 (and earlier) 2.5
+
+/usr/kvm/cg14config /usr/platform/sun4m/sbin/cg14config sun4m only
+
+/usr/kvm/sxconfig /usr/platform/sun4m/sbin/sxconfig sun4m only
+
+/usr/kvm/prtdiag /usr/platform/sun4d/sbin/prtdiag sun4d only
+
diff --git a/usr/src/cmd/Adm/sun/ioctl.syscon b/usr/src/cmd/Adm/sun/ioctl.syscon
new file mode 100644
index 0000000..bf38cc8
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/ioctl.syscon
@@ -0,0 +1 @@
+2502:1805:bd:8a3b:0:3:1c:7f:15:4:0:0:0
diff --git a/usr/src/cmd/Adm/sun/passwd b/usr/src/cmd/Adm/sun/passwd
new file mode 100644
index 0000000..588dbd6
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/passwd
@@ -0,0 +1,15 @@
+root:x:0:0:Super-User:/:/sbin/sh
+daemon:x:1:1::/:
+bin:x:2:2::/usr/bin:
+sys:x:3:3::/:
+adm:x:4:4:Admin:/var/adm:
+lp:x:71:8:Line Printer Admin:/usr/spool/lp:
+uucp:x:5:5:uucp Admin:/usr/lib/uucp:
+nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
+smmsp:x:25:25:SendMail Message Submission Program:/:
+listen:x:37:4:Network Admin:/usr/net/nls:
+gdm:x:50:50:GDM Reserved UID:/:
+webservd:x:80:80:WebServer Reserved UID:/:
+nobody:x:60001:60001:NFS Anonymous Access User:/:
+noaccess:x:60002:60002:No Access User:/:
+nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:
diff --git a/usr/src/cmd/Adm/sun/release_info b/usr/src/cmd/Adm/sun/release_info
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/release_info
diff --git a/usr/src/cmd/Adm/sun/shadow b/usr/src/cmd/Adm/sun/shadow
new file mode 100644
index 0000000..8c2c3de
--- /dev/null
+++ b/usr/src/cmd/Adm/sun/shadow
@@ -0,0 +1,15 @@
+root::6445::::::
+daemon:NP:6445::::::
+bin:NP:6445::::::
+sys:NP:6445::::::
+adm:NP:6445::::::
+lp:NP:6445::::::
+uucp:NP:6445::::::
+nuucp:NP:6445::::::
+smmsp:NP:6445::::::
+listen:*LK*:::::::
+gdm:*LK*:::::::
+webservd:*LK*:::::::
+nobody:*LK*:6445::::::
+noaccess:*LK*:6445::::::
+nobody4:*LK*:6445::::::
diff --git a/usr/src/cmd/Adm/sys b/usr/src/cmd/Adm/sys
new file mode 100644
index 0000000..c258c7d
--- /dev/null
+++ b/usr/src/cmd/Adm/sys
@@ -0,0 +1,26 @@
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.2 */
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# The sys crontab should be used to do performance collection. See cron
+# and performance manual pages for details on startup.
+#
diff --git a/usr/src/cmd/Adm/ttysrch b/usr/src/cmd/Adm/ttysrch
new file mode 100644
index 0000000..ef3bd2e
--- /dev/null
+++ b/usr/src/cmd/Adm/ttysrch
@@ -0,0 +1,60 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# This file is used by ttyname(3C) to minimize search time
+# during attempts to determine the name of a terminal device.
+#
+# This is done by providing the names of directories which
+# are most likely to contain device entries for terminal
+# devices. These directories will be searched in the order
+# listed prior to an exhaustive search of the rest of /dev.
+#
+# Each line contains the name of a directory (which must
+# begin with "/dev") and (optionally) a set of flags which
+# modify the criteria used to determine a match. By default,
+# an exact match requires that the major/minor device number
+# (the M flag), the file system identifier (the F flag), and
+# the inode number (the I flag) all match. Normally, a partial
+# match on the major/minor device and the file system identifier
+# is accepted only after exhausting all entries under /dev.
+# By specifying only the M and F flags, an exact match will
+# be accepted regardless of the value of the inode number as
+# soon as it is found. This is especially useful for cloned
+# devices, which generally will not match inode numbers.
+#
+# For additional information see ttysrch(4).
+#
+# EXAMPLE:
+#
+# /dev/slan MF
+#
+# This would improve performance for Starlan network connections
+# if all Starlan network clone device entries were contained
+# in the /dev/slan directory.
+#
+/dev/pts
+/dev/term
+/dev/zcons
diff --git a/usr/src/cmd/Adm/zones-index b/usr/src/cmd/Adm/zones-index
new file mode 100644
index 0000000..91fe7a9
--- /dev/null
+++ b/usr/src/cmd/Adm/zones-index
@@ -0,0 +1,29 @@
+# ident "%Z%%M% %I% %E% SMI"
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# DO NOT EDIT: this file is automatically generated by zoneadm(1M)
+# and zonecfg(1M). Any manual changes will be lost.
+#
+global:installed:/
diff --git a/usr/src/cmd/Makefile b/usr/src/cmd/Makefile
new file mode 100644
index 0000000..5b89a04
--- /dev/null
+++ b/usr/src/cmd/Makefile
@@ -0,0 +1,832 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+
+include ../Makefile.master
+
+#
+# Note that the commands 'agents', 'lp', 'perl', and 'man' are first in
+# the list, violating alphabetical order. This is because they are very
+# long-running and should be given the most wall-clock time for a
+# parallel build.
+#
+# Commands in the FIRST_SUBDIRS list are built before starting the build
+# of other commands. Currently this includes only 'isaexec' and
+# 'platexec'. This is necessary because $(ROOT)/usr/lib/isaexec or
+# $(ROOT)/usr/lib/platexec must exist when some other commands are built
+# because their 'make install' creates a hard link to one of them.
+#
+# Commands are listed one per line so that TeamWare can auto-merge most
+# changes.
+#
+
+FIRST_SUBDIRS= \
+ isaexec \
+ platexec
+
+COMMON_SUBDIRS= \
+ agents \
+ lp \
+ perl \
+ man \
+ Adm \
+ abi \
+ adbgen \
+ acct \
+ acctadm \
+ arch \
+ asa \
+ aset \
+ audio \
+ auths \
+ autopush \
+ awk \
+ awk_xpg4 \
+ backup \
+ banner \
+ bart \
+ basename \
+ bc \
+ bdiff \
+ bfs \
+ bnu \
+ boot \
+ busstat \
+ cal \
+ calendar \
+ captoinfo \
+ cat \
+ cdrw \
+ cfgadm \
+ checkeq \
+ checknr \
+ chgrp \
+ chmod \
+ chown \
+ chroot \
+ cksum \
+ clear \
+ clinfo \
+ cmd-crypto \
+ cmd-inet \
+ cmp \
+ col \
+ comm \
+ compress \
+ consadm \
+ coreadm \
+ cpio \
+ cpc \
+ cron \
+ crypt \
+ csh \
+ csplit \
+ ctrun \
+ ctstat \
+ ctwatch \
+ cut \
+ datadm \
+ date \
+ dc \
+ dd \
+ deroff \
+ des \
+ devfsadm \
+ syseventd \
+ devctl \
+ devinfo \
+ devmgmt \
+ dfs.cmds \
+ diff \
+ diff3 \
+ diffmk \
+ dircmp \
+ dirname \
+ diskmgtd \
+ dispadmin \
+ dladm \
+ dmesg \
+ dodatadm \
+ dtrace \
+ du \
+ dumpadm \
+ dumpcs \
+ echo \
+ ed \
+ eeprom \
+ egrep \
+ enhance \
+ env \
+ eqn \
+ expand \
+ expr \
+ exstr \
+ face \
+ factor \
+ false \
+ fdetach \
+ fdformat \
+ fdisk \
+ filesync \
+ fgrep \
+ file \
+ find \
+ fm \
+ fmli \
+ fmt \
+ fmthard \
+ fmtmsg \
+ fold \
+ format \
+ fs.d \
+ fstyp \
+ fuser \
+ gcore \
+ gencat \
+ geniconvtbl \
+ genmsg \
+ getconf \
+ getdevpolicy \
+ getent \
+ getfacl \
+ getmajor \
+ getopt \
+ gettext \
+ gettxt \
+ graph \
+ grep \
+ grep_xpg4 \
+ groups \
+ grpck \
+ gss \
+ halt \
+ head \
+ hostid \
+ hostname \
+ iconv \
+ id \
+ infocmp \
+ init \
+ initpkg \
+ install.d \
+ intrstat \
+ ipcrm \
+ ipcs \
+ ipf \
+ isainfo \
+ isalist \
+ java \
+ join \
+ kbd \
+ keyserv \
+ killall \
+ krb5 \
+ ksh \
+ kstat \
+ last \
+ lastcomm \
+ ldap \
+ ldapcachemgr \
+ line \
+ link \
+ listen \
+ llc2 \
+ loadkeys \
+ locale \
+ localedef \
+ lockstat \
+ locator \
+ lofiadm \
+ logadm \
+ logger \
+ login \
+ logins \
+ logname \
+ look \
+ ls \
+ lvm \
+ mach \
+ machid \
+ mail \
+ mailx \
+ makekey \
+ mdb \
+ mesg \
+ mkdir \
+ mkfifo \
+ mkfile \
+ mkmsgs \
+ mknod \
+ mkpwdict \
+ mktemp \
+ modload \
+ more \
+ more_xpg4 \
+ msgfmt \
+ msgid \
+ mt \
+ mv \
+ mvdir \
+ netadm \
+ netfiles \
+ newform \
+ newgrp \
+ news \
+ newtask \
+ nice \
+ nispasswd \
+ nl \
+ nlsadmin \
+ nohup \
+ nsadmin \
+ nscd \
+ oamuser \
+ oawk \
+ od \
+ openssl \
+ pack \
+ pagesize \
+ passmgmt \
+ passwd \
+ paste \
+ patch \
+ pathchk \
+ pax \
+ pbind \
+ pcitool \
+ pcmciad \
+ pfexec \
+ pgrep \
+ picl \
+ plimit \
+ pools \
+ power \
+ ppgsz \
+ pg \
+ plockstat \
+ pr \
+ prctl \
+ print \
+ printf \
+ priocntl \
+ profiles \
+ projadd \
+ projects \
+ prstat \
+ prtconf \
+ prtdiag \
+ prtvtoc \
+ ps \
+ psradm \
+ psrinfo \
+ psrset \
+ pt_chmod \
+ ptools \
+ pwck \
+ pwconv \
+ pwd \
+ raidctl \
+ ramdiskadm \
+ rcap \
+ rcm_daemon \
+ rctladm \
+ refer \
+ regcmp \
+ renice \
+ rexd \
+ rm \
+ rmdir \
+ rmformat \
+ rmt \
+ roles \
+ rpcbind \
+ rpcgen \
+ rpcinfo \
+ rpcsvc \
+ rpld \
+ runat \
+ sa \
+ saf \
+ savecore \
+ script \
+ sdiff \
+ sed \
+ sed_xpg4 \
+ sendmail \
+ setfacl \
+ setmnt \
+ setpgrp \
+ setuname \
+ sgs \
+ sh \
+ sleep \
+ smartcard \
+ smserverd \
+ soelim \
+ sort \
+ spell \
+ spline \
+ split \
+ srchtxt \
+ ssh \
+ stat \
+ streams \
+ strings \
+ su \
+ sulogin \
+ sum \
+ sunpc \
+ svc \
+ swap \
+ sync \
+ sysdef \
+ syseventadm \
+ syslogd \
+ tabs \
+ tail \
+ tar \
+ tbl \
+ tcopy \
+ tcpd \
+ tee \
+ terminfo \
+ th_tools \
+ tic \
+ time \
+ tip \
+ tnf \
+ touch \
+ tplot \
+ tput \
+ tr \
+ tr_xpg4 \
+ trapstat \
+ troff \
+ true \
+ truss \
+ tty \
+ ttymon \
+ uadmin \
+ ul \
+ uname \
+ uniq \
+ units \
+ unlink \
+ unpack \
+ users \
+ utmp_update \
+ utmpd \
+ valtools \
+ vgrind \
+ vi \
+ volmgt \
+ w \
+ wall \
+ wbem \
+ wc \
+ which \
+ who \
+ whodo \
+ wracct \
+ write \
+ xntpd \
+ xargs \
+ xstr \
+ yes \
+ ypcmd \
+ yppasswd \
+ zdump \
+ zic \
+ zlogin \
+ zoneadm \
+ zoneadmd \
+ zonecfg \
+ zonename
+
+i386_SUBDIRS= \
+ addbadsec \
+ biosdev \
+ diskscan \
+ OWconfig \
+ rtc
+
+sparc_SUBDIRS= \
+ cvcd \
+ dcs \
+ fruadm \
+ mtst \
+ prtfru \
+ scadm \
+ sckmd \
+ sf880drd \
+ stmsboot \
+ wrsmconf \
+ wrsmstat
+
+#
+# Commands that are messaged. Note that 'lp' and 'man' come first
+# (see previous comment about 'lp' and 'man').
+#
+MSGSUBDIRS= \
+ lp \
+ man \
+ abi \
+ acctadm \
+ allocate \
+ asa \
+ audio \
+ audit \
+ auditd \
+ auths \
+ autopush \
+ awk \
+ awk_xpg4 \
+ backup \
+ banner \
+ bart \
+ basename \
+ bnu \
+ bsmconv \
+ bsmrecord \
+ bsmunconv \
+ busstat \
+ cal \
+ cat \
+ cdrw \
+ cfgadm \
+ checkeq \
+ checknr \
+ chgrp \
+ chmod \
+ chown \
+ cksum \
+ cmd-crypto \
+ cmd-inet \
+ cmp \
+ col \
+ comm \
+ compress \
+ consadm \
+ coreadm \
+ cpio \
+ cpc \
+ cron \
+ csh \
+ csplit \
+ ctrun \
+ ctstat \
+ ctwatch \
+ cut \
+ datadm \
+ date \
+ dc \
+ dcs \
+ dd \
+ deroff \
+ devfsadm \
+ diff \
+ diffmk \
+ dladm \
+ du \
+ dumpcs \
+ ed \
+ env \
+ eqn \
+ expand \
+ expr \
+ fgrep \
+ file \
+ filesync \
+ find \
+ fm \
+ fold \
+ fs.d \
+ geniconvtbl \
+ genmsg \
+ getconf \
+ getent \
+ gettext \
+ gettxt \
+ grep \
+ grep_xpg4 \
+ grpck \
+ gss \
+ halt \
+ head \
+ hostname \
+ iconv \
+ id \
+ isaexec \
+ join \
+ krb5 \
+ ksh \
+ kstat \
+ last \
+ ldap \
+ ldapcachemgr \
+ llc2 \
+ locale \
+ localedef \
+ lofiadm \
+ logadm \
+ logger \
+ logins \
+ logname \
+ ls \
+ lvm \
+ mailx \
+ mesg \
+ mkdir \
+ mkpwdict \
+ mktemp \
+ more \
+ more_xpg4 \
+ msgfmt \
+ mv \
+ newgrp \
+ newtask \
+ nice \
+ nispasswd \
+ nohup \
+ oawk \
+ od \
+ pack \
+ passwd \
+ passmgmt \
+ paste \
+ patch \
+ pathchk \
+ pax \
+ pfexec \
+ pg \
+ pgrep \
+ picl \
+ pools \
+ power \
+ pr \
+ praudit \
+ print \
+ printf \
+ profiles \
+ projadd \
+ projects \
+ prstat \
+ prtdiag \
+ ps \
+ psrinfo \
+ pwconv \
+ pwd \
+ raidctl \
+ ramdiskadm \
+ rcap \
+ rcm_daemon \
+ refer \
+ regcmp \
+ renice \
+ roles \
+ rm \
+ rmdir \
+ rmformat \
+ scadm \
+ script \
+ sdiff \
+ sed \
+ sed_xpg4 \
+ sgs \
+ sh \
+ sleep \
+ sort \
+ split \
+ ssh \
+ strings \
+ su \
+ sum \
+ svc \
+ swap \
+ syseventadm \
+ syseventd \
+ tabs \
+ tail \
+ tar \
+ tbl \
+ tee \
+ time \
+ tnf \
+ touch \
+ tput \
+ tr \
+ tr_xpg4 \
+ troff \
+ tty \
+ ttymon \
+ ul \
+ uname \
+ uniq \
+ units \
+ unlink \
+ unpack \
+ valtools \
+ vgrind \
+ vi \
+ volmgt \
+ w \
+ wbem \
+ wc \
+ who \
+ whodo \
+ wracct \
+ write \
+ xargs \
+ yppasswd \
+ zdump \
+ zic \
+ zlogin \
+ zoneadm \
+ zoneadmd \
+ zonecfg \
+ zonename
+
+sparc_MSGSUBDIRS= \
+ fruadm \
+ prtfru \
+ stmsboot \
+ wrsmconf \
+ wrsmstat
+
+#
+# commands that use dcgettext for localized time, LC_TIME
+#
+DCSUBDIRS= \
+ cal \
+ cfgadm \
+ diff \
+ ls \
+ pax \
+ pr \
+ tar \
+ w \
+ who \
+ whodo \
+ write
+
+#
+# commands that belong only to the basic security module
+#
+BSMSUBDIRS= \
+ allocate \
+ amt \
+ audit \
+ audit_warn \
+ auditconfig \
+ auditd \
+ auditreduce \
+ auditstat \
+ dminfo \
+ praudit \
+ bsmconv \
+ bsmrecord \
+ bsmunconv
+
+#
+# commands not owned by the systems group
+#
+BWOSDIRS=
+
+#
+# Commands providing manifests must offer a check target. A recursive check
+# target across all commands directories is not currently provided.
+#
+MANIFEST_TOPDIRS= \
+ auditd \
+ bnu \
+ consadm \
+ coreadm \
+ cron \
+ cvcd \
+ dumpadm \
+ eeprom \
+ fm \
+ ipf \
+ keyserv \
+ ldapcachemgr \
+ nscd \
+ power \
+ rexd \
+ rpcbind \
+ rpcsvc \
+ saf \
+ sf880drd \
+ smserverd \
+ syseventd \
+ syslogd \
+ utmpd \
+ ypcmd \
+ zoneadmd
+
+MANIFEST_SUBDIRS= \
+ cmd-crypto/scripts \
+ cmd-inet/usr.lib/in.chargend \
+ cmd-inet/usr.lib/in.daytimed \
+ cmd-inet/usr.lib/in.dhcpd \
+ cmd-inet/usr.lib/in.discardd \
+ cmd-inet/usr.lib/in.echod \
+ cmd-inet/usr.lib/in.timed \
+ cmd-inet/usr.lib/inetd \
+ cmd-inet/usr.lib/slpd \
+ cmd-inet/usr.sbin \
+ cmd-inet/usr.sbin/in.ftpd \
+ cmd-inet/usr.sbin/in.talkd \
+ dcs/sparc/sun4u \
+ fs.d/autofs \
+ fs.d/cachefs \
+ fs.d/nfs/svc \
+ gss/gssd \
+ krb5/kadmin/server \
+ krb5/krb5kdc \
+ krb5/kwarn \
+ krb5/slave \
+ lp/cmd/lpsched \
+ lvm/rpc.metad \
+ lvm/rpc.metamedd \
+ lvm/rpc.metamhd \
+ lvm/md_monitord \
+ lvm/metassist/sysfiles \
+ lvm/util \
+ picl/picld \
+ print/gateway \
+ print/lp \
+ rcap/rcapd \
+ rpcsvc/rpc.bootparamd \
+ sendmail/lib \
+ smartcard/daemon \
+ ssh/etc \
+ svc/milestone \
+ ypcmd/yppasswd \
+ ypcmd/ypupdated \
+ xntpd/xntpd
+
+all := TARGET = all
+install := TARGET = install
+clean := TARGET = clean
+clobber := TARGET = clobber
+lint := TARGET = lint
+check := TARGET = check
+_msg := TARGET = _msg
+_dc := TARGET = _dc
+
+.KEEP_STATE:
+
+SUBDIRS = $(COMMON_SUBDIRS) $($(MACH)_SUBDIRS)
+
+.PARALLEL: $(BWOSDIRS) $(SUBDIRS) $(MSGSUBDIRS) $(BSMSUBDIRS) \
+ $(MANIFEST_SUBDIRS)
+
+all install clean clobber lint: $(FIRST_SUBDIRS) .WAIT $(SUBDIRS) $(BSMSUBDIRS)
+
+check: svccfg_check .WAIT $(MANIFEST_TOPDIRS) $(MANIFEST_SUBDIRS)
+
+svccfg_check:
+ @$(ECHO) "building requirements for svccfg check ..."; \
+ (cd $(SRC)/cmd/svc/svccfg && pwd && $(MAKE) $(MFLAGS) native)
+
+#
+# The .WAIT directive works around an apparent bug in parallel make.
+# Evidently make was getting the target _msg vs. _dc confused under
+# some level of parallelization, causing some of the _dc objects
+# not to be built.
+#
+_msg: $(MSGSUBDIRS) $($(MACH)_MSGSUBDIRS) .WAIT _dc
+
+_dc: $(DCSUBDIRS)
+
+$(FIRST_SUBDIRS) $(BWOSDIRS) $(SUBDIRS) $(BSMSUBDIRS) $(MANIFEST_SUBDIRS): FRC
+ @if [ -f $@/Makefile ]; then \
+ cd $@; pwd; $(MAKE) $(TARGET); \
+ else \
+ true; \
+ fi
+
+FRC:
diff --git a/usr/src/cmd/Makefile.cmd b/usr/src/cmd/Makefile.cmd
new file mode 100644
index 0000000..1d074eb
--- /dev/null
+++ b/usr/src/cmd/Makefile.cmd
@@ -0,0 +1,419 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Definitions common to command source.
+#
+# include global definitions; SRC should be defined in the shell.
+# SRC is needed until RFE 1026993 is implemented.
+
+include $(SRC)/Makefile.master
+
+LN= ln
+CP= cp
+SH= sh
+ECHO= echo
+MKDIR= mkdir
+TOUCH= touch
+
+FILEMODE= 0555
+LIBFILEMODE= 0444
+XPG4= $(XPG4PROG:%=%.xpg4)
+XPG6= $(XPG6PROG:%=%.xpg6)
+
+KRB5DIR= $(ROOT)/usr
+KRB5BIN= $(KRB5DIR)/bin
+KRB5SBIN= $(KRB5DIR)/sbin
+KRB5LIB= $(KRB5DIR)/lib/krb5
+KRB5RUNPATH= /usr/lib/krb5
+GSSRUNPATH= /usr/lib/gss
+
+
+ROOTBIN= $(ROOT)/usr/bin
+ROOTLIB= $(ROOT)/usr/lib
+ROOTLIBSVCBIN= $(ROOT)/lib/svc/bin
+ROOTLIBSVCMETHOD= $(ROOT)/lib/svc/method
+
+ROOTSHLIB= $(ROOT)/usr/share/lib
+ROOTSBIN= $(ROOT)/sbin
+ROOTUSRSBIN= $(ROOT)/usr/sbin
+ROOTETC= $(ROOT)/etc
+ROOTCCSBIN= $(ROOT)/usr/ccs/bin
+ROOTUSRKVM= $(ROOT)/usr/kvm
+ROOTXPG4= $(ROOT)/usr/xpg4
+ROOTXPG4BIN= $(ROOT)/usr/xpg4/bin
+ROOTXPG4BIN32= $(ROOTXPG4BIN)/$(MACH32)
+ROOTXPG4BIN64= $(ROOTXPG4BIN)/$(MACH64)
+ROOTXPG6= $(ROOT)/usr/xpg6
+ROOTXPG6BIN= $(ROOT)/usr/xpg6/bin
+ROOTLOCALEDEF= $(ROOT)/usr/lib/localedef
+ROOTCHARMAP= $(ROOTLOCALEDEF)/charmap
+ROOTI18NEXT= $(ROOTLOCALEDEF)/extensions
+ROOTI18NEXT64= $(ROOTLOCALEDEF)/extensions/$(MACH64)
+ROOTBIN32= $(ROOTBIN)/$(MACH32)
+ROOTBIN64= $(ROOTBIN)/$(MACH64)
+ROOTCMDDIR64= $(ROOTCMDDIR)/$(MACH64)
+ROOTLIB64= $(ROOTLIB)/$(MACH64)
+ROOTUSRSBIN32= $(ROOTUSRSBIN)/$(MACH32)
+ROOTUSRSBIN64= $(ROOTUSRSBIN)/$(MACH64)
+ROOTMAN1= $(ROOT)/usr/share/man/man1
+ROOTMAN1M= $(ROOT)/usr/share/man/man1m
+ROOTMAN3= $(ROOT)/usr/share/man/man3
+
+#
+
+# Like ROOTLIBDIR in $(SRC)/Makefile.lib, any lower-level Makefiles that
+# put their binaries in a non-standard location should reset this and use
+# $(ROOTCMD) in their `install' target. By default we set this to a bogus
+# value so that it will not conflict with any of the other values already
+# defined in this Makefile.
+#
+ROOTCMDDIR= $(ROOT)/__nonexistent_directory__
+
+ROOTSHAUDIO= $(ROOT)/usr/share/audio
+ROOTAUDIOSAMP= $(ROOTSHAUDIO)/samples
+ROOTAUDIOSAMPAU=$(ROOTAUDIOSAMP)/au
+
+#
+# Begin /usr/sfw freeware rules for freeware that has "External"
+# taxonomy stability level.
+#
+ROOTSFW= $(ROOT)/usr/sfw
+ROOTSFWBIN= $(ROOT)/usr/sfw/bin
+ROOTSFWSBIN= $(ROOT)/usr/sfw/sbin
+ROOTSFWSHARE= $(ROOT)/usr/sfw/share
+ROOTSFWSHSRC= $(ROOT)/usr/sfw/share/src
+ROOTSFWINFO= $(ROOT)/usr/sfw/share/info
+ROOTSFWINCLUDE= $(ROOT)/usr/sfw/include
+ROOTSFWLIB= $(ROOT)/usr/sfw/lib
+ROOTLIBEXEC= $(ROOT)/usr/sfw/libexec
+ROOTSFWMAN= $(ROOT)/usr/sfw/share/man
+ROOTSFWMANN= $(ROOT)/usr/sfw/share/mann
+ROOTSFWMAN1= $(ROOT)/usr/sfw/share/man/man1
+ROOTSFWMAN1M= $(ROOT)/usr/sfw/share/man/man1m
+ROOTSFWMAN3= $(ROOT)/usr/sfw/share/man/man3
+ROOTSFWMAN5= $(ROOT)/usr/sfw/share/man/man5
+ROOTSFWMAN7= $(ROOT)/usr/sfw/share/man/man7
+#
+# End /usr/sfw freeware rules
+#
+
+ISAEXEC= $(ROOT)/usr/lib/isaexec
+PLATEXEC= $(ROOT)/usr/lib/platexec
+
+NX_MAP_i386= $(SRC)/cmd/mapfile_noexdata
+NX_MAP_sparc=
+NX_MAP= $(NX_MAP_$(MACH))
+NES_MAPFILE= $(SRC)/cmd/mapfile_noexstk $(NX_MAP)
+
+LDLIBS = $(LDLIBS.cmd)
+
+LDFLAGS.cmd = \
+ $(STRIPFLAG) $(ENVLDFLAGS1) $(ENVLDFLAGS2) $(ENVLDFLAGS3) \
+ $(NES_MAPFILE:%=-M%) $(PGA_MAPFILE:%=-M%)
+
+LDFLAGS = $(LDFLAGS.cmd)
+
+LINTFLAGS= -axsm
+LINTFLAGS64= -axsm -Xarch=$(MACH64:sparcv9=v9)
+LINTOUT= lint.out
+
+KRB5PROG= $(PROG:%=$(KRB5BIN)/%)
+KRB5SBINPROG= $(PROG:%=$(KRB5SBIN)/%)
+KRB5LIBPROG= $(PROG:%=$(KRB5LIB)/%)
+
+ROOTPROG= $(PROG:%=$(ROOTBIN)/%)
+ROOTCMD= $(PROG:%=$(ROOTCMDDIR)/%)
+ROOTSHFILES= $(SHFILES:%=$(ROOTBIN)/%)
+ROOTLIBPROG= $(PROG:%=$(ROOTLIB)/%)
+ROOTLIBSHFILES= $(SHFILES:%=$(ROOTLIB)/%)
+ROOTSHLIBPROG= $(PROG:%=$(ROOTSHLIB)/%)
+ROOTSBINPROG= $(PROG:%=$(ROOTSBIN)/%)
+ROOTUSRSBINPROG=$(PROG:%=$(ROOTUSRSBIN)/%)
+ROOTETCPROG= $(PROG:%=$(ROOTETC)/%)
+ROOTCCSBINPROG= $(PROG:%=$(ROOTCCSBIN)/%)
+ROOTUSRKVMPROG= $(PROG:%=$(ROOTUSRKVM)/%)
+ROOTXPG4PROG= $(XPG4PROG:%=$(ROOTXPG4BIN)/%)
+ROOTXPG4PROG32= $(XPG4PROG:%=$(ROOTXPG4BIN32)/%)
+ROOTXPG4PROG64= $(XPG4PROG:%=$(ROOTXPG4BIN64)/%)
+ROOTXPG6PROG= $(XPG6PROG:%=$(ROOTXPG6BIN)/%)
+ROOTLOCALEPROG= $(PROG:%=$(ROOTLOCALEDEF)/%)
+ROOTPROG64= $(PROG:%=$(ROOTBIN64)/%)
+ROOTPROG32= $(PROG:%=$(ROOTBIN32)/%)
+ROOTCMD64= $(PROG:%=$(ROOTCMDDIR64)/%)
+ROOTUSRSBINPROG32= $(PROG:%=$(ROOTUSRSBIN32)/%)
+ROOTUSRSBINPROG64= $(PROG:%=$(ROOTUSRSBIN64)/%)
+ROOTMAN1FILES= $(MAN1FILES:%=$(ROOTMAN1)/%)
+$(ROOTMAN1FILES) := FILEMODE= 444
+$(ROOTMAN1FILES) := OWNER= root
+$(ROOTMAN1FILES) := GROUP= bin
+ROOTMAN1MFILES= $(MAN1MFILES:%=$(ROOTMAN1M)/%)
+$(ROOTMAN1MFILES) := FILEMODE= 444
+$(ROOTMAN1MFILES) := OWNER= root
+$(ROOTMAN1MFILES) := GROUP= bin
+ROOTMAN3FILES= $(MAN3FILES:%=$(ROOTMAN3)/%)
+$(ROOTMAN3FILES) := FILEMODE= 444
+$(ROOTMAN3FILES) := OWNER= root
+$(ROOTMAN3FILES) := GROUP= bin
+
+ROOTETCDEFAULT= $(ROOTETC)/default
+ROOTETCDEFAULTFILES= $(DEFAULTFILES:%=$(ROOTETCDEFAULT)/%)
+$(ROOTETCDEFAULTFILES) := OWNER = root
+$(ROOTETCDEFAULTFILES) := GROUP = sys
+$(ROOTETCDEFAULTFILES) := FILEMODE = 0444
+
+#
+# Directories for smf(5) service manifests and profiles.
+#
+ROOTVARSVC= $(ROOT)/var/svc
+
+ROOTVARSVCMANIFEST= $(ROOTVARSVC)/manifest
+ROOTVARSVCPROFILE= $(ROOTVARSVC)/profile
+
+ROOTSVCMILESTONE= $(ROOTVARSVCMANIFEST)/milestone
+ROOTSVCDEVICE= $(ROOTVARSVCMANIFEST)/device
+ROOTSVCSYSTEM= $(ROOTVARSVCMANIFEST)/system
+ROOTSVCSYSTEMDEVICE= $(ROOTSVCSYSTEM)/device
+ROOTSVCSYSTEMFILESYSTEM= $(ROOTSVCSYSTEM)/filesystem
+ROOTSVCSYSTEMSECURITY= $(ROOTSVCSYSTEM)/security
+ROOTSVCNETWORK= $(ROOTVARSVCMANIFEST)/network
+ROOTSVCNETWORKLDAP= $(ROOTSVCNETWORK)/ldap
+ROOTSVCNETWORKNFS= $(ROOTSVCNETWORK)/nfs
+ROOTSVCNETWORKNIS= $(ROOTSVCNETWORK)/nis
+ROOTSVCNETWORKRPC= $(ROOTSVCNETWORK)/rpc
+ROOTSVCNETWORKSECURITY= $(ROOTSVCNETWORK)/security
+ROOTSVCPLATFORM= $(ROOTVARSVCMANIFEST)/platform
+ROOTSVCPLATFORMI86PC= $(ROOTSVCPLATFORM)/i86pc
+ROOTSVCPLATFORMSUN4U= $(ROOTSVCPLATFORM)/sun4u
+ROOTSVCAPPLICATION= $(ROOTVARSVCMANIFEST)/application
+ROOTSVCAPPLICATIONMANAGEMENT= $(ROOTSVCAPPLICATION)/management
+ROOTSVCAPPLICATIONSECURITY= $(ROOTSVCAPPLICATION)/security
+ROOTSVCAPPLICATIONPRINT= $(ROOTSVCAPPLICATION)/print
+
+#
+# Commands Makefiles delivering a manifest are expected to define MANIFEST.
+#
+# Like ROOTCMDDIR, any lower-level Makefiles that put their manifests in a
+# subdirectory of the manifest directories listed above should reset
+# ROOTMANIFESTDIR and use it in their `install' target. By default we set this
+# to a bogus value so that it will not conflict with any of the other values
+# already defined in this Makefile.
+#
+# The manifest validation of the $SRC/cmd check target is also derived from a
+# valid MANIFEST setting.
+#
+ROOTMANIFESTDIR= $(ROOTVARSVCMANIFEST)/__nonexistent_directory__
+ROOTMANIFEST= $(MANIFEST:%=$(ROOTMANIFESTDIR)/%)
+CHKMANIFEST= $(MANIFEST:%.xml=%.xmlchk)
+
+#
+# For installing "starter scripts" of services
+#
+
+ROOTSVCBIN= $(SVCBIN:%=$(ROOTLIBSVCBIN)/%)
+ROOTSVCMETHOD= $(SVCMETHOD:%=$(ROOTLIBSVCMETHOD)/%)
+
+ROOTSVCBINDIR= $(ROOTLIBSVCBIN)/__nonexistent_directory__
+ROOTSVCBIN= $(SVCBIN:%=$(ROOTSVCBINDIR)/%)
+$(ROOTSVCBIN) := FILEMODE= 544
+
+#
+
+# For programs that are installed in the root filesystem,
+# build $(ROOTFS_PROG) rather than $(PROG)
+$(ROOTFS_PROG) := LDFLAGS += -Wl,-I/lib/ld.so.1
+
+$(KRB5BIN)/%: %
+ $(INS.file)
+
+$(KRB5SBIN)/%: %
+ $(INS.file)
+
+$(KRB5LIB)/%: %
+ $(INS.file)
+
+$(ROOTBIN)/%: %
+ $(INS.file)
+
+$(ROOTLIB)/%: %
+ $(INS.file)
+
+$(ROOTBIN64)/%: %
+ $(INS.file)
+
+$(ROOTLIB64)/%: %
+ $(INS.file)
+
+$(ROOTBIN32)/%: %
+ $(INS.file)
+
+$(ROOTSHLIB)/%: %
+ $(INS.file)
+
+$(ROOTSBIN)/%: %
+ $(INS.file)
+
+$(ROOTUSRSBIN)/%: %
+ $(INS.file)
+
+$(ROOTUSRSBIN32)/%: %
+ $(INS.file)
+
+$(ROOTUSRSBIN64)/%: %
+ $(INS.file)
+
+$(ROOTETC)/%: %
+ $(INS.file)
+
+$(ROOTCCSBIN)/%: %
+ $(INS.file)
+
+$(ROOTUSRKVM)/%: %
+ $(INS.file)
+
+$(ROOTXPG4BIN)/%: %.xpg4
+ $(INS.rename)
+
+$(ROOTXPG4BIN32)/%: %.xpg4
+ $(INS.rename)
+
+$(ROOTXPG4BIN64)/%: %.xpg4
+ $(INS.rename)
+
+$(ROOTXPG6BIN)/%: %.xpg6
+ $(INS.rename)
+
+$(ROOTLOCALEDEF)/%: %
+ $(INS.file)
+
+$(ROOTCHARMAP)/%: %
+ $(INS.file)
+
+$(ROOTI18NEXT)/%: %
+ $(INS.file)
+
+$(ROOTI18NEXT64)/%: %
+ $(INS.file)
+
+$(ROOTLIBSVCMETHOD)/%: %
+ $(INS.file)
+
+$(ROOTLIBSVCBIN)/%: %
+ $(INS.file)
+
+$(ROOTSVCMILESTONE)/%: %
+ $(INS.file)
+
+$(ROOTSVCDEVICE)/%: %
+ $(INS.file)
+
+$(ROOTSVCSYSTEM)/%: %
+ $(INS.file)
+
+$(ROOTSVCSYSTEMDEVICE)/%: %
+ $(INS.file)
+
+$(ROOTSVCSYSTEMFILESYSTEM)/%: %
+ $(INS.file)
+
+$(ROOTSVCSYSTEMSECURITY)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORK)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORKLDAP)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORKNFS)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORKNIS)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORKRPC)/%: %
+ $(INS.file)
+
+$(ROOTSVCNETWORKSECURITY)/%: %
+ $(INS.file)
+
+$(ROOTSVCAPPLICATION)/%: %
+ $(INS.file)
+
+$(ROOTSVCAPPLICATIONMANAGEMENT)/%: %
+ $(INS.file)
+
+$(ROOTSVCAPPLICATIONSECURITY)/%: %
+ $(INS.file)
+
+$(ROOTSVCAPPLICATIONPRINT)/%: %
+ $(INS.file)
+
+$(ROOTSVCPLATFORM)/%: %
+ $(INS.file)
+
+$(ROOTSVCPLATFORMI86PC)/%: %
+ $(INS.file)
+
+$(ROOTSVCPLATFORMSUN4U)/%: %
+ $(INS.file)
+
+$(ROOTMAN1)/%: %.sunman
+ $(INS.rename)
+
+$(ROOTMAN1M)/%: %.sunman
+ $(INS.rename)
+
+$(ROOTMAN3)/%: %.sunman
+ $(INS.rename)
+
+# build rule for statically linked programs with single source file.
+%.static: %.c
+ $(LINK.c) -o $@ $< $(LDLIBS)
+ $(POST_PROCESS)
+
+%.xpg4: %.c
+ $(LINK.c) -o $@ $< $(LDLIBS)
+ $(POST_PROCESS)
+
+%.xpg6: %.c
+ $(LINK.c) -o $@ $< $(LDLIBS)
+ $(POST_PROCESS)
+
+# Define the majority text domain in this directory.
+TEXT_DOMAIN= SUNW_OST_OSCMD
+
+CLOBBERFILES += $(XPG4) $(XPG6) $(DCFILE)
+
+# This flag is being added only for SCO (x86) compatibility
+i386_SPFLAG= -D_iBCS2
+sparc_SPFLAG=
+
+iBCS2FLAG = $($(MACH)_SPFLAG)
+
+# This flag is for programs which should not build a 32-bit binary
+sparc_64ONLY= $(POUND_SIGN)
+64ONLY= $($(MACH)_64ONLY)
diff --git a/usr/src/cmd/Makefile.cmd.64 b/usr/src/cmd/Makefile.cmd.64
new file mode 100644
index 0000000..e0276a9
--- /dev/null
+++ b/usr/src/cmd/Makefile.cmd.64
@@ -0,0 +1,36 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# This makefile contains the compiler fiddling needed to build
+# 64-bit utilities.
+#
+
+include $(SRC)/Makefile.master.64
+
+V9CODESIZE = -xcode=abs44
+
+sparcv9_CFLAGS += $(V9CODESIZE)
diff --git a/usr/src/cmd/Makefile.cmd.bsm b/usr/src/cmd/Makefile.cmd.bsm
new file mode 100644
index 0000000..191dbdc
--- /dev/null
+++ b/usr/src/cmd/Makefile.cmd.bsm
@@ -0,0 +1,50 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Definitions common to BSM command source
+#
+# Before including this file you must set the PROG variable
+# and include Makefile.cmd
+#
+
+
+all:
+
+install: all $(ROOTUSRSBINPROG)
+
+# Rules for internationalization
+
+PO= $(TEXT_DOMAIN).po
+
+po: $(PO)
+
+$(PO): $(POS)
+ $(CAT) $(POS) > $@
+
+%.po: %.c
+ $(XGETTEXT) -c TRANSLATION_NOTE -d $(TEXT_DOMAIN) $<
+ $(MV) $(TEXT_DOMAIN).po $@
diff --git a/usr/src/cmd/Makefile.targ b/usr/src/cmd/Makefile.targ
new file mode 100644
index 0000000..6557291
--- /dev/null
+++ b/usr/src/cmd/Makefile.targ
@@ -0,0 +1,65 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# cmd/Makefile.targ
+# common target definitions for command builds
+#
+
+clobber: clean
+ -$(RM) $(PROG) $(CLOBBERFILES)
+
+lint_PROG: $$(PROG).c
+ $(LINT.c) $(PROG).c $(LDLIBS)
+
+lint_SRCS: $$(SRCS)
+ $(LINT.c) $(SRCS) $(LDLIBS)
+
+$(ROOTCMDDIR)/%: $(ROOTCMDDIR) %
+ $(INS.file)
+
+$(ROOTCMDDIR) $(ROOTCMDDIR64):
+ $(INS.dir)
+
+$(ROOTCMDDIR64)/%: $(ROOTCMDDIR64) %
+ $(INS.file)
+
+#
+# For message catalogue files
+#
+_msg: $(MSGDOMAIN) $(POFILE)
+ $(RM) $(MSGDOMAIN)/$(POFILE)
+ $(CP) $(POFILE) $(MSGDOMAIN)
+
+# the build of the $(DCFILE) should be defined locally
+# its .dc extension gets renamed to .po upon installation
+#
+_dc: $(DCMSGDOMAIN) $(DCFILE)
+ $(RM) $(DCMSGDOMAIN)/$(DCFILE)
+ $(CP) $(DCFILE) $(DCMSGDOMAIN)/$(DCFILE:.dc=.po)
+
+$(MSGDOMAIN) $(DCMSGDOMAIN):
+ $(INS.dir)
diff --git a/usr/src/cmd/OWconfig/Makefile b/usr/src/cmd/OWconfig/Makefile
new file mode 100644
index 0000000..1c948c2
--- /dev/null
+++ b/usr/src/cmd/OWconfig/Makefile
@@ -0,0 +1,76 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# cmd/OWconfig/Makefile
+
+include ../Makefile.cmd
+
+FILES= OWconfig
+
+ROOTETC= $(ROOT)/etc
+OPENWIND= $(ROOTETC)/openwin
+OPENWINETCD= $(OPENWIND)/etc
+SERVERD= $(OPENWIND)/server
+SERVERETCD= $(SERVERD)/etc
+DEVDATAD= $(OPENWINETCD)/devdata
+SUNWACCELD= $(DEVDATAD)/SUNWaccel
+MONITORSD= $(SUNWACCELD)/monitors
+PDPD= $(MONITORSD)/pnp
+
+
+DIRS= \
+ $(ROOTETC) \
+ $(OPENWIND) \
+ $(OPENWINETCD) \
+ $(SERVERD) \
+ $(SERVERETCD) \
+ $(DEVDATAD) \
+ $(SUNWACCELD) \
+ $(MONITORSD) \
+ $(PDPD)
+
+FILEMODE=0644
+OWCONFIG=$(FILES:%=$(SERVERETCD)/%)
+
+$(SERVERETCD)/%: %
+ $(INS.file)
+
+
+.KEEP_STATE:
+
+all:
+
+install: all $(DIRS) $(OWCONFIG)
+
+$(DIRS):
+ -$(INS.dir)
+
+clean:
+
+lint:
+
+include ../Makefile.targ
diff --git a/usr/src/cmd/OWconfig/OWconfig b/usr/src/cmd/OWconfig/OWconfig
new file mode 100644
index 0000000..28104ca
--- /dev/null
+++ b/usr/src/cmd/OWconfig/OWconfig
@@ -0,0 +1 @@
+# Placeholder only - this file will not end up on the system.
diff --git a/usr/src/cmd/abi/Makefile b/usr/src/cmd/abi/Makefile
new file mode 100644
index 0000000..ddd7f9f
--- /dev/null
+++ b/usr/src/cmd/abi/Makefile
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+SUBDIRS = spectrans apptracecmd appcert
+
+all := TARGET= all
+install := TARGET= install
+clean := TARGET= clean
+clobber := TARGET= clobber
+lint := TARGET= lint
+_msg := TARGET= _msg
+
+.KEEP_STATE:
+
+all install clean clobber lint _msg: $(SUBDIRS)
+
+$(SUBDIRS): FRC
+ @cd $@; pwd; $(MAKE) $(TARGET)
+
+FRC:
diff --git a/usr/src/cmd/abi/Makefile.abi b/usr/src/cmd/abi/Makefile.abi
new file mode 100644
index 0000000..6b39a8f
--- /dev/null
+++ b/usr/src/cmd/abi/Makefile.abi
@@ -0,0 +1,37 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+CPPFLAGS += -I../../common
+
+# We are compiling native, so disable the restricting
+# of library lookups to the local workspace.
+LDLIBS.cmd =
+LDLIBS.lib =
+
+# XXX -- temporary until the build machine's libc is updated
+ZDEFS = $(ZNODEFS)
diff --git a/usr/src/cmd/abi/appcert/Makefile b/usr/src/cmd/abi/appcert/Makefile
new file mode 100644
index 0000000..4d65df3
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/Makefile
@@ -0,0 +1,53 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright (c) 1996-2001 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# cmd/abi/appcert/Makefile
+#
+
+.KEEP_STATE:
+BUILD = static_prof \
+ scripts \
+ etc
+
+APPCERT_MSGSUBDIRS = etc scripts
+
+all := TARGET= all
+install := TARGET= install
+clean := TARGET= clean
+clobber := TARGET= clobber
+lint := TARGET= lint
+_msg := TARGET= _msg
+
+all install clean clobber lint: $(BUILD)
+
+_msg: $(APPCERT_MSGSUBDIRS)
+
+$(BUILD): FRC
+ @cd $@; pwd; $(MAKE) $(TARGET)
+
+FRC:
+
diff --git a/usr/src/cmd/abi/appcert/etc/Makefile b/usr/src/cmd/abi/appcert/etc/Makefile
new file mode 100644
index 0000000..4932431
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/etc/Makefile
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# cmd/abi/appcert/etc/Makefile
+#
+
+include $(SRC)/cmd/Makefile.cmd
+
+SUFFIXES += .in
+
+.KEEP_STATE:
+
+ROOTLIBAPPCERT= $(ROOT)/usr/lib/abi/appcert
+
+ETC_FILES = etc.alt etc.scoped etc.tweaks etc.warn
+MESSAGES = etc.warn.po
+ETC_FILES_SRC = $(ETC_FILES:%=%.in)
+
+DEST_FILES = $(ETC_FILES:%=$(ROOTLIBAPPCERT)/%)
+
+CLEANFILES= $(MESSAGES) $(ETC_FILES)
+
+install := FILEMODE= 0444
+install := DIRMODE= 0755
+install := OWNER= root
+install := GROUP= bin
+
+all: $(ETC_FILES)
+
+install: all .WAIT $(DEST_FILES)
+
+$(ROOTLIBAPPCERT)/%: %
+ $(INS.file)
+
+%: %.in
+ $(SED) -e 's,gettext("\([^"]*\)"),\1,' $< > $@
+
+_msg: $(MSGDOMAIN) $(MESSAGES)
+ $(CP) $(MESSAGES) $(MSGDOMAIN)
+
+$(MSGDOMAIN):
+ $(INS.dir)
+
+%.po: %.in
+ $(XGETTEXT) $(XGETFLAGS) $<
+ $(RM) $@
+ $(SED) "/^domain/d" messages.po > $@
+ $(RM) messages.po
+
+lint:
+
+clean:
+ -$(RM) $(CLEANFILES)
+
+clobber: clean
+
diff --git a/usr/src/cmd/abi/appcert/etc/etc.alt.in b/usr/src/cmd/abi/appcert/etc/etc.alt.in
new file mode 100644
index 0000000..1b092eb
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/etc/etc.alt.in
@@ -0,0 +1,49 @@
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+# syntax:
+#ALT_USAGE:<tag>:<1-line-desc>:<lib>:<sym>[|<sym>...]:<text>
+#
+# the label's and 1-line-desc's must be unique.
+# later <lib> basename may be added.
+# "\" may be used to continue a line. the newline is replaced by " ".
+# Another way to quote a block of text is to sandwich it between
+# single "-". The newline previous to the 1st "-" must be "\" quoted.
+# Special keywords in <expression>:
+# file =~ -> $file =~ where $file is `/bin/file /path/to/object`
+# dump =~ -> $dump =~ where $dump is `/usr/ccs/bin/dump /path/to/object`
+# needed =~ -> $needed =~ where $needed is a list of all needed libs.
+#
+#
+###############################################################################
+ALT_USAGE:libsocket_strong_symbols:libsocket.so weak/strong pairs:libsocket.so.1:_socket|_connect|_recv|_setsockopt|_getsockopt|_getsockname|_getpeername|_bind|_accept|_send|_socketpair|_shutdown|_sendto|_sendmsg|_recvmsg|_recvfrom|_listen|_setpeername|_socketpair_bsd|_socket_bsd:
+###############################################################################
+ALT_USAGE:inadvertant_static_linking:static linking inadevertantly brings in private symbols:*:__getcontext|__sigaction|__threaded|_bufsync|_cerror|_dgettext|_doprnt|_doscan|_ecvt|_fcvt|_findbuf|_findiop|_getsp|_memcmp|_memmove|_memset|_mutex_unlock|_psignal|_realbufend|_setbufend|_siguhandler|_smbuf|_thr_getspecific|_thr_keycreate|_thr_main|_thr_setspecific|_xflsbuf|gtty|stty:
+###############################################################################
+ALT_USAGE:getdomainname:possible getdomainname() replacements:libnsl.so.1:getdomainname:
+###############################################################################
+ALT_USAGE:__rpc_createerr:rpc_createerr can be a macro from <rpc/clnt.h>:libnsl.so.1:__rpc_createerr:
diff --git a/usr/src/cmd/abi/appcert/etc/etc.scoped.in b/usr/src/cmd/abi/appcert/etc/etc.scoped.in
new file mode 100644
index 0000000..277855a
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/etc/etc.scoped.in
@@ -0,0 +1,1835 @@
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Special Cases Database. Locally scoped interfaces.
+#
+# Most of these are due to the local scoping the occurred in 5.6.
+#
+# SunOS 5.6
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.div
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.div_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.mul
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.mul_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.rem
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.rem_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.udiv
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.udiv_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.umul
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.umul_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.urem
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|.urem_sw
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_brdr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_cmdz
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_cmfl
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_cmsg
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_cofl
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_cotf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_csps
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rbeo
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rirt
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rsnf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rupp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rupr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_rvob
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Errmsg_unft
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Intmsg_relo
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Lddmsg_fndl
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Lddmsg_lequ
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Lddmsg_lflp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|Lddmsg_rsnf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|___lwp_cond_wait
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|___lwp_mutex_lock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|___lwp_mutex_unlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__ctype
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_cond_broadcast
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_cond_signal
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_continue
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_create
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_exit
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_getprivate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_info
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_kill
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_mutex_lock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_mutex_trylock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_mutex_unlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_self
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_sema_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_sema_post
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_sema_wait
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_setprivate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_sigredirect
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_suspend
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__lwp_wait
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|__xpg4
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_cerror
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_cerror64
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_close
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_ctype
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_exit
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_fcntl
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_fstat
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_ftruncate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_getdents
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_getegid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_geteuid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_getgid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_getpid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_getuid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_halt
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_kill
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lock_clear
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lock_try
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_cond_broadcast
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_cond_signal
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_continue
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_create
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_exit
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_getprivate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_info
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_kill
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_mutex_lock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_mutex_trylock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_mutex_unlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_self
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_sema_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_sema_post
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_sema_wait
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_setprivate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_sigredirect
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_suspend
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_lwp_wait
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_memcpy
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_memset
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_mmap
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_mprotect
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_munmap
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_profil
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_setup
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_sigprocmask
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_stat
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_strtok_r
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_sysconf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_sysconfig
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_sysinfo
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_thr_errnop
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_thr_main
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_thr_min_stack
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|_truncate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|addfree
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|analyze_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_bndr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_fct
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_lookup_sym
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_plt_write
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_reloc
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_rtbndr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|aout_set_prot
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|are_u_this
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|ask_db
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|bind_clear
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|bind_mode
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|bindlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|bound_add
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|bound_delete
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|boundlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|call_fini
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|call_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|caller
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|close
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|conv_reloc_type_str
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|copies
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dbg_file
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dbg_setup
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dl_new_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dl_old_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dlp_delete
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dlp_listadd
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|do_platform_token
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|doprf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dz_close
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dz_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|dz_open
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_bndr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_copy_reloc
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_fct
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_hash
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_obj_file
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_obj_fini
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_plt_cg
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_plt_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_reloc
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|elf_set_prot
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|envdirs
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|envlist
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|envp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|errno
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|fcntl
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|flags
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|fm_cleanup
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|fm_init
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|fmap
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|format
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|fstat
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|ftruncate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|get_next_dir
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|getdents
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|getegid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|geteuid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|getgid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|getpid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|getuid
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|iflush_range
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|interp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|is_so_loaded
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|kill
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lasterr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lc_version
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|ldso_name
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|ldso_path
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|list_append
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lm_append
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lml_main
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lml_rtld
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|lo_cache
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|load_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|malloclock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|memset
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|mmap
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|mprotect
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|munmap
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|perm_free
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|perm_get
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|perm_set
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|perm_test
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|perm_unset
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|platform
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|plt_cg_interp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|pr_name
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|preload
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|printf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|printlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profil
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profile
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profile_close
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profile_dir
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profile_name
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|profilelock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|readenv
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|relocate_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|remove_so
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rt_atfork
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rt_mutex_lock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rt_mutex_unlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rt_name
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rtld_flags
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rw_rdlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rw_unlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|rw_wrlock
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|security
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|setup
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|sigprocmask
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|so_find
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|so_gen_path
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|stat
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strchr
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strncmp
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strncpy
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strpbrk
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strspn
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|strtok_r
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|sysconf
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|sysinfo
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|syspagsz
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|thr_errnop
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|thr_main
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|thr_min_stack
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|thr_self
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|tracing
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|truncate
+SCOPED_SYMBOL|SunOS_5.6|ld.so.1|zero
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|clockClassRec
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|clockWidgetClass
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|logoClassRec
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|logoWidgetClass
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|mailboxClassRec
+SCOPED_SYMBOL|SunOS_5.6|libXaw.so.5|mailboxWidgetClass
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_closelkfile
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_enddgrptab
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_freedevtabent
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_freedgrptabent
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_getdevrec
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_getdevtabent
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_getdgrprec
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_getdgrptabent
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_openlkfile
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_putdevtabrec
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_putdgrptabrec
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_setdevtab
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|_setdgrptab
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|ckgrpfile
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|ckpwdfile
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|doremovecmd
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|oam_devtab
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|oam_dgroup
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|pkginfopen
+SCOPED_SYMBOL|SunOS_5.6|libadm.so.1|unreserv
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aio_cachefillcv
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aio_cachefilling
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aio_cachefillock
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aio_initlock
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aio_mutex
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aiosendsig
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__aiostksz
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__init_stacks
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__pid
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__sigio_masked
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__sigio_maskedcnt
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__sigio_pending
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__sigio_pendinglock
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__uaio_init
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|__uaio_ok
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_alloc_stack
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_cancel_off
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_cancel_on
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_cancel_work
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_cnt
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_create_worker
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_do_request
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_done_cv
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_done_head
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_done_tail
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_donecnt
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_forkinit
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_free_stack
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_free_stack_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_hash_del
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_hash_insert
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_idle
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_idle_cv
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_lock
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_lwp_exec
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_outstand_cnt
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_req_add
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_req_alloc
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_req_done
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_req_free
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_req_get
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_unlock
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_work_done
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aio_worker_cnt
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aiopanic
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aioreqsize
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aiorw
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_aiowait_flag
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_alloc_stack
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_defaultstkcache
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_fill_aiocache
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_free_stack
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_halted
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_idle_workers
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_kaio_cleanup_thread
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_kaio_init
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_kaio_ok
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_kaiowp
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_lastworker
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_max_workers
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_maxworkload
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_min_workers
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_minworkload
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_nextworker
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_panic
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_sigio_enabled
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_worker_set
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|_workers
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|aio_pread
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|aio_pwrite
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|aiocancel_all
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|aiosigcancelhndlr
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|caller
+SCOPED_SYMBOL|SunOS_5.6|libaio.so.1|devzero
+SCOPED_SYMBOL|SunOS_5.6|libauth.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libauth.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libauth.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libauth.so.1|pam_debug
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|audit_halt_generic
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|audit_reboot_generic
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|auditstat
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|audituser
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|getkernstate
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|getuseraudit
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|setkernstate
+SCOPED_SYMBOL|SunOS_5.6|libbsm.so.1|setuseraudit
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.div_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.mul_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.rem_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.udiv_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.umul_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|.urem_sw
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|Msgdb
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|PASSWD
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_Msgdb
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_Q_set_exception
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__Xiswctype
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|___iswctype
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|___mul_65536_n
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|___wctype
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__arint_set_n
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__base_conversion_abort
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__base_conversion_set_exception
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__base_conversion_write_only_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__big_binary_to_big_decimal
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__big_binary_to_unpacked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__big_decimal_to_big_binary
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__big_float_times_power
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__binary_to_decimal_fraction
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__binary_to_decimal_integer
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__carry_in_b10000
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__carry_propagate_ten
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__carry_propagate_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__class_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__class_extended
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__class_single
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__copy_big_float_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__daytab
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__decimal_round
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__decimal_to_binary_fraction
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__decimal_to_binary_integer
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__decimal_to_unpacked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__digits_to_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__doscan_u
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__double_to_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fgetwc_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__first_link
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__four_digits_quick
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__four_digits_quick_table
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fp_leftshift
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fp_normalize
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fp_rightshift
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fp_set_exception
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_add3wc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_cmpli
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_error_nan
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_neg2wc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_normalize
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_rightshift
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_set_exception
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fpu_sub3wc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__fractionstring_to_big_decimal
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__free_big_float
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__get_ieee_flags
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__gtxt
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__infnanstring
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__inrange_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__inrange_quadex
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__inrange_single
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__integerstring_to_big_decimal
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__isenglish
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__isideogram
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__isnumber
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__isphonogram
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__isspecial
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswalnum
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswalpha
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswcntrl
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswdigit
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswgraph
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswlower
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswprint
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswpunct
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswspace
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswupper
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__iswxdigit
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__k_double_to_decimal
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__k_gconvert
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__k_quadruple_to_decimal
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__left_shift_base_ten
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__left_shift_base_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__lfmt_log
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__longquorem10000
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__lsearch_lock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__lshift_b10000
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__mbftowc_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__month_size
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__mul_10000short
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__mul_65536short
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__multiply_base_ten
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__multiply_base_ten_by_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__multiply_base_ten_vector
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__multiply_base_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__multiply_base_two_vector
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pack_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pack_extended
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pack_quadruple
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pack_single
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pfmt_label
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pfmt_nsev
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pfmt_print
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__pfmt_sev_tab
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__prod_10000_b65536
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__prodc_b10000
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__quorem
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__quorem10000
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__right_shift_base_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__rtboot
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__sbrk_lock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__set_ieee_flags
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__sigfillset
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__snprintf
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_big_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_big_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_huge_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_huge_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_small_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_10_small_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_big_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_big_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_huge_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_huge_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_small_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_2_small_start
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_baselg
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_ntens
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__tbl_tens
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__towlower
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__towupper
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__treelock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__trwctype
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__umac
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_double
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_double_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_extended
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_extended_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_quadruple_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_single
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpack_single_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpackdouble
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpackllong
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__unpacksingle
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__utx_lock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__vsnprintf
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wcschr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wcslen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wcswidth_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wcwidth_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wschr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__wslen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|__year_lengths
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_alt_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_brk_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_check_threaded
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_clearerr_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_coll_get_order
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_collate_category_changed
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_cur_locale
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_dirent_lock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_dl_zero
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_dostrfmon_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_eras
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_eucwidth
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_feof_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_ferror_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fexecve
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fflush_u
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fileno_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_flockget
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_flockrel
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_add
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_compare
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_current_direction
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_current_exceptions
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_current_precision
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_div
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_mul
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_pack
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_sqrt
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_sub
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fp_unpack
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_free_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fullocale
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_fwrite_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_get_coll_elm
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_get_encoded_value
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_get_r_weight_mbs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_get_r_weight_wcs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_gethz
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_id2str
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_alarm
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_calloc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_fork
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_fork1
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_free
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_malloc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_realloc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_set_threaded
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_setitimer
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_sigaction
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_siglongjmp
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_sigwait
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_sleep
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_libc_unset_threaded
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_loc_filename
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_localeconv_nolock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_locktab
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_lsign
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_ltostr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_cclass
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_collequiv
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_collorder
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_collrange
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_colltostr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_getmccoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_getwmccoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_ismccollel
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_collequiv
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_collorder
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_collrange
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_colltostr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_getmccoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_maxcoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_m_strtocoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_mbstowcsdup
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_strtocoll
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_m_wcstombsdup
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mblen_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mbrtowc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mbstowcs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mbstowcs_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mbtowc_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_mcount_newent
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_modut
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nativeloc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_XbyY_fgets
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_initf_group
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_initf_passwd
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_initf_shadow
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_src_state_destr
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nss_status_vec
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_nsw_getoneconfig
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_num_alt_digits
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_num_eras
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_pcmask
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_reallock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_reg_m_mbstowcsdup
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_rewind_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_rmutex_trylock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_rw_pfmt_label
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_rw_pfmt_sev_tab
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_set_tab
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_19
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_3
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_35
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_51
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_52
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_double_m1
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_shorten
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_single_22
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_single_23
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_single_6
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_split_single_m1
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_str2id
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_strcoll_dyn
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_strcoll_xpg4
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_strxfrm_dyn
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_strxfrm_xpg4
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_sys_polllist
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_sys_siginfolist
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_thr_get_direction
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_thr_get_exceptions
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_thr_get_inf_written
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_thr_get_nan_written
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_thr_get_precision
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_time_lock
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_tsdalloc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_unpacked_to_decimal_two
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_updutfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_updutmp
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_updutmpx
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_updutxfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_wchar_opt
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_wcstombs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_wcstombs_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_wctoce
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|_wctomb_gen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|charmap
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|classtest
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|clearerr_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|close_fd
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dbm_firsthash
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dbm_flush
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dbm_flushdir
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dbm_flushpag
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dbm_forder
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|dummy_setlocale
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|extract_era_info
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|feof_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|ferror_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fileno_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fnwnmatch
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fnwwmatch
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fp_mblen
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fp_mbstowcs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fp_mbtowc
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fp_wcstombs
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|fp_wctomb
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|gethz
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|handle_return
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|id2str
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|ieee_handlers
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|invoke_utmp_update
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|isdevice
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|libc_yp_first
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|libc_yp_get_default_domain
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|libc_yp_match
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|libc_yp_next
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|lsign
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|modut
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|okshells
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|regsbdosub
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|regsbdosuba
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|regwcomp
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|regwdosuba
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|regwexec
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|sendpid
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|setup_collate
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|str2group
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|str2id
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|str2passwd
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|strcoll_C
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|strxfrm_C
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|syssun
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|updutfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|updutmp
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|updutmpx
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|updutxfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|utmpfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|utmpxfile
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|wisprint
+SCOPED_SYMBOL|SunOS_5.6|libc.so.1|xpg4_dfl_fmt
+SCOPED_SYMBOL|SunOS_5.6|libdl.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libdl.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libdoor.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libdoor.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libdoor.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf32_ehdr_init
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf32_entsz
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf32_msize
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf32_mtype
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_app_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_arinit
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_armem
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_byte
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_cook
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_cookscn
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_demangle_doarg
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_demangle_doargs
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_dnode
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_encode
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_findop
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_free_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_inmap
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_jbuf
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_mk_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_napp_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_nplist
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_nprep_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_outmap
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_prep_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_read
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_set_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_snode
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_snode_init
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_trunc_String
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_unmap
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_vm
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_elf_work
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libelf.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libintl.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libintl.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libintl.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libintl.so.1|category_to_name
+SCOPED_SYMBOL|SunOS_5.6|libintl.so.1|defaultbind
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|FreeParameterSet
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|ParmCompare
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_C0095B2A
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_C0095B2B
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_C0095B2C
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_C0095C2A
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_C0095C2B
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|ad_print
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|com_err
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|com_err_hook
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|com_perror
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|create_ciph
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|decomp_ticket
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_cbc_cksum
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_cblock_print_file
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_check_key_parity
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_debug
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_fixup_key_parity
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_generate_random_block
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_init_random_number_generator
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_is_weak_key
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_key_sched
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_new_random_key
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_quad_cksum
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_random_key
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_read_password
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_read_pw_string
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_set_random_generator_seed
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_set_sequence_number
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|des_string_to_key
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|error_message
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|extract_ticket
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fGetChar
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fGetKeywordValue
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fGetLiteral
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fGetParameterSet
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fGetToken
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fUngetChar
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|fgetst
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|get_ad_tkt
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|get_pw_tkt
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|get_request
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|getst
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|in_tkt
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|init_error_table
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|init_krb_err_tbl
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|kerb_dogrouplist
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_ap_req_debug
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_create_ticket
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_debug
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_err_base
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_get_in_tkt
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_get_tf_fullname
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_set_lifetime
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_udp_port
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|krb_use_nis
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|kset_logfile
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|kuserok
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|month_sname
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|new_log
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|pkt_clen
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|private_msg_ver
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|read_service_key
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|rep_err_code
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|reset_com_err_hook
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|save_credentials
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|send_to_kdc
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|set_com_err_hook
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|set_logfile
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|strsave
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|strutol
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|svcauthkerb_stats
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|swap_bytes
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|tf_save_cred
+SCOPED_SYMBOL|SunOS_5.6|libkrb.so.1|tt_local
+SCOPED_SYMBOL|SunOS_5.6|libkstat.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libkstat.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libkstat.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|__kvm_getkvar
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|__kvm_kvtop
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|__kvm_openerror
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_anonoffset
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_kvm_physaddr
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_swapread
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|_uncondense
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|kvm_as_rdwr
+SCOPED_SYMBOL|SunOS_5.6|libkvm.so.1|kvm_as_write
+SCOPED_SYMBOL|SunOS_5.6|libld.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libld.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libld.so.1|conv_reloc_type_str
+SCOPED_SYMBOL|SunOS_5.6|libld.so.1|format
+SCOPED_SYMBOL|SunOS_5.6|libld.so.1|list_append
+SCOPED_SYMBOL|SunOS_5.6|liblddbg.so.2|_fini
+SCOPED_SYMBOL|SunOS_5.6|liblddbg.so.2|_init
+SCOPED_SYMBOL|SunOS_5.6|liblddbg.so.2|conv_reloc_type_str
+SCOPED_SYMBOL|SunOS_5.6|liblddbg.so.2|format
+SCOPED_SYMBOL|SunOS_5.6|liblm.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|liblm.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|liblm.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|malloc_debug
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|malloc_verify
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|mallocmap
+SCOPED_SYMBOL|SunOS_5.6|libmapmalloc.so.1|memstart
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|_mp_fatal
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|_mp_mcan
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|fmin
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|fmout
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|invert
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_add
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_div
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_dsb
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_mult
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_sub
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|m_trq
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|omin
+SCOPED_SYMBOL|SunOS_5.6|libmp.so.1|omout
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|FreeDictionary
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|InUseDictionary
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|_fini
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|_init
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|copy_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|curdict
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_apply_log_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_log_entries_since
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_print_all_indices
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_print_index
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_print_table_names
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_stats
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_update_version
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|db_version
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|dbenv
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|make_zero
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|new_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|tempdict
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_action
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_attrname
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_data_desc
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dict_desc
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dict_desc_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dict_version
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dictlog_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dictlog_entry_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_dictlog_list
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_free_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_free_entry_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_free_list
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_free_list_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_index
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_index_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_index_entry_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_index_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_key_desc
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_log_entry
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_log_entry_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_log_list
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_mindex
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_mindex_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_next_desc
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_posn_info
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_qcomp
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_query
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_request
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_result
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_scheme
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_scheme_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_status
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_stringname
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_table
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_table_desc
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_table_desc_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_db_table_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_entry_object
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_entry_object_p
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_entryp
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_item
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_nullptr
+SCOPED_SYMBOL|SunOS_5.6|libnisdb.so.2|xdr_vers
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__classic_netdir_getbyaddr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__classic_netdir_getbyname
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__clear_directory_local
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__inet_address_is_local
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__inet_netdir_options
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__inet_taddr2uaddr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__inet_uaddr2taddr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__is_xdrrec_first
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_CacheRefreshEntry
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_cast
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_flush_one_group
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_librand
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_max_hard_lookup_time
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_nextsep_of
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_no_preference
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_preferred_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_set_preference
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_splice_name_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nis_swap_endpoints
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__nisipbufsize
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpc_get_time_offset
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpc_minfd
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpc_openchild
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpc_raise_fd
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpcb_findaddr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__rpcb_findaddr_timed
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svc_vc_setflag
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svc_versquiet_get
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svc_versquiet_off
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svc_versquiet_on
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svcauth_null
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svcauth_short
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svcauth_sys
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__svcauth_unix
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__td_setnodelay
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__xdrrec_resetfirst
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__xdrrec_setfirst
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__yp_dobind_rsvdport
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|__ypipbufsize
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_door_gethostbyaddr_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_door_gethostbyname_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_libnsl_lock_init
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_nss_initf_hosts
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_nss_initf_rpc
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_svc_destroy_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_svc_dg_destroy_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_svc_prog_dispatch
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_svc_vc_destroy_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_switch_getservbyname_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_switch_getservbyport_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_aligned_copy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_blockallsignals
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_checkfd
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_create
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_do_ioctl
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_is_event
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_is_ok
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_look_locked
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_restoresigmask
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_t_tsdalloc
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_ti_userlock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_ypserv_timeout
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|_ypsleeptime
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|add_to_xlate_list
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|additem
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|authdes_cachesz
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|authdes_pk_seccreate
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|authnone_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|authsvc_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|chkblk
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|clnt_fd_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|clntraw_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|cmpdatum
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|dbm_access
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|dbmflush
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|delitem
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|destroy_err_buf
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|dname_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|do_cpy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|dupreq_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|forder
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|free_dom_binding
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|g_cache_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|getbit
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|hent2ndaddr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|hitab
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|hltab
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|hsents2ndhostservs
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|keyserv_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|libnsl_trace_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|lock_value
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|loopnconf_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|lowvers
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|mem_err_msg_arr
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|mem_err_msg_ref
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ndaddr2hent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ndaddr2srent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ndhostserv2hent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ndhostserv2srent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|netpp_mutex
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_add_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_cache_add_entry_1
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_cache_read_coldstart_1
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_cache_refresh_entry_1
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_cache_remove_entry_1
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_callback_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_checkpoint_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_clone_object_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_cptime_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_data_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_dump_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_dump_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_dumplog_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_dumplog_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_finddirectory_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_flush_namelist
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_flush_table
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ibadd_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ibfirst_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_iblist_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ibmodify_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ibnext_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ibremove_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_lookup_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_mkdir_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_modify_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_name_of_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_old_data_r
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_ping_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_print_server
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_remove_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_rmdir_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_scan_table
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_servstate_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_sort_directory_servers
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_status_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|nis_updkeys_clnt
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ops_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|order_haddrlist
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|partab
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|portnum_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|proglst_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|rpc_nullproc
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|rpcbaddr_cache_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|rpcsoc_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|serialize_pkey
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|setbit
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|srv_cache_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|str2hostent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|str2rpcent
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_args_done
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_copy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_dg_create_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_dg_xprtcopy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_dg_xprtfree
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_exit_mutex
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_fd_create_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_fd_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_fd_xprtcopy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_fd_xprtfree
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_max_fd
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_mt_mode
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_mutex
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_nfds
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_nfds_set
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_pipe
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_polling
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_thr_fdwait
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_thr_mutex
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_vc_create_private
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_vc_xprtcopy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_vc_xprtfree
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_versquiet
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_xdrs
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_xports
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svc_xprt_destroy
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svcauthdes_stats
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|svcraw_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|thr_get_storage
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|thr_sigblock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|tsd_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|writeColdStartFile_unsafe
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_entry_col
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_group_obj
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_link_obj
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_log_entry_t
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_netconfig
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_nis_tag
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_nstype
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_oar_mask
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_passwd
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_table_col
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_ypbind_binding
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_ypreq_newname_string
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xdr_zotypes
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|xprtlist_lock
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ypbindproc_null_3
+SCOPED_SYMBOL|SunOS_5.6|libnsl.so.1|ypbindproc_setdom_3
+SCOPED_SYMBOL|SunOS_5.6|libposix4.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libposix4.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libposix4.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libpthread.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libpthread.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libpthread.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libpthread.so.1|_sema_wait_cancel
+SCOPED_SYMBOL|SunOS_5.6|libpthread.so.1|_thr_errnop
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|__rpcb_findaddr
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|free_pkt
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|free_pollinfo
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|pkt_vc_poll
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|pkt_vc_read
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|ri_to_xid
+SCOPED_SYMBOL|SunOS_5.6|librac.so.1|xdrrec_resetinput
+SCOPED_SYMBOL|SunOS_5.6|libresolv.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libresolv.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libresolv.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libresolv.so.1|putshort
+SCOPED_SYMBOL|SunOS_5.6|libresolv.so.1|res_sethostfile
+SCOPED_SYMBOL|SunOS_5.6|librpcsoc.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|librpcsoc.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|librpcsoc.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|rusers3
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|xdr_ru_utmp
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|xdr_utmpidle
+SCOPED_SYMBOL|SunOS_5.6|librpcsvc.so.1|xdr_utmpidleptr
+SCOPED_SYMBOL|SunOS_5.6|libsec.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libsec.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libsec.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|__accept
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|__bind
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|__getpeername
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|__getsockname
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|__setsockopt
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_connect2
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_aligned_copy
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_blockallsignals
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_cbuf_alloc
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_checkfd
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_close
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_cpaddr
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_do_ioctl
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_is_ok
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_max
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_min
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_rcv_conn_con
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_restoresigmask
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_snd_conn_req
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_sockdebug
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_socreate
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_soreceivexx
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_sosendxx
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_synch
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_s_uxpathlen
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_switch_getservbyname_r
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|_switch_getservbyport_r
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|callselect
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|find_silink
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|s_getfflags
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|s_invalfflags
+SCOPED_SYMBOL|SunOS_5.6|libsocket.so.1|setsockname
+SCOPED_SYMBOL|SunOS_5.6|libsys.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libsys.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|TR_rf
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_SHAREDFRAME
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__advance_pc_if_munlock_segv
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__alarm
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__alarm_sigaction
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__bounceself
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__dynamic_tid
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__fork
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__fork1
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__ksigsok
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__libthread_segvhdlr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__lwp_alarm
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__lwpdirsigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__null_sigaction
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__pseudosynch
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__segv_sigaction
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sendsig
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__setcontext
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__setitimer
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sig_resethand
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sighandler_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sighandler_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sigprocmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sigsuspend_trap
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__sigtimedwait_trap
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__thr_continue
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__thr_kill
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__thr_sigredirect
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__thr_sigsetmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__unsafe_bsigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|__wrd
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_age
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_aging
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_allmasked
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_alloc_attr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_alloc_stack
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_alloc_thread
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_alloc_tmpstack
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_allthreads
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_allunmasked
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_blocking
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_blocksent
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_bpending
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_bpendinglock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_bsigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_callin
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_calloutcnt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_calloutlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_calloutp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_cantmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_cantreset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_choose_thread
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_co_set
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_co_tid
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_cond_eot
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_curthread
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_d2bzombies
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_defaultstkcache
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_deliversigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_destroy_tsd
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dispdeq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dispinit
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dispq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dopreempt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dqactmap
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dynamic_create
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_dynamiclwps
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_ex_clnup_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_ex_unwind_local
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_first_thr_create
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_flush_and_tell
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_flush_user_windows
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_free_attr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_free_stack
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_free_tmpstack
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_fsig
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_getcaller
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_getpc
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_getpsr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_halted
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_hibit
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_idle_thread_create
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_idtot
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_ignoredefault
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_init_cpu
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_initsigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lasttid
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lcantmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_libpthread_loaded
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lmutex_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lmutex_trylock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lmutex_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lpagesize
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lpostfork_child_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lpostfork_parent_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lprefork_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lpthread_atfork
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lrw_rdlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lrw_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lrw_wrlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lwp_exec
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lwp_exitp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lwp_mutex_unlockp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_lwp_terminate
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_maxpriq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_minlwps
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_minpri
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_mutex_op_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_mutex_op_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_mutex_sema_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_mutex_unlock_asm
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nagewakecnt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_naging
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_ndie
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_new_lwp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nidle
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nidlecnt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nlwps
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nrunnable
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_nthreads
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_null_sigset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_onproc_deq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_onproc_enq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_onprocq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_onprocq_size
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_panic
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_pmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_pmasklock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_postfork_child_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_postfork_parent_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_preempt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_preempt_off
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_preempt_on
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_prefork_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_qswtch
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reap_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reap_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reap_wait
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reap_wait_cancel
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reapcnt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reaper_create
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reaplock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reaplockp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_reapq_add
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_resetlib
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_restorefsr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_rmcallout
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_rwlsub_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_rwlsub_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_save_thread
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_savefsr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_lock_nosig
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_owner
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_ownerpc
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_unlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sched_unlock_nosig
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_schedlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_setcallout
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_setpsr
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_setrq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_setrun
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_setsighandler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigcancel
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sighandlerlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_siglwp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_siglwp_handler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigmaskset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigredirect
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigunblock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigwait_cv
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigwaiting_enabled
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_sigwaitingset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_slpq
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_stack_switch
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_stkcachelock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_suspended
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_switch_stack
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_swtch
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t0
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t0init
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t_block
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t_cancel
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t_release
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t_release_all
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_t_setitimer
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tcancel_all
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thr_exit_common
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_call
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_destroy
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_free
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_probe_getfunc
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_ret
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thread_start
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_threadjmp
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_threadoffset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thrp_create
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thrp_exit
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thrp_join
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_thrp_kill_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tidlock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tidtotls
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_timerset
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tlsbase
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tlstotid
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_totalmasked
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_totalthreads
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tpmask
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tsiguhandler
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_tsslock
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_u2bzombies
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_unpark
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_unsleep
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_untilreaped
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_userthreads
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_zombiecnt
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_zombied
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|_zombies
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|caller
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|devzero
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|hrestime
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|setcontext_masksigs
+SCOPED_SYMBOL|SunOS_5.6|libthread.so.1|tsd_common
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.0|_fini
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.0|_init
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.0|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.0|thread_db_stksegment
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__gd_lock
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__map_fp_pr2reg
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__map_fp_reg2pr
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_debug
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_dread_process
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_dwrite_process
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_logging
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_pub_debug
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_read_thr_struct
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_read_thread_hash_tbl
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_sigmask_are_equal
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_ta_map_addr2thr
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_thr_map_state
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|__td_write_thr_struct
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|_tpmask
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|diag_print
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|td_global_events
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|td_sync_type_names
+SCOPED_SYMBOL|SunOS_5.6|libthread_db.so.1|td_ta_map_addr2thr
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_check_array
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_check_datum
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_check_record
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_check_slots
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_check_type
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_error
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_fini_tags
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_align
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_base_tag
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_chars
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_derived_base
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_element_count
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_element_named
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_elements
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_header_size
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_info
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_kind
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_name
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_property
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_props
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_ref16
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_ref32
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_ref_size
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_root_tag
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_self_size
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_slot_named
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_slot_typed
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_slot_types
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_storage_size
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_tag
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_get_tag_arg
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_init_tags
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_record_info
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_swap16
+SCOPED_SYMBOL|SunOS_5.6|libtnf.so.1|_tnf_swap32
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_buf_headers_p
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_fork
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_fork1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_fork_thread_setup
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_resume_ret
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_sched_init
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_trace_initialize
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|_tnf_vfork
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_abstract_tag_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_align_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_array_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_array_slots
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_array_tag_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_array_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_array_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_block_header_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_derived_base_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_derived_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_derived_tag_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_derived_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_derived_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_element_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_file_header_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_header_size_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_inline_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_name_array_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_no_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_probe_tag
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_probe_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_properties_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_scalar_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_scalar_tag_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_scalar_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_scalar_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_sched_rec_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_schedule_write
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_self_size_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_slot_names_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_slot_types_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_string_array_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_struct_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_struct_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_struct_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_tag_arg_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_tag_array_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_tag_element_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_tag_properties_1
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_tagged_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_trace_initial_tpd
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_type_array_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_type_properties
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_type_size_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnf_type_tag_data
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_alloc
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_atomic_swap
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_clear_lock
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_fw_alloc
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_get_lock
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_init_buffer
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_xabort
+SCOPED_SYMBOL|SunOS_5.6|libtnfprobe.so.1|tnfw_b_xcommit
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|cnvtvfs
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|dc
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|ucbsignal
+SCOPED_SYMBOL|SunOS_5.6|libucb.so.1|wstat
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|_regcmp
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|_regex
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|getrawpart0
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|volmgt_completename
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|volmgt_getfullblkname
+SCOPED_SYMBOL|SunOS_5.6|libvolmgt.so.1|volmgt_getfullrawname
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_fgetwc_unlocked
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_init
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_wcscoll_dyn
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_wcscoll_xpg4
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_wcsxfrm_dyn
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_wcsxfrm_xpg4
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_wssize
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_xpg4_wcscoll
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|_xpg4_wcsxfrm
+SCOPED_SYMBOL|SunOS_5.6|libw.so.1|mbftowc
+SCOPED_SYMBOL|SunOS_5.6|libxfn.so.1|_fini
+SCOPED_SYMBOL|SunOS_5.6|libxfn.so.1|_init
+#
+# SunOS 5.7
+SCOPED_SYMBOL|SunOS_5.7|libresolv.so.2|__p_rr
+#
+# appcert 2.5
+SCOPED_SYMBOL|SunOS_5.10|libadm.so.1|sysmem
+SCOPED_SYMBOL|SunOS_5.10|libadm.so.1|asysmem
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|_aiosigaction
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|_pagesize
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__aio_suspend64
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__libaio_fdsync
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__libaio_pread
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__libaio_pwrite
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__libaio_read
+SCOPED_SYMBOL|SunOS_5.10|libaio.so.1|__libaio_write
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|auditstat
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|audituser
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|getkernstate
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|getuseraudit
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|setkernstate
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|setuseraudit
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|audit_cron_make_anc_name
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|audit_init_generic
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|audit_shutdown_generic
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|audit_uadmin_fail
+SCOPED_SYMBOL|SunOS_5.8|libbsm.so.1|bsm_dom
+SCOPED_SYMBOL|SunOS_5.9|libc.so.1|_thr_libthread
+SCOPED_SYMBOL|SunOS_5.9|libc.so.1|_libc_child_atfork
+SCOPED_SYMBOL|SunOS_5.9|libc.so.1|_libc_parent_atfork
+SCOPED_SYMBOL|SunOS_5.9|libc.so.1|_libc_prepare_atfork
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___lwp_cond_wait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___lwp_mutex_lock
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_create
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_exit
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_getprivate
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_makecontext
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_setprivate
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_wait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__sigaction
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_create
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_exit
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_getprivate
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_makecontext
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_setprivate
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_wait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_thr_errnop
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___lwp_mutex_unlock
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|thr_errnop
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_sigredirect
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__signotifywait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_sigredirect
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_signotifywait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__mt_sigpending
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_libc_nanosleep
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_libc_sigprocmask
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_libc_sigtimedwait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_libc_threads_interface
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_schedctl
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_suspend2
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_schedctl
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_suspend2
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___lwp_mutex_trylock
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___lwp_mutex_wakeup
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___xpg4_putmsg
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|___xpg4_putpmsg
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_sigtimedwait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_libc_tsd_common
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_sigtimedwait
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__lwp_detach
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|__setcontext
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lpostfork_child_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lpostfork_parent_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lprefork_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lpthread_atfork
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_lwp_detach
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_postfork_child_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_postfork_parent_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_prefork_handler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_register_forkhandler
+SCOPED_SYMBOL|SunOS_5.10|libc.so.1|_unregister_forkhandler
+SCOPED_SYMBOL|SunOS_5.9|libnsl.so.1|_exec_checkid
+SCOPED_SYMBOL|SunOS_5.9|libthread.so.1|_thr_libthread
+SCOPED_SYMBOL|SunOS_5.9|libthread.so.1|thr_slot_get
+SCOPED_SYMBOL|SunOS_5.9|libthread.so.1|thr_slot_set
+SCOPED_SYMBOL|SunOS_5.9|libthread.so.1|thr_slot_sync_allocate
+SCOPED_SYMBOL|SunOS_5.9|libthread.so.1|thr_slot_sync_deallocate
+SCOPED_SYMBOL|SunOS_5.10|libthread.so.1|_thr_errnop
+SCOPED_SYMBOL|SunOS_5.10|libthread.so.1|_cond_timedwait_cancel
+SCOPED_SYMBOL|SunOS_5.10|libthread.so.1|_cond_wait_cancel
+SCOPED_SYMBOL|SunOS_5.10|libthread.so.1|_sema_wait_cancel
+SCOPED_SYMBOL|SunOS_5.10|libthread.so.1|_libthread_sema_wait
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIAddr
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIFuncs
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIGetHostByAddr
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIGetHostByName
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIGetHostName
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIInit
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_X11TransDNIntoa
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIAddr
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIFuncs
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIGetHostByAddr
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIGetHostByName
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIGetHostName
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIInit
+SCOPED_SYMBOL|SunOS_5.9|libX11.so.4|_XimXTransDNIntoa
+SCOPED_SYMBOL|SunOS_5.9|libpthread.so.1|_pthread_mutex_attr_gettype
+SCOPED_SYMBOL|SunOS_5.9|libpthread.so.1|_pthread_mutex_attr_settype
+SCOPED_SYMBOL|SunOS_5.9|libpthread.so.1|pthread_mutex_attr_gettype
+SCOPED_SYMBOL|SunOS_5.9|libpthread.so.1|pthread_mutex_attr_settype
+SCOPED_SYMBOL|SunOS_5.10|libpthread.so.1|_libthread_sema_wait
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|devfs_find
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|devfs_find_all
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|devfs_is_nexus_driver
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|devfs_iscbdriver
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|devinfo_prop_get_int
+SCOPED_SYMBOL|SunOS_5.8|libdevinfo.so.1|local_addr
+SCOPED_SYMBOL|SunOS_5.10|libdevinfo.so.1|di_devlink_synchronize_db
+SCOPED_SYMBOL|SunOS_5.8|libdmi.so.1|trace_on
+SCOPED_SYMBOL|SunOS_5.8|libdmi.so.1|get_debug_flag
+SCOPED_SYMBOL|SunOS_5.8|libdmi.so.1|set_debug_flag
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|dynamic_function
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|etc_get_list
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|etc_get_name
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|etc_put_printer
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|nis_get_list
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|nis_get_name
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|nisplus_get_list
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|nisplus_get_name
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|posix_name
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|user_get_list
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|user_get_name
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|user_put_printer
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|xfn_get_list
+SCOPED_SYMBOL|SunOS_5.8|libprint.so.2|xfn_get_name
+SCOPED_SYMBOL|SunOS_5.10|libprint.so.2|xfn_put_printer
+SCOPED_SYMBOL|SunOS_5.9|libresolv.so.2|evPollfdAdd
+SCOPED_SYMBOL|SunOS_5.9|libresolv.so.2|evPollfdDel
+SCOPED_SYMBOL|SunOS_5.10|libXm.so.4|Xm21GetPixmapByDepth
+SCOPED_SYMBOL|SunOS_5.10|libXm.so.4|Xm21InstallImage
+SCOPED_SYMBOL|SunOS_5.10|libXm.so.4|Xm21UninstallImage
+SCOPED_SYMBOL|SunOS_5.10|libXm.so.4|_Xm21GetPixmapData
+SCOPED_SYMBOL|SunOS_5.10|libXm.so.4|_Xm21InstallImage
+SCOPED_SYMBOL|SunOS_5.8|libpam.so.1|_lib_version
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_addr_to_map
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_execname
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_getenv
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_lookup_by_addr
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_lookup_by_name
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_lwp_iter
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_mapping_iter
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_object_iter
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_objname
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_pidarg
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_rd_agent
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_read_string
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_reset_maps
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_stack_iter
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_symbol_iter
+SCOPED_SYMBOL|SunOS_5.8|libproc.so.1|proc_update_maps
+SCOPED_SYMBOL|SunOS_5.10|libproc.so.1|Plookup_by_lmid
+SCOPED_SYMBOL|SunOS_5.8|libssagent.so.1|SSAAutoMemFree
+SCOPED_SYMBOL|SunOS_5.8|libssagent.so.1|SSARegSubtable
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|CheckDNIName
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|DNIEnabled
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|GetTransCount
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIAddr
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIFuncs
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIGetHostByAddr
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIGetHostByName
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIGetHostName
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIInit
+SCOPED_SYMBOL|SunOS_5.9|libICE.so.6|_IceTransDNIntoa
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_alloc
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_append_bytes
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_append_ints
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_append_strings
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_end_of_data
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_free
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_get_next_tuple
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_lookup_bytes
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_lookup_ints
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_lookup_strings
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_tuple_bytes
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_tuple_ints
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_tuple_name
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_tuple_strings
+SCOPED_SYMBOL|SunOS_5.9|librcm.so.1|se_tuple_type
+SCOPED_SYMBOL|SunOS_5.9|libsldap.so.1|__ns_ldap_cache_destroy
+SCOPED_SYMBOL|SunOS_5.9|libsldap.so.1|__ns_ldap_dump_profile
+SCOPED_SYMBOL|SunOS_5.9|libsldap.so.1|__ns_ldap_freeAuth
+SCOPED_SYMBOL|SunOS_5.10|libsmartcard.so.1|OCF_ListReadersPresent
+SCOPED_SYMBOL|SunOS_5.6|libX11.so.4|XauGetAuthByAddr
diff --git a/usr/src/cmd/abi/appcert/etc/etc.tweaks.in b/usr/src/cmd/abi/appcert/etc/etc.tweaks.in
new file mode 100644
index 0000000..e6c8470
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/etc/etc.tweaks.in
@@ -0,0 +1,355 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+#
+# Special Cases Database. Model Tweaks.
+#
+# Format: MODEL_TWEAK|<library>|<arch1,...>|<symbol>|<classification>
+#
+# if <arch> is "*" applies to all arches.
+# <classification> is "public" or "private"
+#
+
+MODEL_TWEAK|/usr/lib/libnsl.so.1|*|gethostname|public
+MODEL_TWEAK|/usr/lib/libc.so.1|*|mkstemp|public
+# /usr/openwin/include/X11/Xlibint.h possible macros, etc.
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XAllocScratch|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XAllocTemp|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XAsyncErrorHandler|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_Xdebug|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XDeq|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XEatData|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XEnq|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XError|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XErrorFunction|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XEventsQueued|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XFlush|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XFreeTemp|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XGetAsyncReply|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XGetHostname|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XIOError|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XIOErrorFunction|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XRead|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XReadEvents|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XReadPad|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XRegisterInternalConnection|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XReply|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XScreenOfWindow|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XSend|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XSetLastRequestRead|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XUnregisterInternalConnection|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XVIDtoVisual|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_Xglobal_lock|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XReadBitmapFileData|unclassified
+#
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtStrings|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtShellStrings|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XtInheritTranslations|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XtIsSubclassOf|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XtCheckSubclassFlag|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XUnlockMutex_fn|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XLockMutex_fn|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtSetSelectionParameters|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtSendSelectionRequest|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtGetSelectionParameters|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtR6ShellStrings|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtOpenApplication|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|_XtInherit|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtR6Strings|unclassified
+#
+MODEL_TWEAK|/usr/openwin/lib/libXm.so.3|*|_XmInheritClass|unclassified
+MODEL_TWEAK|/usr/lib/libc.so.1|*|thr_main|public
+#
+MODEL_TWEAK|/usr/lib/libc.so.1|i386,amd64|htonl|public
+MODEL_TWEAK|/usr/lib/libc.so.1|i386,amd64|htons|public
+MODEL_TWEAK|/usr/lib/libc.so.1|i386,amd64|ntohl|public
+MODEL_TWEAK|/usr/lib/libc.so.1|i386,amd64|ntohs|public
+MODEL_TWEAK|/usr/lib/libc.so.1|*|__trans_lower|public
+MODEL_TWEAK|/usr/lib/libc.so.1|*|__trans_upper|public
+MODEL_TWEAK|/usr/lib/libdmi.so.1|*|dmi_error|public
+MODEL_TWEAK|/usr/lib/libdmi.so.1|*|freeDmiString|public
+MODEL_TWEAK|/usr/lib/libdmi.so.1|*|newDmiString|public
+MODEL_TWEAK|/usr/lib/libdmi.so.1|*|printDmiDataUnion|public
+MODEL_TWEAK|/usr/lib/libdmi.so.1|*|printDmiString|public
+MODEL_TWEAK|/usr/lib/libresolv.so.2|*|res_mkupdrec|public
+MODEL_TWEAK|/usr/lib/libresolv.so.2|*|__p_rr|private
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtActionInvoke|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtCreateHelpDialog|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtCreateHelpQuickDialog|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtDtsIsTrue|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtHelpQuickDialogGetChild|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtHelpReturnSelectedWidgetId|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtSaverGetWindows|public
+MODEL_TWEAK|/usr/dt/lib/libDtSvc.so.1|*|DtWsmRemoveWorkspaceCallback|public
+#
+MODEL_TWEAK|/usr/dt/lib/libXm.so.4|*|_XmStrings|unclassified
+MODEL_TWEAK|/usr/dt/lib/libXm.so.4|*|_XmStrings21|unclassified
+#
+MODEL_TWEAK|/usr/openwin/lib/libXaw.so.5|*|FMT8BIT|unclassified
+#
+# These special symbols are well-known, e.g. crt, and uninteresting.
+SKIP_SYMBOL|_END_
+SKIP_SYMBOL|_START_
+SKIP_SYMBOL|__1cG__CrunMdo_exit_code6F_v_
+SKIP_SYMBOL|__1cG__CrunVdo_exit_code_in_range6Fpv1_v_
+SKIP_SYMBOL|__1cH__CimplKcplus_fini6F_v_
+SKIP_SYMBOL|__1cH__CimplKcplus_init6F_v_
+SKIP_SYMBOL|__fsr_init_value
+SKIP_SYMBOL|_ex_deregister
+SKIP_SYMBOL|_ex_register
+SKIP_SYMBOL|_fini
+SKIP_SYMBOL|_get_exit_frame_monitor
+SKIP_SYMBOL|_init
+SKIP_SYMBOL|_objcInit
+SKIP_SYMBOL|main
+SKIP_SYMBOL|_ctype
+SKIP_SYMBOL|__ctype
+SKIP_SYMBOL|__ctype_mask
+SKIP_SYMBOL|_end
+SKIP_SYMBOL|_environ
+SKIP_SYMBOL|environ
+SKIP_SYMBOL|errno
+SKIP_SYMBOL|__iob
+SKIP_SYMBOL|_lib_version
+#
+MODEL_TWEAK=5.5.1|/usr/lib/libthread.so.1|*|kill|public
+#
+# UNIX98 project
+SKIP_SYMBOL|__fgetwc_xpg5
+SKIP_SYMBOL|__fgetws_xpg5
+SKIP_SYMBOL|__fputwc_xpg5
+SKIP_SYMBOL|__fputws_xpg5
+SKIP_SYMBOL|__getwc_xpg5
+SKIP_SYMBOL|__getwchar_xpg5
+SKIP_SYMBOL|__putwc_xpg5
+SKIP_SYMBOL|__putwchar_xpg5
+SKIP_SYMBOL|__ungetwc_xpg5
+SKIP_SYMBOL|__wcsftime_xpg5
+SKIP_SYMBOL|__wcstok_xpg5
+#
+# C99 complex arithmetic functions
+# sparc, sparcv9, i386
+SKIP_SYMBOL|_F_cplx_mul
+SKIP_SYMBOL|_F_cplx_div
+SKIP_SYMBOL|_F_cplx_div_rx
+SKIP_SYMBOL|_F_cplx_div_ix
+SKIP_SYMBOL|_D_cplx_mul
+SKIP_SYMBOL|_D_cplx_div
+SKIP_SYMBOL|_D_cplx_div_rx
+SKIP_SYMBOL|_D_cplx_div_ix
+# sparc, sparcv9
+SKIP_SYMBOL|_Q_cplx_mul
+SKIP_SYMBOL|_Q_cplx_div
+SKIP_SYMBOL|_Q_cplx_div_rx
+SKIP_SYMBOL|_Q_cplx_div_ix
+SKIP_SYMBOL|_Q_cplx_lr_mul
+SKIP_SYMBOL|_Q_cplx_lr_div
+SKIP_SYMBOL|_Q_cplx_lr_div_rx
+SKIP_SYMBOL|_Q_cplx_lr_div_ix
+# i386
+SKIP_SYMBOL|_F_cplx_lr_div
+SKIP_SYMBOL|_F_cplx_lr_div_rx
+SKIP_SYMBOL|_F_cplx_lr_div_ix
+SKIP_SYMBOL|_D_cplx_lr_div
+SKIP_SYMBOL|_D_cplx_lr_div_rx
+SKIP_SYMBOL|_D_cplx_lr_div_ix
+SKIP_SYMBOL|_X_cplx_mul
+SKIP_SYMBOL|_X_cplx_div
+SKIP_SYMBOL|_X_cplx_div_rx
+SKIP_SYMBOL|_X_cplx_div_ix
+SKIP_SYMBOL|_X_cplx_lr_div
+SKIP_SYMBOL|_X_cplx_lr_div_rx
+SKIP_SYMBOL|_X_cplx_lr_div_ix
+#
+# UNIX03 compiler generated
+# Printing functions:
+SKIP_SYMBOL|_fprintf_c89
+SKIP_SYMBOL|_printf_c89
+SKIP_SYMBOL|_snprintf_c89
+SKIP_SYMBOL|_sprintf_c89
+SKIP_SYMBOL|_vfprintf_c89
+SKIP_SYMBOL|_vprintf_c89
+SKIP_SYMBOL|_vsnprintf_c89
+SKIP_SYMBOL|_vsprintf_c89
+SKIP_SYMBOL|_fwprintf_c89
+SKIP_SYMBOL|_swprintf_c89
+SKIP_SYMBOL|_wprintf_c89
+SKIP_SYMBOL|_vfwprintf_c89
+SKIP_SYMBOL|_vswprintf_c89
+SKIP_SYMBOL|_vwprintf_c89
+SKIP_SYMBOL|_wsprintf_c89
+# Scanning functions:
+SKIP_SYMBOL|_fscanf_c89
+SKIP_SYMBOL|_scanf_c89
+SKIP_SYMBOL|_sscanf_c89
+SKIP_SYMBOL|_vfscanf_c89
+SKIP_SYMBOL|_vscanf_c89
+SKIP_SYMBOL|_vsscanf_c89
+SKIP_SYMBOL|_fwscanf_c89
+SKIP_SYMBOL|_swscanf_c89
+SKIP_SYMBOL|_wscanf_c89
+SKIP_SYMBOL|_vfwscanf_c89
+SKIP_SYMBOL|_vswscanf_c89
+SKIP_SYMBOL|_vwscanf_c89
+SKIP_SYMBOL|_wsscanf_c89
+#
+SKIP_SYMBOL|_imaxabs_c89
+SKIP_SYMBOL|_imaxdiv_c89
+SKIP_SYMBOL|_strtoimax_c89
+SKIP_SYMBOL|_strtoumax_c89
+SKIP_SYMBOL|_wcstoimax_c89
+SKIP_SYMBOL|_wcstoumax_c89
+SKIP_SYMBOL|__assert_c99
+SKIP_SYMBOL|_imaxabs_c89
+SKIP_SYMBOL|_imaxdiv_c89
+#
+SKIP_SYMBOL|_QgetRD
+SKIP_SYMBOL|_QgetRP
+SKIP_SYMBOL|_QswapRD
+SKIP_SYMBOL|_QswapRP
+SKIP_SYMBOL|__divrem64
+SKIP_SYMBOL|__divdi3
+SKIP_SYMBOL|__muldi3
+SKIP_SYMBOL|__moddi3
+SKIP_SYMBOL|__udivdi3
+SKIP_SYMBOL|__umoddi3
+SKIP_SYMBOL|__cmpdi2
+SKIP_SYMBOL|__ucmpdi2
+SKIP_SYMBOL|__floatdidf
+SKIP_SYMBOL|__floatdisf
+SKIP_SYMBOL|__ashldi3
+SKIP_SYMBOL|__ashrdi3
+SKIP_SYMBOL|__lshrdi3
+SKIP_SYMBOL|__fltrounds
+SKIP_SYMBOL|_fpsetsticky
+SKIP_SYMBOL|_fpsetround
+SKIP_SYMBOL|_finite
+SKIP_SYMBOL|_getfp
+SKIP_SYMBOL|__swapEX
+SKIP_SYMBOL|__swapRD
+SKIP_SYMBOL|__swapTE
+SKIP_SYMBOL|__udivrem64
+SKIP_SYMBOL|__xgetRD
+SKIP_SYMBOL|__xtol
+SKIP_SYMBOL|__xtoll
+SKIP_SYMBOL|__xtoul
+SKIP_SYMBOL|__xtoull
+#
+MODEL_TWEAK|/usr/openwin/lib/libdpstk.so.5|*|XDPSCreatePixmapForEPSF|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libdpstk.so.5|*|XDPSImageFileIntoDrawable|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libdpstk.so.5|*|XDPSPixelsPerPoint|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libICE.so.6|*|_IceRead|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libICE.so.6|*|_IceWrite|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XConvertCase|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XESetEventToWire|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XESetWireToEvent|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XFlushGCCache|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XInternalConnectionNumbers|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XProcessInternalConnection|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XauDisposeAuth|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XauReadAuth|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XtCvtStringToFont|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XAddConnectionWatch|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXaw.so.5|*|XawInitializeWidgetSet|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXaw.so.5|*|XawViewportSetCoordinates|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXaw.so.5|*|XawTextSinkSetTabs|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtAppLock|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtAppUnlock|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtCvtStringToFontSet|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtCvtStringToFontStruct|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtProcessLock|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtProcessUnlock|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtSetEventDispatcher|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtRegisterExtensionSelector|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtToolkitThreadInitialize|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtGetClassExtension|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|colorConvertArgs|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtRegisterDrawable|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtSessionReturnToken|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtAppSetExitFlag|unclassified
+MODEL_TWEAK|/usr/lib/libcurses.so.1|*|stdscr|unclassified
+MODEL_TWEAK|/usr/lib/libcurses.so.1|*|COLS|unclassified
+MODEL_TWEAK|/usr/lib/libcurses.so.1|*|LINES|unclassified
+MODEL_TWEAK|/usr/lib/libcurses.so.1|*|curscr|unclassified
+#
+MODEL_TWEAK|/usr/dt/lib/libXm.so.3|*|_XmInheritClass|unclassified
+MODEL_TWEAK|/usr/dt/lib/libtt.so.2|*|Tttk_string|unclassified
+MODEL_TWEAK|/usr/dt/lib/libXm.so.4|*|XmStringCreateLtoR|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XauGetBestAuthByAddr|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XInitExtension|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XAddExtension|unclassified
+MODEL_TWEAK|/usr/dt/lib/libXm.so.4|*|XmStringCreateSimple|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtUnregisterDrawable|unclassified
+#
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dladdr1|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlmopen|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dldump|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlinfo|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dladdr|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlopen|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlsym|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlerror|public
+MODEL_TWEAK|/usr/lib/ld.so.1|*|dlclose|public
+#
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtCvtStringToPixel|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXt.so.4|*|XtCvtStringToBoolean|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libXext.so.0|*|XScreenSaverAllocInfo|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XLockDisplay|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|XUnlockDisplay|unclassified
+MODEL_TWEAK|/usr/openwin/lib/libX11.so.4|*|_XInitImageFuncPtrs|unclassified
+MODEL_TWEAK|/usr/lib/libnsl.so.1|*|t_errlist|unclassified
+#
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__w1|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_HLINE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_VLINE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_BLOCK|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_BOARD|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_BTEE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_BULLET|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_CKBOARD|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_DARROW|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_DEGREE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_DIAMOND|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_LANTERN|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_LARROW|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_LLCORNER|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_LRCORNER|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_LTEE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_PLMINUS|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_PLUS|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_RARROW|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_RTEE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_S1|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_S9|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_TTEE|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_UARROW|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_ULCORNER|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__WACS_URCORNER|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__cht1|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__cht2|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__pcht1|public
+MODEL_TWEAK|/usr/xpg4/lib/libcurses.so.2|*|__pcht2|public
diff --git a/usr/src/cmd/abi/appcert/etc/etc.warn.in b/usr/src/cmd/abi/appcert/etc/etc.warn.in
new file mode 100644
index 0000000..d78ffb5
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/etc/etc.warn.in
@@ -0,0 +1,91 @@
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# syntax:
+#WARNING:<label>:<1-line-desc>:<lib>|<sym>|<caller>,...:<text>
+# or
+#WARNING:<label>:<1-line-desc>:MATCH <expression>:<text>
+#
+# the label's and 1-line-desc's must be unique.
+# the warning matches if any of the <lib>|<sym>|<caller> in the
+# comma separated list match.
+# "\" may be used to continue a line. the newline is replaced by " ".
+# Another way to quote a block of text is to sandwich it between
+# single "-". The newline previous to the 1st "-" must be "\" quoted.
+# Special keywords in <expression>:
+# file =~ -> $file =~ where $file is `/bin/file /path/to/object`
+# dump =~ -> $dump =~ where $dump is `/usr/ccs/bin/dump /path/to/object`
+# needed =~ -> $needed =~ where $needed is a list of all ldd needed libs.
+# syms =~ -> $syms =~ where $syms is a string of the direct symbols.
+#
+# Note: if <lib> is a full path (contains /) that symlinks are not
+# automatically handled (as they are for the models and the tweaks), so
+# you have to list all likely symbolic links in the check (see ptrace ex.)
+#
+###############################################################################
+WARNING:sys_errlist:gettext("references sys_errlist/sys_nerr"):libc.so.1|sys_errlist|*DIRECT*,libc.so.1|sys_nerr|*DIRECT*:
+###############################################################################
+WARNING:libkvm:gettext("calls libkvm kernel interfaces"):libkvm.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libproc:gettext("calls libproc interfaces"):libproc.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libxgl:gettext("calls libxgl graphics library"):libxgl.so.3|*|*DIRECT*:
+###############################################################################
+WARNING:libxil:gettext("calls libxil imaging library"):libxil.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libkrb:gettext("calls libkrb kerberos library"):libkrb.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libauth:gettext("calls libauth library"):libauth.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libdevfsevent:gettext("calls libdevfsevent library"):libdevfsevent.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:libdhcp:gettext("calls libdhcp.so.2 library"):libdhcp.so.2|*|*DIRECT*:
+###############################################################################
+WARNING:libami:gettext("calls libami library"):libami.so.1|*|*DIRECT*,libami-global.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:ALT_USAGE _XtwaitForSomething:gettext("calls incompatible _XtwaitForSomething"):libXt.so.*|_XtwaitForSomething|*DIRECT*:
+###############################################################################
+WARNING:sunos4x:gettext("SunOS 4.x a.out binary"):MATCH file=~/Sun demand paged|pure SPARC/:
+###############################################################################
+WARNING:fork1_forkall:gettext("non-POSIX libthread fork call"):MATCH dump=~/NEEDED\s*libthread\.so\.1/ && !(needed=~/libpthread\.so\.1/) && syms=~/\b(fork|_fork)\b/:
+###############################################################################
+WARNING:sysmem:gettext("calls deprecated sysmem/asysmem"):libadm.so.1|sysmem|*DIRECT*,libadm.so.1|asysmem|*DIRECT*:
+###############################################################################
+WARNING:_lwp_create:gettext("uses lightweight processes directly"):libc.so.1|_lwp_create|*DIRECT*,libc.so.1|_lwp_detach|*DIRECT*,libc.so.1|_lwp_exit|*DIRECT*,libc.so.1|_lwp_getprivate|*DIRECT*,libc.so.1|_lwp_makecontext|*DIRECT*,libc.so.1|_lwp_setprivate|*DIRECT*,libc.so.1|_lwp_wait|*DIRECT*:
+###############################################################################
+WARNING:libldap.so.3:gettext("calls obsolete LDAP library libldap.so.3"):libldap.so.3|*|*DIRECT*:
+###############################################################################
+WARNING:libxfn:gettext("calls obsolete federated naming library libxfn.so"):libxfn.so.1|*|*DIRECT*,libxfn.so.2|*|*DIRECT*:
+###############################################################################
+WARNING:auditsvc:gettext("calls libbsm interface auditsvc(2)"):libbsm.so.1|auditsvc|*DIRECT*:
+###############################################################################
+WARNING:libXinput:gettext("calls obsolete input library libXinput.so.0"):libXinput.so.0|*|*DIRECT*:
+###############################################################################
+WARNING:libkcs:gettext("calls KCMS library libkcs.so.1"):libkcs.so.1|*|*DIRECT*:
+###############################################################################
+WARNING:64-bit-ptrace:gettext("calls 64-bit ptrace(2) interface"):/usr/lib/sparcv9/libc.so.1|ptrace|*DIRECT*,/usr/lib/64/libc.so.1|ptrace|*DIRECT*:
+###############################################################################
+WARNING:makecontext:gettext("possible makecontext(3C) source incompatibility"):libc.so.1|makecontext|*DIRECT*:
diff --git a/usr/src/cmd/abi/appcert/scripts/AppcertUtil.pm b/usr/src/cmd/abi/appcert/scripts/AppcertUtil.pm
new file mode 100644
index 0000000..4eba2fb
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/AppcertUtil.pm
@@ -0,0 +1,1951 @@
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# This module contains utility routines and data for use by the appcert
+# programs: appcert, symprof, symcheck, and symreport.
+#
+
+package AppcertUtil;
+
+require 5.005;
+use strict;
+use locale;
+use Getopt::Std;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+use File::Path;
+
+BEGIN {
+ use Exporter();
+ use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+ @ISA = qw(Exporter);
+ @EXPORT = qw(
+ $command_name
+ $object_dir
+ $solaris_library_ld_path
+ $uname_p
+ $working_dir
+ $appcert_lib_dir
+ $batch_report
+ $binary_count
+ $block_min
+ $block_max
+ $tmp_dir
+
+ $cmd_dump
+ $cmd_elfdump
+ $cmd_file
+ $cmd_find
+ $cmd_ldd
+ $cmd_ls
+ $cmd_more
+ $cmd_pvs
+ $cmd_sort
+ $cmd_uname
+ $cmd_uniq
+
+ @lib_index_loaded
+
+ %lib_index_definition
+ %text
+ %model_tweak
+ %skip_symbols
+ %scoped_symbol
+ %scoped_symbol_all
+ %warnings_bind
+ %warnings_desc
+ %warnings_match
+
+ &object_to_dir_name
+ &dir_name_to_path
+ &next_dir_name
+ &cmd_output_file
+ &cmd_output_dump
+ &all_ldd_neededs
+ &all_ldd_neededs_string
+ &direct_syms
+ &import_vars_from_environment
+ &export_vars_to_environment
+ &c_locale
+ &overall_result_code
+ &trim
+ &sort_on_count
+ &print_line
+ &list_format
+ &emsg
+ &pmsg
+ &nofile
+ &nopathexist
+ &norunprog
+ &nocreatedir
+ &exiter
+ &set_clean_up_exit_routine
+ &signals
+ &create_tmp_dir
+ &dir_is_empty
+ &follow_symlink
+ &is_statically_linked
+ &is_elf
+ &is_shared_object
+ &is_aout
+ &is_suid
+ &bin_type
+ &files_equal
+ &purge_caches
+ &filter_lib_type
+ &load_model_index
+ &load_misc_check_databases
+ );
+
+ @EXPORT_OK = ();
+
+ %EXPORT_TAGS = ();
+}
+
+use vars @EXPORT;
+use vars @EXPORT_OK;
+
+use vars qw(
+ $lib_match_initialized
+
+ %lib_index
+ %lib_index_loaded
+ %shared_object_index
+
+ %file_inode_cache
+ %file_exists_cache
+ %filter_lib_cache
+ %lib_match_cache
+ %cmd_output_file_cache
+ %cmd_output_dump_cache
+ %all_ldd_neededs_cache
+);
+
+my $clean_up_exit_routine;
+my $tmp_dir_count = 0;
+my $next_dir_name_dh;
+my $LC_ALL = '';
+
+# Get the name of the program:
+$command_name = basename($0);
+
+$cmd_dump = '/usr/ccs/bin/dump';
+$cmd_elfdump = '/usr/ccs/bin/elfdump';
+$cmd_file = '/usr/bin/file';
+$cmd_find = '/usr/bin/find';
+$cmd_ldd = '/usr/bin/ldd';
+$cmd_ls = '/usr/bin/ls';
+$cmd_more = '/usr/bin/more';
+$cmd_pvs = '/usr/bin/pvs';
+$cmd_sort = '/usr/bin/sort';
+$cmd_uname = '/usr/bin/uname';
+$cmd_uniq = '/usr/bin/uniq';
+
+chomp($uname_p = `$cmd_uname -p`);
+
+
+# Initialize constants:
+
+$solaris_library_ld_path = "/usr/openwin/lib:/usr/dt/lib";
+
+# Prefix for every object's profiling (etc) subdir in $working_dir.
+$object_dir = 'objects/';
+
+$text{'Summary_Result_None_Checked'} = gettext(
+ "No binaries were checked.");
+$text{'Summary_Result_Some_Failed'} = gettext(
+ "Potential binary stability problem(s) detected.");
+$text{'Summary_Result_Some_Incomplete'} = gettext(
+ "No stability problems detected, but not all binaries were checked.");
+$text{'Summary_Result_All_Passed'} = gettext(
+ "No binary stability problems detected.");
+
+
+$text{'Message_Private_Symbols_Check_Outfile'} = <<"END";
+#
+# <binary>|<abi>|<caller>|<callee>|private|<symbol>
+#
+END
+
+$text{'Message_Public_Symbols_Check_Outfile'} =
+ $text{'Message_Private_Symbols_Check_Outfile'};
+$text{'Message_Public_Symbols_Check_Outfile'} =~ s/private/public/g;
+
+#
+# Maps a filesystem path of a binary object to a subdirectory name (in
+# $working_dir). $working_dir is NOT prepended.
+#
+# Maps, e.g., /home/auser/bin/netscape.sparc
+# ===> objects/:=home=auser=bin=netscape.sparc
+#
+sub object_to_dir_name
+{
+ my ($filename) = @_;
+
+ my $dirname = $filename;
+
+ # protect any percents there:
+ $dirname =~ s,%,%%,g;
+
+ # protect any equals there:
+ $dirname =~ s,=,%=,g;
+
+ # now change slashes to equals:
+ $dirname =~ s,/,=,g;
+
+ #
+ # Prepend "objects/" and ":" tag to avoid dirname starting
+ # with "=" or "."
+ #
+ $dirname = $object_dir . ':' . $dirname;
+
+ return $dirname;
+}
+
+#
+# Takes the application output data directory and returns the path to
+# the actual binary.
+#
+sub dir_name_to_path
+{
+ my ($dirname) = @_;
+ my $path = '';
+
+ if (! -f "$dirname/info.path") {
+ exiter(nofile("$dirname/info.path", $!));
+ } else {
+ my $info_path_fh = do { local *FH; *FH };
+ open($info_path_fh, "<$dirname/info.path") ||
+ exiter(nofile("$dirname/info.path", $!));
+ chomp($path = <$info_path_fh>);
+ close($info_path_fh);
+ }
+
+ return $path;
+}
+
+#
+# This subroutine repeatly returns the object dirnames in the
+# working_dir. The full path to the dirname is returned. "undef" is
+# returned when all have been cycled through.
+#
+sub next_dir_name
+{
+ # object directory:
+ my $object_directory = $working_dir;
+ $object_directory .= "/" . $object_dir if ($object_dir);
+
+ # Check if we have the directory handle already open:
+ if (! defined($next_dir_name_dh)) {
+ # If not, then opendir it:
+ $next_dir_name_dh = do { local *FH; *FH };
+ if (! opendir($next_dir_name_dh, $object_directory)) {
+ exiter(nodir($object_directory, $!));
+ }
+ }
+
+ my $dirname;
+
+ #
+ # Loop over directory entries until one matches the magic tag
+ # "object:" Return undef when done reading the directory.
+ #
+ while (1) {
+ $dirname = readdir($next_dir_name_dh);
+
+ if (! defined($dirname)) {
+ # Done with dir. Clean up for next time:
+ closedir($next_dir_name_dh);
+ undef($next_dir_name_dh);
+ return undef;
+ } elsif ($dirname =~ m,^:,) {
+ # Return the full path to object's directory:
+ return "$object_directory/$dirname";
+ }
+ }
+}
+
+#
+# When appcert started up, it stored the /usr/bin/file output in the
+# app's output directory (appcert: record_binary()). This subroutine
+# retrieves it. If it cannot find it, it runs the file command
+# instead. The result is stored in memory in %cmd_output_file_cache
+#
+# Returns the single line of "file" output including the "\n". It
+# returns the null string if it had trouble, usually only if filename
+# doesn't exist.
+#
+sub cmd_output_file
+{
+ my ($filename) = @_;
+
+ # Check if we have it cached:
+ if (exists($cmd_output_file_cache{$filename})) {
+ return $cmd_output_file_cache{$filename};
+ }
+
+ # Otherwise, try to look it up in the $working_dir:
+ my $outfile = object_to_dir_name($filename);
+ $outfile = "$working_dir/$outfile/info.file";
+
+ my $str;
+
+ if (-f $outfile) {
+ my $file_cmd_fh = do { local *FH; *FH };
+ if (open($file_cmd_fh, "<$outfile")) {
+ $str = <$file_cmd_fh>;
+ close($file_cmd_fh);
+ }
+ }
+
+ # Otherwise run /usr/bin/file on it:
+ if (! defined($str) && -f $filename && $filename !~ /'/) {
+ c_locale(1);
+ $str = `$cmd_file '$filename' 2>/dev/null`;
+ c_locale(0);
+ }
+
+ $cmd_output_file_cache{$filename} = $str;
+
+ return $str;
+}
+
+#
+# When appcert started up, it stored the /usr/ccs/bin/dump output in the
+# app's output directory (appcert: record_binary()). This subroutine
+# retrieves it. If it cannot find it, it runs the dump -Lv command
+# instead. The result is stored in memory in %cmd_output_dump_cache
+#
+# Returns the "dump -Lv" output. It returns the null string if it had
+# trouble, usually only if filename doesn't exist.
+#
+sub cmd_output_dump
+{
+ my ($filename) = @_;
+
+ # Check if we have it cached:
+ if (exists($cmd_output_dump_cache{$filename})) {
+ return $cmd_output_dump_cache{$filename};
+ }
+
+ # Otherwise, try to look it up in the $working_dir:
+ my $outfile = object_to_dir_name($filename);
+ $outfile = "$working_dir/$outfile/info.dump";
+
+ my $str;
+
+ if (-f $outfile) {
+ my $dump_cmd_fh = do { local *FH; *FH };
+ if (open($dump_cmd_fh, "<$outfile")) {
+ while (<$dump_cmd_fh>) {
+ $str .= $_;
+ }
+ close($dump_cmd_fh);
+ }
+ }
+
+ # Otherwise run /usr/ccs/bin/dump -Lv on it:
+ if (! defined($str) && -f $filename && $filename !~ /'/) {
+ c_locale(1);
+ $str = `$cmd_dump -Lv '$filename' 2>/dev/null`;
+ c_locale(0);
+ }
+
+ $cmd_output_dump_cache{$filename} = $str;
+
+ return $str;
+}
+
+#
+# When symprof runs it stores the /usr/bin/ldd output in the app's
+# output directory (symprof: dynamic_profile()). This subroutine
+# retrieves it. If it cannot find it, it runs the ldd command instead.
+# The result is stored in memory in %all_ldd_neededs_cache
+#
+# Returns a "neededs hash" as output. The keys being the things needed
+# (left side of " => ") and the values are the resolution (right side of
+# " => "). It returns the null hash if it had trouble, usually only if
+# filename doesn't even exist, or if the object is not dynamically
+# linked.
+#
+sub all_ldd_neededs
+{
+ my ($filename) = @_;
+
+ my (%all_neededs);
+
+ my $output;
+
+ # Check if we have it cached:
+ if (exists($all_ldd_neededs_cache{$filename})) {
+ $output = $all_ldd_neededs_cache{$filename};
+ }
+
+ if (! defined($output)) {
+ # Otherwise, try to look it up in the $working_dir:
+ my $outfile = object_to_dir_name($filename);
+ $outfile = "$working_dir/$outfile/profile.dynamic.ldd";
+
+ if (-f $outfile) {
+ my $all_neededs_fh = do { local *FH; *FH };
+ if (open($all_neededs_fh, "<$outfile")) {
+ while (<$all_neededs_fh>) {
+ next if (/^\s*#/);
+ $output .= $_;
+ }
+ }
+ close($all_neededs_fh);
+ }
+ }
+
+ my ($str, $line, $l1, $l2);
+ if (! defined($output) && -f $filename && $filename !~ /'/) {
+ # Otherwise run /usr/bin/ldd on it:
+ c_locale(1);
+ $str = `$cmd_ldd '$filename' 2>/dev/null`;
+ c_locale(0);
+ foreach $line (split(/\n/, $str)) {
+ $line = trim($line);
+ $output .= "$line\n";
+ }
+ }
+
+ if (! defined($output)) {
+ #
+ # Set the output to the null string so following loop
+ # will do nothing and thus the empty hash will be
+ # returned.
+ #
+ $output = '';
+ }
+
+ $all_ldd_neededs_cache{$filename} = $output;
+
+ foreach $line (split(/\n/, $output)) {
+ ($l1, $l2) = split(/\s*=>\s*/, $line);
+ $l1 = trim($l1);
+ $l2 = trim($l2);
+ $all_neededs{$l1} = $l2;
+ if ($l2 !~ /file not found/) {
+ $all_neededs{$l2} = $l2;
+ }
+ }
+
+ return %all_neededs;
+}
+
+#
+# Create a string with all of the needed objects (direct and indirect).
+# This is intended for object name matching. See the 'needed' MATCH
+# entries in etc.warn.
+#
+sub all_ldd_neededs_string
+{
+ my ($filename) = @_;
+ my (%hash, $key);
+ my $str = '';
+ %hash = all_ldd_neededs($filename);
+ foreach $key (keys(%hash)) {
+ $str .= "$key $hash{$key}\n";
+ }
+ return $str;
+}
+
+#
+# Create a list with all of the directly bound symbols. This is
+# intended for symbol call matching. See the 'syms' MATCH entries in
+# etc.warn.
+#
+sub direct_syms
+{
+ my ($filename) = @_;
+ #
+ # We stored the dynamic profile output in the app's output
+ # directory. This subroutine retrieves it, identifies the
+ # direct bindings symbol names and places them in a newline
+ # separated string returned to caller.
+ #
+ my $direct_syms = '';
+
+ my $outfile = object_to_dir_name($filename);
+ $outfile = "$working_dir/$outfile/profile.dynamic";
+
+ my $prof_fh = do { local *FH; *FH };
+ if (! open($prof_fh, "<$outfile")) {
+ exiter(nofile($outfile, $!));
+ }
+ my ($app, $caller, $lib, $sym);
+ while (<$prof_fh>) {
+ next if (/^\s*#/);
+ next if (/^\s*$/);
+ chop;
+ ($app, $caller, $lib, $sym) = split(/\|/, $_, 4);
+ next unless ($caller eq '*DIRECT*');
+ $direct_syms .= "$sym\n";
+ }
+ close($prof_fh);
+
+ return $direct_syms;
+}
+
+#
+# Block to keep export_list private
+#
+{
+ my %export_list = (
+ 'AC_LIB_DIR', 'appcert_lib_dir',
+ 'AC_WORKING_DIR', 'working_dir',
+ 'AC_TMP_DIR', 'tmp_dir',
+ 'AC_BINARY_COUNT', 'binary_count',
+ 'AC_BLOCK_MIN', 'block_min',
+ 'AC_BLOCK_MAX', 'block_max',
+ 'AC_BATCH_REPORT', 'batch_report',
+ );
+
+
+ #
+ # Subroutine to read in possibly exported variables
+ #
+ sub import_vars_from_environment
+ {
+ no strict qw(refs);
+
+ while (my ($evar, $pvar) = each(%export_list)) {
+ $pvar = $export_list{$evar};
+ if (exists($ENV{$evar})) {
+ $$pvar = $ENV{$evar};
+ } else {
+ $$pvar = '';
+ }
+ }
+ }
+
+ #
+ # Exports the variables in %export_list to the environment.
+ #
+ sub export_vars_to_environment
+ {
+ my $pval;
+ no strict qw(refs);
+
+ while (my ($evar, $pvar) = each(%export_list)) {
+ $pvar = $export_list{$evar};
+ $pval = $$pvar;
+ if (defined($pval)) {
+ $ENV{$evar} = $pval;
+ }
+ }
+ }
+}
+
+#
+# Routine for turning on or off LC_ALL environment variable 'C'. When
+# we want command output that we will parse we set LC_ALL=C. On the
+# other hand, when we want to pass command output to the user we retain
+# their locale (if any).
+#
+sub c_locale
+{
+ my ($action) = @_;
+
+ #
+ # example usage:
+ # c_locale(1);
+ # $output = `some_cmd some_args 2>/dev/null`;
+ # c_locale(0);
+ #
+
+ if ($action) {
+ if (defined($ENV{'LC_ALL'})) {
+ $LC_ALL = $ENV{'LC_ALL'};
+ } else {
+ $LC_ALL = '__UNSET__';
+ }
+ $ENV{'LC_ALL'} = 'C';
+ } else {
+ if ($LC_ALL eq '__UNSET__') {
+ delete $ENV{'LC_ALL'};
+ } else {
+ $ENV{'LC_ALL'} = $LC_ALL;
+ }
+ }
+}
+
+#
+# Set or get the overall appcert result/return code.
+#
+sub overall_result_code
+{
+ my ($val) = @_;
+ #
+ # The code has significance (see below) and is the numerical
+ # exit() code for the appcert script.
+ #
+ # Code can be number followed by 1-line description.
+ #
+ # 0 appcert completed OK and ZERO binaries had problems detected
+ # and ZERO binaries had "warnings".
+ # 1 appcert failed somehow
+ # 2 appcert completed OK and SOME binaries had problems detected.
+ # 3 appcert completed OK and ZERO binaries had problems detected.
+ # and SOME binaries had "warnings".
+ #
+ # When called with a no arguments, only the number is returned.
+ # When called with a non-null argument it is written to the rc file.
+ #
+
+ my ($return_code_file, $line);
+
+ $return_code_file = "$working_dir/ResultCode";
+
+ my $rc_file_fh = do { local *FH; *FH };
+ if (! defined($val)) {
+ if (! -f $return_code_file) {
+ emsg("%s", nofile($return_code_file));
+ return 1;
+ }
+ open($rc_file_fh, "<$return_code_file") ||
+ exiter(nofile($return_code_file, $!));
+ chomp($line = <$rc_file_fh>);
+ close($rc_file_fh);
+ if ($line =~ /^(\d+)/) {
+ return $1;
+ } else {
+ return $line;
+ }
+ } else {
+ $val = trim($val);
+ if ($val !~ /^\d+/) {
+ $val = "1 $val";
+ }
+ open($rc_file_fh, ">$return_code_file") ||
+ exiter(nofile($return_code_file, $!));
+ print $rc_file_fh $val, "\n";
+ close($rc_file_fh);
+ return;
+ }
+}
+
+#
+# Sorter for strings like: "something 14", sorts on count (number)
+# first, then by string.
+#
+sub sort_on_count
+{
+ my $soc_cmp = sub {
+ my($n1, $n2);
+ if ($a =~ /(\d+)\s*$/) {
+ $n1 = $1;
+ } else {
+ $n1 = 0;
+ }
+ if ($b =~ /(\d+)\s*$/) {
+ $n2 = $1;
+ } else {
+ $n2 = 0;
+ }
+
+ if ($n1 == $n2) {
+ # if the numbers are "tied", then compare the
+ # string portion.
+ $a cmp $b;
+ } else {
+ # otherwise compare numerically:
+ $n2 <=> $n1;
+ }
+ };
+ return sort $soc_cmp @_;
+}
+
+#
+# Trims leading and trailing whitespace from a string.
+#
+sub trim
+{
+ my ($x) = @_;
+ if (! defined($x)) {
+ return '';
+ }
+ $x =~ s/^\s*//;
+ $x =~ s/\s*$//;
+ return $x;
+}
+
+#
+# Prints a line to filehandle or STDOUT.
+#
+sub print_line
+{
+ my ($fh) = @_;
+ if (defined($fh)) {
+ print $fh '-' x 72, "\n";
+ } else {
+ print STDOUT '-' x 72, "\n";
+ }
+}
+
+#
+# Returns formatted output of list items that fit in 80 columns, e.g.
+# Gelf_got_title 1 Gelf_reloc_entry 1
+# Gelf_ver_def_print 1 Gelf_syminfo_entry_title 1
+# Gelf_sym_table_title 1 Gelf_elf_header 1
+#
+sub list_format
+{
+ my ($indent, @list) = @_;
+
+ # $indent is a string which shifts everything over to the right.
+
+ my $width = 0;
+ my ($item, $len, $space);
+
+ foreach $item (@list) { # find the widest list item.
+ $len = length($item);
+ $width = $len if ($len > $width);
+ }
+ $width += 2; # pad 2 spaces for each column.
+
+ if ($width > (80 - length($indent))) {
+ $width = 80 - length($indent);
+ }
+
+ # compute number of columns:
+ my $columns = int((80 - length($indent))/$width);
+
+ # initialize:
+ my $current_column = 0;
+ my $text = $indent;
+
+ # put the items into lined up columns:
+ foreach $item (@list) {
+ if ($current_column >= $columns) {
+ $text .= "\n";
+ $current_column = 0;
+ $text .= $indent;
+ }
+ $space = $width - length($item);
+ $text .= $item . ' ' x $space if ($space > 0);
+ $current_column++;
+ }
+ $text .= "\n" if ($current_column);
+
+ return $text;
+}
+
+#
+# Wrapper for STDERR messages.
+#
+sub emsg
+{
+ printf STDERR @_;
+}
+
+#
+# Wrapper for STDOUT messages.
+#
+sub pmsg
+{
+ printf STDOUT @_;
+}
+
+#
+# Error message for a failed file open.
+#
+sub nofile
+{
+ my $msg = "$command_name: ";
+ $msg .= gettext("cannot open file: %s\n");
+ $msg = sprintf($msg, join(' ', @_));
+
+ return $msg;
+}
+
+#
+# Error message for an invalid file path.
+#
+sub nopathexist
+{
+ my $msg = "$command_name: ";
+ $msg .= gettext("path does not exist: %s\n");
+ $msg = sprintf($msg, join(' ', @_));
+
+ return $msg;
+}
+
+#
+# Error message for a failed running of a command.
+#
+sub norunprog
+{
+ my $msg = "$command_name: ";
+ $msg .= gettext("cannot run program: %s\n");
+ $msg = sprintf($msg, join(' ', @_));
+
+ return $msg;
+}
+
+#
+# Error message for a failed directory creation.
+#
+sub nocreatedir
+{
+ my $msg = "$command_name: ";
+ $msg .= gettext("cannot create directory: %s\n");
+ $msg = sprintf($msg, join(' ', @_));
+
+ return $msg;
+}
+
+#
+# Error message for a failed directory opendir.
+#
+sub nodir
+{
+ my $msg = "$command_name: ";
+ $msg .= gettext("cannot open directory: %s\n");
+ $msg = sprintf($msg, join(' ', @_));
+
+ return $msg;
+}
+
+#
+# exiter routine wrapper is used primarily to abort. Calls
+# clean_up_exit() routine if that routine is defined. Prints $msg to
+# STDERR and exits with exit code $status $status is 1 (aborted command)
+# by default.
+#
+sub exiter
+{
+ my ($msg, $status) = @_;
+
+ if (defined($msg) && ! defined($status) && $msg =~ /^\d+$/) {
+ $status = $msg;
+ undef($msg);
+ }
+ if (! defined($status)) {
+ $status = 1;
+ }
+
+ if (defined($msg)) {
+ #
+ # append a newline unless one is already there or string
+ # is empty:
+ #
+ $msg .= "\n" unless ($msg eq '' || $msg =~ /\n$/);
+ emsg($msg);
+ }
+ if (defined($clean_up_exit_routine)) {
+ &$clean_up_exit_routine($status);
+ }
+
+ exit $status;
+}
+
+sub set_clean_up_exit_routine
+{
+ my($code_ref) = @_;
+ $clean_up_exit_routine = $code_ref;
+}
+
+#
+# Generic routine for setting up signal handling. (usually just a clean
+# up and exit routine).
+#
+# Call with mode 'on' and the name of the handler subroutine.
+# Call with mode 'off' to set signal handling back to defaults
+# (e.g. a handler wants to call signals('off')).
+# Call it with 'ignore' to set them to ignore.
+#
+sub signals
+{
+ my ($mode, $handler) = @_;
+
+ # List of general signals to handle:
+ my (@sigs) = qw(INT QUIT);
+
+ my $sig;
+
+ # Loop through signals and set the %SIG array accordingly.
+
+ if ($mode eq 'on') {
+ foreach $sig (@sigs) {
+ $SIG{$sig} = $handler;
+ }
+ } elsif ($mode eq 'off') {
+ foreach $sig (@sigs) {
+ $SIG{$sig} = 'DEFAULT';
+ }
+ } elsif ($mode eq 'ignore') {
+ foreach $sig (@sigs) {
+ $SIG{$sig} = 'IGNORE';
+ }
+ }
+}
+
+#
+# Creates a temporary directory with a unique name. Directory is
+# created and the directory name is return. On failure to create it,
+# null string is returned.
+#
+sub create_tmp_dir
+{
+ my ($basedir) = @_;
+ #
+ # If passed a prefix in $prefix, try to create a unique tmp dir
+ # with that basedir. Otherwise, it will make a name in /tmp.
+ #
+ # If passed a directory that already exists, a subdir is created
+ # with madeup basename "prefix.suffix"
+ #
+
+ my $cmd = $command_name;
+ $cmd = 'tempdir' unless (defined($cmd) && $cmd ne '');
+
+ if (! defined($basedir) || ! -d $basedir) {
+ $basedir = "/tmp/$cmd";
+ } else {
+ $basedir = "$basedir/$cmd";
+ }
+
+ my $suffix = $$;
+ if ($tmp_dir_count) {
+ $suffix .= ".$tmp_dir_count";
+ }
+ my $dir = "$basedir.$suffix";
+ $tmp_dir_count++;
+ if ($dir =~ m,^/tmp/,) {
+ if (! mkpath($dir, 0, 0700) || ! -d $dir) {
+ emsg("%s", nocreatedir($dir, $!));
+ return '';
+ }
+ } else {
+ if (! mkpath($dir) || ! -d $dir) {
+ emsg("%s", nocreatedir($dir, $!));
+ return '';
+ }
+ }
+ return $dir;
+}
+
+#
+# Checks to see if a directory is empty. Returns 1 if the directory is.
+# returns 0 if it is not or if directory does not exist.
+#
+sub dir_is_empty
+{
+ my ($dir) = @_;
+
+ return 0 if (! -d $dir);
+
+ my $is_empty = 1;
+
+ my $dir_is_empty_dh = do { local *FH; *FH };
+ if (opendir($dir_is_empty_dh, $dir)) {
+ my $subdir;
+ foreach $subdir (readdir($dir_is_empty_dh)) {
+ if ($subdir ne '.' && $subdir ne '..') {
+ $is_empty = 0;
+ last;
+ }
+ }
+ close($dir_is_empty_dh);
+ } else {
+ return 0;
+ }
+
+ return $is_empty;
+}
+
+#
+# Follows a symbolic link until it points to a non-symbolic link. If
+# $file is not a symlink but rather a file, returns $file. Returns null
+# if what is pointed to does not exist.
+#
+sub follow_symlink
+{
+ my ($file) = @_;
+
+ if (! -e $file) {
+ # We will never find anything:
+ return '';
+ }
+
+ if (! -l $file) {
+ # Not a symlink:
+ return $file;
+ }
+
+ my ($tmp1, $tmp2);
+
+ $tmp1 = $file;
+
+ while ($tmp2 = readlink($tmp1)) {
+
+ if ($tmp2 !~ m,^/,) {
+ $tmp2 = dirname($tmp1) . "/" . $tmp2;
+ }
+
+ $tmp1 = $tmp2; #
+ $tmp1 =~ s,/+,/,g; # get rid of ////
+ $tmp1 =~ s,^\./,,g; # remove leading ./
+ $tmp1 =~ s,/\./,/,g; # remove /./
+ $tmp1 =~ s,/+,/,g; # get rid of //// again
+ $tmp1 =~ s,/[^/]+/\.\./,/,g; # remove "abc/.."
+ #
+
+ if (! -e $tmp1) {
+ $tmp1 = $tmp2;
+ }
+ if (! -e $tmp1) {
+ return '';
+ }
+ }
+
+ return $tmp1;
+}
+
+#
+# Examines if the file is statically linked. Can be called on any file,
+# but it is preferable to run it on things known to be executables or
+# libraries.
+#
+# Returns 0 if not statically linked. Otherwise, returns 1.
+#
+sub is_statically_linked
+{
+ my ($file) = @_;
+
+ my $tmp;
+ my $file_cmd_output;
+ $file_cmd_output = cmd_output_file($file);
+
+ if ($file_cmd_output eq '') {
+ return 1;
+ }
+
+ if ($file_cmd_output =~ /[:\s](.*)$/) {
+ $tmp = $1;
+ if ($tmp =~ /ELF.*statically linked/) {
+ return 1;
+ } elsif ($tmp =~ /Sun demand paged/) {
+ if ($tmp !~ /dynamically linked/) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+#
+# Examines first 4 bytes of file. Returns 1 if they are "\x7fELF".
+# Otherwise, returns 0.
+#
+sub is_elf
+{
+ my ($file) = @_;
+
+ my ($buf, $n);
+ my $cmp = "\x7fELF";
+ if (! -r $file) {
+ return 0;
+ }
+
+ my $is_elf_fh = do { local *FH; *FH };
+ if (open($is_elf_fh, "<$file")) {
+ $n = read($is_elf_fh, $buf, 4);
+ close($is_elf_fh);
+ if ($n != 4) {
+ return 0;
+ }
+ if ($buf eq $cmp) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#
+# Returns 1 if $file is a shared object (i.e. ELF shared library)
+# Returns 0 if it is not.
+#
+# Routine uses the dump -Lv output to determine this. Failing that, it
+# examines the /usr/bin/file output.
+#
+sub is_shared_object
+{
+ my ($file) = @_;
+
+ return 0 unless (-f $file);
+
+ my ($on, $line, $is_shared_object);
+ my ($n, $tag, $val);
+
+ $on = 0;
+ $is_shared_object = 0;
+
+ foreach $line (split(/\n/, cmd_output_dump($file))) {
+
+ if ($line =~ /^\[INDEX\]/) {
+ $on = 1;
+ next;
+ }
+ next unless ($on);
+ ($n, $tag, $val) = split(/\s+/, trim($line));
+ if ($tag eq "SONAME") {
+ $is_shared_object = 1;
+ last;
+ }
+ }
+
+ if (! $is_shared_object) {
+ # If it is ELF, file output will say "dynamic lib":
+ $line = cmd_output_file($file);
+ if ($line =~ /ELF.* dynamic lib /) {
+ $is_shared_object = 1;
+ }
+ }
+
+ return $is_shared_object;
+}
+
+#
+# Used for the a.out warning in etc.warn. Examines first 4 bytes of
+# file, and returns 1 if SunOS 4.x a.out binary 0 otherwise.
+#
+sub is_aout
+{
+ my ($file) = @_;
+
+ my ($buf, $n);
+ my $cmp1 = "\001\013";
+ my $cmp2 = "\001\010";
+ my $cmp3 = "\001\007";
+ if (! -r $file) {
+ return 0;
+ }
+
+ my $is_aout_fh = do { local *FH; *FH };
+ if (open($is_aout_fh, "<$file")) {
+ $n = read($is_aout_fh, $buf, 4);
+ close($is_aout_fh);
+ if ($n != 4) {
+ return 0;
+ }
+ $buf = substr($buf, 2);
+ if ($buf eq $cmp1) {
+ return 1;
+ }
+ if ($buf eq $cmp2) {
+ return 1;
+ }
+ if ($buf eq $cmp3) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#
+# is_suid
+# Returns 1 if $file is a set user ID file.
+# Returns 2 if $file otherwise is a set group ID (but not suid).
+# Returns 0 if it is neither or file does not exist.
+#
+sub is_suid
+{
+ my ($file) = @_;
+
+ return 0 unless (-f $file);
+
+ my ($mask, $mode, $test);
+ my @is_suid_masks = (04000, 02010, 02030, 02050, 02070);
+
+ $mode = (stat($file))[2];
+
+ foreach $mask (@is_suid_masks) {
+ $test = $mode & $mask;
+ if ($test == $mask) {
+ if ($mask == $is_suid_masks[0]) {
+ return 1;
+ } else {
+ return 2;
+ }
+ }
+ }
+ return 0;
+}
+
+#
+# Returns a list of (abi, [ELF|a.out], wordsize, endianness)
+#
+sub bin_type
+{
+ my ($filename) = @_;
+
+ my ($abi, $e_machine, $type, $wordsize, $endian, $rest);
+
+ $abi = 'unknown';
+ $e_machine = 'unknown';
+ $type = 'unknown';
+ $wordsize = 'unknown';
+ $endian = 'unknown';
+
+ # Try to look it up in the $working_dir:
+ my $outfile = object_to_dir_name($filename);
+ $outfile = "$working_dir/$outfile/info.arch";
+
+ if (-f $outfile) {
+ my $arch_info_fh = do { local *FH; *FH };
+ if (open($arch_info_fh, "<$outfile")) {
+ while (<$arch_info_fh>) {
+ chomp;
+ if (/^ARCH:\s*(\S.*)$/) {
+ $abi = $1;
+ } elsif (/^TYPE:\s*(\S.*)$/) {
+ $type = $1;
+ } elsif (/^WORDSIZE:\s*(\S.*)$/) {
+ $wordsize = $1;
+ } elsif (/^BYTEORDER:\s*(\S.*)$/) {
+ $endian = $1;
+ }
+ }
+ close($arch_info_fh);
+ }
+ return ($abi, $type, $wordsize, $endian);
+ }
+
+ # Otherwise, process /usr/bin/file output:
+ my $file_output;
+ $file_output = cmd_output_file($filename);
+
+ if ($file_output =~ /Sun demand paged SPARC|pure SPARC/) {
+ $type = 'a.out';
+ $abi = 'sparc';
+ $e_machine = 'SPARC';
+ $wordsize = '32';
+ $endian = 'MSB';
+ } elsif ($file_output =~ /ELF\s+/) {
+ $type = 'ELF';
+ $rest = $';
+ if ($rest =~ /^(\d+)-bit\s+/) {
+ $wordsize = $1;
+ $rest = $';
+ }
+ if ($rest =~ /^(LSB|MSB)\s+/) {
+ $endian = $1;
+ $rest = $';
+ }
+ if ($rest =~ /SPARC/) {
+ if ($rest =~ /\bSPARC\b/) {
+ $abi = 'sparc';
+ $e_machine = 'SPARC';
+ } elsif ($rest =~ /\bSPARC32PLUS\b/) {
+ $abi = 'sparc';
+ $e_machine = 'SPARC32PLUS';
+ } elsif ($rest =~ /\bSPARCV9\b/) {
+ $abi = 'sparcv9';
+ $e_machine = 'SPARCV9';
+ }
+ } else {
+ if ($rest =~ /\bAMD64\b/ ||
+ $wordsize == 64 && $endian eq 'LSB') {
+ $abi = 'amd64';
+ $e_machine = 'AMD64';
+ } elsif ($rest =~ /\b80386\b/) {
+ $abi = 'i386';
+ $e_machine = '80386';
+ }
+ }
+ }
+ return ($abi, $type, $wordsize, $endian, $e_machine);
+}
+
+#
+# Compares two files to see if they are the same. First tries some
+# string comparisons. Then, if $fast is not true, attempts an inode
+# comparison.
+#
+sub files_equal
+{
+ my ($file1, $file2, $fast) = @_;
+
+ my ($f1, $f2);
+
+ #
+ # If they are the same string, we say they are equal without
+ # checking if they do exist.
+ #
+
+ if ($file1 eq $file2) {
+ return 1;
+ }
+
+ # Try trimming off any leading "./"
+ $f1 = $file1;
+ $f2 = $file2;
+
+ $f1 =~ s,^\./+,,;
+ $f2 =~ s,^\./+,,;
+
+ if ($f1 eq $f2) {
+ return 1;
+ }
+
+ # That is all we do if doing a fast compare.
+ return 0 if ($fast);
+
+ # Otherwise, resort to the file system:
+
+ my ($inode1, $inode2);
+ $inode1 = file_inode($file1);
+ $inode2 = file_inode($file2);
+
+ if (! defined($inode1) || ! defined($inode2) ||
+ $inode1 < 0 || $inode2 < 0) {
+ return 0;
+ } elsif ($inode1 eq $inode2) {
+ return 1;
+ }
+ return 0;
+}
+
+#
+# Utility to return the inode of a file. Used to determine if two
+# different paths or a path + symlink point to the same actual file.
+#
+sub file_inode
+{
+ my ($file) = @_;
+
+ my $inode;
+ if (exists($file_inode_cache{$file})) {
+ return $file_inode_cache{$file};
+ }
+
+ if (! file_exists($file)) {
+ $file_inode_cache{$file} = -1;
+ return -1;
+ }
+
+ $inode = (stat($file))[1];
+
+ if (! defined($inode) || $inode !~ /^\d+$/) {
+ $inode = -1;
+ }
+
+ $file_inode_cache{$file} = $inode;
+ return $inode;
+}
+
+#
+# Existence test for files. Caches the results for speed.
+#
+sub file_exists
+{
+ my ($file) = @_;
+
+ if (exists($file_exists_cache{$file})) {
+ return $file_exists_cache{$file};
+ }
+
+ my $x;
+ if (-e $file) {
+ $x = 1;
+ } else {
+ $x = 0;
+ }
+ $file_exists_cache{$file} = $x;
+
+ return $x;
+}
+
+#
+# This routine deletes the caches we store information (e.g. cmd output)
+# in to improve performance. It is called when the caches are suspected
+# to be too large.
+#
+sub purge_caches
+{
+ undef %file_exists_cache;
+ undef %file_inode_cache;
+ undef %filter_lib_cache;
+ undef %cmd_output_file_cache;
+ undef %cmd_output_dump_cache;
+ undef %all_ldd_neededs_cache;
+}
+
+#
+# Given a filter library, this routine tries to determine if it is a
+# STANDARD filter or an AUXILIARY filter. This is done by running dump
+# -Lv on the filter library. Results are cached in the global
+# filter_lib_cache to avoid calling dump many times on the same library
+# (e.g. libc.so.1).
+#
+sub filter_lib_type
+{
+ my ($filter) = @_;
+
+ my $type = 'unknown';
+
+ if (exists($filter_lib_cache{$filter})) {
+ return $filter_lib_cache{$filter};
+ }
+
+ if (! -f $filter) {
+ $filter_lib_cache{$filter} = 'unknown';
+ return 'unknown';
+ }
+
+ my $dump_output;
+ $dump_output = cmd_output_dump($filter);
+
+ if (! $dump_output) {
+ emsg(gettext("could not determine library filter type: %s\n"),
+ $filter);
+ $filter_lib_cache{$filter} = 'unknown';
+
+ } else {
+ my ($line, $dump, $idx, $tag, $val);
+ my ($saw_filter, $saw_aux);
+ $saw_filter = 0;
+ $saw_aux = 0;
+ foreach $line (split(/\n/, $dump_output)) {
+ next unless ($line =~ /^\[\d+\]/);
+ $dump = trim($line);
+ ($idx, $tag, $val) = split(/\s+/, $dump);
+ # detect both names used for each filter type:
+ if ($tag eq 'FILTER' || $tag eq 'SUNW_FILTER') {
+ $type = 'STD';
+ $saw_filter = 1;
+ } elsif ($tag eq 'AUXILIARY' || $tag eq
+ 'SUNW_AUXILIARY') {
+ $type = 'AUX';
+ $saw_aux = 1;
+ }
+ }
+ if ($saw_filter && $saw_aux) {
+ $type = 'AUX';
+ }
+ $filter_lib_cache{$filter} = $type;
+ }
+ return $filter_lib_cache{$filter};
+}
+
+#
+# Calls "abi_index" to dynamically create the list of Solaris libraries
+# and their characteristics.
+#
+sub load_model_index
+{
+ my $dir = "auto"; # all model indexes are created automatically
+
+ if (exists($lib_index_loaded{$dir})) {
+ if ($lib_index_loaded{$dir} == -1) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+
+ my ($lib, $lib2, $def, $cnt, $link_cnt, $all_links);
+ my ($key, $base);
+
+ my $reading_cache_file;
+
+ $link_cnt = 0;
+ my $cache_file = "$working_dir/AbiIndex";
+ my $index_fh = do { local *FH; *FH };
+ my $cache_fh = do { local *FH; *FH };
+ if (-f $cache_file) {
+ open($index_fh, "<$cache_file") ||
+ exiter(nofile($cache_file, $!));
+ $reading_cache_file = 1;
+ } else {
+ if (! open($index_fh,
+ "$appcert_lib_dir/abi_index 2>/dev/null |")) {
+ exiter(noprogrun("abi_index", $!));
+ }
+ if (! open($cache_fh, ">$cache_file")) {
+ exiter(nofile($cache_file, $!));
+ }
+ $reading_cache_file = 0;
+ }
+
+ if (! $reading_cache_file) {
+ emsg("\n");
+ emsg(gettext("determining list of Solaris libraries"));
+ emsg(" ...\n");
+ }
+
+ my $abi;
+ while (<$index_fh>) {
+ next if (/^\s*#/);
+ next if (/^\s*$/);
+ print $cache_fh $_ if (! $reading_cache_file);
+ chomp;
+
+ ($abi, $lib, $def, $cnt, $all_links) = split(/\|/, $_, 5);
+
+ next if (! -f $lib);
+
+ $abi = 'any' if ($abi eq 'unknown');
+
+ # note if $all_links is empty, we still get the base lib.
+ foreach $lib2 ($lib, split(/:/, $all_links)) {
+ $key = "$dir|$lib2|$abi";
+ $lib_index_definition{$key} = $def;
+
+ $base = basename($lib2);
+ #
+ # store an index of lib basenames to be used for
+ # libfoo.so* matching.
+ #
+ $shared_object_index{$base}++;
+ $lib_index{$base}++ if ($base =~ /^lib/);
+
+ $link_cnt++;
+ }
+ #
+ # record the device/inode too, used to avoid confusion due
+ # to symlinks between *directories* instead of files. E.g.:
+ # /usr/lib/64 -> /usr/lib/sparcv9
+ # under some crle(1) configurations this can be
+ # particularly problematic.
+ #
+ if (-e $lib) {
+ my ($device, $inode) = (stat($lib))[0,1];
+ if (defined($device) && defined($inode)) {
+ $key = "$dir|$device/$inode|$abi";
+ $lib_index_definition{$key} = $def;
+ }
+ }
+ }
+ close($index_fh);
+ close($cache_fh) if (! $reading_cache_file);
+
+ # return 1 if library links were loaded. 0 indicates a failure.
+ push(@lib_index_loaded, $dir);
+ if ($link_cnt) {
+ $lib_index_loaded{$dir} = $link_cnt;
+ return 1;
+ } else {
+ $lib_index_loaded{$dir} = -1;
+ return 0;
+ }
+}
+
+#
+# Returns a list of Solaris library basenames matching a pattern. If a
+# directory name is in $pattern, it will be prepended to each item.
+#
+sub lib_match
+{
+ my ($pattern, $return_something) = @_;
+
+ if ($pattern eq '*') {
+ # special case '*'
+ return $pattern;
+ }
+
+ #
+ # $return_something = 1 means if there was nothing matched,
+ # return $pattern to the caller.
+ #
+ # This sub should only be called to initialize things since it
+ # is very slow. (runs the regex over all libraries) Do not call
+ # it in a loop over, say, application binaries. Rather, call it
+ # before the loop and make note of all the discrete cases.
+ #
+
+ # To handle libfoo.so* matching, we need the Index file loaded:
+ if (! $lib_match_initialized) {
+ load_model_index();
+ $lib_match_initialized = 1;
+ }
+
+ my (@list, @libs, $lib, $id, $patt0, $dir0);
+
+ # if empty, set it to "0" for the $id key.
+ $return_something = 0 if ($return_something eq '');
+ $id = "$pattern|$return_something";
+
+ if (defined($lib_match_cache{$id})) {
+ # If we have already found it, return the cached result.
+ return split(/\|/, $lib_match_cache{$id});
+ }
+
+ $patt0 = $pattern;
+ # extract dirname, if any.
+ if ($pattern =~ m,/,) {
+ $dir0 = dirname($pattern);
+ $pattern = basename($pattern);
+ } else {
+ $dir0 = '';
+ }
+
+ # turn the matching pattern into a regex:
+ $pattern =~ s/\./\\./g; # protect .'s
+ $pattern =~ s/\*/.*/g; # * -> .*
+ $pattern =~ s,/,\\/,g; # protect /'s (see below)
+
+ #
+ # create a little code to check the match, since there will be a
+ # big loop of checks: note the anchoring /^...$/
+ #
+ my $regex = qr/^$pattern$/;
+
+ if ($pattern =~ /^lib/) {
+ # for a bit of speed, the lib* set is much smaller, so use it:
+ @libs = keys(%lib_index);
+ } else {
+ # this is the full list:
+ @libs = keys(%shared_object_index);
+ }
+
+ # now try all libs for a match, and store in @list.
+ foreach $lib (@libs) {
+ if ($lib =~ /$regex/) {
+ if ($dir0 ne '') {
+ # put back the dirname:
+ $lib = "$dir0/$lib";
+ }
+ push(@list, $lib);
+ }
+ }
+
+ # return list and cache result:
+ if ($return_something && ! @list) {
+ $lib_match_cache{$id} = $patt0;
+ return $patt0;
+ } else {
+ $lib_match_cache{$id} = join('|', @list);
+ return @list;
+ }
+}
+
+#
+# Expand the matches in a etc.warn MATCH expression.
+# returns subroutine code for the comparison.
+#
+sub expand_expr
+{
+ my($expr) = @_;
+ my $code = 'my($fn) = @_; ';
+ $expr =~ s/\bfile\s*\=\~\s*/ cmd_output_file(\$fn) =~ /g;
+ $expr =~ s/\bdump\s*\=\~\s*/ cmd_output_dump(\$fn) =~ /g;
+ $expr =~ s/\bneeded\s*\=\~\s*/ all_ldd_neededs_string(\$fn) =~ /g;
+ $expr =~ s/\bsyms\s*\=\~\s*/ direct_syms(\$fn) =~ /g;
+
+ $code .= "if ($expr) {return 1;} else {return 0;}";
+ return $code;
+}
+
+#
+# Loads the binary stability information contained in the
+# /usr/lib/abi/appcert/etc.* files.
+#
+sub load_misc_check_databases
+{
+ my $etc_dir = "$appcert_lib_dir";
+
+ my ($etc_file, $line);
+
+ my (@etcs) = <$etc_dir/etc.*>;
+
+ #
+ # Event(etc.) types to handle:
+ #
+ # SCOPED_SYMBOL|<release>|<lib>|<sym>
+ # MODEL_TWEAK|<library>|<abi1,...>|<symbol>|<classification>
+ # REMOVED_SYMBOL|<release>|<lib>|<sym>
+ #
+
+ my ($tag, $rel, $lib, $sym, $rest);
+ my ($abis, $class, $tmp, $gather);
+
+ # Read in and process all the etc files:
+ my $count = 0;
+ foreach $etc_file (@etcs) {
+ my $etc_fh = do { local *FH; *FH };
+ if (! open($etc_fh, "<$etc_file")) {
+ exiter(nofile($etc_file, $!));
+ }
+ while (<$etc_fh>) {
+ # read each line:
+ chomp($line = $_);
+
+ # gather lines continued with "\" at end:
+ while ($line =~ /\\$/) {
+ chomp($line);
+ last if (eof($etc_fh));
+ chomp($tmp = <$etc_fh>);
+ # handle "-" ... "-" style text blocks.
+ if ($tmp eq '-') {
+ #
+ # gather everything until the
+ # next '-' line.
+ #
+ $gather = '';
+ while (1) {
+ last if (eof($etc_fh));
+ chomp($tmp = <$etc_fh>);
+ last if ($tmp eq '-');
+ $gather .= "|$tmp";
+ }
+ $line .= $gather;
+ } else {
+ $line .= " " . $tmp;
+ }
+ }
+
+ #
+ # skip blank lines or lines (including continued lines)
+ # beginning with "#"
+ #
+ next if ($line =~ /^\s*#/);
+ next if ($line =~ /^\s*$/);
+
+ my $lib2;
+
+ # Case statement for all the types:
+ if ($line =~ /^SCOPED_SYMBOL/) {
+ ($tag, $rel, $lib, $sym, $rest) =
+ split(/\|/, $line, 5);
+ #
+ # current implementation uses library basename.
+ #
+ # We may also want to split this value
+ # into a hash or two, e.g.
+ # Scope_Symbol_Release, etc..
+ #
+ # No lib_match wild-carding done for this case.
+ #
+ $scoped_symbol{"$lib|$sym"} .=
+ "$rel|$lib|$sym,";
+ $scoped_symbol_all{"$sym"} .=
+ "$rel|$lib|$sym,";
+ } elsif ($line =~ /^SKIP_SYMBOL/) {
+ #
+ # These are low-level, e.g. C runtime
+ # we always want to skip.
+ #
+ ($tag, $sym) = split(/\|/, $line, 2);
+ $skip_symbols{$sym} = 1;
+
+ } elsif ($line =~ /^MODEL_TWEAK/) {
+ #
+ # These are direct edits of symbol
+ # public/private database.
+ #
+ ($tag, $lib, $abis, $sym, $class) =
+ split(/\|/, $line, 5);
+ # change arch sep from "," to "%"
+ $abis =~ s/,/%/g;
+
+ my (@libs, $lib64, @tmp);
+ if ($lib =~ /\*/) {
+ @libs = lib_match($lib, 1);
+ } else {
+ push(@libs, $lib);
+ }
+ if ($abis eq '*') {
+ #
+ # '*' means all ABIs, so we modify
+ # pathnames to reflect the 64 bit
+ # versions. If these exists on the
+ # system, we append them to the list
+ # for this tweak.
+ #
+ @tmp = @libs;
+ foreach $lib2 (@tmp) {
+ if ($lib2 !~ m,/lib/,) {
+ next;
+ }
+ #
+ # check for existence of sparc
+ # and x86 64 bit versions.
+ #
+ $lib64 = $lib2;
+ $lib64 =~
+ s,/lib/,/lib/sparcv9/,;
+ if (-e $lib64) {
+ push(@libs, $lib64);
+ }
+ $lib64 = $lib2;
+ $lib64 =~ s,/lib/,/lib/amd64/,;
+ if (-e $lib64) {
+ push(@libs, $lib64);
+ }
+ $lib64 = $lib2;
+ $lib64 =~ s,/lib/,/lib/64/,;
+ if (-e $lib64) {
+ push(@libs, $lib64);
+ }
+ }
+ }
+
+ @tmp = @libs;
+ foreach $lib2 (@tmp) {
+ if ($lib2 !~ m,/, || ! -e $lib2) {
+ next;
+ }
+ #
+ # if it exists on the system,
+ # store info wrt inode as well:
+ #
+ my ($device, $inode);
+ ($device, $inode) = (stat($lib2))[0,1];
+ if ($device ne '' && $inode ne '') {
+ push(@libs, "$device/$inode");
+ }
+ }
+
+ #
+ # now store the tweak info for all associated
+ # libraries.
+ #
+ foreach $lib2 (@libs) {
+ $model_tweak{$lib2} .=
+ "$sym|$abis|$class,";
+ }
+
+ } elsif ($line =~ /^WARNING:/) {
+ #
+ # Extra warnings for miscellaneous problems.
+ #
+ my $cnt = 0;
+ my ($warn, $tag, $desc, $bindings);
+ my ($bind, $text);
+ ($warn, $tag, $desc, $bindings, $text) =
+ split(/:/, $line, 5);
+
+ # trim any leading spaces:
+ $tag =~ s/^\s*//;
+ $desc =~ s/^\s*//;
+ $bindings =~ s/^\s*//;
+ $text =~ s/^\s*//;
+
+ $tag =~ s,[\s/;]+,_,g;
+
+ #
+ # desc lists will be ";" delimited, so
+ # replace any found in the text.
+ #
+ $desc =~ s/;/,/g;
+ $desc = trim($desc);
+
+
+ # Store info in %Warnings_* hashes:
+
+ $warnings_desc{$tag} = $desc;
+
+ $warnings_match{$tag} = '';
+
+ if ($bindings =~ /^MATCH\s*(\S.*)$/) {
+ #
+ # Handle the pattern MATCH
+ # case. Note there there is no
+ # libfoo.so.* matching here.
+ #
+ my $expr = $1;
+ my $code;
+
+ #
+ # For efficiency we will create
+ # a subroutine for each case.
+ #
+
+ # get subref code:
+ $code = expand_expr($expr);
+
+ # define the subroutine:
+
+ my $subref;
+ eval "\$subref = sub { $code };";
+ if ("$@" eq "" && $subref) {
+ $warnings_match{$tag} = $subref;
+ }
+ } else {
+ #
+ # Otherwise, it is a
+ # lib|sym|caller type match
+ #
+ my ($lib, $sym, $rest);
+ foreach $bind (split(/,/, $bindings)) {
+ #
+ # Create pseudo tag,
+ # "tag|N", for each
+ # binding.
+ #
+ $bind = trim($bind);
+ ($lib, $sym, $rest) =
+ split(/\|/, $bind, 3);
+ foreach $lib2
+ (lib_match($lib, 1)) {
+ $tmp = "$tag|$cnt";
+ $warnings_bind{$tmp} =
+ "$lib2|$sym|$rest";
+ $warnings_desc{$tmp} =
+ $desc;
+ $cnt++;
+ }
+ }
+ }
+ }
+ }
+ $count++;
+ close($etc_fh);
+ }
+
+ # Trim any trailing "," separators from the last append:
+
+ my $key;
+ foreach $key (keys(%scoped_symbol)) {
+ $scoped_symbol{$key} =~ s/,+$//;
+ }
+ foreach $key (keys(%scoped_symbol_all)) {
+ $scoped_symbol_all{$key} =~ s/,+$//;
+ }
+ foreach $key (keys(%model_tweak)) {
+ $model_tweak{$key} =~ s/,+$//;
+ #
+ # make sure tweak is associated with device/inode to aid not
+ # getting tricked by symlinks under crle, LD_LIBRARY_PATH, etc.
+ #
+ my ($device, $inode) = (stat($key))[0,1];
+ if (defined($device) && defined($inode)) {
+ $model_tweak{"$device/$inode"} = $model_tweak{$key};
+ }
+ }
+ return $count;
+}
+
+1;
diff --git a/usr/src/cmd/abi/appcert/scripts/Makefile b/usr/src/cmd/abi/appcert/scripts/Makefile
new file mode 100644
index 0000000..9b08992
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/Makefile
@@ -0,0 +1,106 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# cmd/abi/appcert/scripts/Makefile
+#
+
+SUFFIXES += .pl .pm
+
+PROG= appcert
+APPCERT_SUBCMDS= symcheck symprof symreport abi_index
+MODULES= AppcertUtil.pm
+
+SCRIPTS= $(PROG) $(APPCERT_SUBCMDS)
+MESSAGES= $(SCRIPTS:%=%.po) $(MODULES:%.pm=%.po)
+
+
+CLEANFILES= $(SCRIPTS) $(MESSAGES)
+CLOBBERFILES= $(SCRIPTS) $(MESSAGES)
+
+include $(SRC)/cmd/Makefile.cmd
+
+ROOTLIBABIDIR = $(ROOTLIB)/abi/appcert
+ROOTLIBABIFILES = $(APPCERT_SUBCMDS:%=$(ROOTLIBABIDIR)/%) \
+ $(MODULES:%=$(ROOTLIBABIDIR)/%)
+
+.KEEP_STATE:
+
+all: $(SCRIPTS) $(MODULES)
+
+#
+# install targets
+# Note: Makefile.cmd has a rule to cover $(ROOTSHFILES), but
+# $(ROOTLIBABIFILES) are special install targets (go into
+# dirs not covered by Makefile.cmd), so we provide an explicit
+# rule for that.
+#
+
+install: all .WAIT $(ROOTPROG) $(ROOTLIBABIDIR) .WAIT $(ROOTLIBABIFILES)
+
+_msg: $(MSGDOMAIN) $(MESSAGES)
+ $(CP) $(MESSAGES) $(MSGDOMAIN)
+
+$(MSGDOMAIN):
+ $(INS.dir)
+
+.pl:
+ $(RM) $@
+ $(SED) -e "s@TEXT_DOMAIN@\"$(TEXT_DOMAIN)\"@" $< > $@
+ $(CHMOD) +x $@
+
+.pm:
+
+
+clean:
+ -$(RM) $(CLEANFILES)
+
+$(ROOTBINPROG): $(PROG)
+ $(INS.file)
+
+$(ROOTLIBABIDIR):
+ $(INS.dir)
+
+$(ROOTLIBABIDIR)/%: %
+ $(INS.file)
+
+%.po: %.pl
+ $(XGETTEXT) $(XGETFLAGS) $<
+ $(RM) $@
+ $(SED) "/^domain/d" messages.po > $@
+ $(RM) messages.po
+
+%.po: %.pm
+ $(XGETTEXT) $(XGETFLAGS) $<
+ $(RM) $@
+ $(SED) "/^domain/d" messages.po > $@
+ $(RM) messages.po
+
+lint:
+
+clobber: clean
+ -$(RM) $(CLOBBERFILES)
+
diff --git a/usr/src/cmd/abi/appcert/scripts/abi_index.pl b/usr/src/cmd/abi/appcert/scripts/abi_index.pl
new file mode 100644
index 0000000..c1ff743
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/abi_index.pl
@@ -0,0 +1,419 @@
+#!/usr/perl5/bin/perl -w
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# This utility program reads the contents file to extract Solaris ELF
+# libraries, and then runs pvs(1) on them to find the library versioning
+# information (if any). This info is printed to stdout in an index file
+# format.
+#
+
+require 5.005;
+use strict;
+use locale;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+
+use vars qw(
+ @liblist
+ %symlink
+ %inode_hash
+ %fileoutput
+ %didlib
+);
+
+setlocale(LC_ALL, "");
+textdomain(TEXT_DOMAIN);
+
+# parameters for what types of libraries to list out:
+my $must_be_versioned = 0;
+my $must_be_public = 0;
+
+# paths to skip outright.
+my @skip_list = qw(
+ /etc
+ /usr/4lib
+ /usr/perl5
+);
+my $path_skip = join('|', @skip_list);
+$path_skip = qr/^($path_skip)/;
+
+# find library names:
+#
+# We have to use pkgchk -l output (even though it is much slower than
+# parsing /var/sadm/install/contents ourselves) because the contents
+# file will go away or change incompatibly at some point.
+#
+my $old = $ENV{'LC_ALL'};
+$ENV{'LC_ALL'} = 'C';
+my $contents_fh = do { local *FH; *FH };
+open($contents_fh, "/usr/sbin/pkgchk -l|") || die "$!\n";
+if (defined($old)) {
+ $ENV{'LC_ALL'} = $old;
+} else {
+ delete($ENV{'LC_ALL'});
+}
+
+my $pathname = '';
+my $type = '';
+my $link = '';
+my $pkgs = '';
+my $status = '';
+my $inpkgs = 0;
+while (<$contents_fh>) {
+ next if (/^Ex/);
+ chomp;
+ if (/^Pathname:\s*/i) {
+ $pathname = $';
+ $type = '';
+ $link = '';
+ $status = '';
+ $pkgs = '';
+ $inpkgs = 0;
+ next;
+ } elsif (/^Type:\s*/i) {
+ $type = $';
+ next;
+ } elsif (/^Source of link:\s*/i) {
+ $link = $';
+ next;
+ } elsif (/^Referenced by/i) {
+ $inpkgs = 1;
+ } elsif (/^Current status:\s*/i) {
+ $status = $';
+ $inpkgs = 0;
+ next;
+ } elsif (/^\s*$/) {
+ next unless ($pathname =~ m,\.so,);
+ next unless ($pathname =~ m,/lib,);
+ next unless ($pathname =~ m,/lib[^/]*\.so\b,);
+ next unless ($type =~ /regular file|symbolic link/i);
+ next unless ($status =~ /^\s*installed\s*$/);
+ $pathname = trim($pathname);
+ $link = trim($link);
+ filter($pathname, $link, $pkgs);
+ }
+ if ($inpkgs) {
+ $pkgs .= $_ . ' ';
+ }
+}
+close($contents_fh);
+
+# run pvs(1) on the libraries found:
+my $batch = 30; # batch size to use (running in batches is faster).
+
+my @list = ();
+for (my $i = 1; $i <= scalar(@liblist); $i++) {
+ push(@list, $liblist[$i-1]);
+ if ($i % $batch == 0) {
+ do_pvs(@list) if (@list);
+ @list = ();
+ }
+}
+do_pvs(@list) if (@list); # finish any remainder.
+
+exit 0;
+
+#
+# Take a pkgchk -l entry and decide if it corresponds to a Solaris
+# library. If so, save it in the list @liblist, and record info in
+# %symlink & %inode_hash associative arrays as appropriate.
+#
+sub filter
+{
+ my ($path, $link, $pkgs) = @_;
+
+
+ # consider only SUNW packages:
+ return unless ($pkgs =~ /\bSUNW\S+/);
+
+ my $basename;
+
+ $basename = basename($path);
+
+ if ($link ne '') {
+ # include developer build-time symlinks:
+ return unless ($basename =~ /^lib.*\.so[\.\d]*$/);
+ } else {
+ return unless ($basename =~ /^lib.*\.so\.[\.\d]+$/);
+ }
+ return if ($path =~ /$path_skip/);
+
+ return unless (-f $path);
+
+ # inode is used to identify what file a symlink point to:
+ my $inode;
+ $inode = (stat($path))[1];
+ return unless (defined($inode));
+
+ if ($link ne '') {
+ # record info about symlinks:
+ if (exists($symlink{$inode})) {
+ $symlink{$inode} .= ":" . $path;
+ } else {
+ $symlink{$inode} = ":" . $path;
+ }
+ } else {
+ # ordinary file case:
+ $inode_hash{$path} = $inode;
+ push(@liblist, $path);
+ }
+}
+
+#
+# Run pvs(1) on a list of libraries. More than one is done at a time to
+# speed things up.
+#
+# Extracts the version information and passes it to the output() routine
+# for final processing.
+#
+sub do_pvs
+{
+ my (@list) = @_;
+
+ my (%list, $paths, $path, $cnt);
+
+ #
+ # record info about the library paths and construct the list of
+ # files for the pvs command line.
+ #
+ $cnt = 0;
+ $paths = '';
+ foreach $path (@list) {
+ $list{$path} = 1;
+ $paths .= ' ' if ($paths ne '');
+ #
+ # $path should never have single quote in it in
+ # all normal usage. Make sure this is so:
+ #
+ next if ($path =~ /'/);
+ #
+ # quote the filename in case it has meta-characters
+ # (which should never happen in all normal usage)
+ #
+ $paths .= "'$path'";
+ $cnt++;
+ }
+
+ return if ($cnt == 0);
+
+ # set locale to C for running command, since we interpret the output:
+ my $old = $ENV{'LC_ALL'};
+ $ENV{'LC_ALL'} = 'C';
+
+ # get the file(1) output for each item:
+ my $file_fh = do { local *FH; *FH };
+ open($file_fh, "/usr/bin/file $paths 2>&1 |") || die "$!\n";
+ my ($file, $out);
+ while (<$file_fh>) {
+ ($file, $out) = split(/:/, $_, 2);
+ if ($list{$file} && $out =~ /\bELF\b/) {
+ $fileoutput{$file} = $out;
+ }
+ }
+ close($file_fh);
+
+ #
+ # in the case of only 1 item, we place it on the command line
+ # twice to induce pvs(1) to indicate which file it is reporting
+ # on.
+ #
+ if ($cnt == 1) {
+ $paths .= " $paths";
+ }
+
+ #
+ # $paths are entries from /var/sadm/install/contents and
+ # so should not contain spaces or meta characters:
+ #
+ my $pvs_fh = do { local *FH; *FH };
+ open($pvs_fh, "/usr/bin/pvs -dn $paths 2>&1 |") || die "$!\n";
+
+ # reset LC_ALL, if there was any:
+ if (defined($old)) {
+ $ENV{'LC_ALL'} = $old;
+ } else {
+ delete($ENV{'LC_ALL'});
+ }
+
+ my ($pub, $pri, $obs, $evo, $vers, $new_path);
+
+ undef($path);
+
+ # initialize strings used below for appending info to:
+ $pub = '';
+ $pri = '';
+ $obs = '';
+ $evo = '';
+
+ while (<$pvs_fh>) {
+ $_ =~ s/\s*$//;
+ if (m,^([^:]+):$,) {
+ # a new pvs file header, e.g. "/usr/lib/libc.so.1:"
+ if ($list{$1}) {
+ $new_path = $1;
+
+ # output the previous one and reset accumulators:
+ if (defined($path)) {
+ output($path, $pub, $pri, $obs, $evo);
+
+ $pub = '';
+ $pri = '';
+ $obs = '';
+ $evo = '';
+ }
+ $path = $new_path;
+ next; # done with pvs header case
+ }
+ }
+
+ # extract SUNW version head end:
+
+ $vers = trim($_);
+ $vers =~ s/;//g;
+
+ # handle the various non-standard cases in Solaris libraries:
+ if ($vers =~ /^(SUNW.*private|SUNW_XIL_GPI)/i) {
+ $pri .= $vers . ":";
+ } elsif ($vers =~ /^(SUNW_\d|SYSVABI|SISCD)/) {
+ $pub .= $vers . ":";
+ } elsif ($vers =~ /^(SUNW\.\d|SUNW_XIL)/) {
+ $pub .= $vers . ":";
+ } elsif ($vers =~ /^SUNWobsolete/) {
+ $obs .= $vers . ":";
+ } elsif ($vers =~ /^SUNWevolving/) {
+ $evo .= $vers . ":";
+ } else {
+ next;
+ }
+ }
+ close($pvs_fh);
+
+ # output the last one (if any):
+ if (defined($path)) {
+ output($path, $pub, $pri, $obs, $evo);
+ }
+}
+
+#
+# Take the raw library versioning information and process it into index
+# file format and then print it out.
+#
+sub output
+{
+ my ($path, $pub, $pri, $obs, $evo) = @_;
+
+ return if ($didlib{$path}); # skip repeating a library
+
+ # trim off any trailing separators:
+ $pub =~ s/:$//;
+ $pri =~ s/:$//;
+ $obs =~ s/:$//;
+ $evo =~ s/:$//;
+
+ # work out the type of library:
+ my $type;
+ my $defn;
+ my $n;
+ if ($pri && ! $pub && ! $obs && ! $evo) {
+ $type = 'INTERNAL';
+ $defn = 'NO_PUBLIC_SYMS';
+ } elsif ($obs) {
+ $type = 'OBSOLETE';
+ $defn = $obs;
+ } elsif ($pub) {
+ $type = 'PUBLIC';
+ $defn = $pub;
+ if ($defn =~ /:/) {
+ $defn =~ s/:/,/g;
+ $defn = "PUBLIC=$defn";
+ }
+ } elsif ($evo) {
+ $type = 'EVOLVING';
+ $defn = $evo;
+ } elsif (! $pri && ! $pub && ! $obs && ! $evo) {
+ $type = 'UNVERSIONED';
+ $defn = '-';
+ } else {
+ return;
+ }
+
+ # return if instructed to skip either of these cases:
+ if ($must_be_versioned && $type eq 'UNVERSIONED') {
+ return;
+ }
+ if ($must_be_public && $type eq 'INTERNAL') {
+ return;
+ }
+
+
+ # prepare the output line, including any symlink information:
+ my $inode = $inode_hash{$path};
+ my $links;
+ if ($inode && exists($symlink{$inode})) {
+ $links = "${path}$symlink{$inode}";
+ } else {
+ $links = "$path";
+ }
+
+ # count the total number of references:
+ my (@n) = split(/:/, $links);
+ $n = scalar(@n);
+
+ # determine the abi to which the library file belongs:
+ my ($fout, $abi);
+ $abi = 'unknown';
+ $fout = $fileoutput{$path};
+ if ($fout =~ /\bSPARCV9\b/) {
+ $abi = 'sparcv9';
+ } elsif ($fout =~ /\bSPARC/) {
+ $abi = 'sparc';
+ } elsif ($fout =~ /\bAMD64\b/ || $fout =~ /\bELF\s+64-bit\s+LSB\b/) {
+ $abi = 'amd64';
+ } elsif ($fout =~ /\b80386\b/) {
+ $abi = 'i386';
+ }
+ print STDOUT "$abi|$path|$defn|$n|$links\n";
+
+ # record that we did this library so we do not process it a second time.
+ $didlib{$path} = 1;
+}
+
+#
+# Remove leading and trailing spaces.
+#
+sub trim
+{
+ my ($x) = @_;
+ $x =~ s/^\s*//;
+ $x =~ s/\s*$//;
+
+ return $x;
+}
diff --git a/usr/src/cmd/abi/appcert/scripts/appcert.pl b/usr/src/cmd/abi/appcert/scripts/appcert.pl
new file mode 100644
index 0000000..74dec7c
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/appcert.pl
@@ -0,0 +1,847 @@
+#!/usr/perl5/bin/perl -w
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# This is the top level script for performing the appcert checks. It
+# reads the command line options, determines list of binaries to check,
+# and then calls symprof (the raw symbol profiler), symcheck (that
+# checks for unstable behavior), and symreport (that constructs and
+# outputs a rollup report)
+#
+
+require 5.005;
+use strict;
+use locale;
+use Getopt::Std;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+use File::Path;
+
+use lib qw(/usr/lib/abi/appcert);
+use AppcertUtil;
+
+setlocale(LC_ALL, "");
+textdomain(TEXT_DOMAIN);
+
+use vars qw(
+ @item_list
+ $file_list
+ $do_not_follow_symlinks
+ $modify_ld_path
+ $append_solaris_dirs_to_ld_path
+ $skipped_count
+);
+
+my $caught_signal = 0;
+my $record_binary_call_count = 0;
+
+# The directory where the appcert specific scripts and data reside:
+$appcert_lib_dir = "/usr/lib/abi/appcert";
+
+set_clean_up_exit_routine(\&clean_up_exit);
+
+signals('on', \&interrupted);
+
+get_options();
+
+@item_list = @ARGV; # List of directories and/or objects to check.
+check_item_list();
+
+set_working_dir();
+
+find_binaries(); # Records all of the binary objects to check.
+
+supplement_ld_library_path();
+
+export_vars_to_environment(); # Exports info for our child scripts to use.
+
+run_profiler(); # Run the script symprof.
+
+run_checker(); # Run script symcheck.
+
+run_report_generator(); # Run the script symreport.
+
+my $rc = overall_result_code();
+
+clean_up();
+
+exit $rc;
+
+
+#
+# This subroutine calls getopts() and sets up variables reflecting how
+# we were called.
+#
+sub get_options
+{
+ my %opt;
+
+ getopts('?hnLBSw:f:', \%opt) || (show_usage() && exiter(2));
+
+ if (exists($opt{'?'}) || exists($opt{'h'})) {
+ show_usage();
+ exiter(2);
+ }
+
+ if (exists($opt{'f'})) {
+ $file_list = $opt{'f'};
+ } else {
+ $file_list = '';
+ }
+
+ if (exists($opt{'w'})) {
+ $working_dir = $opt{'w'};
+ } else {
+ $working_dir = '';
+ }
+ if ($working_dir =~ /'/) {
+ #
+ # This character will ultimately cause problems with
+ # system() and pipelines so we exit now.
+ #
+ exiter(sprintf(gettext(
+ "directory contains the single-quote character ': %s\n"),
+ $working_dir));
+ }
+
+ if (defined($opt{'B'})) {
+ $batch_report = 1;
+ } else {
+ $batch_report = 0;
+ }
+
+ if (defined($opt{'n'})) {
+ $do_not_follow_symlinks = 1;
+ } else {
+ $do_not_follow_symlinks = 0;
+ }
+
+ if (defined($opt{'L'})) {
+ $modify_ld_path = 0;
+ } else {
+ $modify_ld_path = 1;
+ }
+
+ if (defined($opt{'S'})) {
+ $append_solaris_dirs_to_ld_path = 1;
+ } else {
+ $append_solaris_dirs_to_ld_path = 0;
+ }
+}
+
+#
+# Performs an initial check to see if the user supplied anything at all
+# to check. Also reads in the file list if the user supplied one via -f <file>
+#
+sub check_item_list
+{
+ # Add the items if the -f flag was used.
+ if ($file_list) {
+ my $file;
+ my $list_fh = do { local *FH; *FH };
+ if (-f $file_list && open($list_fh, "<$file_list")) {
+ while (<$list_fh>) {
+ chomp($file = $_);
+ push(@item_list, $file);
+ }
+ close($list_fh);
+ } else {
+ exiter(nofile($file_list, $!));
+ }
+ }
+
+ return if (@item_list);
+
+ emsg("$command_name: " . gettext(
+ "at least one file or directory to check must be specified.") .
+ "\n\n");
+
+ show_usage();
+ exiter(3);
+}
+
+#
+# This subroutine sets up the working directory, the default something
+# like: /tmp/appcert.<PID>
+#
+sub set_working_dir
+{
+ if ($working_dir) {
+ # working_dir has been set in get_options().
+ if (! -d $working_dir) {
+ if (! mkpath($working_dir) || ! -d $working_dir) {
+ exiter(nocreatedir($working_dir, $!));
+ }
+ } else {
+ if (! dir_is_empty($working_dir)) {
+ # create a subdir of it for our use.
+ $working_dir = create_tmp_dir($working_dir);
+ }
+ }
+ } else {
+ # Default case: will create, e.g., /tmp/appcert.12345
+ $working_dir = create_tmp_dir();
+ }
+
+ if (! -d $working_dir) {
+ # We have no working directory.
+ exiter(nocreatedir($working_dir));
+ }
+
+ #
+ # Create a subdirectory of working_dir that will contain all of
+ # the object subdirs.
+ #
+ my $dir = "$working_dir/$object_dir";
+ if (! mkpath($dir) || ! -d $dir) {
+ exiter(nocreatedir($dir, $!));
+ }
+ #
+ # Make a tmp subdirectory for small temporary work. It is
+ # preferred to have it on tmpfs (especially not NFS) for
+ # performance reasons.
+ #
+ $tmp_dir = "/tmp/${command_name}_tmp.$$";
+ if (-d $tmp_dir) {
+ exiter(nocreatedir("$tmp_dir", $!));
+ }
+ if (! mkpath($tmp_dir, 0, 0700) || ! -d $tmp_dir) {
+ emsg("%s", nocreatedir($tmp_dir, $!));
+ # fall back to our output dir (which could have slow access)
+ $tmp_dir = "$working_dir/tmp";
+ if (! mkpath($tmp_dir)) {
+ exiter(nocreatedir($tmp_dir, $!));
+ }
+ }
+
+ if (! -d $tmp_dir) {
+ exiter(nocreatedir($tmp_dir, $!));
+ }
+}
+
+#
+# Top level function to find all the binaries to be checked. Calls
+# record_binary() to do the actual deciding and recording.
+#
+# The array @item_list contains all the items to find.
+#
+sub find_binaries
+{
+ $binary_count = 0;
+
+ my $skipped_file = "$working_dir/Skipped";
+ my $skipped_fh = do { local *FH; *FH };
+ open($skipped_fh, ">$skipped_file") ||
+ exiter(nofile($skipped_file, $!));
+
+ $skipped_count = 0;
+
+ my ($item, $args, $file);
+ emsg("\n" . gettext(
+ "finding executables and shared libraries to check") . " ...\n");
+
+ $args = '';
+ $args .= '-follow ' unless ($do_not_follow_symlinks);
+ $args .= '-type f -print';
+
+ my $quote_fmt = gettext(
+ "skipping: item contains the single-quote character ': %s\n");
+
+ foreach $item (@item_list) {
+ if (! -e $item) {
+ emsg(gettext("skipping: %s: %s\n"), $item, $!);
+ print $skipped_fh "$item: no_exist\n";
+ $skipped_count++;
+ next;
+ } elsif ($item =~ /'/) {
+ emsg($quote_fmt, $item);
+ print $skipped_fh "$item: item_has_bad_char\n";
+ $skipped_count++;
+ next;
+ }
+ # note that $item does not contain a single-quote.
+ my $find_fh = do { local *FH; *FH };
+ open($find_fh, "$cmd_find '$item' $args|") ||
+ exiter(norunprog("$cmd_find '$item' $args", $!));
+
+ while (<$find_fh>) {
+ chomp($file = $_);
+ #
+ # We are free to remove leading "./". This will
+ # minimize directory names we create that would
+ # start with a dot.
+ #
+ $file =~ s,^\./,,;
+
+ next if ($file eq '');
+
+ record_binary($file, $skipped_fh);
+ }
+ close($find_fh);
+ }
+
+ if ($binary_count == 0) {
+ exiter("$command_name: " . gettext(
+ "no checkable binary objects were found."), 3);
+ }
+
+ if ($skipped_count == 0) {
+ print $skipped_fh "# NO_FILES_WERE_SKIPPED\n";
+ }
+ close($skipped_fh);
+}
+
+#
+# This subroutine will determine if a binary is checkable.
+#
+# If so, it will reserve a directory for its output in the $working_dir
+# location, and store the output of a number of commands there.
+#
+sub record_binary
+{
+ my ($file, $skipped_fh) = @_;
+
+ if ((++$record_binary_call_count % 500) == 0) {
+ #
+ # This indicates are being called many times for a large
+ # product. Clear out our caches.
+ #
+ purge_caches();
+ }
+
+ #
+ # Check if the object exists and is regular file. Note that
+ # this test also passes a symlink as long as that symlink
+ # ultimately refers to a regular file.
+ #
+ if (! -f $file) {
+ emsg(gettext("skipping: not a file: %s\n"), $file);
+ print $skipped_fh "$file: not_a_file\n";
+ $skipped_count++;
+ return 0;
+ }
+
+ # Check if it is readable:
+ if (! -r $file) {
+ emsg(gettext("skipping: cannot read: %s\n"), $file);
+ print $skipped_fh "$file: unreadable\n";
+ $skipped_count++;
+ return 0;
+ }
+
+ #
+ # Since the filename will be used as operands passed to utility
+ # commands via the shell, we exclude at the outset certain meta
+ # characters in the filenames.
+ #
+ my $quote_fmt = gettext(
+ "skipping: filename contains the single-quote character: ': %s\n");
+ if ($file =~ /'/) {
+ emsg($quote_fmt, $file);
+ print $skipped_fh "$file: filename_has_bad_char\n";
+ $skipped_count++;
+ return 0;
+ }
+
+ my $newline_fmt = gettext(
+ "skipping: filename contains the newline character: \\n: %s\n");
+ if ($file =~ /\n/) {
+ emsg($newline_fmt, $file);
+ print $skipped_fh "$file: filename_has_bad_char\n";
+ $skipped_count++;
+ return 0;
+ }
+
+ my $pipe_fmt = gettext(
+ "skipping: filename contains the pipe character: \|: %s\n");
+ if ($file =~ /\|/) {
+ emsg($pipe_fmt, $file);
+ print $skipped_fh "$file: filename_has_bad_char\n";
+ $skipped_count++;
+ return 0;
+ }
+
+ my $file_output;
+
+ # Run the file(1) command on it.
+
+ c_locale(1);
+ # note that $file does not contain a single-quote.
+ $file_output = `$cmd_file '$file' 2>/dev/null`;
+ c_locale(0);
+
+ if ($file_output =~ /script$/) {
+ $file_output =~ s/:\s+/: /;
+ $file_output =~ s/: /: script /;
+ print $skipped_fh "$file_output";
+
+ #
+ # again now without the c_locale() setting:
+ # note that $file does not contain a single-quote.
+ #
+ $file_output = `$cmd_file '$file' 2>/dev/null`;
+ $file_output =~ s/:\s+/: /;
+ emsg(gettext("skipping: %s"), $file_output);
+ $skipped_count++;
+ return 0;
+ }
+
+ # create ELF and a.out matching regex:
+ my $object_match =
+ 'ELF.*executable.*dynamically' . '|' .
+ 'ELF.*dynamic lib' . '|' .
+ 'ELF.*executable.*statically' . '|' .
+ 'Sun demand paged SPARC.*dynamically linked' . '|' .
+ 'Sun demand paged SPARC executable' . '|' .
+ 'pure SPARC executable' . '|' .
+ 'impure SPARC executable';
+
+ #
+ # Note that we let the "statically linked" binaries through
+ # here, but will catch them later in the profiler and checker.
+ #
+
+ if ($file_output !~ /$object_match/io) {
+ # it is not an ELF object file and so does not interest us.
+ return 0;
+ }
+
+ my $exec_fmt = gettext(
+ "skipping: must have exec permission to be checked: %s\n");
+ if (! -x $file) {
+ #
+ # It interests us, but the execute bit not set. Shared
+ # objects will be let through here since ldd will still
+ # work on them (since it uses lddstub). Otherwise, we
+ # cannot check it.
+ #
+ if (! is_shared_object($file)) {
+ # warn the user exec bit should be set:
+ emsg($exec_fmt, $file);
+ print $skipped_fh "$file: no_exec_permission\n";
+ $skipped_count++;
+ return 0;
+ }
+ }
+
+ #
+ # Rather than let ldd fail later on in symprof, we check the
+ # arch here to make sure it matches $uname_p. If it does not
+ # match, we anticipate a 64-bit application and so we
+ # immediately test how ldd will handle it (kernel might be
+ # 32-bit, etc).
+ #
+ my ($arch, $type, $wordsize, $endian, $e_machine) = bin_type($file);
+
+ if ($arch !~ /^${uname_p}$/io) {
+ my ($ldd_output, $ldd_output2);
+
+ #
+ # Now run ldd on it to see how things would go. If it
+ # fails we must skip it.
+ #
+ c_locale(1);
+ # note that $file does not contain single-quote
+ $ldd_output = `$cmd_ldd '$file' 2>&1 1>/dev/null`;
+ c_locale(0);
+ if ($? != 0) {
+ # note that $file does not contain a single-quote
+ $ldd_output2 = `$cmd_ldd '$file' 2>&1 1>/dev/null`;
+ $ldd_output =~ s/\n.*$//;
+ $ldd_output2 =~ s/\n.*$//;
+ if ($ldd_output !~ /wrong class/) {
+ $ldd_output = "$file: " . sprintf(
+ gettext("ldd failed for arch: %s"), $arch);
+ $ldd_output2 = $ldd_output;
+ } else {
+ $ldd_output .= " ($arch)";
+ $ldd_output2 .= " ($arch)";
+ }
+ $ldd_output =~ s/:\s+/: /;
+ $ldd_output2 =~ s/:\s+/: /;
+ emsg(gettext("skipping: %s\n"), $ldd_output2);
+ $ldd_output =~ s/: /: ldd_failed /;
+ print $skipped_fh "$ldd_output\n";
+ $skipped_count++;
+ return 0;
+ }
+ }
+
+ # From this point on, object is one we decided to check.
+
+ # Create the directory name for this object:
+ my $dirname = object_to_dir_name($file);
+ my $dirpath = "$working_dir/$dirname";
+ my $early_fmt = gettext(
+ "skipping: %s referenced earlier on the command line\n");
+ if (-e $dirpath) {
+ #
+ # Directory already exists. We assume this means the
+ # user listed it twice (possibly indirectly via "find").
+ #
+ emsg($early_fmt, $file);
+ return 0;
+ }
+
+ if (! mkdir($dirpath, 0777)) {
+ exiter(nocreatedir($dirpath, $!));
+ }
+
+ $binary_count++;
+
+ # Record binary object's location:
+ my $path_fh = do { local *FH; *FH };
+ open($path_fh, ">$dirpath/info.path") ||
+ exiter(nofile("$dirpath/info.path", $!));
+ print $path_fh $file, "\n";
+ close($path_fh);
+
+ #
+ # Record /usr/bin/file output. Note that the programmatical way
+ # to access this info is through the command cmd_output_file().
+ #
+ my $file_fh = do { local *FH; *FH };
+ open($file_fh, ">$dirpath/info.file") ||
+ exiter(nofile("$dirpath/info.file", $!));
+ print $file_fh $file_output;
+ close($file_fh);
+
+ #
+ # Record dump -Lv output. Note that the programmatical way to
+ # access this info is through the command cmd_output_dump().
+ #
+ my $dump_fh = do { local *FH; *FH };
+ open($dump_fh, ">$dirpath/info.dump") ||
+ exiter(nofile("$dirpath/info.dump", $!));
+
+ my $dump_output;
+ c_locale(1);
+ # note that $file does not contain a single-quote
+ $dump_output = `$cmd_dump -Lv '$file' 2>&1`;
+ c_locale(0);
+ print $dump_fh $dump_output;
+ close($dump_fh);
+
+ #
+ # Record arch and etc binary type.
+ #
+ my $arch_fh = do { local *FH; *FH };
+ open($arch_fh, ">$dirpath/info.arch") ||
+ exiter(nofile("$dirpath/info.arch", $!));
+
+ if ($arch eq 'unknown') {
+ my $tmp = $file_output;
+ chomp($tmp);
+ emsg(gettext("warning: cannot determine arch: %s\n"), $tmp);
+ }
+
+ print $arch_fh "ARCH: $arch\n";
+ print $arch_fh "TYPE: $type\n";
+ print $arch_fh "WORDSIZE: $wordsize\n";
+ print $arch_fh "BYTEORDER: $endian\n";
+ print $arch_fh "E_MACHINE: $e_machine\n";
+ close($arch_fh);
+
+ # Record the file -> directory name mapping in the index file.
+ my $index_file = "$working_dir/Index";
+ my $index_fh = do { local *FH; *FH };
+ open($index_fh, ">>$index_file") ||
+ exiter(nofile($index_file, $!));
+ print $index_fh "$file => $dirname\n";
+ close($index_fh);
+
+ return 1;
+}
+
+#
+# Prints the usage statement to standard out.
+#
+sub show_usage
+{
+ emsg(gettext(
+ "usage: appcert [ -nBLS ] [ -f file ] [ -w dir ] { obj | dir } ...\n" .
+ " Examine binary object files for use of private Solaris\n" .
+ " interfaces, unstable use of static linking, and other\n" .
+ " unstable practices.\n")
+ );
+}
+
+#
+# Examines the set of binaries to be checked and notes which ones are
+# shared libraries. Constructs a LD_LIBRARY_PATH that would find ALL of
+# these shared objects. The new directories are placed at the END of the
+# current LD_LIBRARY_PATH (if any).
+#
+sub supplement_ld_library_path
+{
+ my (@orig, @add_product, @add_solaris, %ldpath);
+
+ # First, note the current LD_LIBRARY_PATH parts:
+
+ my $dirname;
+ if (defined($ENV{'LD_LIBRARY_PATH'})) {
+ foreach $dirname (split(/:/, $ENV{'LD_LIBRARY_PATH'})) {
+ if (! exists($ldpath{$dirname})) {
+ push(@orig, $dirname);
+ $ldpath{$dirname} = 1;
+ }
+ }
+ }
+
+ # Next, search for ELF shared objects.
+ my ($dir, $path);
+
+ if ($modify_ld_path) {
+ while (defined($dir = next_dir_name())) {
+ $path = dir_name_to_path($dir);
+
+ $dirname = dirname($path);
+ next if (exists($ldpath{$dirname}));
+
+ #
+ # A colon ":" in directory name is cannot be
+ # accepted because that is the LD_LIBRARY_PATH
+ # separator.
+ #
+ next if ($dirname =~ /:/);
+
+ if (is_shared_object($path)) {
+ if (! exists($ldpath{$dirname})) {
+ push(@add_product, $dirname);
+ $ldpath{$dirname} = 1;
+ }
+ }
+ }
+ }
+
+ if ($append_solaris_dirs_to_ld_path) {
+ foreach $dirname (split(/:/, $solaris_library_ld_path)) {
+ if (! exists($ldpath{$dirname})) {
+ push(@add_solaris, $dirname);
+ $ldpath{$dirname} = 1;
+ }
+ }
+ }
+
+ # modify the LD_LIBRARY_PATH:
+ if (@add_product || @add_solaris) {
+ $ENV{'LD_LIBRARY_PATH'} =
+ join(':', (@orig, @add_product, @add_solaris));
+ }
+
+ emsg("\n");
+ if (@add_product) {
+ emsg(gettext(
+ "Shared libraries were found in the application and the\n" .
+ "following directories are appended to LD_LIBRARY_PATH:\n"
+ ) . "\n");
+
+ foreach $dir (@add_product) {
+ $dir = "./$dir" unless ($dir =~ m,^/,);
+ emsg(" $dir\n");
+ }
+ emsg("\n");
+ }
+
+ if (@add_solaris) {
+ emsg(gettext(
+ "These Solaris library directories are being appended\n" .
+ "to LD_LIBRARY_PATH:\n") . "\n");
+
+ foreach $dir (@add_solaris) {
+ emsg(" $dir\n");
+ }
+ emsg("\n");
+ }
+}
+
+#
+# Everything is correctly exported by now, and so we just run "symprof".
+# It is run in batches of $block_size binaries to minimize the effect of
+# memory usage caused by huge binaries in the product to be checked.
+#
+sub run_profiler
+{
+ my $block_size = 20;
+
+ my $i = 0;
+
+ # record old values of the blocks (if any)
+ my $env_min = $ENV{'AC_BLOCK_MIN'};
+ my $env_max = $ENV{'AC_BLOCK_MAX'};
+
+ while ($i < $binary_count) { # do each block
+ # export our symprof values of the block limits
+ $ENV{'AC_BLOCK_MIN'} = $i;
+ $ENV{'AC_BLOCK_MAX'} = $i + $block_size;
+
+ run_symprof();
+
+ $i += $block_size;
+ }
+
+ # restore old values of the blocks (if any)
+ if (defined($env_min)) {
+ $ENV{'AC_BLOCK_MIN'} = $env_min;
+ } else {
+ delete $ENV{'AC_BLOCK_MIN'};
+ }
+ if (defined($env_max)) {
+ $ENV{'AC_BLOCK_MAX'} = $env_max;
+ } else {
+ delete $ENV{'AC_BLOCK_MAX'};
+ }
+}
+
+#
+# Sub that actually runs "symprof".
+#
+sub run_symprof
+{
+ system("$appcert_lib_dir/symprof");
+ if ($? != 0) {
+ emsg("%s", utilityfailed("symprof"));
+ clean_up_exit(1);
+ }
+}
+
+#
+# Sub to run "symcheck".
+#
+sub run_checker
+{
+ system("$appcert_lib_dir/symcheck");
+ if ($? != 0) {
+ emsg("%s", utilityfailed("symcheck"));
+ clean_up_exit(1);
+ }
+}
+
+#
+# Sub to run "symreport".
+#
+sub run_report_generator
+{
+ system("$appcert_lib_dir/symreport");
+ if ($? != 0) {
+ emsg("%s", utilityfailed("symreport"));
+ clean_up_exit(1);
+ }
+}
+
+#
+# General routine to be called if one of our utility programs (symprof,
+# symcheck, symreport) failed (that is, return != 0). returns the
+# formatted error message string to pass to the user.
+#
+sub utilityfailed
+{
+ my ($prog) = @_;
+ my $fmt;
+ $fmt = "\n *** " . gettext("utility program failed: %s\n");
+ return sprintf($fmt, $prog);
+}
+
+#
+# Does the cleanup and then exits with return code $rc. The utility
+# subroutine exiter() will call this subroutine. No general cleanup is
+# performed if exiting with error ($rc > 0) so that the user can examine
+# at the output files, etc.
+#
+sub clean_up_exit
+{
+ my ($rc) = @_;
+
+ if ($rc != 0) {
+ working_dir_msg();
+ } else {
+ clean_up();
+ }
+
+ exit $rc;
+}
+
+#
+# General cleanup routine.
+#
+sub clean_up
+{
+ if (-d $tmp_dir && ($tmp_dir !~ m,^/+$,)) {
+ rmdir($tmp_dir);
+ }
+}
+
+#
+# Routine that is called when an error has occurred. It indicates to
+# user where the working and/or temporary directory is and that they are
+# not being removed.
+#
+sub working_dir_msg
+{
+
+ my @dirlist;
+ emsg("\n");
+ if (defined($working_dir) && -d $working_dir) {
+ push(@dirlist, $working_dir);
+ }
+ if (defined($tmp_dir) && -d $tmp_dir) {
+ push(@dirlist, $tmp_dir);
+ }
+
+ return if (! @dirlist);
+
+ emsg(gettext(
+ "Note that the temporary working directories still exist:") .
+ "\n\n");
+
+ my $dir;
+ # show the user explicitly which directories remains:
+ foreach $dir (@dirlist) {
+ system($cmd_ls, '-ld', $dir);
+ }
+
+ emsg("\n");
+}
+
+#
+# Signal handler for interruptions (E.g. Ctrl-C SIGINT).
+#
+sub interrupted
+{
+ $SIG{$_[0]} = 'IGNORE';
+
+ exit 1 if ($caught_signal);
+ $caught_signal = 1;
+
+ signals('off');
+ emsg("\n** " . gettext("interrupted") . " **\n");
+
+ clean_up_exit(1);
+}
diff --git a/usr/src/cmd/abi/appcert/scripts/symcheck.pl b/usr/src/cmd/abi/appcert/scripts/symcheck.pl
new file mode 100644
index 0000000..1d77f34
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/symcheck.pl
@@ -0,0 +1,1309 @@
+#!/usr/perl5/bin/perl -w
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# This utility program loads the unstable behavior databases, then reads
+# the symprof output for each binary, and record any detected unstable
+# behavior in the binary's output directory.
+#
+
+require 5.005;
+use strict;
+use locale;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+use File::Path;
+
+use lib qw(/usr/lib/abi/appcert);
+use AppcertUtil;
+
+setlocale(LC_ALL, "");
+textdomain(TEXT_DOMAIN);
+
+use vars qw(
+ $LIBC
+ $tmp_check_dir
+ $binaries_checked_count
+ $misc_check_databases_loaded_ok
+ %load_model_default
+ %load_error
+ %model_loaded
+ %model
+ %is_system_library_cache
+);
+
+set_clean_up_exit_routine(\&clean_up_exit);
+
+initialize_variables();
+
+import_vars_from_environment();
+
+signals('on', \&interrupted);
+
+set_working_dir();
+
+load_model_index();
+
+check_objects();
+
+clean_up();
+
+exit 0;
+
+#
+# Set up any variables.
+#
+sub initialize_variables
+{
+ # Here is what we call libc:
+ $LIBC = '/usr/lib/libc.so.1';
+}
+
+#
+# working_dir has been imported by import_vars_from_environment()
+# A sanity check is performed here to make sure it exists.
+#
+sub set_working_dir
+{
+ if (! defined($working_dir) || ! -d $working_dir) {
+ exiter("$command_name: " . sprintf(gettext(
+ "cannot locate working directory: %s\n"), $working_dir));
+ }
+}
+
+#
+# Called when interrupted by a signal.
+#
+sub interrupted
+{
+ $SIG{$_[0]} = 'DEFAULT';
+ signals('off');
+ clean_up_exit(1);
+}
+
+#
+# Does the cleanup then exit with return code $rc. Note: The utility
+# routine exiter() will call this routine.
+#
+sub clean_up_exit
+{
+ my ($rc) = @_;
+ $rc = 0 unless ($rc);
+
+ clean_up();
+ exit $rc;
+}
+
+#
+# General cleanup activities are placed here. There may not be an
+# immediate exit after this cleanup.
+#
+sub clean_up
+{
+ if (defined($tmp_check_dir) && -d $tmp_check_dir) {
+ rmtree($tmp_check_dir);
+ }
+}
+
+#
+# Top level routine to initialize databases and then loop over the
+# objects and call the checking routines on each one.
+#
+sub check_objects
+{
+ # Make a tmp dir for the checking work.
+ $tmp_check_dir = create_tmp_dir($tmp_dir);
+
+ if (! -d $tmp_check_dir) {
+ exiter(nocreatedir($tmp_check_dir, $!));
+ }
+
+ emsg("\n" . gettext(
+ "checking binary objects for unstable practices") . " ...\n\n");
+
+ my ($dir, $path_to_object);
+
+ #
+ # Loop over each object item in the working_dir.
+ # - $dir will be each one of these object directories.
+ # - $path_to_object will be the corresponding actual path
+ # to the the binary to be checked.
+ # Output will be placed down in $dir, e.g. "$dir/check.foo"
+ #
+
+ $binaries_checked_count = 0;
+
+ #
+ # We need to load the Misc Databases to get any modifications to
+ # the symbol database. E.g. gethostname should be public.
+ #
+ $misc_check_databases_loaded_ok = load_misc_check_databases();
+
+ while (defined($dir = next_dir_name())) {
+
+ # Map object output dir to actual path of the object:
+ $path_to_object = dir_name_to_path($dir);
+
+ if (! -f $path_to_object) {
+ exiter(nopathexist($path_to_object, $!));
+ }
+
+ # Check it:
+ emsg(gettext("checking: %s\n"), $path_to_object);
+
+ static_check_object($path_to_object, $dir);
+ dynamic_check_object($path_to_object, $dir);
+ }
+
+ if ($binaries_checked_count == 0) {
+ exiter("$command_name: " . gettext(
+ "no binary objects where checked."));
+ }
+
+ # Do additional heuristic checks of unstable behavior:
+ perform_misc_checks();
+
+ clean_up(); # Remove any tmp dirs and files.
+}
+
+#
+# Reads in the static profile (i.e. the symbols exported by bin in
+# .text section) and calls the static archive checking routine.
+#
+sub static_check_object
+{
+ my ($path_to_object, $dir) = @_;
+
+ # The profile output file created by static_profile() in symprof.
+
+ my $profile_file = "$dir/profile.static";
+
+ my $err_fmt = gettext(
+ "binary object %s has no static profile: %s: %s\n");
+ if (! -f $profile_file) {
+ emsg("$command_name: " . $err_fmt, $path_to_object,
+ $profile_file, $!);
+ return 0;
+ }
+
+ my $profile_fh = do { local *FH; *FH };
+ if (! open($profile_fh, "<$profile_file")) {
+ exiter(nofile($profile_file, $!));
+ }
+
+ my ($profile, $lib, $lib2, $base, %libs_needed);
+
+ my $completely_statically_linked = 0;
+
+ while (<$profile_fh>) {
+ $profile .= $_;
+ if (/^\s*#dtneeded:\s*(.*)$/) {
+ #
+ # record the bare name, e.g. "libc" of the
+ # (direct) dtneededs.
+ #
+ foreach $lib (split(/\s+/, $1)) {
+ next if ($lib eq '');
+ $base = $lib;
+ # record it as libc.so.1 -> libc
+ $base =~ s/\.so\..*$//;
+ $base =~ s/\.so$//;
+ $libs_needed{$base} = $lib;
+ $libs_needed{basename($base)} = $lib;
+ }
+ } elsif (/^\s*#SKIPPED_TEST:\s+STATICALLY_LINKED/) {
+ #
+ # Record statical linking if it takes place
+ # since it indicates to skip the test.
+ #
+ $completely_statically_linked = 1;
+ }
+ }
+ close($profile_fh);
+
+ my $problems = "$dir/check.problems";
+
+ my $problems_fh = do { local *FH; *FH };
+ if (! open($problems_fh, ">>$problems")) {
+ exiter(nofile($problems, $!));
+ }
+
+ if ($completely_statically_linked) {
+ print $problems_fh "STATIC: COMPLETELY_STATIC" . "\n";
+ }
+
+ my (%saw_lib);
+ if (! defined($profile)) {
+ close($problems_fh);
+ return;
+ }
+ foreach $lib (lib_static_check($profile)) {
+ #
+ # lib_static_check returns a list of statically linked
+ # libraries, however to be on the safe side we will skip
+ # false positives our dtneeded's show they are really
+ # dynamically linked in.
+ #
+
+ next if ($libs_needed{$lib});
+ next if ($libs_needed{basename($lib)});
+ next if ($saw_lib{basename($lib)}++);
+
+ $lib2 = $lib;
+ $lib2 =~ s/\.a$//;
+ next if ($libs_needed{$lib2});
+ next if ($libs_needed{basename($lib2)});
+
+ # Otherwise, record in the problems file:
+ print $problems_fh "STATIC: LINKED_ARCHIVE $lib" . "\n";
+ }
+ close($problems_fh);
+}
+
+#
+# Takes as input the static profile (e.g. the .text symbols) and returns
+# a list of suspected statically linked Solaris archive libraries.
+#
+sub lib_static_check
+{
+ my ($profile) = @_;
+
+ my ($line, $area, $extent, $type, $sym, $obj);
+
+ my (%symbols);
+
+ #
+ # Working on lines like:
+ # /bin/ftp|TEXT|GLOB|FUNC|glob
+ # /bin/ftp|TEXT|GLOB|FUNC|help
+ #
+
+ # First record all the symbols in the TEXT area:
+
+ foreach $line (split(/\n/, $profile)) {
+ next unless ($line =~ /\bTEXT\b/);
+ ($obj, $area, $extent, $type, $sym) = split(/\|/, $line);
+
+ $symbols{$sym} = 1;
+ }
+
+ my (@static_libs);
+
+ # Next, check against the library heuristics for static linking:
+
+ # libc.a:
+
+ if (exists($symbols{'_exit'})) {
+ push(@static_libs, "/usr/lib/libc.a");
+ }
+
+ # libsocket.a:
+
+ if (exists($symbols{'socket'}) && exists($symbols{'_socket'}) &&
+ exists($symbols{'bind'}) && exists($symbols{'_bind'}) &&
+ exists($symbols{'connect'}) && exists($symbols{'_connect'})) {
+ push(@static_libs, "/usr/lib/libsocket.a");
+ }
+
+ # libnsl.a:
+
+ if (exists($symbols{'_xti_bind'}) && exists($symbols{'_xti_connect'}) &&
+ exists($symbols{'_tx_bind'}) && exists($symbols{'_tx_connect'})) {
+ push(@static_libs, "/usr/lib/libnsl.a");
+ }
+
+ return @static_libs;
+}
+
+#
+# Reads in the dynamic profile from the object's output directory.
+# Loads any needed public/private Solaris library symbol models.
+# Records unstable use of any private Solaris symbols in the object's
+# output directory.
+#
+sub dynamic_check_object
+{
+ my ($path_to_object, $dir) = @_;
+
+ # Location of the dynamic profile output:
+ my $profile_file = "$dir/profile.dynamic";
+
+ my $err_fmt = gettext(
+ "binary object %s has no dynamic profile: %s: %s\n");
+ if (! -f $profile_file) {
+ emsg("$command_name: " . $err_fmt, $path_to_object,
+ $profile_file, $!);
+ return 0;
+ }
+
+ my $profile_fh = do { local *FH; *FH };
+ if (! open($profile_fh, "<$profile_file")) {
+ exiter(nofile($profile_file, $!));
+ }
+
+ $binaries_checked_count++;
+
+ #
+ # Variables to hold temporary items:
+ #
+ # %library_list will be a hash of "to" libraries we need to load.
+ # @symbol_list will be an array of the "lib|sym" pairs.
+ #
+
+ my (%library_list, @symbol_list, @unbound_list);
+ my ($to, $sym, $from, $binary, $line);
+
+ my ($to_is_sys_lib, $from_is_sys_lib);
+
+ #
+ # profile lines look like:
+ # /bin/ftp|*DIRECT*|libsocket.so.1|socket
+ # /bin/ftp|libnsl.so.1|libc.so.1|mutex_lock
+ #
+ # or:
+ #
+ # /bin/ftp|*DIRECT*|/usr/lib/libsocket.so.1|socket
+ # /bin/ftp|/usr/lib/libnsl.so.1|/usr/lib/libc.so.1|mutex_lock
+ #
+
+ my ($abi, $type, $wordsize, $endian, $e_machine) =
+ bin_type($path_to_object);
+
+ #
+ # Setting abi to 'any' will allow continuation when
+ # we encounter an abi we do not recognize.
+ #
+ if (! defined($abi) || $abi eq 'unknown') {
+ $abi = 'any';
+ } else {
+ #
+ # Always try to load libc. This will be used for symbol
+ # migration to libc checks.
+ #
+ if (! exists($load_model_default{$abi})) {
+ load_model($LIBC, $abi);
+ }
+ $load_model_default{$abi} = 1;
+ }
+
+ my $dynamic_bindings_count = 0;
+ my $no_bindings_msg;
+
+ while (<$profile_fh>) {
+ chomp;
+
+ if (/^\s*#/) {
+ if (/NO_BINDINGS_FOUND\s*(.*)$/) {
+ my $msg = $1;
+ if ($msg =~ /^\s*$/) {
+ $no_bindings_msg = 'NO_SYMBOL_BINDINGS_FOUND';
+ } else {
+ $no_bindings_msg = $msg;
+ }
+ }
+ next;
+ }
+
+ ($binary, $from, $to, $sym) = split(/\|/, $_, 4);
+
+ $dynamic_bindings_count++;
+
+ # Skip the checking of reverse calls:
+ next if ($from eq "*REVERSE*");
+
+ # Skip the checking of special symbols:
+ next if (exists($skip_symbols{$sym}));
+
+ # Accumulate unbounds, but otherwise skip them:
+ if ($to eq "*UNBOUND*") {
+ push(@unbound_list, "$from|$sym");
+ next;
+ }
+
+ # Record if the "to" object is a system library:
+ $to_is_sys_lib = is_system_library($to, $abi);
+
+ if ($from eq "*DIRECT*") {
+ $from_is_sys_lib = 0;
+ } else {
+ #
+ # Otherwise we may check its calls. See if it is
+ # a system lib:
+ #
+ $from_is_sys_lib = is_system_library($from, $abi);
+ }
+
+ #
+ # We will pass judgement on *DIRECT* calls and indirect
+ # calls from a library we do not recognize.
+ #
+ if ($from_is_sys_lib) {
+ next;
+ }
+ if (! $to_is_sys_lib) {
+ # Call to a middleware or supporting library.
+ next;
+ }
+
+ $library_list{$to} = 1;
+ push(@symbol_list, "$from|$to|$abi|$sym");
+ }
+
+ close($profile_fh);
+
+ my $file;
+
+ my $problems_fh = do { local *FH; *FH };
+ if ($dynamic_bindings_count == 0 && defined($no_bindings_msg)) {
+ $file = "$dir/check.problems";
+
+ if (! open($problems_fh, ">>$file")) {
+ exiter(nofile($file, $!));
+ }
+
+ print $problems_fh "DYNAMIC: NO_DYNAMIC_BINDINGS_FOUND" .
+ " $no_bindings_msg\n";
+ close($problems_fh);
+ return;
+ }
+
+ my ($lib, $str);
+
+ $file = "$dir/check.dynamic.abi_models";
+ my $model_info_fh = do { local *FH; *FH };
+ if (! open($model_info_fh, ">$file")) {
+ exiter(nofile($file, $!));
+ }
+
+ # Load all the needed library models:
+ my ($s1, $s2);
+ $s1 = ",NO_PUBLIC/PRIVATE_MODEL_FOUND-SKIPPING_CHECK_FOR_THIS_LIBRARY";
+ $s2 = "ERROR_LOADING_PUBLIC/PRIVATE_MODEL";
+
+ foreach $lib (keys %library_list) {
+ if (! load_model($lib, $abi) && ! $load_error{"$lib|$abi"}) {
+ $load_error{"$lib|$abi"} = 1;
+ }
+ $str = $model_loaded{"$lib|$abi"};
+ if ($str eq '__FAILED__') {
+ $str .= $s1;
+ } elsif (! $str) {
+ $str = $s2;
+ }
+ print $model_info_fh "$lib:$str\n";
+ }
+ close($model_info_fh);
+
+ my ($lib_abi_sym, $class, %result_list);
+
+ my ($l, $a, $s);
+ foreach $lib_abi_sym (@symbol_list) {
+
+ ($from, $lib_abi_sym) = split(/\|/, $lib_abi_sym, 2);
+
+ ($l, $a, $s) = split(/\|/, $lib_abi_sym);
+
+ if (! exists($model{$lib_abi_sym})) {
+ #
+ # Check the library. If it is not in
+ # model_loaded, then we claim it is not a
+ # library we are interested in.
+ #
+ next if (! exists($model_loaded{"$l|$a"}));
+ next if ($model_loaded{"$l|$a"} eq '__FAILED__');
+
+ # it is an unrecognized symbol:
+ $result_list{'unrecognized'} .=
+ "$from|$lib_abi_sym" . "\n";
+ next;
+ }
+
+ # N.B. $lib_abi_sym and $l may have been altered above.
+ $class = $model{$lib_abi_sym};
+ $line = "$path_to_object|$a|$from|$l|$class|$s" . "\n";
+
+ if ($class !~ /^(public|private|unclassified)$/) {
+ exiter("$command_name" . sprintf(gettext(
+ "unrecognized symbol class: %s"), $class));
+ }
+
+ $result_list{$class} .= $line;
+ }
+
+ if (@unbound_list) {
+ my $ldd_file = "$dir/profile.dynamic.ldd";
+ my $tmp;
+ if (-f $ldd_file) {
+ my $ldd_info_fh = do { local *FH; *FH };
+ if (! open($ldd_info_fh, "<$ldd_file")) {
+ exiter(nofile($ldd_file, $!));
+ }
+ while (<$ldd_info_fh>) {
+ $tmp .= '# ' . $_ if (/not\s+found/);
+ }
+ close($ldd_info_fh);
+ }
+ if (defined($tmp)) {
+ $result_list{'unbound'} = $tmp;
+ }
+ $result_list{'unbound'} .= join("\n", @unbound_list) . "\n";
+ }
+
+ my $count;
+
+ my @classes = qw(private public unbound unclassified unrecognized);
+
+ foreach $class (@classes) {
+
+ next if (! exists($result_list{$class}));
+
+ $file = "$dir/check.dynamic.$class";
+
+ my $outfile_fh = do { local *FH; *FH };
+ if (! open($outfile_fh, ">$file")) {
+ exiter(nofile($file, $!));
+ }
+ if ($class eq 'private') {
+ print $outfile_fh
+ $text{'Message_Private_Symbols_Check_Outfile'};
+ } elsif ($class eq 'public') {
+ print $outfile_fh
+ $text{'Message_Public_Symbols_Check_Outfile'};
+ }
+ print $outfile_fh $result_list{$class};
+ close($outfile_fh);
+ }
+
+ $file = "$dir/check.problems";
+
+ if (! open($problems_fh, ">>$file")) {
+ exiter(nofile($file, $!));
+ }
+
+ if (exists($result_list{'private'})) {
+ $count = scalar(my @a = split(/\n/, $result_list{'private'}));
+ print $problems_fh "DYNAMIC: PRIVATE_SYMBOL_USE $count\n";
+ }
+ if (exists($result_list{'unbound'})) {
+ $count = scalar(@unbound_list);
+ print $problems_fh "DYNAMIC: UNBOUND_SYMBOL_USE $count\n";
+ }
+ if (exists($result_list{'unrecognized'})) {
+ $count =
+ scalar(my @a = split(/\n/, $result_list{'unrecognized'}));
+ print $problems_fh "DYNAMIC: UNRECOGNIZED_SYMBOL_USE $count\n";
+ }
+
+ close($problems_fh);
+}
+
+#
+# Loads a system model for a library on demand.
+#
+# Input is a library to load and the architecture ABI.
+#
+# On successful completion, 1 is returned and the associative array:
+#
+# %model{"$library|$abi|$symbol"} = {public,private}
+#
+# is set.
+#
+sub load_model
+{
+ #
+ # Returns 1 if the model was successfully loaded, or returns 0
+ # if it was not.
+ #
+
+ my ($library, $abi) = @_;
+
+ #
+ # This %model_loaded hash records the following states:
+ # <string> Method by which successfully loaded.
+ # __FAILED__ Failed to loaded successfully.
+ # undef Have not tried to load yet.
+ #
+ if (exists($model_loaded{"$library|$abi"})) {
+ if ($model_loaded{"$library|$abi"} eq '__FAILED__') {
+ return 0;
+ } elsif ($model_loaded{"$library|$abi"}) {
+ return 1;
+ }
+ }
+
+ my ($loaded, $ok);
+
+ $loaded = 1 if (load_model_versioned_lib($library, $abi));
+
+ # Record the result so we do not have to repeat the above:
+
+ if ($loaded) {
+ $ok = "OK";
+ my $tweaks = load_tweaks($library, $abi);
+ $ok .= ",Model_Tweaks\[$tweaks\]" if ($tweaks);
+ $model_loaded{"$library|$abi"} = $ok;
+ } else {
+ $model_loaded{"$library|$abi"} = '__FAILED__';
+ }
+
+ return $loaded;
+}
+
+#
+# Routine to load into %model any special modifications to the Solaris
+# symbol Models kept in the etc.* file.
+#
+sub load_tweaks
+{
+ my ($lib, $abi) = @_;
+
+ my $key;
+ if (exists($model_tweak{$lib}) && $model_tweak{$lib}) {
+ $key = $lib;
+ } else {
+ #
+ # check device/inode record so as to not get tricked by
+ # symlinks.
+ #
+ my ($device, $inode) = (stat($lib))[0,1];
+ if (! defined($device) || ! defined($inode)) {
+ return 0;
+ }
+ $key = "$device/$inode";
+ if (! exists($model_tweak{$key}) || ! $model_tweak{$key}) {
+ return 0;
+ }
+ #
+ # device/inode $key is recorded, so continue along
+ # using it below in the model_tweak lookup.
+ #
+ }
+
+ #
+ # etc line looks like:
+ # MODEL_TWEAK|/usr/lib/libnsl.so.1|sparc,i386|gethostname|public
+ # value looks like:
+ # gethostname|sparc,i386|public
+ #
+
+ my ($case, $abis, $sym, $class, $count);
+
+ $count = 0;
+ foreach $case (split(/,/, $model_tweak{$key})) {
+ ($sym, $abis, $class) = split(/\|/, $case);
+ if ($abis eq '*' || ($abis =~ /\b${abi}\b/)) {
+ $model{"$lib|$abi|$sym"} = $class;
+ $count++;
+ }
+ }
+
+ return $count;
+}
+
+#
+# Determine the public/private symbol model for a versioned Solaris
+# library. Returns 0 if no model could be extracted, otherwise returns a
+# string detailing the model loading.
+#
+sub load_model_versioned_lib
+{
+ my ($library, $abi) = @_;
+
+ #
+ # This subroutine runs pvs -dos directly on the Solaris shared
+ # object, and parses data that looks like this:
+ #
+ # % pvs -dos /usr/lib/libsocket.so.1
+ # ...
+ # /usr/lib/libsocket.so.1 - SUNW_1.1: __xnet_sendmsg;
+ # ...
+ # /usr/lib/libsocket.so.1 - SISCD_2.3: connect;
+ # ...
+ # /usr/lib/libsocket.so.1 - SUNWprivate_1.2: getnetmaskbyaddr;
+ #
+ # Note that data types look like:
+ # /usr/lib/libc.so.1 - SUNWprivate_1.1: __environ_lock (24);
+ #
+ # we discard the size.
+ #
+ # On successful completion 1, is returned and the hash:
+ #
+ # %model{"$library|$abi|$symbol"} = {public,private}
+ #
+ # is set.
+ #
+
+ # library must be a full path and exist:
+ if (! -f $library) {
+ return 0;
+ }
+
+ my ($rc, $output, $output_syslib);
+
+ #
+ # quote character should never happen in normal use, but if it
+ # did it will foul up the pvs commands below, so we return
+ # early.
+ #
+ if ($library =~ /'/) {
+ return 0;
+ }
+
+ #
+ # Get the entire list of symbols:
+ # note that $library does not contain a single-quote.
+ #
+ c_locale(1);
+ $output = `$cmd_pvs -dos '$library' 2>/dev/null`;
+ $rc = $?;
+ c_locale(0);
+
+ if ($rc != 0 || ($output =~ /^[\s\n]*$/)) {
+ # It is not versioned, so get out.
+ return 0;
+ }
+
+ # Library is versioned with something from this point on.
+
+ my ($line, $libtmp, $j1, $j2, $version, $symbol, $class);
+ my ($count, $public_count, $private_count);
+ my (%versions);
+ my $libbase = basename($library);
+
+ $count = 0;
+ $public_count = 0;
+ $private_count = 0;
+
+ my $is_system_lib = is_system_library($library, $abi);
+
+ my (@defs, $def);
+ if (defined($is_system_lib)) {
+ foreach $def (split(/:/, $is_system_lib)) {
+ next if ($def =~ /^FILE=/);
+ next if ($def =~ /^-$/);
+ push(@defs, $def);
+ }
+ if (@defs == 1) {
+ $is_system_lib = $defs[0];
+ }
+ }
+
+ my (@version_heads, $vers, $default_class);
+ if (defined($is_system_lib) && $is_system_lib ne 'NO_PUBLIC_SYMS') {
+ #
+ # It is a versioned system library. Extract the public
+ # symbols version head end(s)
+ #
+ if ($is_system_lib =~ /^PUBLIC=(.*)$/) {
+ @version_heads = split(/,/, $1);
+ } else {
+ push(@version_heads, $is_system_lib);
+ }
+
+ #
+ # Rerun pvs again to extract the symbols associated with
+ # the *public* inheritance chain(s).
+ #
+ c_locale(1);
+ foreach $vers (@version_heads) {
+ # something is wrong if $vers has a quote
+ $vers =~ s/'//g;
+
+ # $library has been screened for single quotes earlier.
+ $output_syslib .=
+ `$cmd_pvs -dos -N '$vers' '$library' 2>/dev/null`;
+ }
+ c_locale(0);
+ }
+
+
+ if (defined($output_syslib) && ($output_syslib !~ /^[\s\n]*$/)) {
+ #
+ # If non-empty there are some public symbols sets.
+ # First, mark everything private:
+ #
+ $output = "DEFAULT_CLASS=private\n" . $output;
+ # then overwrite the public ones:
+ $output .= "DEFAULT_CLASS=public\n" . $output_syslib;
+ } elsif (defined($is_system_lib) &&
+ $is_system_lib eq 'NO_PUBLIC_SYMS') {
+ # Everything is private:
+ $output = "DEFAULT_CLASS=private\n" . $output;
+ } else {
+ #
+ # assume public, the override will occur when version
+ # string matches /private/i. This is for 3rd party
+ # libraries.
+ #
+ $output = "DEFAULT_CLASS=public\n" . $output;
+ }
+
+ foreach $line (split(/\n/, $output)) {
+ $line = trim($line);
+ if ($line =~ /^DEFAULT_CLASS=(.*)$/) {
+ $default_class = $1;
+ next;
+ }
+ ($libtmp, $j1, $version, $symbol, $j2) = split(/\s+/, $line);
+
+ $symbol =~ s/;*$//;
+ $version =~ s/:*$//;
+
+ next if ($symbol =~ /^\s*$/);
+ next if ($version eq $libbase); # see example output above
+
+ $versions{$version}++;
+
+ $class = $default_class;
+
+ if (! $output_syslib && ($version =~ /private/i)) {
+ $class = 'private';
+ }
+
+ if ($class eq 'private') {
+ $private_count++;
+ } else {
+ if ($output_syslib) {
+ # remove the double counting of this version:
+ $versions{$version}--;
+ $private_count--;
+ $count--;
+ }
+ $public_count++;
+ }
+
+ $model{"$library|$abi|$symbol"} = $class;
+ $count++;
+ }
+
+ if (! $count) {
+ return 0;
+ }
+
+ # Construct the info string:
+ $libtmp = "load_model_versioned_lib,$library,$abi:";
+ foreach $version (sort(keys(%versions))) {
+ $libtmp .= "$version\[$versions{$version}\],";
+ }
+ $libtmp .=
+ "\[${count}symbols=${public_count}public+${private_count}private\]";
+ return $libtmp;
+}
+
+#
+# Returns a non-empty string if the $path_to_library is recognized as a
+# System (i.e. Solaris) ABI library for given abi. Returns undef
+# otherwise. The returned string will either be the public symbol version
+# name(s), "NO_PUBLIC_SYMS" if all symbols are private, or "-" if there
+# is no versioning at all.
+#
+sub is_system_library
+{
+ my ($path_to_library, $abi) = @_;
+
+ if (exists($is_system_library_cache{"$path_to_library|$abi"})) {
+ return $is_system_library_cache{"$path_to_library|$abi"};
+ }
+
+ my ($dir, $def, $key);
+
+ my ($device, $inode) = (stat($path_to_library))[0,1];
+ foreach $dir (@lib_index_loaded) {
+
+ $key = "$dir|$path_to_library|$abi";
+ $def = $lib_index_definition{$key};
+ if (defined($device) && defined($inode) && ! defined($def)) {
+ # try inode lookup (chases down unexpected symlinks)
+ $key = "$dir|$device/$inode|$abi";
+ $def = $lib_index_definition{$key};
+ }
+ last if (defined($def));
+ }
+ if (!defined($def) && $path_to_library !~ /'/) {
+ #
+ # we skip the case $path_to_library containing
+ # a single quote, so the cmd argument is protected.
+ #
+ my $tmp = `$cmd_pvs -dn '$path_to_library' 2>/dev/null`;
+ if ($tmp =~ /\b(SUNW[^;]*);/) {
+ $def = $1;
+ }
+ }
+
+ $is_system_library_cache{"$path_to_library|$abi"} = $def;
+
+ return $def;
+}
+
+#
+# Loop over each object item in the working_dir.
+# - $dir will be each one of these object directories.
+# - $path_to_object will be the corresponding actual path
+# to the the binary to be checked.
+# Output will usually be placed down in $dir, e.g. "$dir/check.foo"
+#
+sub perform_misc_checks
+{
+ my ($dir, $path_to_object);
+
+ if (! $misc_check_databases_loaded_ok) {
+ #
+ # The load was attempted in check_objects() There is no
+ # point in continuing if that loading failed.
+ #
+ return;
+ }
+
+ emsg("\n" . gettext(
+ "performing miscellaneous checks") . " ...\n\n");
+
+ while (defined($dir = next_dir_name())) {
+
+ # Map object output dir to actual path of the object:
+ $path_to_object = dir_name_to_path($dir);
+
+ if (! -f $path_to_object) {
+ exiter(nopathexist($path_to_object, $!));
+ }
+
+ # Check it:
+ misc_check($path_to_object, $dir);
+ }
+}
+
+#
+# Routine to perform the misc. checks on a given binary object. Records
+# the findings in object's output directory.
+#
+sub misc_check
+{
+ my ($path_to_object, $dir) = @_;
+
+ # Load the entire dynamic profile for this object:
+
+ my (@profile, @profile_short, %direct_syms, $file);
+ my $tmp;
+
+ $file = "$dir/profile.dynamic";
+
+ my ($app, $caller, $lib, $base, $sym);
+ my ($libsymcaller, $cnt, %sawlib);
+ if (-f $file) {
+ my $prof_fh = do { local *FH; *FH };
+ if (! open($prof_fh, "<$file")) {
+ exiter(nofile($file, $!));
+ }
+ $cnt = 0;
+ while (<$prof_fh>) {
+ next if (/^\s*#/);
+ next if (/^\s*$/);
+ chomp;
+ ($app, $caller, $lib, $sym) = split(/\|/, $_, 4);
+
+ # Skip the checking of special symbols:
+ next if (exists($skip_symbols{$sym}));
+
+ push(@profile, "$lib|$sym|$caller");
+
+ #
+ # We collect in @profile_short up to 10
+ # lib-sym-caller triples where all the libs are
+ # distinct. This is used to speed up some
+ # loops over the profile below: when we catch
+ # the lib-matching checks early in the loop we
+ # can exclude those checks from the remainder
+ # of the loop. Since a profile may involve
+ # 1000's of symbols this can be a savings.
+ #
+ if ($cnt < 10 && ! exists($sawlib{$lib})) {
+ push(@profile_short, "$lib|$sym|$caller");
+ $sawlib{$lib} = 1;
+ $cnt++;
+ }
+ }
+ close($prof_fh);
+ }
+ #
+ # Misc Check #1:
+ # Go through dynamic profile looking for scoped local symbols:
+ #
+
+ my (%all_neededs, %lib_not_found);
+ my ($scoped_list, $scoped_msg);
+ my ($sc_rel, $sc_lib, $sc_sym, $sc_val);
+
+ %all_neededs = all_ldd_neededs($path_to_object);
+ my ($key, $key_trim);
+ foreach $key (keys(%all_neededs)) {
+ $key_trim = basename($key);
+ $all_neededs{$key_trim} = $all_neededs{$key};
+ if ($all_neededs{$key} =~ /file not found/) {
+ # %lib_not_found will be used below in check #2
+ $lib_not_found{$key}++;
+ $lib_not_found{$key_trim}++;
+ }
+ }
+
+ # We will need the abi of the object:
+ my $abi;
+ ($abi) = bin_type($path_to_object);
+ if ($abi eq '' || ($abi =~ /^(unknown|any)$/)) {
+ if ($uname_p =~ /sparc/i) {
+ $abi = 'sparc';
+ } else {
+ $abi = 'i386';
+ }
+ }
+
+ foreach $libsymcaller (@profile) {
+ next unless ($libsymcaller =~ /\*DIRECT\*$/);
+
+ ($lib, $sym, $caller) = split(/\|/, $libsymcaller, 3);
+
+ #
+ # Record direct symbols to improve our %wskip list used
+ # to speed up loops over symbols.
+ #
+ $direct_syms{$sym} = 1;
+ next unless (exists($scoped_symbol_all{$sym}));
+
+ $base = basename($lib);
+
+ #
+ # We only worry if a scoped call is a direct one. This
+ # assumes the user's support shared objects are also
+ # checked by appcert.
+ #
+
+ if (exists($scoped_symbol{"$lib|$sym"}) ||
+ exists($scoped_symbol{"$base|$sym"})) {
+ #
+ # This one is for checking on releases BEFORE
+ # the scoping actually occurred.
+ #
+ $scoped_msg .= "$base:$sym ";
+ $scoped_list .= "$path_to_object|$caller|$lib|$sym\n";
+
+ } elsif ($lib eq '*UNBOUND*' &&
+ exists($scoped_symbol_all{$sym})) {
+ #
+ # This one is for checking on releases AFTER the
+ # scoping.
+ #
+ # Assume these type of unbounds are deprecated
+ # if found in scoped_symbol_all. Double check it
+ # is in the all-needed-libs though:
+ #
+
+ if (defined($sc_sym) &&
+ exists($model{"$LIBC|$abi|$sc_sym"})) {
+ next;
+ }
+
+ foreach $sc_val (split(/,/, $scoped_symbol_all{$sym})) {
+ ($sc_rel, $sc_lib, $sc_sym) =
+ split(/\|/, $sc_val);
+
+ #
+ # The general scoping that occurred for
+ # ld.so.1 makes the current heuristic
+ # somewhat less accurate. Unboundedness
+ # from other means has too good a chance
+ # of overlapping with the ld.so.1
+ # scoping. Note that the app likely does
+ # NOT have ld.so.1 in its neededs, but
+ # we still skip this case.
+ #
+
+ next if ($sc_lib eq 'ld.so.1');
+
+ if ($all_neededs{$sc_lib}) {
+ # note that $lib is '*UNBOUND*'
+ $scoped_msg .= "<unbound>:$sym ";
+ $scoped_list .=
+ "$path_to_object|$caller|$lib|$sym\n";
+ }
+ }
+ }
+ }
+
+ if (defined($scoped_msg)) {
+ my $problems = "$dir/check.problems";
+
+ # problems will be appended to the file:
+ my $problems_fh = do { local *FH; *FH };
+ if (! open($problems_fh, ">>$problems")) {
+ exiter(nofile($problems, $!));
+ }
+ print $problems_fh
+ "MISC: REMOVED_SCOPED_SYMBOLS: $scoped_msg\n";
+ close($problems_fh);
+
+ $problems = "$dir/check.demoted_symbols";
+
+ # problems will be appended to the file:
+ my $check_fh = do { local *FH; *FH };
+ if (! open($check_fh, ">>$problems")) {
+ exiter(nofile($problems, $!));
+ }
+ print $check_fh $scoped_list;
+ close($check_fh);
+ }
+
+ #
+ # Misc Check #2
+ # Go through dynamic profile looking for special warnings.
+ #
+
+ my (%warnings, %wskip);
+ my (%lib_star, %sym_star, %caller_star);
+ my ($tag, $tag0, $sub, $res);
+
+ while (($tag, $sub) = each(%warnings_match)) {
+ next if (! $sub);
+
+ $res = &{$sub}($path_to_object);
+ $warnings{$tag} = 1 if ($res);
+ }
+
+ my $warnings_bind_has_non_direct = 0;
+
+ while (($tag0, $tmp) = each(%warnings_bind)) {
+ ($lib, $sym, $caller) = split(/\|/, $tmp, 3);
+ $lib_star{$tag0} = 1 if ($lib eq '*');
+ $sym_star{$tag0} = 1 if ($sym eq '*');
+ $caller_star{$tag0} = 1 if ($caller eq '*');
+ if ($lib ne '*' && $lib !~ m,/, && ! $all_neededs{$lib}) {
+ # it can never match:
+ $wskip{$tag0} = 1;
+ }
+ if ($caller ne '*DIRECT*') {
+ # this will be used to speed up the *DIRECT* only case:
+ $warnings_bind_has_non_direct = 1;
+ } elsif ($sym ne '*' && ! $direct_syms{$sym}) {
+ # it can never match:
+ $wskip{$tag0} = 1;
+ }
+ }
+
+ foreach $lib (keys(%lib_not_found)) {
+ #
+ # add a placeholder symbol in %profile to indicate
+ # $lib is on dtneeded, but wasn't found. This will
+ # match a $sym = '*' warnings_bind misc check:
+ #
+ push(@profile,
+ "$lib|__ldd_indicated_file_not_found__|*DIRECT*");
+ }
+
+ my ($l_t, $s_t, $c_t, $match_t);
+
+ my (@tag_list, @tag_list2, $new_tags);
+ #
+ # create a list of tags excluding the ones we know will be
+ # skipped in the $libsymcaller loop below.
+ #
+ foreach $tag0 (keys(%warnings_bind)) {
+ next if ($wskip{$tag0});
+ push(@tag_list, $tag0);
+ }
+
+ #
+ # we loop over @profile_short first, these will give us up to
+ # 10 different libraries early to help us shrink @tag_list
+ # as we go through the profile.
+ #
+ foreach $libsymcaller (@profile_short, @profile) {
+ @tag_list = @tag_list2 if ($new_tags);
+ last if (! @tag_list);
+
+ ($lib, $sym, $caller) = split(/\|/, $libsymcaller, 3);
+
+ if (! $warnings_bind_has_non_direct && $caller ne '*DIRECT*') {
+ next;
+ }
+
+ $base = basename($lib);
+ $new_tags = 0;
+
+ foreach $tag0 (@tag_list) {
+
+ # try to get out early:
+ next if ($wskip{$tag0});
+
+ ($tag, $tmp) = split(/\|/, $tag0, 2);
+ # try to get out early:
+ next if ($warnings{$tag});
+
+ $match_t = $warnings_bind{$tag0};
+
+ $l_t = $lib;
+ $s_t = $sym;
+ $c_t = $caller;
+
+ $l_t = '*' if ($lib_star{$tag0});
+ $s_t = '*' if ($sym_star{$tag0});
+ $c_t = '*' if ($caller_star{$tag0});
+
+ if ("$l_t|$s_t|$c_t" eq $match_t ||
+ "$base|$s_t|$c_t" eq $match_t) {
+ $warnings{$tag} = 1;
+ $wskip{$tag0} = 1;
+
+ # shorten tag list:
+ my (@t, $tg, $tg2, $tp);
+ foreach $tg (@tag_list) {
+ next if ($tg eq $tag0);
+ ($tg2, $tp) = split(/\|/, $tg, 2);
+ next if ($tg2 eq $tag);
+ push(@t, $tg);
+ }
+ @tag_list2 = @t;
+ $new_tags = 1;
+ }
+ }
+ }
+
+ if (%warnings) {
+ my $problems = "$dir/check.problems";
+
+ # append problems to the file:
+ my $problems_fh = do { local *FH; *FH };
+ if (! open($problems_fh, ">>$problems")) {
+ exiter(nofile($problems, $!));
+ }
+
+ my $tag;
+ foreach $tag (keys(%warnings)) {
+ print $problems_fh "MISC: WARNING: $tag\n";
+ }
+ close($problems_fh);
+ }
+}
diff --git a/usr/src/cmd/abi/appcert/scripts/symprof.pl b/usr/src/cmd/abi/appcert/scripts/symprof.pl
new file mode 100644
index 0000000..ce16962
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/symprof.pl
@@ -0,0 +1,1646 @@
+#!/usr/perl5/bin/perl -w
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# This utility program creates the profiles of the binaries to be
+# checked.
+#
+# The dynamic profiling is done by running ldd -r on the binary with
+# LD_DEBUG=files,bindings and parsing the linker debug output.
+#
+# The static profiling (gathering of .text symbols) is done by calling
+# the utility program static_prof.
+#
+
+require 5.005;
+use strict;
+use locale;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+use File::Path;
+
+use lib qw(/usr/lib/abi/appcert);
+use AppcertUtil;
+
+setlocale(LC_ALL, "");
+textdomain(TEXT_DOMAIN);
+
+use vars qw(
+ $tmp_prof_dir
+);
+
+set_clean_up_exit_routine(\&clean_up_exit);
+
+import_vars_from_environment();
+
+signals('on', \&interrupted);
+
+set_working_dir();
+
+profile_objects();
+
+clean_up();
+
+exit 0;
+
+#
+# working_dir has been imported by import_vars_from_environment() from
+# appcert. A sanity check is performed here to make sure it exists.
+#
+sub set_working_dir
+{
+ if (! defined($working_dir) || ! -d $working_dir) {
+ exiter("$command_name: " . sprintf(gettext(
+ "cannot locate working directory: %s\n"), $working_dir));
+ }
+}
+
+#
+# Routine called when interrupted by user (e.g. SIGINT).
+#
+sub interrupted
+{
+ $SIG{$_[0]} = 'DEFAULT';
+ signals('off');
+ clean_up_exit(1);
+}
+
+#
+# Does the cleanup then exits with return code $rc. Note: The utility
+# routine exiter() calls this routine.
+#
+sub clean_up_exit
+{
+ my ($rc) = @_;
+ $rc = 0 unless ($rc);
+
+ clean_up();
+ exit $rc;
+}
+
+#
+# General cleanup activities.
+#
+sub clean_up
+{
+ if (defined($tmp_prof_dir) && -d $tmp_prof_dir) {
+ rmtree($tmp_prof_dir);
+ }
+}
+
+#
+# Top level routine to loop over the objects and call the profiling
+# routines on each.
+#
+sub profile_objects
+{
+ # Make a tmp directory for the profiling work.
+ $tmp_prof_dir = create_tmp_dir($tmp_dir);
+
+ if (! -d $tmp_prof_dir) {
+ exiter(nocreatedir($tmp_prof_dir, $!));
+ }
+
+ my ($dir, $path_to_object);
+
+ #
+ # Loop over each object item in the working_dir.
+ # - $dir will be each one of these object directories.
+ # - $path_to_object will be the corresponding actual path
+ # to the the binary to be profiled.
+ # Output will usually be placed down in $dir, e.g. "$dir/profile.static"
+ #
+
+ my $cnt = -1;
+ my $last_i;
+ while (defined($dir = next_dir_name())) {
+ $cnt++;
+ if ($block_max ne '') {
+ next if ($cnt < $block_min || $cnt >= $block_max);
+ }
+
+ $last_i = $cnt;
+
+ # Map object output directory to actual path of the object:
+ $path_to_object = dir_name_to_path($dir);
+
+ if (! -f $path_to_object) {
+ exiter(nopathexist($path_to_object, $!));
+ }
+
+ # Profile it:
+
+ emsg(gettext("profiling: %s\n"), $path_to_object);
+
+ static_profile($path_to_object, $dir);
+
+ dynamic_profile($path_to_object, $dir);
+ }
+
+ # Only try this after everything has been initially profiled.
+ if (! $block_max || $last_i >= $binary_count - 1) {
+ redo_unbound_profile();
+ }
+ clean_up(); # Remove any tmp dirs and files.
+}
+
+#
+# Runs utility program static_prof on the object and places results in
+# output directory.
+#
+sub static_profile($$)
+{
+ my ($object, $output_dir) = @_;
+
+ # This is the location of static_prof's output file:
+
+ my $outfile = "$output_dir/profile.static";
+
+ # It is consumed by static_check_object() in symcheck.
+
+ #
+ # Do not run on *completely* statically linked objects. This
+ # case will be caught and noted in the dynamic profiling and
+ # checking.
+ #
+ my $skip_it;
+ if (is_statically_linked($object)) {
+ $skip_it = "STATICALLY_LINKED";
+ } elsif (! is_elf($object)) {
+ $skip_it = "NON_ELF";
+ }
+
+ my $static_prof_fh = do { local *FH; *FH };
+ if (defined($skip_it)) {
+ open($static_prof_fh, ">$outfile") ||
+ exiter(nofile($outfile, $!));
+
+ print $static_prof_fh "#SKIPPED_TEST: $skip_it\n";
+ close($static_prof_fh);
+
+ return;
+ }
+
+ #
+ # system() when run in the following manner will prevent the
+ # shell from expanding any strange characters in $object. Quotes
+ # around '$object' would be almost as safe. since excluded
+ # earlier the cases where it contains the ' character.
+ #
+ system("$appcert_lib_dir/static_prof", '-p', '-s', '-o', $outfile,
+ $object);
+
+ if ($? != 0) {
+ open($static_prof_fh, ">$outfile") ||
+ exiter(nofile($outfile, $!));
+
+ #
+ # For completeness, we'll use elfdump to record the
+ # static profile for 64 bit binaries, although the
+ # static linking problems only occur for 32-bit
+ # applications.
+ #
+ my ($prof, $sym);
+ $prof = '';
+ my $elfdump_fh = do { local *FH; *FH };
+ if (open($elfdump_fh, "$cmd_elfdump -s -N .dynsym '$object' " .
+ " 2>/dev/null |")) {
+ while (<$elfdump_fh>) {
+ chomp;
+ if (/\s\.text\s+(\S+)$/) {
+ $sym = $1;
+ if (! /\bFUNC\b/) {
+ next;
+ }
+ if (/\bGLOB\b/) {
+ $prof .= "$object|TEXT|GLOB|" .
+ "FUNC|$sym\n";
+ } else {
+ $prof .= "$object|TEXT|WEAK|" .
+ "FUNC|$sym\n";
+ }
+ }
+ }
+ close($elfdump_fh);
+ }
+ if ($prof ne '') {
+ my $line;
+ print $static_prof_fh "#generated by symprof/elfdump\n";
+ print $static_prof_fh "#dtneeded:";
+ foreach $line (split(/\n/, cmd_output_dump($object))) {
+ if ($line =~ /\bNEEDED\s+(\S+)/) {
+ print $static_prof_fh " $1";
+ }
+ }
+ print $static_prof_fh "\n";
+ print $static_prof_fh $prof;
+ } else {
+ print $static_prof_fh "#SKIPPED_TEST: " .
+ "PROFILER_PROGRAM_static_prof_RETURNED:$?\n";
+ }
+ close($static_prof_fh);
+
+
+ return;
+ }
+
+ # Also store the dtneededs from the static profile output.
+ my $dtneeded = "$output_dir/info.dtneeded";
+
+ my $dtneeded_fh = do { local *FH; *FH };
+ open($dtneeded_fh, ">$dtneeded") ||
+ exiter(nofile($dtneeded, $!));
+
+ open($static_prof_fh, "<$outfile") ||
+ exiter(nofile($outfile, $!));
+
+ my $lib;
+ while (<$static_prof_fh>) {
+
+ next unless (/^\s*#/);
+
+ if (/^\s*#\s*dtneeded:\s*(\S.*)$/) {
+ foreach $lib (split(/\s+/, $1)) {
+ next if ($lib eq '');
+ print $dtneeded_fh "$lib\n";
+ }
+ last;
+ }
+ }
+ close($dtneeded_fh);
+ close($static_prof_fh);
+}
+
+#
+# Top level subroutine for doing a dynamic profile of an object. It
+# calls get_dynamic_profile() which handles the details of the actual
+# profiling and returns the newline separated "preprocessed format" to
+# this subroutine.
+#
+# The records are then processed and placed in the output directory.
+#
+sub dynamic_profile
+{
+ my ($object, $output_dir) = @_;
+
+ my ($profile, $line, $tmp);
+
+ # This is the profile output file.
+ my $outfile = "$output_dir/profile.dynamic";
+
+ $profile = get_dynamic_profile($object);
+
+ if ($profile =~ /^ERROR:\s*(.*)$/) {
+ # There was some problem obtaining the dynamic profile
+ my $msg = $1;
+ my $errfile = "$output_dir/profile.dynamic.errors";
+
+ my $profile_error_fh = do { local *FH; *FH };
+ open($profile_error_fh, ">>$errfile") ||
+ exiter(nofile($errfile, $!));
+
+ $msg =~ s/\n/ /g;
+ $msg =~ s/;/,/g;
+ print $profile_error_fh $msg, "\n";
+ close($profile_error_fh);
+
+ # Write a comment to the profile file as well:
+ my $profile_fh = do { local *FH; *FH };
+ open($profile_fh, ">$outfile") ||
+ exiter(nofile($outfile, $!));
+ print $profile_fh "#NO_BINDINGS_FOUND $msg\n";
+ close($profile_fh);
+
+ return;
+ }
+
+ my ($filter, $filtee, $from, $to, $sym);
+ my ($type, $saw_bindings, $all_needed);
+ my (%filter_map, %symlink_map);
+
+ # Resolve the symlink of the object, if any.
+ $symlink_map{$object} = follow_symlink($object);
+
+ #
+ # Collect the filter or static linking info first. Since the
+ # filter info may be used to alias libraries, it is safest to do
+ # it before any bindings processing. that is why we iterate
+ # through $profile twice.
+ #
+ my @dynamic_profile_array = split(/\n/, $profile);
+
+ foreach $line (@dynamic_profile_array) {
+
+ if ($line =~ /^FILTER_AUX:(.*)$/) {
+ #
+ # Here is the basic example of an auxiliary filter:
+ #
+ # FILTER: /usr/lib/libc.so.1
+ # FILTEE: /usr/platform/sun4u/lib/libc_psr.so.1
+ #
+ # The app links against symbol memcpy() in
+ # libc.so.1 at build time. Now, at run time IF
+ # memcpy() is provided by libc_psr.so.1 then
+ # that "code" is used, otherwise it backs off to
+ # use the memcpy()in libc.so.1. The
+ # libc_psr.so.1 doesn't even have to exist.
+ #
+ # The dynamic linker happily informs us that it
+ # has found (and will bind to) memcpy() in
+ # /usr/platform/sun4u/lib/libc_psr.so.1. We
+ # want to alias libc_psr.so.1 => libc.so.1.
+ # Why?
+ # - less models to maintain. Note the symlink
+ # situation in /usr/platform.
+ # - libc_psr.so.1 is versioned, but we would be
+ # incorrect since it has memcpy() as SUNWprivate
+ #
+ # Therefore we record this aliasing in the hash
+ # %filter_map. This will be used below to
+ # replace occurrences of the FILTEE string by
+ # the FILTER string. Never the other way round.
+ #
+
+ ($filter, $filtee) = split(/\|/, $1, 2);
+ $filter_map{$filtee} = $filter;
+
+ # Map the basenames too:
+ $filter = basename($filter);
+ $filtee = basename($filtee);
+ $filter_map{$filtee} = $filter;
+
+ } elsif ($line =~ /^FILTER_STD:(.*)$/) {
+
+ #
+ # Here is the basic example(s) of a standard filter:
+ #
+ # FILTER: /usr/lib/libsys.so.1
+ # FILTEE: /usr/lib/libc.so.1
+ #
+ # Here is another:
+ #
+ # FILTER: /usr/lib/libw.so.1
+ # FILTEE: /usr/lib/libc.so.1
+ #
+ # Here is a more perverse one, libxnet.so.1 has 3
+ # filtees:
+ #
+ # FILTER: /usr/lib/libxnet.so.1
+ # FILTEE: /usr/lib/{libsocket.so.1,libnsl.so.1,libc.so.1}
+ #
+ # The important point to note about standard
+ # filters is that they contain NO CODE AT ALL.
+ # All of the symbols in the filter MUST be found
+ # in (and bound to) the filtee(s) or there is a
+ # relocation error.
+ #
+ # The app links against symbol getwc() in
+ # libw.so.1 at build time. Now, at run time
+ # getwc() is actually provided by libc.so.1.
+ #
+ # The dynamic linker happily informs us that it
+ # has found (and will bind to) getwc() in
+ # libc.so.1. IT NEVER DIRECTLY TELLS US getwc was
+ # actually referred to in libw.so.1
+ #
+ # So, unless we open a model file while
+ # PROFILING, we cannot figure out which ones
+ # come from libw.so.1 and which ones come from
+ # libc.so.1. In one sense this is too bad: the
+ # libw.so.1 structure is lost.
+ #
+ # The bottom line is we should not alias
+ # libc.so.1 => libw.so.1 (FILTEE => FILTER) as
+ # we did above with FILTER_AUX. That would be a
+ # disaster. (would say EVERYTHING in libc came
+ # from libw!)
+ #
+ # So we DO NOT store the alias in this case, this
+ # leads to:
+ # - more models to maintain.
+ #
+ # Thus we basically skip this info.
+ # EXCEPT for one case, libdl.so.1, see below.
+ #
+
+ ($filter, $filtee) = split(/\|/, $1, 2);
+
+ #
+ # The dlopen(), ... family of functions in
+ # libdl.so.1 is implemented as a filter for
+ # ld.so.1. We DO NOT want to consider a symbol
+ # model for ld.so.1. So in this case alone we
+ # want to alias ld.so.1 => libdl.so.1
+ #
+ #
+ # We only need to substitute the standard filter
+ # libdl.so.n. Record the alias in that case.
+ #
+ if ($filter =~ /\blibdl\.so\.\d+/) {
+ $filter_map{$filtee} = $filter;
+
+ # Map basenames too:
+ $filter = basename($filter);
+ $filtee = basename($filtee);
+ $filter_map{$filtee} = $filter;
+ }
+
+ } elsif ($line =~ /^DYNAMIC_PROFILE_SKIPPED_NOT_ELF/ ||
+ $line =~ /^STATICALLY_LINKED:/) {
+ #
+ # This info will go as a COMMENT into the
+ # output. n.b.: there is no checking whether
+ # this piece of info is consistent with the rest
+ # of the profile output.
+ #
+ # The $message string will come right after the
+ # header, and before the bindings (if any). See
+ # below where we write to the PROF filehandle.
+ #
+
+ my $profile_msg_fh = do { local *FH; *FH };
+ open($profile_msg_fh, ">>$outfile") ||
+ exiter(nofile($outfile, $!));
+ print $profile_msg_fh "#$line\n";
+ close($profile_msg_fh);
+
+ } elsif ($line =~ /^NEEDED_FOUND:(.*)$/) {
+ #
+ # These libraries are basically information
+ # contained in the ldd "libfoo.so.1 =>
+ # /usr/lib/libfoo.so.1" output lines. It is the
+ # closure of the neededs (not just the directly
+ # needed ones).
+ #
+
+ $all_needed .= $1 . "\n";
+ }
+ }
+
+ #
+ # Now collect the bindings info:
+ #
+ # Each BINDING record refers to 1 symbol. After manipulation
+ # here it will go into 1 record into the profile output.
+ #
+ # What sort of manipulations? Looking below reveals:
+ #
+ # - we apply the library FILTER_AUX aliases in %filter_map
+ # - for shared objects we resolve symbolic links to the actual
+ # files they point to.
+ # - we may be in a mode where we do not store full paths of
+ # the shared objects, e.g. /usr/lib/libc.so.1, but rather
+ # just their basename "libc.so.1"
+ #
+ # There are exactly four(4) types of bindings that will be
+ # returned to us by get_dynamic_profile(). See
+ # get_dynamic_profile() and Get_ldd_Profile() for more details.
+ #
+ # Here are the 4 types:
+ #
+ # BINDING_DIRECT:from|to|sym
+ # The object being profiled is the "from" here!
+ # It directly calls "sym" in library "to".
+ #
+ # BINDING_INDIRECT:from|to|sym
+ # The object being profiled is NOT the "from" here.
+ # "from" is a shared object, and "from" calls "sym" in
+ # library "to".
+ #
+ # BINDING_REVERSE:from|to|sym
+ # The shared object "from" makes a reverse binding
+ # all the way back to the object being profiled! We call
+ # this *REVERSE*. "to" is the object being profiled.
+ #
+ # BINDING_UNBOUND:from|sym
+ # object "from" wants to call "sym", but "sym" was
+ # not found! We didn't find the "to", and so no
+ # "to" is passed to us.
+ #
+
+ my $put_DIRECT_in_the_UNBOUND_record;
+
+ $saw_bindings = 0;
+ #
+ # Start the sorting pipeline that appends to the output file.
+ # It will be written to in the following loop.
+ #
+ # Tracing back $outfile to $outdir to $working_dir, one sees $outfile
+ # should have no single-quote characters. We double check it does not
+ # before running the command.
+ #
+ if ($outfile =~ /'/) {
+ exiter(norunprog("|$cmd_sort -t'|' +1 | $cmd_uniq >> '$outfile'"));
+ }
+
+ my $prof_fh = do { local *FH; *FH };
+ open($prof_fh, "|$cmd_sort -t'|' +1 | $cmd_uniq >> '$outfile'") ||
+ exiter(norunprog("|$cmd_sort -t'|' +1 | $cmd_uniq >> '$outfile'",
+ $!));
+ local($SIG{'PIPE'}) = sub {
+ exiter(norunprog(
+ "|$cmd_sort -t'|' +1 | $cmd_uniq >> '$outfile'", $!));
+ };
+
+ foreach $line (@dynamic_profile_array) {
+
+ if ($line =~ /^BINDING_([^:]+):(.*)$/) {
+
+ $type = $1;
+
+ if ($type eq 'UNBOUND') {
+ #
+ # If the symbol was unbound, there is no
+ # "to" library. We make an empty "to"
+ # value so as to avoid special casing
+ # "to" all through the code that
+ # follows. It is easy to verify no
+ # matter what happens with the $to
+ # variable, it will NOT be printed to the
+ # profile output file in the UNBOUND
+ # case.
+ #
+
+ ($from, $sym) = split(/\|/, $2, 2);
+ $to = '';
+
+ } else {
+ # Otherwise, we have the full triple:
+
+ ($from, $to, $sym) = split(/\|/, $2, 3);
+ }
+
+ #
+ # We record here information to be used in
+ # writing out UNBOUND records, namely if the
+ # "from" happened to also be the object being
+ # profiled. In that case The string "*DIRECT*"
+ # will be placed in the "*UNBOUND*" record,
+ # otherwise the "from" will stand as is in the
+ # "*UNBOUND*" record. We do this check here
+ # before the filter_map is applied. The chances
+ # of it making a difference is small, but we had
+ # best to do it here.
+ #
+ if (files_equal($from, $object)) {
+ #
+ # Switch to indicate placing *DIRECT* in
+ # the *UNBOUND* line, etc.
+ #
+ $put_DIRECT_in_the_UNBOUND_record = 1;
+ } else {
+ $put_DIRECT_in_the_UNBOUND_record = 0;
+ }
+
+ #
+ # See if there is a filter name that "aliases"
+ # either of the "from" or "to" libraries, if so
+ # then rename it.
+ #
+ if ($to ne '' && $filter_map{$to}) {
+ $to = $filter_map{$to};
+ }
+ if ($type ne 'DIRECT' && $filter_map{$from}) {
+ $from = $filter_map{$from};
+ }
+
+ #
+ # Record symlink information.
+ #
+ # Note that follow_symlink returns the file
+ # name itself when the file is not a symlink.
+ #
+ # Work out if either "from" or "to" are
+ # symlinks. For efficiency we keep them in the
+ # %symlink_map hash. Recall that we are in a
+ # loop here, so why do libc.so.1 200 times?
+ #
+ if ($from ne '') {
+ if (! exists($symlink_map{$from})) {
+ $symlink_map{$from} =
+ follow_symlink($from);
+ }
+ }
+ if ($to ne '') {
+ if (! exists($symlink_map{$to})) {
+ $symlink_map{$to} =
+ follow_symlink($to);
+ }
+ }
+
+ #
+ # Now make the actual profile output line. Construct
+ # it in $tmp and then append it to $prof_fh pipeline.
+ #
+ $tmp = '';
+
+ if ($type eq "DIRECT") {
+ $tmp = "$object|*DIRECT*|$to|$sym";
+ } elsif ($type eq "INDIRECT") {
+ $tmp = "$object|$from|$to|$sym";
+ } elsif ($type eq "REVERSE") {
+ $tmp = "$object|*REVERSE*|$from|$sym";
+ } elsif ($type eq "UNBOUND") {
+ if ($put_DIRECT_in_the_UNBOUND_record) {
+ $tmp =
+ "$object|*DIRECT*|*UNBOUND*|$sym";
+ } else {
+ $tmp = "$object|$from|*UNBOUND*|$sym";
+ }
+ } else {
+ exiter("$command_name: " . sprintf(gettext(
+ "unrecognized ldd(1) LD_DEBUG " .
+ "bindings line: %s\n"), $line));
+ }
+
+ # write it to the sorting pipeline:
+ print $prof_fh $tmp, "\n";
+ $saw_bindings = 1;
+ } elsif ($line =~ /^DYNAMIC_PROFILE_SKIPPED_NOT_ELF/) {
+ # ignore no bindings warning for non-ELF
+ $saw_bindings = 1;
+ }
+ }
+
+ if (! $saw_bindings) {
+ print $prof_fh "#NO_BINDINGS_FOUND\n";
+ }
+ close($prof_fh);
+ if ($? != 0) {
+ exiter(norunprog(
+ "|$cmd_sort -t'|' +1 | $cmd_uniq >> '$outfile'", $!));
+ }
+
+ # Print out the library location and symlink info.
+ $outfile = "$output_dir/profile.dynamic.objects";
+
+ my $objects_fh = do { local *FH; *FH };
+ open($objects_fh, ">$outfile") || exiter(nofile($outfile, $!));
+
+ my ($var, $val);
+ while (($var, $val) = each(%ENV)) {
+ if ($var =~ /^LD_/) {
+ print $objects_fh "#info: $var=$val\n";
+ }
+ }
+
+ my $obj;
+ foreach $obj (sort(keys(%symlink_map))) {
+ next if ($obj eq '');
+ print $objects_fh "$obj => $symlink_map{$obj}\n";
+ }
+ close($objects_fh);
+
+ # Print out ldd shared object resolution.
+ $outfile = "$output_dir/profile.dynamic.ldd";
+
+ my $ldd_prof_fh = do { local *FH; *FH };
+ open($ldd_prof_fh, ">$outfile") || exiter(nofile($outfile, $!));
+
+ if (defined($all_needed)) {
+ print $ldd_prof_fh $all_needed;
+ }
+ close($ldd_prof_fh);
+
+}
+
+#
+# If the users environment is not the same when running symprof as when
+# running their application, the dynamic linker cannot resolve all of
+# the dynamic bindings and we get "unbound symbols".
+# redo_unbound_profile attempts to alleviate this somewhat. In
+# particular, for shared objects that do not have all of their
+# dependencies recorded, it attempts to use binding information in the
+# other *executables* under test to supplement the binding information
+# for the shared object with unbound symbols. This is not the whole
+# story (e.g. dlopen(3L)), but it often helps considerably.
+#
+sub redo_unbound_profile
+{
+ my ($dir, $path_to_object);
+ my ($profile, $total, $count);
+ my (%unbound_bins);
+
+ #
+ # Find the objects with unbound symbols. Put them in the list
+ # %unbound_bins.
+ #
+ $total = 0;
+ while (defined($dir = next_dir_name())) {
+
+ $profile = "$dir/profile.dynamic";
+ my $profile_fh = do { local *FH; *FH };
+ if (! -f $profile || ! open($profile_fh, "<$profile")) {
+ next;
+ }
+
+ $count = 0;
+ while (<$profile_fh>) {
+ next if (/^\s*#/);
+ $count++ if (/\|\*UNBOUND\*\|/);
+ }
+ close($profile_fh);
+
+ $unbound_bins{$dir} = $count if ($count);
+ $total += $count;
+ }
+
+ # we are done if no unbounds are detected.
+ return unless (%unbound_bins);
+ return if ($total == 0);
+
+ my (%dtneededs_lookup_full, %dtneededs_lookup_base);
+
+ # Read in *ALL* objects dt_neededs.
+
+ my ($soname, $base, $full);
+ while (defined($dir = next_dir_name())) {
+
+ $profile = "$dir/profile.dynamic.ldd";
+ my $all_neededs_fh = do { local *FH; *FH };
+ if (! open($all_neededs_fh, "<$profile")) {
+ # this is a heuristic, so we skip on to the next
+ next;
+ }
+
+ while (<$all_neededs_fh>) {
+ chop;
+ next if (/^\s*#/);
+ # save the dtneeded info:
+ ($soname, $full) = split(/\s+=>\s+/, $_);
+
+ if ($full !~ /not found|\)/) {
+ $dtneededs_lookup_full{$full}{$dir} = 1;
+ }
+ if ($soname !~ /not found|\)/) {
+ $base = basename($soname);
+ $dtneededs_lookup_base{$base}{$dir} = 1;
+ }
+ }
+ close($all_neededs_fh);
+ }
+
+ emsg("\n" . gettext(
+ "re-profiling binary objects with unbound symbols") . " ...\n");
+
+ # Now combine the above info with each object having unbounds:
+
+ my $uref = \%unbound_bins;
+ foreach $dir (keys(%unbound_bins)) {
+
+ # Map object output directory to the actual path of the object:
+ $path_to_object = dir_name_to_path($dir);
+
+ #
+ # Here is the algorithm:
+ #
+ # 1) binary with unbounds must be a shared object.
+ #
+ # 2) check if it is in the dtneeded of other product binaries.
+ # if so, use the dynamic profile of those binaries
+ # to augment the bindings of the binary with unbounds
+ #
+
+ if (! -f $path_to_object) {
+ exiter(nopathexist($path_to_object, $!));
+ }
+
+ # only consider shared objects (e.g. with no DTNEEDED recorded)
+ if (! is_shared_object($path_to_object)) {
+ next;
+ }
+
+ $base = basename($path_to_object);
+
+ my (@dirlist);
+
+ my $result = 0;
+
+ if (defined($dtneededs_lookup_base{$base})) {
+ # the basename is on another's dtneededs:
+ @dirlist = keys(%{$dtneededs_lookup_base{$base}});
+ # try using the bindings of these executables:
+ $result =
+ try_executables_bindings($dir, $uref, @dirlist);
+ }
+ if ($result) {
+ # we achieved some improvements and so are done:
+ next;
+ }
+
+ # Otherwise, try objects that have our full path in their
+ # dtneededs:
+ @dirlist = ();
+ foreach $full (keys(%dtneededs_lookup_full)) {
+ if (! files_equal($path_to_object, $full)) {
+ next;
+ }
+ push(@dirlist, keys(%{$dtneededs_lookup_full{$full}}));
+ }
+ if (@dirlist) {
+ $result =
+ try_executables_bindings($dir, $uref, @dirlist);
+ }
+ }
+ emsg("\n");
+}
+
+#
+# We are trying to reduce unbound symbols of shared objects/libraries
+# under test that *have not* recorded their dependencies (i.e.
+# DTNEEDED's). So we look for Executables being checked that have *this*
+# binary ($path_to_object, a shared object) on *its* DTNEEDED. If we
+# find one, we use those bindings.
+#
+sub try_executables_bindings
+{
+ my ($dir, $uref, @dirlist) = @_;
+
+ my $path_to_object = dir_name_to_path($dir);
+
+ #
+ # N.B. The word "try" here means for a binary (a shared library,
+ # actually) that had unbound symbols, "try" to use OTHER
+ # executables binding info to resolve those unbound symbols.
+ #
+ # At least one executable needs this library; we select the one
+ # with minimal number of its own unbounds.
+ #
+ my (%sorting_list);
+ my (@executables_to_try);
+ my ($dir2, $cnt);
+ foreach $dir2 (@dirlist) {
+ next if (! defined($dir2));
+ next if ($dir2 eq $dir);
+ if (exists($uref->{$dir2})) {
+ $cnt = $uref->{$dir2};
+ } else {
+ #
+ # This binary is not on the unbounds list, so
+ # give it the highest priority.
+ #
+ $cnt = 0;
+ }
+ $sorting_list{"$dir2 $cnt"} = $dir2;
+ }
+
+ foreach my $key (reverse(sort_on_count(keys %sorting_list))) {
+ push(@executables_to_try, $sorting_list{$key});
+ }
+
+ my ($my_new_count, $my_new_profile, %my_new_symbols);
+ my ($object, $caller, $callee, $sym, $profile);
+ my $reprofiled = 0;
+
+ my ($line, $path2);
+
+ foreach $dir2 (@executables_to_try) {
+ $path2 = dir_name_to_path($dir2);
+ emsg(gettext(
+ "re-profiling: %s\n" .
+ "using: %s\n"), $path_to_object, $path2);
+
+ # read the other binary's profile
+
+ $profile = "$dir2/profile.dynamic";
+ if (! -f $profile) {
+ next;
+ }
+
+ my $prof_try_fh = do { local *FH; *FH };
+ open($prof_try_fh, "<$profile") ||
+ exiter(nofile($profile, $!));
+
+ # initialize for the next try:
+ $my_new_profile = '';
+ $my_new_count = 0;
+ %my_new_symbols = ();
+
+ # try to find bindings that involve us ($dir)
+ while (<$prof_try_fh>) {
+ chop($line = $_);
+ next if (/^\s*#/);
+ next if (/^\s*$/);
+ ($object, $caller, $callee, $sym) =
+ split(/\|/, $line, 4);
+
+ if ($caller eq '*REVERSE*') {
+ next if ($callee =~ /^\*.*\*$/);
+ if (! files_equal($callee, $path_to_object)) {
+ next;
+ }
+
+ $my_new_profile .=
+ "$callee|*DIRECT*|REVERSE_TO:" .
+ "$object|$sym\n";
+
+ $my_new_symbols{$sym}++;
+ $my_new_count++;
+
+ } elsif (files_equal($caller, $path_to_object)) {
+ $my_new_profile .=
+ "$caller|*DIRECT*|$callee|$sym\n";
+
+ $my_new_symbols{$sym}++;
+ $my_new_count++;
+ }
+ }
+ close($prof_try_fh);
+
+ next if (! $my_new_count);
+
+ # modify our profile with the new information:
+ $profile = "$dir/profile.dynamic";
+ if (! rename($profile, "$profile.0") || ! -f "$profile.0") {
+ return 0;
+ }
+ my $prof_orig_fh = do { local *FH; *FH };
+ if (! open($prof_orig_fh, "<$profile.0")) {
+ rename("$profile.0", $profile);
+ return 0;
+ }
+ my $prof_fh = do { local *FH; *FH };
+ if (! open($prof_fh, ">$profile")) {
+ rename("$profile.0", $profile);
+ return 0;
+ }
+ my $resolved_from = dir_name_to_path($dir2);
+ print $prof_fh "# REDUCING_UNBOUNDS_VIA_PROFILE_FROM: " .
+ "$resolved_from\n";
+
+ while (<$prof_orig_fh>) {
+ if (/^\s*#/) {
+ print $prof_fh $_;
+ next;
+ }
+ chop($line = $_);
+ ($object, $caller, $callee, $sym) =
+ split(/\|/, $line, 4);
+ if (! exists($my_new_symbols{$sym})) {
+ print $prof_fh $_;
+ next;
+ }
+ print $prof_fh "# RESOLVED_FROM=$resolved_from: $_";
+ }
+ close($prof_orig_fh);
+ print $prof_fh "# NEW_PROFILE:\n" . $my_new_profile;
+ close($prof_fh);
+
+ $reprofiled = 1;
+ last;
+ }
+ return $reprofiled;
+}
+
+#
+# This routine calls get_ldd_output on the object and parses the
+# LD_DEBUG output. Returns a string containing the information in
+# standard form.
+#
+sub get_dynamic_profile
+{
+ my ($object) = @_;
+
+ # Check if the object is statically linked:
+
+ my $str;
+ if (! is_elf($object)) {
+ return "DYNAMIC_PROFILE_SKIPPED_NOT_ELF";
+ } elsif (is_statically_linked($object)) {
+ $str = cmd_output_file($object);
+ return "STATICALLY_LINKED: $str";
+ }
+
+ # Get the raw ldd output:
+ my $ldd_output = get_ldd_output($object);
+
+ if ($ldd_output =~ /^ERROR:/) {
+ # some problem occurred, pass the error upward:
+ return $ldd_output;
+ }
+
+ # variables for manipulating the output:
+ my ($line, $filters, $neededs, $rest);
+ my ($tmp, $tmp2, @bindings);
+
+ # Now parse it:
+
+ foreach $line (split(/\n/, $ldd_output)) {
+
+ if ($line =~ /^\d+:\s*(.*)$/) {
+ # LD_DEBUG profile line, starts with "NNNNN:"
+ $tmp = $1;
+ next if ($tmp eq '');
+
+ if ($tmp =~ /^binding (.*)$/) {
+ #
+ # First look for:
+ # binding file=/bin/pagesize to \
+ # file=/usr/lib/libc.so.1: symbol `exit'
+ #
+ $tmp = $1;
+ push(@bindings, ldd_binding_line($1, $object));
+
+ } elsif ($tmp =~ /^file=\S+\s+(.*)$/) {
+ #
+ # Next look for:
+ # file=/usr/platform/SUNW,Ultra-1/\
+ # lib/libc_psr.so.1; filtered by /usr...
+ # file=libdl.so.1; needed by /usr/lib/libc.so.1
+ #
+ $rest = trim($1);
+
+ if ($rest =~ /^filtered by /) {
+ $filters .=
+ ldd_filter_line($tmp);
+ } elsif ($rest =~ /^needed by /) {
+ $neededs .=
+ ldd_needed_line($tmp, $object);
+ }
+
+ }
+
+ } elsif ($line =~ /^stdout:(.*)$/) {
+ # LD_DEBUG stdout line:
+
+ $tmp = trim($1);
+ next if ($tmp eq '');
+
+ if ($tmp =~ /\s+=>\s+/) {
+ #
+ # First look for standard dependency
+ # resolution lines:
+ #
+ # libsocket.so.1 => /usr/lib/libsocket.so.1
+ #
+ # Note that these are *all* of the
+ # needed shared objects, not just the
+ # directly needed ones.
+ #
+ $tmp =~ s/\s+/ /g;
+ $neededs .= "NEEDED_FOUND:$tmp" . "\n";
+
+ } elsif ($tmp =~ /symbol not found: (.*)$/) {
+ #
+ # Next look for unbound symbols:
+ # symbol not found: gethz (/usr/\
+ # local/bin/gethz)
+ #
+
+ $tmp = trim($1);
+ ($tmp, $tmp2) = split(/\s+/, $tmp, 2);
+ $tmp2 =~ s/[\(\)]//g; # trim off ().
+
+ # $tmp is the symbol, $tmp2 is the
+ # calling object.
+
+ push(@bindings,
+ "BINDING_UNBOUND:$tmp2|$tmp" . "\n"
+ );
+ }
+ }
+ }
+
+ # Return the output:
+ my $ret = '';
+ $ret .= $filters if (defined($filters));
+ $ret .= $neededs if (defined($neededs));
+ $ret .= join('', @bindings);
+
+ return $ret;
+}
+
+#
+# Routine used to parse a LD_DEBUG "binding" line.
+#
+# Returns "preprocessed format line" if line is ok, or
+# null string otherwise.
+#
+sub ldd_binding_line
+{
+ my ($line, $object) = @_;
+
+ my ($from, $to, $sym);
+
+ my ($t1, $t2, $t3); # tmp vars for regex output
+
+ #
+ # Working on a line like:
+ #
+ # binding file=/bin/pagesize to file=/usr/lib/libc.so.1: symbol `exit'
+ #
+ # (with the leading "binding " removed).
+ #
+
+ if ($line =~ /^file=(\S+)\s+to file=(\S+)\s+symbol(.*)$/) {
+ #
+ # The following trim off spaces, ', `, ;, and :, from
+ # the edges so if the filename had those there could
+ # be a problem.
+ #
+ $from = $1;
+ $to = $2;
+ $sym = $3;
+ #
+ # guard against future changes to the LD_DEBUG output
+ # (i.e. information appended to the end)
+ #
+ $sym =~ s/'\s+.*$//;
+
+ $to =~ s/:$//;
+
+ $sym =~ s/[\s:;`']*$//;
+ $sym =~ s/^[\s:;`']*//;
+
+ } elsif ($line =~ /^file=(.+) to file=(.+): symbol (.*)$/) {
+ # This will catch spaces, but is less robust.
+ $t1 = $1;
+ $t2 = $2;
+ $t3 = $3;
+ #
+ # guard against future changes to the LD_DEBUG output
+ # (i.e. information appended to the end)
+ #
+ $t3 =~ s/'\s+.*$//;
+
+ $from = wclean($t1, 1);
+ $to = wclean($t2, 1);
+ $sym = wclean($t3);
+
+ } else {
+ return '';
+ }
+
+ if ($from eq '' || $to eq '' || $sym eq '') {
+ return '';
+ }
+
+ #
+ # OK, we have 3 files: $from, $to, $object
+ # Which, if any, are the same file?
+ #
+ # Note that we have not yet done the Filter library
+ # substitutions yet. So one cannot be too trusting of the file
+ # comparisons done here.
+ #
+
+ if (files_equal($from, $to, 0)) {
+ #
+ # We skip the "from" = "to" case
+ # (could call this: BINDING_SELF).
+ #
+ return '';
+ } elsif (files_equal($object, $from, 0)) {
+ # DIRECT CASE (object calls library):
+ return "BINDING_DIRECT:$from|$to|$sym" . "\n";
+ } elsif (files_equal($object, $to, 0)) {
+ # REVERSE CASE (library calls object):
+ return "BINDING_REVERSE:$from|$to|$sym" . "\n";
+ } else {
+ #
+ # INDIRECT CASE (needed library calls library):
+ # (this will not be a library calling itself because
+ # we skip $from eq $to above).
+ #
+ return "BINDING_INDIRECT:$from|$to|$sym" . "\n";
+ }
+}
+
+#
+# Routine used to parse a LD_DEBUG "filtered by" line.
+#
+# Returns "preprocessed format line" if line is ok, or null string
+# otherwise.
+#
+sub ldd_filter_line
+{
+ my ($line) = @_;
+
+ my ($filter, $filtee);
+
+ #
+ # Working on a line like:
+ #
+ # file=/usr/platform/SUNW,Ultra-1/lib/libc_psr.so.1; \
+ # filtered by /usr/lib/libc.so.1
+ #
+
+ my ($t1, $t2); # tmp vars for regex output
+
+ if ($line =~ /file=(\S+)\s+filtered by\s+(\S.*)$/) {
+ $t1 = $1;
+ $t2 = $2;
+ $filtee = wclean($t1);
+ $filter = wclean($t2);
+ } elsif ($line =~ /file=(.+); filtered by (.*)$/) {
+ $t1 = $1;
+ $t2 = $2;
+ $filtee = wclean($t1, 1);
+ $filter = wclean($t2, 1);
+ } else {
+ return '';
+ }
+
+ if ($filtee eq '' || $filter eq '') {
+ return '';
+ }
+ #
+ # What kind of filter is $filter?
+ # STANDARD (contains no "real code", e.g. libxnet.so.1), or
+ # AUXILIARY (provides "code" if needed, but
+ # prefers to pass filtee's "code", e.g. libc.so.1)
+ #
+ # LD_DEBUG output does not indicate this, so dump -Lv is run on it
+ # in filter_lib_type:
+ #
+
+ my $type = 'unknown';
+
+ $type = filter_lib_type($filter);
+
+ if ($type eq 'STD') {
+ return "FILTER_STD:$filter|$filtee" . "\n";
+ } elsif ($type eq 'AUX') {
+ return "FILTER_AUX:$filter|$filtee" . "\n";
+ } else {
+ return '';
+ }
+}
+
+#
+# Routine used to parse a LD_DEBUG "needed by" line.
+#
+# Returns "preprocessed format line" if line is ok, or the null string
+# otherwise.
+#
+sub ldd_needed_line
+{
+ my ($line, $object) = @_;
+
+ my ($thing_needed, $file);
+
+ my ($t1, $t2); # tmp variables for regex output.
+
+ #
+ # Working on a line like:
+ #
+ # file=libdl.so.1; needed by /usr/lib/libc.so.1
+ #
+
+ if ($line =~ /file=(\S+)\s+needed by\s+(\S.*)$/) {
+ $t1 = $1;
+ $t2 = $2;
+ $thing_needed = wclean($t1);
+ $file = wclean($t2);
+ } elsif ($line =~ /file=(.+); needed by (.*)$/) {
+ $t1 = $1;
+ $t2 = $2;
+ $thing_needed = wclean($t1, 1);
+ $file = wclean($t2, 1);
+ } else {
+ return '';
+ }
+
+ if ($thing_needed eq '' || $file eq '') {
+ return '';
+ }
+
+ #
+ # Note that $thing_needed is not a path to a file, just the
+ # short name unresolved, e.g. "libc.so.1". The next line of the
+ # LD_DEBUG output would tell us where $thing_needed is resolved
+ # to.
+ #
+
+ if (files_equal($object, $file)) {
+ return "NEEDED_DIRECT:$thing_needed|$file" . "\n";
+ } else {
+ return "NEEDED_INDIRECT:$thing_needed|$file" . "\n";
+ }
+}
+
+#
+# Routine to clean up a "word" string from ldd output.
+#
+# This is specialized for removing the stuff surrounding files and
+# symbols in the LD_DEBUG output. It is usually a file name or symbol
+# name.
+#
+sub wclean
+{
+ my ($w, $keep_space) = @_;
+
+ if (! $keep_space) {
+ # make sure leading/trailing spaces are gone.
+ $w =~ s/[\s:;`']*$//; # get rid of : ; ' and `
+ $w =~ s/^[\s:;`']*//;
+ } else {
+ $w =~ s/[:;`']*$//; # get rid of : ; ' and `
+ $w =~ s/^[:;`']*//;
+ }
+
+ return $w;
+}
+
+#
+# This routine runs ldd -r on the object file with LD_DEBUG flags turned
+# on. It collects the stdout and the LD_DEBUG profile data for the
+# object (it must skip the LD_DEBUG profile data for /usr/bin/ldd
+# /bin/sh, or any other extraneous processes).
+#
+# It returns the profile data as a single string with \n separated
+# records. Records starting with "stdout: " are the stdout lines,
+# Records starting with "NNNNN: " are the LD_DEBUG lines. Our caller
+# must split and parse those lines.
+#
+# If there is some non-fatal error, it returns a 1-line string like:
+# ERROR: <error-message>
+#
+sub get_ldd_output
+{
+
+ my ($object) = @_;
+
+ my ($tmpdir, $outfile, $errfile);
+
+ if (! -f $object) {
+ exiter(nopathexist($object));
+ }
+
+ # We use the tmp_dir for our work:
+ $tmpdir = $tmp_prof_dir;
+
+ # Clean out the tmpdir.
+ if ($tmpdir !~ m,^/*$,) {
+ unlink(<$tmpdir/*>);
+ #
+ # The following puts xgettext(1) back on track. It is
+ # confused and believes it is inside a C-style /* comment */
+ #
+ my $unused = "*/";
+ }
+
+ # Output files for collecting output of the ldd -r command:
+ $errfile = "$tmpdir/stderr";
+ $outfile = "$tmpdir/stdout";
+
+ my ($rc, $msg, $child, $result);
+
+ #
+ # This forking method should have 2 LD_DEBUG bind.<PID> files
+ # one for ldd and the other for $object. system() could have
+ # another from the shell.
+ #
+
+ # Fork off a child:
+ $child = fork();
+
+ #
+ # Note: the file "/tmp/.../bind.$child" should be the "ldd"
+ # profile, but we do not want to depend upon that.
+ #
+
+ if (! defined($child)) {
+ # Problem forking:
+ exiter(sprintf(gettext(
+ "cannot fork for command: ldd -r %s: %s\n"), $object, $!));
+
+ } elsif ($child == 0) {
+
+ # Reopen std output to the desired output files:
+ open(STDOUT, ">$outfile") ||
+ exiter(nofile($outfile, $!));
+
+ open(STDERR, ">$errfile") ||
+ exiter(nofile($errfile, $!));
+
+ #
+ # Set the env to turn on debugging from the linker:
+ #
+ $ENV{'LD_DEBUG'} = "files,bindings";
+ $ENV{'LD_DEBUG_OUTPUT'} = "$tmpdir/bind";
+
+ #
+ # Set LD_NOAUXFLTR to avoid auxiliary filters (e.g. libc_psr)
+ # since they are not of interest to the public/private
+ # symbol status and confuse things more than anything else.
+ #
+ $ENV{'LD_NOAUXFLTR'} = "1";
+
+ # Run ldd -r:
+ c_locale(1);
+ exec($cmd_ldd, '-r', $object);
+ exit 1; # only reached if exec fails.
+ } else {
+ wait; # Wait for children to finish.
+ $rc = $?; # Record exit status.
+ $msg = $!;
+ }
+
+ # Check the exit status:
+ if ($rc != 0) {
+ if (-s $errfile) {
+ my $tmp;
+ my $errfile_fh = do { local *FH; *FH };
+ if (open($errfile_fh, "<$errfile")) {
+ while (<$errfile_fh>) {
+ if (/ldd:/) {
+ $tmp = $_;
+ last;
+ }
+ }
+ close($errfile_fh);
+ }
+ if (defined($tmp)) {
+ chomp($tmp);
+ if ($tmp =~ /ldd:\s*(\S.*)$/) {
+ $tmp = $1;
+ }
+ if ($tmp =~ /^[^:]+:\s*(\S.*)$/) {
+ my $t = $1;
+ if ($t !~ /^\s*$/) {
+ $tmp = $t;
+ }
+ }
+ $msg = $tmp if ($tmp !~ /^\s*$/);
+ }
+ }
+ emsg("%s", norunprog("$cmd_ldd -r $object", "$msg\n"));
+ $msg =~ s/\n/ /g;
+ $msg =~ s/;/,/g;
+ $msg = sprintf("ERROR: " . gettext(
+ "Error running: ldd -r LD_DEBUG: %s"), $msg);
+ return $msg;
+ }
+
+ #
+ # We now have all the output files created. We read them and
+ # merge them into one long string to return to whoever called
+ # us. The caller will parse it, not us. Our goal here is to
+ # just return the correct LD_DEBUG profile data.
+ #
+
+ if (-f "$tmpdir/stdout") {
+ my $out_fh = do { local *FH; *FH };
+ if (! open($out_fh, "<$tmpdir/stdout")) {
+ exiter(nofile("$tmpdir/stdout", $!));
+ }
+ while (<$out_fh>) {
+ # Add the special prefix for STDOUT:
+ $result .= "stdout: $_";
+ }
+ close($out_fh);
+ }
+
+ my ($file, $count, $goodone, $ok, $aok, @file);
+
+ $count = 0;
+
+ my $prevline;
+
+ # Loop over each "bind.NNNNN" file in the tmp directory:
+ foreach $file (<$tmpdir/bind.*>) {
+
+ # Open it for reading:
+ my $ldd_file_fh = do { local *FH; *FH };
+ if (! open($ldd_file_fh, "<$file")) {
+ exiter(nofile($file, $!));
+ }
+
+ #
+ # ok = 1 means this file we are reading the profile file
+ # corresponding to $object. We set ok = 0 as soon as we
+ # discover otherwise.
+ #
+ $ok = 1;
+
+ #
+ # $aok = 1 means always OK. I.e. we are definitely in the
+ # correct profile.
+ #
+ $aok = 0;
+
+ #
+ # this variable will hold the previous line so that we
+ # can skip adjacent duplicates.
+ #
+ $prevline = '';
+
+ my $idx;
+
+ while (<$ldd_file_fh>) {
+
+ #
+ # This check is done to perform a simple
+ # uniq'ing of the output. Non-PIC objects have
+ # lots of duplicates, many of them right after
+ # each other.
+ #
+
+ next if ($_ eq $prevline);
+ $prevline = $_;
+
+ #
+ # Check to see if this is the wrong profile
+ # file: The ones we know about are "ldd" and
+ # "sh". If the object under test is ever "ldd"
+ # or "sh" this will fail.
+ #
+ if ($aok) {
+ ;
+ } elsif ($ok) {
+ #
+ # checks line:
+ # file=ldd; analyzing [ RTLD_GLOBAL RTLD_LAZY ]
+ #
+ if (/\bfile=\S+\b(ldd|sh)\b/) {
+ $ok = 0;
+ } else {
+ $idx =
+ index($_, " file=$object; analyzing");
+ $aok = 1 if ($idx != -1);
+ }
+ }
+
+ # We can skip this file as soon as we see $ok = 0.
+ last unless ($ok);
+
+ # Gather the profile output into a string:
+ $file[$count] .= $_;
+ }
+
+ #
+ # Note that this one is the desired profile
+ # (i.e. if $ok is still true):
+ #
+ $goodone .= "$count," if ($ok);
+
+ # On to the next $file:
+ close($ldd_file_fh);
+ $count++;
+ }
+
+ if (defined($goodone)) {
+ $goodone =~ s/,$//; # Trim the last comma off.
+ }
+
+ # If we have none or more than one "good one" we are in trouble:
+ if (! defined($goodone) || ($goodone !~ /^\d+$/) || ($goodone =~ /,/)) {
+
+ #
+ # Note that this is the first point at which we would detect
+ # a problem with the checking of SUID/SGID objects, although
+ # in theory we could have skipped these objects earlier.
+ # We prefer to let the linker, ld.so.1, indicate this failure
+ # and then we catch it and diagnose it here.
+ #
+ my $suid = is_suid($object);
+
+ if ($suid == 1) {
+ $result = "ERROR: " . gettext(
+ "SUID - ldd(1) LD_DEBUG profile failed");
+ } elsif ($suid == 2) {
+ $result = "ERROR: " . gettext(
+ "SGID - ldd(1) LD_DEBUG profile failed");
+ } else {
+ $result = "ERROR: " . gettext(
+ "could not get ldd(1) LD_DEBUG profile output");
+ }
+
+ } else {
+ # Append the correct profile to the result and return it:
+ $result .= $file[$goodone];
+ }
+
+ # Tidy up our mess by cleaning out the tmpdir.
+ unlink(<$tmpdir/*>) if ($tmpdir !~ m,^/*$,);
+
+ return $result;
+}
diff --git a/usr/src/cmd/abi/appcert/scripts/symreport.pl b/usr/src/cmd/abi/appcert/scripts/symreport.pl
new file mode 100644
index 0000000..36db632
--- /dev/null
+++ b/usr/src/cmd/abi/appcert/scripts/symreport.pl
@@ -0,0 +1,835 @@
+#!/usr/perl5/bin/perl -w
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright (c) 1996-2000 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+
+#
+# This utility program reads the symcheck output of each binary and
+# creates additional output for then and an overall report.
+#
+
+require 5.005;
+use strict;
+use locale;
+use POSIX qw(locale_h);
+use Sun::Solaris::Utils qw(textdomain gettext);
+use File::Basename;
+use File::Path;
+
+use lib qw(/usr/lib/abi/appcert);
+use AppcertUtil;
+
+setlocale(LC_ALL, "");
+textdomain(TEXT_DOMAIN);
+
+use vars qw(
+ $tmp_report_dir
+ $misc_check_databases_loaded_ok
+ %result_list_hash
+ %result_msg
+ %warnings_found
+);
+
+set_clean_up_exit_routine(\&clean_up_exit);
+
+import_vars_from_environment();
+
+signals('on', \&interrupted);
+
+set_working_dir();
+
+generate_reports();
+
+clean_up();
+
+exit 0;
+
+#
+# working_dir has been imported by import_vars_from_environment()
+# A sanity check is performed here to make sure it exists.
+#
+sub set_working_dir
+{
+ if (! defined($working_dir) || ! -d $working_dir) {
+ exiter("$command_name: " . sprintf(gettext(
+ "cannot locate working directory: %s\n"), $working_dir));
+ }
+}
+
+#
+# Called when interrupted by user.
+#
+sub interrupted
+{
+ $SIG{$_[0]} = 'DEFAULT';
+ signals('off');
+ clean_up_exit(1);
+}
+
+#
+# Does the cleanup and then exit with return code $rc. Note: The
+# utility routine exiter() will call this routine.
+#
+sub clean_up_exit
+{
+ my ($rc) = @_;
+ $rc = 0 unless ($rc);
+
+ clean_up();
+ exit $rc;
+}
+
+#
+# General cleanup activities are placed here. There may not be an
+# immediate exit after this cleanup.
+#
+sub clean_up
+{
+ if (defined($tmp_report_dir) && -d $tmp_report_dir) {
+ rmtree($tmp_report_dir);
+ }
+}
+
+#
+# Top level routine for generating the additional reports.
+#
+sub generate_reports
+{
+ # Make a tmp dir for the reporting work.
+ $tmp_report_dir = create_tmp_dir($tmp_dir);
+
+ if (! -d $tmp_report_dir) {
+ exiter(nocreatedir($tmp_report_dir, $!));
+ }
+
+ pmsg("\n");
+ print_line();
+
+ my ($dir, $path_to_object);
+
+ #
+ # Loop over each object item in the working_dir.
+ # - $dir will be each one of these object directories.
+ # - $path_to_object will be the corresponding actual path
+ # to the the binary to be profiled.
+ # Output will be placed down in $dir, e.g. "$dir/report"
+ #
+
+ while (defined($dir = next_dir_name())) {
+
+ # Map object output dir to actual path of the object:
+ $path_to_object = dir_name_to_path($dir);
+
+ # Make a report for it:
+ report_object($path_to_object, $dir);
+ }
+
+ my $type;
+ foreach $type (keys(%result_list_hash)) {
+ $result_list_hash{$type} =~ s/\|+$//;
+ }
+
+ print_report();
+ my $tout;
+ $tout = gettext(
+ "Additional output regarding private symbols usage and other\n" .
+ "data is in the directory:\n");
+
+ $tout .= "\n $working_dir\n\n";
+
+ $tout .= gettext(
+ "see the appcert documentation for more information.\n");
+
+ pmsg("%s", $tout);
+
+ clean_up(); # Remove any tmp directories and files.
+}
+
+#
+# Examines the symcheck output for a given binary object recording and
+# reporting and problems found. Generates additional reports and
+# summaries.
+#
+sub report_object
+{
+ my ($object, $dir) = @_;
+
+ my (%problems);
+
+ my $problems_file = "$dir/check.problems";
+
+ my $problems_fh = do { local *FH; *FH };
+ open($problems_fh, "<$problems_file") ||
+ exiter(nofile($problems_file, $!));
+
+ # We need the "warning" msgs and text from the Misc Checks loaded:
+ if (! defined($misc_check_databases_loaded_ok)) {
+ $misc_check_databases_loaded_ok = load_misc_check_databases();
+ }
+
+ my ($prob, $incomp, $c, $w);
+ my $problem_count = 0;
+ my $incomplete_count = 0;
+ my $line_count = 0;
+
+ while (<$problems_fh>) {
+ chomp;
+ $prob = 1;
+ $incomp = 0;
+ $line_count++;
+
+ if (/^DYNAMIC: PRIVATE_SYMBOL_USE\s+(\d*)/) {
+ $problems{'private_syms'} += $1;
+ } elsif (/^DYNAMIC: UNBOUND_SYMBOL_USE\s+(\d*)/) {
+ $problems{'unbound_syms'} += $1;
+ $incomp = 1;
+ } elsif (/^DYNAMIC: UNRECOGNIZED_SYMBOL_USE\s+(\d*)/) {
+ $problems{'unrecognized_syms'} += $1;
+ $incomp = 1;
+ } elsif (/^DYNAMIC: NO_DYNAMIC_BINDINGS_FOUND\s*(.*)$/) {
+ $problems{'no_dynamic_bindings'} .= "$1, ";
+ $incomp = 1;
+ } elsif (/^STATIC: LINKED_ARCHIVE\s+(.*)$/) {
+ $problems{'static_linking'} .= "$1, ";
+ } elsif (/^STATIC: COMPLETELY_STATIC/) {
+ $problems{'completely_static'}++;
+ } elsif (/^MISC: REMOVED_SCOPED_SYMBOLS:\s+(.*)$/) {
+ $problems{'scoped_symbols'} .= "$1, ";
+ } elsif (/^MISC: WARNING:\s+(INCOMPLETE\S+)/) {
+ $problems{'warnings'} .= "$1|";
+ $incomp = 1;
+ } elsif (/^MISC: WARNING:\s+(.*)$/) {
+ $problems{'warnings'} .= "$1|";
+ } else {
+ $prob = 0;
+ }
+ $problem_count += $prob;
+ $incomplete_count += $incomp;
+ }
+ close($problems_fh);
+
+ if ($line_count == 0) {
+ # No problems at all, leave a comment message:
+ open($problems_fh, ">$problems_file") ||
+ exiter(nofile($problems_file, $!));
+ print $problems_fh "# NO_PROBLEMS_DETECTED\n";
+ close($problems_fh);
+ }
+
+ if ($problem_count == 0) {
+ $result_list_hash{'passed'} .= "$object|";
+ return;
+ }
+
+ if ($incomplete_count == $problem_count) {
+ $result_list_hash{'incomplete'} .= "$object|";
+ } else {
+ $result_list_hash{'failed'} .= "$object|";
+ }
+
+ my $m;
+
+ if ($m = $problems{'private_syms'}) {
+ $result_list_hash{'private_syms'} .= "$object|";
+ $result_msg{$object} .= "$m " .
+ gettext("private symbols") . "; ";
+ }
+
+ if ($m = $problems{'unbound_syms'}) {
+ $result_list_hash{'unbound_syms'} .= "$object|";
+ $result_msg{$object} .= "$m " .
+ gettext("unbound symbols") . "; ";
+
+ # add this case to the warnings output at end of report.
+ my $tag = 'unbound symbols';
+ $warnings_found{$tag} .= "$object|";
+
+ if (! exists($warnings_desc{$tag})) {
+ my $desc = gettext("unbound symbols");
+ $warnings_desc{$tag} = $desc;
+ }
+ }
+
+ if ($m = $problems{'unrecognized_syms'}) {
+ $result_list_hash{'unrecognized_syms'} .= "$object|";
+ $result_msg{$object} .= "$m " .
+ gettext("unrecognized symbols") . "; ";
+
+ # Add this case to the warnings output at end of report.
+ my $tag = 'unrecognized symbols';
+ $warnings_found{$tag} .= "$object|";
+
+ if (! exists($warnings_desc{$tag})) {
+ my $desc = gettext("unrecognized symbols");
+ $warnings_desc{$tag} = $desc;
+ }
+ }
+
+ if ($m = $problems{'static_linking'}) {
+ $result_list_hash{'static_linking'} .= "$object|";
+ $m =~ s/,\s*$//;
+ $result_msg{$object} .= sprintf(gettext(
+ "statically linked with %s"), $m) . "; ";
+
+ # Add this case to the warnings output at end of report.
+ my $tag = 'statically linked';
+ $warnings_found{$tag} .= "$object|";
+
+ if (! exists($warnings_desc{$tag})) {
+ my $desc =
+ gettext("static linking of Solaris libraries");
+ $warnings_desc{$tag} = $desc;
+ }
+ }
+
+ if ($problems{'completely_static'}) {
+ $result_list_hash{'completely_static'} .= "$object|";
+ $result_msg{$object} .=
+ gettext("completely statically linked") . "; ";
+
+ # Add this case to the warnings output.
+ my $tag = gettext("completely statically linked");
+ $warnings_found{$tag} .= "$object|";
+
+ my $desc =
+ gettext("complete static linking of Solaris libraries");
+ if (! exists($warnings_desc{$tag})) {
+ $warnings_desc{$tag} = $desc;
+ }
+
+ } elsif ($m = $problems{'no_dynamic_bindings'}) {
+ #
+ # Note we skip this error if it is completely static.
+ # The app could technically be SUID as well.
+ #
+
+ $result_list_hash{'no_dynamic_bindings'} .= "$object|";
+ $m =~ s/,\s*$//;
+ $m = " : $m";
+ $m =~ s/ : NO_SYMBOL_BINDINGS_FOUND//;
+ $m =~ s/^ :/:/;
+ $result_msg{$object} .=
+ gettext("no bindings found") . "$m; ";
+ }
+
+ if ($m = $problems{'scoped_symbols'}) {
+ $m =~ s/[,\s]*$//;
+ $result_list_hash{'scoped_symbols'} .= "$object|";
+ $c = scalar(my @a = split(' ', $m));
+
+ $result_msg{$object} .= "$c " .
+ gettext("demoted (removed) private symbols") . ": $m; ";
+
+ # Add this case to the warnings output.
+ my $tag = 'scoped symbols';
+ $warnings_found{$tag} .= "$object|";
+
+ my $desc = gettext(
+ "dependency on demoted (removed) private Solaris symbols");
+ if (! exists($warnings_desc{$tag})) {
+ $warnings_desc{$tag} = $desc;
+ }
+ }
+
+ if ($m = $problems{'warnings'}) {
+ foreach $w (split(/\|/, $m)) {
+ next if ($w =~ /^\s*$/);
+
+ $c = $w;
+ if (defined($warnings_desc{$c})) {
+ $c = $warnings_desc{$c};
+ $c = gettext($c);
+ }
+ $c =~ s/;//g;
+ $result_msg{$object} .= "$c; ";
+ $warnings_found{$w} .= "$object|";
+ }
+ }
+
+ $result_msg{$object} =~ s/;\s+$//;
+}
+
+#
+# Create the top level roll-up report.
+#
+sub print_report
+{
+ # Count the number of passed, failed and total binary objects:
+ my(@a);
+ my($r_passed, $r_incomp, $r_failed);
+ if (exists($result_list_hash{'passed'})) {
+ $r_passed = $result_list_hash{'passed'};
+ } else {
+ $r_passed = '';
+ }
+ if (exists($result_list_hash{'incomplete'})) {
+ $r_incomp = $result_list_hash{'incomplete'};
+ } else {
+ $r_incomp = '';
+ }
+ if (exists($result_list_hash{'failed'})) {
+ $r_failed = $result_list_hash{'failed'};
+ } else {
+ $r_failed = '';
+ }
+ my $n_passed = scalar(@a = split(/\|/, $r_passed));
+ my $n_incomp = scalar(@a = split(/\|/, $r_incomp));
+ my $n_failed = scalar(@a = split(/\|/, $r_failed));
+ my $n_checked = $n_passed + $n_incomp + $n_failed;
+
+ my ($summary_result, $msg, $output, $object);
+
+
+ if ($n_checked == 0) {
+ $summary_result = $text{'Summary_Result_None_Checked'};
+ } elsif ($n_failed > 0) {
+ $summary_result = $text{'Summary_Result_Some_Failed'};
+ } elsif ($n_incomp > 0) {
+ $summary_result = $text{'Summary_Result_Some_Incomplete'};
+ } else {
+ $summary_result = $text{'Summary_Result_All_Passed'};
+ }
+
+ # place the info in problem count file:
+ my $cnt_file = "$working_dir/ProblemCount";
+ my $pcount_fh = do { local *FH; *FH };
+ if (! open($pcount_fh, ">$cnt_file")) {
+ exiter(nofile($cnt_file, $!));
+ }
+
+ print $pcount_fh "$n_failed / $n_checked binary_objects_had_problems\n";
+ print $pcount_fh
+ "$n_incomp / $n_checked could_not_be_completely_checked\n";
+
+ print $pcount_fh "NO_PROBLEMS_LIST: $r_passed\n";
+ print $pcount_fh "INCOMPLETE_LIST: $r_incomp\n";
+ print $pcount_fh "PROBLEMS_LIST: $r_failed\n";
+ close($pcount_fh);
+
+ #
+ # Set the overall result code.
+ # This is used to communicate back to the appcert script to
+ # indicate how it should exit(). The string must start with the
+ # exit number, after which a message may follow.
+ #
+
+ if ($n_checked == 0) {
+ overall_result_code("3 => nothing_checked");
+ } elsif ($n_failed > 0) {
+ overall_result_code("2 => some_problems_detected($n_failed)");
+ } elsif ($n_incomp > 0) {
+ overall_result_code("1 => " .
+ "some_binaries_incompletely_checked($n_incomp)");
+ } else {
+ overall_result_code("0 => no_problems_detected");
+ }
+
+ my ($sp0, $sp, $sf, $si); # PASS & FAIL spacing tags.
+ $sp0 = ' ';
+ if ($batch_report) {
+ $sp = 'PASS ';
+ $sf = 'FAIL ';
+ $si = 'INC ';
+ } else {
+ $sp = $sp0;
+ $sf = $sp0;
+ $si = $sp0;
+ }
+
+
+ $msg = sprintf(gettext("Summary: %s"), $summary_result) . "\n\n";
+ my $format = gettext("A total of %d binary objects were examined.");
+ $msg .= sprintf($format, $n_checked) . "\n\n\n";
+ $output .= $msg;
+
+ my $fmt1 = gettext(
+ "The following (%d of %d) components had no problems detected:");
+
+ if ($n_passed > 0) {
+ $output .= sprintf($fmt1, $n_passed, $n_checked);
+ $output .= "\n\n";
+
+ foreach $object (split(/\|/, $r_passed)) {
+ $output .= "${sp}$object\n";
+ }
+ $output .= "\n";
+ }
+
+ my $fmt2 = gettext(
+ "The following (%d of %d) components had no problems detected,\n" .
+ " but could not be completely checked:");
+
+ if ($n_incomp > 0) {
+ $output .= sprintf($fmt2, $n_incomp, $n_checked);
+ $output .= "\n\n";
+
+ foreach $object (split(/\|/, $r_incomp)) {
+ $msg = $result_msg{$object};
+ $output .= "${si}$object\t($msg)\n";
+ }
+ $output .= "\n";
+ }
+
+ my $fmt3 = gettext(
+ "The following (%d of %d) components have potential " .
+ "stability problems:");
+ if ($n_failed > 0) {
+ $output .= sprintf($fmt3, $n_failed, $n_checked);
+ $output .= "\n\n";
+
+ foreach $object (split(/\|/, $r_failed)) {
+ $msg = $result_msg{$object};
+ $output .= "${sf}$object\t($msg)\n";
+ }
+ $output .= "\n";
+ }
+
+ $output .= "\n" . get_summary();
+
+ $output .= "\n" . get_warnings();
+
+ my $report_file = "$working_dir/Report";
+ my $report_fh = do { local *FH; *FH };
+ open($report_fh, ">$report_file") ||
+ exiter(nofile($report_file, $!));
+
+ print $report_fh $output;
+ close($report_fh);
+ system($cmd_more, $report_file);
+}
+
+#
+# Collects all of the warnings issued for the binaries that were
+# checked. Returns the warning text that will go into the roll-up
+# report.
+#
+sub get_warnings
+{
+ my ($w, $c, $output, $count);
+
+ if (! %warnings_found) {
+ return ''; # appends null string to output text
+ }
+
+ $output = gettext("Summary of various warnings:") . "\n\n";
+ my(@a);
+ foreach $w (keys(%warnings_found)) {
+ $warnings_found{$w} =~ s/\|+$//;
+ $count = scalar(@a = split(/\|/, $warnings_found{$w}));
+ $c = $w;
+ if (defined($warnings_desc{$c})) {
+ $c = $warnings_desc{$c};
+ }
+ $c = gettext($c);
+ $output .= " - $c " . sprintf(gettext(
+ "(%d binaries)\n"), $count);
+ $output .= "\n";
+
+ }
+ $output .= "\n";
+
+ return $output;
+}
+
+#
+# Computes the summary information for each binary object that was
+# checked. Returns the text that will go into the roll-up report.
+#
+sub get_summary
+{
+ my ($dir, $file);
+ my (%lib_private, %libsym_private);
+ my (%libapp, %libapp_private);
+
+ my ($bin, $arch, $direct, $lib, $class, $sym);
+
+ while (defined($dir = next_dir_name())) {
+
+ # This is where the public symbol list is:
+ $file = "$dir/check.dynamic.public";
+
+ my %app_public;
+ my %app_sym_public;
+ my %app_private;
+ my %app_sym_private;
+
+ if (-s $file) {
+ my $publics_fh = do { local *FH; *FH };
+ open($publics_fh, "<$file") ||
+ exiter(nofile($file, $!));
+
+ while (<$publics_fh>) {
+ next if (/^\s*#/);
+ chomp;
+ ($bin, $arch, $direct, $lib, $class, $sym) =
+ split(/\|/, $_);
+
+ $libapp{"$lib|$bin"}++;
+
+ $app_public{$lib}++;
+ $app_sym_public{"$lib|$sym"}++;
+ }
+ close($publics_fh);
+ }
+
+ # This is where the private symbol list is:
+ $file = "$dir/check.dynamic.private";
+
+ if (-s $file) {
+ my $privates_fh = do { local *FH; *FH };
+ open($privates_fh, "<$file") ||
+ exiter(nofile($file, $!));
+
+ while (<$privates_fh>) {
+ next if (/^\s*#/);
+ chomp;
+ ($bin, $arch, $direct, $lib, $class, $sym) =
+ split(/\|/, $_);
+
+ $lib_private{$lib}++;
+ $libsym_private{"$lib|$sym"}++;
+ $libapp_private{"$lib|$bin"}++;
+ $libapp{"$lib|$bin"}++;
+
+ $app_private{$lib}++;
+ $app_sym_private{"$lib|$sym"}++;
+ }
+ close($privates_fh);
+ }
+
+ write_app_summary($dir, \%app_public, \%app_sym_public,
+ \%app_private, \%app_sym_private);
+ }
+
+ my ($app_total, $app_private_total);
+ my ($key, $lib2, $app2, $sym2);
+ my $val;
+ my $text;
+
+ foreach $lib (sort(keys(%lib_private))) {
+
+ $app_total = 0;
+ foreach $key (keys(%libapp)) {
+ ($lib2, $app2) = split(/\|/, $key);
+ $app_total++ if ($lib eq $lib2);
+ }
+
+ $app_private_total = 0;
+ foreach $key (keys(%libapp_private)) {
+ ($lib2, $app2) = split(/\|/, $key);
+ $app_private_total++ if ($lib eq $lib2);
+ }
+
+ my @list;
+ while (($key, $val) = each(%libsym_private)) {
+ ($lib2, $sym2) = split(/\|/, $key);
+ next unless ($lib eq $lib2);
+ push(@list, "$sym2 $val");
+
+ }
+
+ $text .= private_format($lib, $app_total,
+ $app_private_total, @list);
+ }
+
+ if (! defined($text)) {
+ return ''; # appends null string to output report.
+ }
+ return $text;
+}
+
+#
+# Given the symbols and counts of private symbols used by all binaries
+# that were checked, returns a pretty-printed format table of the
+# symbols. This text goes into the roll-up report and the summary.dynamic
+# file.
+#
+sub private_format
+{
+ my ($lib, $tot, $priv, @list) = @_;
+
+ my (@sorted) = sort_on_count(@list);
+ my $formatted = list_format(' ', @sorted);
+
+ my $text;
+ my $libbase = basename($lib);
+
+ $text = sprintf(gettext(
+ "Summary of Private symbol use in %s\n"), $lib);
+ my $fmt =
+ gettext("%d binaries used %s, %d of these used private symbols");
+ $text .= sprintf($fmt, $tot, $libbase, $priv);
+ $text .= "\n\n$formatted\n";
+
+ return $text;
+}
+
+#
+# Given the public/private symbol and library usage information for a
+# binary object, creates an output file with this information formatted
+# in tables.
+#
+sub write_app_summary
+{
+ my ($dir, $public, $sym_public, $private, $sym_private) = @_;
+
+ my $outfile = "$dir/summary.dynamic";
+
+ my $summary_fh = do { local *FH; *FH };
+ open($summary_fh, ">$outfile") ||
+ exiter(nofile($outfile, $!));
+
+ my $path_to_object = dir_name_to_path($dir);
+
+
+ my ($tmp1, $tmp2, $tmp3);
+
+ $tmp1 = gettext("ABI SYMBOL USAGE SUMMARY REPORT");
+ $tmp2 = '*' x length($tmp1);
+
+ print $summary_fh "$tmp2\n$tmp1\n$tmp2\n\n";
+
+ print $summary_fh " ", sprintf(gettext(
+ "Binary Object: %s\n"), $path_to_object);
+
+ my $uname_a = `$cmd_uname -a`;
+ print $summary_fh " ", sprintf(gettext("System: %s\n"), $uname_a);
+
+ $tmp1 = gettext("References to shared objects in the Solaris ABI");
+ $tmp2 = '*' x length($tmp1);
+
+ print $summary_fh "$tmp2\n$tmp1\n$tmp2\n\n";
+
+
+ my (%libs, $lib, $maxlen, $len);
+ $maxlen = 0;
+
+ foreach $lib (keys(%$public), keys(%$private)) {
+ $len = length($lib);
+ $maxlen = $len if ($len > $maxlen);
+ $libs{$lib} = 1;
+ }
+
+ if (! %libs) {
+ my $str = gettext(
+ " NONE FOUND. Possible explanations:\n" .
+ " - the dynamic profiling failed, see ldd(1), ld.so.1(1)\n" .
+ " - the object is SUID or SGID\n" .
+ " - the object is completely statically linked.\n"
+ );