4519 ABI checking needs to adapt to modern times, run by default
1 package 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. SUNW_), followed 47 # 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 69 use 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 # 101 sub Category { 102 my ($Ver, $Soname) = @_; 103 104 # For Solaris and related products, the SUNW_ prefix is 105 # used for numbered 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 Sun-specific additions are all tagged SUNW_xxx. 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 Solaris convention is to use SUNWprivate to indicate 123 # private versions. SUNWprivate can have a numeric suffix, but 124 # the number is not significant for ELF versioning other than 125 # being part 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. 135 1; --- EOF ---