xref: /onnv-gate/usr/src/lib/README.mapfiles (revision 12692:4341b447c069)
12522Sraf#
22522Sraf# CDDL HEADER START
32522Sraf#
42522Sraf# The contents of this file are subject to the terms of the
52522Sraf# Common Development and Distribution License (the "License").
62522Sraf# You may not use this file except in compliance with the License.
72522Sraf#
82522Sraf# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92522Sraf# or http://www.opensolaris.org/os/licensing.
102522Sraf# See the License for the specific language governing permissions
112522Sraf# and limitations under the License.
122522Sraf#
132522Sraf# When distributing Covered Code, include this CDDL HEADER in each
142522Sraf# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152522Sraf# If applicable, add the following below this CDDL HEADER, with the
162522Sraf# fields enclosed by brackets "[]" replaced with your own identifying
172522Sraf# information: Portions Copyright [yyyy] [name of copyright owner]
182522Sraf#
192522Sraf# CDDL HEADER END
202522Sraf#
212522Sraf#
22*12692SAli.Bahrami@Oracle.COM# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
232522Sraf#
242522Sraf
252522SrafMapfiles and versioning in ON
262522Sraf=============================
272522Sraf
282522Sraf1.0 Objective of this README
292522Sraf
302522SrafThis README describes the engineering practices of creating and updating
312522Srafvisible library interfaces.  It describes various kinds of actions that
322522Sraftypically occur as libraries are evolved, and shows how interface
332522Srafspecifications are affected or updated in accordance.  It tells you what
342522Srafyou must do as a shared library developer if you:
352522Sraf
362522Sraf	1. Make interface additions to an existing library
372522Sraf		- add a Public interface
382522Sraf		- add a Private interface
392522Sraf	2. Update an interface in an existing library
402522Sraf		- remove an existing interface
412522Sraf		- promote a Private interface to Public
422522Sraf		- scope a Private interface to local
432522Sraf		- move an interface from one library to another
442522Sraf		- copy interfaces which are part of the standard to a new or
452522Sraf		  existing library
462522Sraf	3. Introduce a new library
472522Sraf		- source directory hierarchy
482522Sraf		- creation of the "mapfile-vers" file
492522Sraf		- Makefiles
502522Sraf	4. Make an entire library obsolete before end-of-life
512522Sraf		- introduce SUNWobsolete to the "mapfile-vers" file
522522Sraf
532522Sraf-------------------------------------------------------------------------------
542522Sraf
552522Sraf2.0 What's a mapfile?
562522Sraf
57*12692SAli.Bahrami@Oracle.COMMapfiles are used to tell the link-editor ("ld") all sorts of things about
582522Srafhow to generate an executable file or a shared object from a collection of
592522Srafrelocatable objects, such as generated by a compiler.  For all the gory
602522Srafdetails, see the Solaris Linker and Libraries Guide, which can be found
612522Srafunder http://docs.sun.com.
622522Sraf
63*12692SAli.Bahrami@Oracle.COMThere are two versions of the mapfile language accepted by the link-editor.
64*12692SAli.Bahrami@Oracle.COMVersion 1 derives from AT&T System V Release 4 Unix. Version 2 is a newer
65*12692SAli.Bahrami@Oracle.COMsyntax specific to Solaris. All mapfiles in the OSnet (ON consolidation) are
66*12692SAli.Bahrami@Oracle.COMrequired to use version 2 syntax. Note that every mapfile using version 2
67*12692SAli.Bahrami@Oracle.COMsyntax must start with the line:
68*12692SAli.Bahrami@Oracle.COM
69*12692SAli.Bahrami@Oracle.COM        $mapfile_version 2
70*12692SAli.Bahrami@Oracle.COM
712522SrafHere, we are only concerned with specifying externally-visible interfaces
722522Sraffor shared libraries (shared objects) and with specifying their versions
732522Sraffor ABI (Application Binary Interface) purposes.  For these purposes, we
74*12692SAli.Bahrami@Oracle.COMonly need to deal with a subset of the mapfile language.
752522Sraf
762522SrafThere should be a "mapfile-vers" file associated with every shared library
772522Srafand it should reside in the common source directory for that library, most
782522Srafoften in a "common" directory.  This is the usual layout of a library's
792522Sraftop-level directory (usr/src/lib/libwombat):
802522Sraf	Makefile       amd64/         i386/          sparcv9/
812522Sraf	Makefile.com   common/        sparc/
822522Sraf
832522SrafThe "common" directory contains the source files and other common files
842522Sraffor the library:
852522Sraf	bat.c              libwombat_impl.h   mapfile-vers       wom.c
862522Sraf	libwombat.h        llib-lwombat       util.c             wombat.c
872522Sraf
882522SrafThe mapfile's name is, by convention, "mapfile-vers" because it is used
892522Sraffor only two purposes: to specify externally-visible interface names while
902522Srafsuppressing visibility of all other names, and to specify their respective
912522Srafunique version names.
922522Sraf
932522Sraf-------------------------------------------------------------------------------
942522Sraf
952522Sraf3.0 Contents of mapfile-vers
962522Sraf
972522SrafThe structure of mapfile-vers is best explained by an example
982522Sraf(the license notification and copyright notice is omitted here
992522Sraffor brevity):
1002522Sraf
101*12692SAli.Bahrami@Oracle.COM$mapfile_version 2
102*12692SAli.Bahrami@Oracle.COM
103*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.2 {	# update to libwombat, Solaris 10
1042522Sraf    global:
1052522Sraf	wb_readv;
1062522Sraf	wb_stat;
1072522Sraf	wb_writev;
1082522Sraf} SUNW_1.1;
1092522Sraf
110*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.1 {	# first release of libwombat, Solaris 9
1112522Sraf    global:
1122522Sraf	wb_read;
1132522Sraf	wb_write;
1142522Sraf};
1152522Sraf
116*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNWprivate {	# private libwombat symbols
1172522Sraf    global:
1182522Sraf	wb_add;
1192522Sraf	wb_delete;
1202522Sraf	wb_search;
1212522Sraf    local:
1222522Sraf	*;
1232522Sraf};
1242522Sraf
1252522SrafThe SUNW_1.* names are the Public version names for the library.
1262522SrafThere should be at most one version name for each release of Solaris,
1272522Srafwith the minor number incremented by one over the previous version.
1282522Sraf
1292522SrafIf no update to the Public-visible names in the library is made
1302522Srafin a given Solaris release, no new version name should be generated
1312522Sraffor that release.  If multiple updates are made to the library at
1322522Srafdifferent points in the development of a given release of Solaris,
1332522Srafonly one version should be used for the entire release.
1342522Sraf
1352522SrafSo, for example, if an update to libwombat is made in Solaris 11,
1362522Srafyou would add "SUNW_1.3" at the start of the mapfile:
1372522Sraf
138*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.3 {	# update to libwombat, Solaris 11
1392522Sraf    global:
1402522Sraf	wb_lseek;
1412522Sraf} SUNW_1.2;
1422522Sraf
1432522SrafEach version must inherit all symbols from its preceding version,
1442522Srafspecified at the ending "}" for each version.  SUNW_1.1 does not
1452522Srafinherit any symbols.  SUNWprivate, if present, stands alone.
1462522Sraf
1472522SrafThe two lines in SUNWprivate:
1482522Sraf    local:
1492522Sraf	*;
1502522Srafensure that no symbols other than those listed in the mapfile are
1512522Srafvisible to clients of the library.  If there is no SUNWprivate,
1522522Srafthese two lines should appear in SUNW_1.1.
1532522Sraf
1542522SrafFor maintainability, the list of names in each version block should
1552522Srafbe sorted in dictionary order (sort -d).  Please comply.
1562522Sraf
157*12692SAli.Bahrami@Oracle.COMThe version 2 mapfile language supports a simple mechanism for conditional
158*12692SAli.Bahrami@Oracle.COMinput, in which lines in the mapfile apply only to a specific platform or
159*12692SAli.Bahrami@Oracle.COMELFCLASS (32/64-bit). This mechanism works very much like the #if/#endif
160*12692SAli.Bahrami@Oracle.COMfeature of the C preprocessor. For instance, the following mapfile declares
161*12692SAli.Bahrami@Oracle.COMa version SUNW_1.1 that always exports a symbol foo, and also exports
162*12692SAli.Bahrami@Oracle.COMthe symbol bar on 32-bit sparc platforms:
163*12692SAli.Bahrami@Oracle.COM
164*12692SAli.Bahrami@Oracle.COM$mapfile_version
165*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.1 {
166*12692SAli.Bahrami@Oracle.COM        foo;
167*12692SAli.Bahrami@Oracle.COM$if _sparc && _ELF32
168*12692SAli.Bahrami@Oracle.COM	bar;
169*12692SAli.Bahrami@Oracle.COM$endif
170*12692SAli.Bahrami@Oracle.COM};
171*12692SAli.Bahrami@Oracle.COM
172*12692SAli.Bahrami@Oracle.COMConditional input can be used if there are ISA-specific library interfaces
173*12692SAli.Bahrami@Oracle.COMnot common to all instances of the library. It is the preferred method for
174*12692SAli.Bahrami@Oracle.COMexpressing platform specific items, as long as the differences are simple
175*12692SAli.Bahrami@Oracle.COM(which is almost always the case).  For example, see libproc, or, if you
176*12692SAli.Bahrami@Oracle.COMare masochistic, libc or libnsl.
177*12692SAli.Bahrami@Oracle.COM
178*12692SAli.Bahrami@Oracle.COMIn addition to conditional input, there is a second heavier weight mechanism
179*12692SAli.Bahrami@Oracle.COMfor expressing ISA-specific differences. In addition to the common mapfile:
1802522Sraf	common/mapfile-vers
181*12692SAli.Bahrami@Oracle.COMsome libraries may have ISA-specific supplemental mapfiles, one in each
1822522Srafof the ISA directories:
1832522Sraf	amd64/mapfile-vers
1842522Sraf	i386/mapfile-vers
1852522Sraf	sparc/mapfile-vers
1862522Sraf	sparcv9/mapfile-vers
1872522SrafThe ISA-specific mapfiles look like the common mapfile, except that only
1882522Srafthe ISA-specific names appear.  The version names are the same as those
1892522Srafin the common mapfile, but only non-empty version instances are present
1908744SAli.Bahrami@Sun.COMand no inheritance specification is present. The link-editor reads the
1918744SAli.Bahrami@Sun.COMinformation from the common and ISA-specific mapfiles and merges them
1928744SAli.Bahrami@Sun.COMin memory into a single description used to create the resulting object.
1932522Sraf
194*12692SAli.Bahrami@Oracle.COMISA-specific mapfiles were used with the version 1 mapfile language, which
195*12692SAli.Bahrami@Oracle.COMlacked conditional input. Their use is rare now, as conditional input is
196*12692SAli.Bahrami@Oracle.COMgenerally preferred. However, it is important to use conditional input
197*12692SAli.Bahrami@Oracle.COMcarefully, or the resulting mapfile can be extremly difficult to read.
198*12692SAli.Bahrami@Oracle.COM
1992522Sraf-------------------------------------------------------------------------------
2002522Sraf
2012522Sraf4.0 Making interface additions to an existing library
2022522Sraf
2032522Sraf4.1 Adding a Public interface
2042522Sraf
2052522SrafThe first engineer to update the existing mapfile-vers file in a release needs
2062522Srafto identify the current highest version name and properly increment the minor
2072522Srafversion number by 1 to be the new version name.  If this is the first Public
2082522Srafinterface in the shared object, a new SUNW_1.1 version name must be introduced.
2092522Sraf
2102522SrafThe major revision number is incremented whenever an incompatible change is
2112522Srafmade to an interface.  This could be the case if an API changes so dramatically
2122522Srafas to invalidate dependencies.  This rarely occurs in practice.  It also
2132522Srafrequires changing the suffix of the shared object from, say, .so.1 to .so.2
2142522Srafand introducing code to continue to ship the .so.1 version of the library.
2152522Sraf
2162522SrafThe minor revision number is incremented whenever one or more new interfaces
2172522Srafis added to a library.  Note that the minor number is not incremented on every
2182522Srafputback that makes an interface addition to the library.  Rather, it is
2192522Srafincremented at most once per (external to Sun) release of the library.
2202522Sraf
2212522Sraf4.2 Adding a Private interface
2222522Sraf
2232522SrafPrivate interfaces are the non-ABI interfaces of the library.  Unlike
2242522Srafintroducing a Public interface, a new entry is simply added to the
2252522SrafSUNWprivate version.  No minor number increment is necessary.
2262522Sraf
2272522SrafIf this interface happens to be the first Private interface introduced
2282522Srafinto the library, the SUNWprivate version must be created (no major.minor
2292522Srafversion numbers).  It inherits nothing and nothing inherits from it.
2302522Sraf
2312522SrafIf the library already has Private interfaces, they may have numbered version
2322522Srafnames like SUNWprivate_m.n (due to errors of the past).  If so, just use the
2332522Srafhighest numbered private version name to version the new interface.  There
2342522Srafis no need to introduce a new private version name.  Be careful not to use
2352522Srafa lower numbered private version name; doing so can cause runtime errors
2362522Sraf(as opposed to load time errors) when running an application with older
2372522Srafversions of the library.
2382522Sraf
2398744SAli.Bahrami@Sun.COMThere are libraries in the OSnet consolidation that contain only private
2408744SAli.Bahrami@Sun.COMinterfaces. In such libraries, the SUNWprivate_m.n may be incremented
2418744SAli.Bahrami@Sun.COMto ensure that the programs that depend on them are built and delivered as a
2428744SAli.Bahrami@Sun.COMintegrated unit. A notable example of this is libld.so (usr/src/cmd/sgs/libld),
2438744SAli.Bahrami@Sun.COMwhich contains the implementation of the link-editor, the public interface to
2448744SAli.Bahrami@Sun.COMwhich is provided by the ld command. When making a modification to the interface
2458744SAli.Bahrami@Sun.COMof such a library, you should follow the convention already in place.
2468744SAli.Bahrami@Sun.COM
2472522Sraf4.3 Adding new public interfaces in an update release
2482522Sraf
2492522SrafAdding new public interfaces in an update release requires careful
2502522Srafcoordination with the next marketing release currently under development.
2512522SrafMultiple updates ship during the period before the next marketing release
2522522Srafships, and since it is generally impossible to know the full set of new
2532522Srafinterfaces in the next marketing release until late in its development
2542522Sraf(after multiple updates have shipped) it must be assumed that not all
2552522Srafinterfaces added to the next marketing release will be added to an update.
2562522Sraf
2572522SrafConsequently, the new version number for an update cannot be a minor
2582522Srafincrement, but must be a micro increment.  For example, if Release N
2592522Srafhas version number SUNW_1.3 and Release N+1 will have SUNW_1.4, then
2602522Srafinterfaces added to an update of Release N must have micro numbers such
2612522Srafas SUNW_1.3.1, SUNW_1.3.2, etc.  (note that the micro number is not
2622522Srafdirectly tied to the update number: SUNW_1.3.1 may appear in Update 2).
2632522SrafThe micro versions form an inheritance chain that is inserted between
2642522Sraftwo successive minor versions.  For example, the mapfile-vers file for
2652522Srafminor release "N+1" to reflect its inclusion of micro releases will
2662522Sraflook like the following:
2672522Sraf
268*12692SAli.Bahrami@Oracle.COM$mapfile_version 2
269*12692SAli.Bahrami@Oracle.COM
270*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.4 {	# release N+1
2712522Sraf    global:
2722522Sraf	...
2732522Sraf} SUNW_1.3.2;
2742522Sraf
275*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.3.2 {	# micro release 2 (e.g., release NU3)
2762522Sraf    global:
2772522Sraf	...
2782522Sraf} SUNW_1.3.1;
2792522Sraf
280*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.3.1 {	# micro release 1 (e.g., release NU2)
2812522Sraf    global:
2822522Sraf	...
2832522Sraf} SUNW_1.3;
2842522Sraf
285*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.3 {	# release N
2862522Sraf    global:
2872522Sraf	...
2882522Sraf} SUNW_1.2;
2892522Sraf
290*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.2 {	# release N-1
2912522Sraf    global:
2922522Sraf	...
2932522Sraf} SUNW_1.1;
2942522Sraf
295*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.1 {	# first release
2962522Sraf    global:
2972522Sraf	...
2982522Sraf};
2992522Sraf
300*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_private {	# same in all releases
3012522Sraf    global:
3022522Sraf	...
3032522Sraf    local:
3042522Sraf	*;
3052522Sraf};
3062522Sraf
3072522SrafThe corresponding update/patch mapfile-vers file will be identical
3082522Srafexcept for the exclusion of SUNW_1.4.
3092522Sraf
3102522SrafThose interfaces which are only present in Release N+1 are always put
3112522Srafinto the next minor version set, SUNW_1.4.
3122522Sraf
3132522SrafThus when adding a new public interface to an update, both the mapfiles
3142522Srafof the update release and next marketing release must be modified to be
3152522Srafconsistent.  The update versions should not be added to the marketing
3162522Srafrelease until the putback to the update release has occurred, to avoid
3172522Sraftiming problems with the update releases (it's all too easy for projects
3182522Srafto slip out of updates, or to change ordering).
3192522Sraf
3202522Sraf-------------------------------------------------------------------------------
3212522Sraf
3222522Sraf5.0 How to update an interface in an existing library
3232522Sraf
3242522Sraf5.1 Removing an existing interface
3252522Sraf
3262522Sraf5.1.1 Moving a Public interface
3272522Sraf
3282522SrafNo Public interfaces should ever be removed from any mapfile.
3292522Sraf
3302522SrafTo move an interface from one library to (say) libc, the code has to be
3312522Srafdeleted from the library and added to libc, then the mapfile for the
3322522Sraflibrary has to have the interface's entry changed from:
3332522Sraf	getfoobar;
3342522Srafto:
335*12692SAli.Bahrami@Oracle.COM	getfoobar       { TYPE = FUNCTION; FILTER = libc.so.1 };
3362522SrafSee, for example, libnsl's common/mapfile-vers file.
3372522Sraf
3382522SrafFollow the rules for adding a new interface for the necessary changes
3392522Srafto libc's mapfile to accommodate the moved interface.  In particular,
3402522Srafthe new interface must be added to the current highest libc version.
3412522Sraf
3422522SrafTo move an entire library into libc, look at what has already been done
3432522Sraffor libthread, libaio, and librt.
3442522Sraf
3452522Sraf5.1.2 Removing a Private interface
3462522Sraf
3472522SrafDeletion of Private interfaces is allowed, but caution should be taken;
3482522Srafit should first be established that the interface is not being used.
3492522SrafTo remove a Private interface, simply delete the corresponding entry
3502522Sraffor that symbol from the mapfile's SUNWprivate section.
3512522Sraf
3522522SrafDo not forget to delete these Public or Private interfaces from the library's
3532522Srafheader files as well as from the code that implements the interfaces.
3542522Sraf
3552522Sraf5.2 Promoting a Private interface to Public
3562522Sraf
3572522SrafThis is similar to what's done when adding a Public interface.  Promoting an
3582522Srafexisting Private interface to a Public one only requires a change to the
3592522Srafexisting interface definition.  Private interfaces have the symbol version name
3602522Sraf"SUNWprivate" associated with them.  To make the interface a Public one, the
3612522Srafinterface must be put into a set associated with the current Public release
3622522Sraflevel of the library.
3632522Sraf
3642522SrafAs an example, if we were modifying libwombat.so.1 and its version in the
3652522Sraflast release of Solaris was SUNW_1.23, any new ABI introduced in the next
3662522Srafrelease would be put into a version called SUNW_1.24.  Therefore, whether
3672522Srafyou wish to promote an existing Private interface to Public, or to introduce
3682522Srafa new Public interface, this (next successive minor numbered version level)
3692522Srafwould be the version that it would be associated with.
3702522Sraf
3712522Sraf5.3 Scoping a Private interface local
3722522Sraf
3738744SAli.Bahrami@Sun.COMAny interfaces not present in the mapfile-vers file will be scoped local
3748744SAli.Bahrami@Sun.COMdue to the presence of the
3758744SAli.Bahrami@Sun.COM    local:
3768744SAli.Bahrami@Sun.COM	*;
3778744SAli.Bahrami@Sun.COMlines discussed earlier. This ensures that such interfaces will not be visible
3788744SAli.Bahrami@Sun.COMoutside the library.  To move an interface from Private to local scope, simply
3792522Srafremove the Private interface from the mapfile-vers file and the header file
3802522Srafto prevent it from being exported.  This may require moving the Private
3812522Srafinterface into a library-private header file.  Scope reduction of Public
3828744SAli.Bahrami@Sun.COMinterfaces is not allowed without specific ARC review and approval.
3832522Sraf
3842522SrafFor the interface to be used in more than one file within the library, it
3852522Srafshould be in a header file that can be included by each file in the library
3862522Srafthat uses the interface.  For example:
3872522Sraf
3882522Sraf	#include "libprivate.h"
3892522Sraf
3902522Sraf5.4 How to copy interfaces which are part of a standard to a new or existing
3912522Sraf    library
3922522Sraf
3932522SrafSYSVABI and SISCD are reserved version names for interfaces listed in the
3942522SrafSystem V Interface Definition and the Sparc Compliance Definition.  Avoid using
3952522Srafthese version names when copying the implementation of standard interfaces to
3962522Srafanother library.  Instead, use SUNW_1.1 for a new library, and SUNW_m.n for
3972522Srafan existing library (where m.n is the next release version; i.e., if the
3982522Sraflast version was SUNW_1.18, then you should version the interfaces with
3992522SrafSUNW_1.19).
4002522Sraf
4012522Sraf-------------------------------------------------------------------------------
4022522Sraf
4032522Sraf6.0 Introducing a new library
4042522Sraf
4052522Sraf6.1 Directories
4062522Sraf
4072522SrafThe normal discipline for introducing a new library in OS/Net is to create a
4082522Srafnew subdirectory of /usr/src/lib.  The interface definition discipline is to
4092522Srafcreate a common/mapfile-vers file for the new library.  If we were introducing
4102522Srafa new foo library, libfoo, we'd create /usr/src/lib/libfoo containing:
4112522Sraf	Makefile       amd64/         i386/          sparcv9/
4122522Sraf	Makefile.com   common/        sparc/
4132522SrafThe common subdirectory would contain the normal source files plus the
4142522Srafmapfile-vers file.  See usr/src/lib/README.Makefiles for directions on
4152522Srafhow to organize the Makefiles.
4162522Sraf
4172522Sraf6.2 The mapfile
4182522Sraf
4192522SrafThe new common/mapfile-vers file would contain:
4202522Sraf
421*12692SAli.Bahrami@Oracle.COM$mapfile_version 2
422*12692SAli.Bahrami@Oracle.COM
423*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.1 {	# first release of libfoo
4242522Sraf    global:
4252522Sraf	...
4262522Sraf};
4272522Sraf
428*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNWprivate {
4292522Sraf    global:
4302522Sraf	...
4312522Sraf    local:
4322522Sraf	*;
4332522Sraf};
4342522Sraf
4352522SrafIf there are no Public interfaces, the SUNW_1.1 section would be omitted.
4362522SrafIf there are no Private interfaces, the SUNWprivate section would be
4372522Srafomitted and the two lines:
4382522Sraf    local:
4392522Sraf	*;
4402522Srafwould be moved into SUNW_1.1
4412522Sraf
4422522SrafTo decide which interfaces are Public (part of the ABI) and which are Private
4432522Sraf(unstable interfaces not intended to be used by third party applications or
4442522Srafunbundled products), the heuristic which works to a first approximation is
4452522Srafthat if it has a man page then it's Public.  Also, it is really the ARC case
4462522Sraffor the new interfaces that prescribes which interfaces are Public and
4472522Srafwhich are not (hence, which interfaces have man pages and which do not).
4482522Sraf
4492522SrafFor maintainability, the list of names in each version block should
4502522Srafbe sorted in dictionary order (sort -d).  Please comply.
4512522Sraf
4522522Sraf-------------------------------------------------------------------------------
4532522Sraf
4542522Sraf7.0 Make an entire library obsolete
4552522Sraf
4562522Sraf7.1 Introduce SUNWobsolete version
4572522Sraf
4582522SrafUse this version name not for specific interfaces but for marking an entire
4592522Sraflibrary as obsolete.  The existing public/private version names are left
4602522Srafunchanged, but a new SUNWobsolete version is created with no symbols in it.
4612522SrafThis becomes a tag by which the obsolescence of the library can be recognized.
4622522SrafThere is no numbering of this version name.
4632522Sraf
464*12692SAli.Bahrami@Oracle.COM$mapfile_version 2
465*12692SAli.Bahrami@Oracle.COM
466*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNWobsolete {
4672522Sraf    global:
4682522Sraf	SUNWobsolete;	# This is the only way to do it.
4692522Sraf} SUNW_1.2;
4702522Sraf
471*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNW_1.2 {
4722522Sraf...
4732522Sraf
4742522Sraf-------------------------------------------------------------------------------
4752522Sraf
4762522Sraf8.0 Documentation
4772522Sraf
4782522SrafFor further information, please refer to the following documents:
4792522Sraf
4802522Sraf	"Solaris Linker and Libraries Guide", http://docs.sun.com
4812522Sraf	/shared/ON/general_docs/scoping-rules.fm.ps
4822522Sraf
4832522SrafFor information on the now-obsolete spec files, used in Solaris releases
4842522Sraf7 through 10, see:
4852522Sraf	/shared/ON/general_docs/README.spec
4862522Sraf	/shared/ON/general_docs/libspec-rules.ps
4872522Sraf	/shared/ON/general_docs/spectrans/*
488