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