123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- # Generate an ELF symbol version map a-la Solaris and GNU ld.
- # Copyright (C) 2007-2015 Free Software Foundation, Inc.
- # Contributed by Richard Henderson <rth@cygnus.com>
- #
- # This file is part of GCC.
- #
- # GCC is free software; you can redistribute it and/or modify it under
- # the terms of the GNU General Public License as published by the Free
- # Software Foundation; either version 3, or (at your option) any later
- # version.
- #
- # GCC is distributed in the hope that it will be useful, but WITHOUT
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- # License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with GCC; see the file COPYING3. If not see
- # <http://www.gnu.org/licenses/>.
- BEGIN {
- state = "nm";
- sawsymbol = 0;
- if (leading_underscore)
- prefix = "_";
- else
- prefix = "";
- }
- # Remove comment and blank lines.
- /^ *#/ || /^ *$/ {
- next;
- }
- # We begin with nm input. Collect the set of symbols that are present
- # so that we can not emit them into the final version script -- Solaris
- # complains at us if we do.
- state == "nm" && /^%%/ {
- state = "ver";
- next;
- }
- state == "nm" && ($1 == "U" || $2 == "U") {
- next;
- }
- state == "nm" && NF == 3 {
- split ($3, s, "@")
- def[s[1]] = 1;
- sawsymbol = 1;
- next;
- }
- state == "nm" {
- next;
- }
- # Now we process a simplified variant of the Solaris symbol version
- # script. We have one symbol per line, no semicolons, simple markers
- # for beginning and ending each section, and %inherit markers for
- # describing version inheritance. A symbol may appear in more than
- # one symbol version, and the last seen takes effect.
- # The magic version name '%exclude' causes all the symbols given that
- # version to be dropped from the output (unless a later version overrides).
- NF == 3 && $1 == "%inherit" {
- inherit[$2] = $3;
- next;
- }
- NF == 2 && $2 == "{" {
- if ($1 != "%exclude")
- libs[$1] = 1;
- thislib = $1;
- next;
- }
- $1 == "}" {
- thislib = "";
- next;
- }
- {
- sym = prefix $1;
- symbols[sym] = 1
- if (thislib != "%exclude")
- ver[sym, thislib] = 1;
- else {
- for (l in libs)
- ver[sym, l] = 0;
- }
- next;
- }
- END {
- if (!sawsymbol)
- {
- print "No symbols seen -- broken or mis-installed nm?" | "cat 1>&2";
- exit 1;
- }
- for (l in libs)
- output(l);
- }
- function output(lib) {
- if (done[lib])
- return;
- done[lib] = 1;
- if (inherit[lib])
- output(inherit[lib]);
- empty=1
- for (sym in symbols)
- if ((ver[sym, lib] != 0) && (sym in def))
- {
- if (empty)
- {
- printf("%s {\n", lib);
- printf(" global:\n");
- empty = 0;
- }
- printf("\t%s;\n", sym);
- }
- if (empty)
- {
- for (l in libs)
- if (inherit[l] == lib)
- inherit[l] = inherit[lib];
- }
- else if (inherit[lib])
- printf("} %s;\n", inherit[lib]);
- else
- printf ("\n local:\n\t*;\n};\n");
- }
|