1package onbld_elfmod_vertype;
2
3#
4# CDDL HEADER START
5#
6# The contents of this file are subject to the terms of the
7# Common Development and Distribution License (the "License").
8# You may not use this file except in compliance with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23
24#
25# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
26#
27
28#
29# This perl module implements the rules used to categorize ELF versions
30# for the core Solaris OS and related code repositories. Although this
31# code fits logically into the onbld_elfmod module, it is maintained as
32# a separate module in order to allow maintainers of other code to provide
33# an implementation appropriate to their local conventions.
34#
35# By isolating the codebase specific details of ELF version names in this
36# module and reporting the results via a fixed interface, we allow
37# interface_check and interface_cmp to be written in a way that isolates
38# them from the specific names that apply to a given body of code.
39# Those tools allow you to substitute your own module in place of this one
40# to customize their behavior.
41#
42# The types of versions understood by interface_check and interface_cmp
43# fall into the following categories:
44#
45#	NUMBERED:	A public version that follows the standard numbering
46#			convention of a known prefix (e.g. ILLUMOS_),
47#			followed by 2 or 3 dot separated numeric values:
48#
49#				<PREFIX>major.minor[.micro]
50#
51#	PLAIN:		A public version that may or may not contain
52#			numeric characters, but for which numeric characters
53#			are not treated as such.
54#
55#	SONAME:		Base version with the same name as the object SONAME
56#
57#	PRIVATE:	A private version that follows the same rules as PLAIN.
58#
59#	UNKNOWN:	A version string that does not fit any of the
60#			above categories
61#
62# The above categories are generic, in the sense that they apply to any
63# code base. However, each code base will have different well known prefix
64# and name strings that map to these categories. The purpose of this module
65# is to map these special well known strings to the category they represent
66# for the code base in question.
67#
68
69use strict;
70
71
72## Category(Version, Soname)
73#
74# Return an array containing the category of ELF version represented
75# by the given Version, and other category dependent information.
76#
77# entry:
78#	Version - Version string to examine
79#	Soname - Empty ('') string, or SONAME of object that contains the
80#		given version if it is available. In some environments,
81#		the valid versions depend on the particular object in
82#		question. This argument can be used to customize the
83#		results of this routine based on the object being analyzed.
84#
85# exit:
86#	This routine returns an array to describe the type of version
87#	encountered. Element [0] is always a string token that gives one
88#	of the version categories described in the module header comment.
89#	For types other than NUMBERED, this is the only element in the
90#	return array.
91#
92#	NUMBERED versions receive a return array with additional values
93#	describing the version:
94#
95#		( 'NUMBERED', cnt, prefix, major, minor[, micro])
96#
97#	If the version has 3 numberic values, cnt is 3, and micro
98#	is present. If there are 2 numeric values, cnt is 2, and micro
99#	is omitted.
100#
101sub Category {
102	my ($Ver, $Soname) = @_;
103
104	# For illumos, the SUNW_ or ILLUMOS_ prefix is used for numbered
105	# public versions.
106	if ($Ver =~ /^((?:SUNW|ILLUMOS)_)(\d+)\.(\d+)(\.(\d+))?/) {
107		return ('NUMBERED', 3, $1, $2, $3, $5) if defined($5);
108		return ('NUMBERED', 2, $1, $2, $3);
109	}
110
111	# Well known plain versions. In Solaris, these names were used
112	# to tag symbols that come from the SVR4 underpinnings to Solaris.
113	# Later additions are all in the NUMBERED form.
114	return ('PLAIN')
115	    if (($Ver =~ /^SYSVABI_1.[23]$/) || ($Ver =~ /^SISCD_2.3[ab]*$/));
116
117	# The link-editor creates "base" versions using the SONAME of the
118	# object to contain  linker generated symbols (_etext, _edata, etc.).
119	return ('SONAME')
120	    if ($Ver eq $Soname) && ($Soname ne '');
121
122	# The convention is to use SUNWprivate and ILLUMOSprivate to indicate
123	# private versions. They may have a numeric suffix, but the
124	# number is not significant for ELF versioning other than being part
125	# of a unique name.
126	return ('PRIVATE')
127	    if ($Ver =~ /^(SUNW|ILLUMOS)private(_[0-9.]+)?$/);
128
129	# Anything else is a version we don't recognize.
130	return ('UNKNOWN');
131}
132
133
134# Perl modules pulled in via 'require' must return an exit status.
1351;
136