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