aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/config/util/elistgen.hp
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/config/util/elistgen.hp')
-rw-r--r--nx-X11/config/util/elistgen.hp202
1 files changed, 202 insertions, 0 deletions
diff --git a/nx-X11/config/util/elistgen.hp b/nx-X11/config/util/elistgen.hp
new file mode 100644
index 000000000..fe22e794e
--- /dev/null
+++ b/nx-X11/config/util/elistgen.hp
@@ -0,0 +1,202 @@
+XCOMM!/bin/sh
+XCOMM $Xorg: elistgen.hp,v 1.3 2000/08/17 19:41:52 cpqbld Exp $
+XCOMM
+XCOMM #########################################################################
+XCOMM Construct shared-library export lists for HP-UX based on standardized
+XCOMM export list description file
+XCOMM
+XCOMM Usage: exportlistgen libfoo.sl libfoo.elist > libfoo.lopt
+XCOMM
+XCOMM libfoo.sl => shared library of interest
+XCOMM libfoo.elist => Meta description of necessary export list.
+XCOMM
+XCOMM The output may then be passed to the linker to reconstruct the
+XCOMM shared library. For unknown reasons naming only exported symbols
+XCOMM with "+e" does not work for debuggable C++ code, even though "nm"
+XCOMM reports no difference between the resulting libraries. The linker
+XCOMM complains that "first non-inline virtual function" is not defined for
+XCOMM vtables. We instead hide internal symbols with "-h" as a work-around.
+XCOMM
+XCOMM Author: Aloke Gupta 5/25/94.
+XCOMM (c) Copyright 1996 Digital Equipment Corporation.
+XCOMM (c) Copyright 1994,1996 Hewlett-Packard Company.
+XCOMM (c) Copyright 1996 International Business Machines Corp.
+XCOMM (c) Copyright 1996 Sun Microsystems, Inc.
+XCOMM (c) Copyright 1996 Novell, Inc.
+XCOMM (c) Copyright 1996 FUJITSU LIMITED.
+XCOMM (c) Copyright 1996 Hitachi.
+XCOMM
+XCOMM #########################################################################
+
+XCOMM Utility programs
+FILTER=CXXFILT # C++ symbol demangler
+AWK=awk # awk
+PATH=/usr/bin:/bin:/usr/ucb # For nm, cat, pr, expand, awk, c++filt
+
+XCOMM Temporary files
+EXPORTLIST=/tmp/elistgen1.$$ # list of export symbols from "libfoo.elist"
+NMLIST=/tmp/elistgen2.$$ # name list from libfoo.sl
+FILTLIST=/tmp/elistgen3.$$ # demangled (C++) version of NMLIST
+
+XCOMM Print useful information at the top of the output
+echo "#" `date`
+echo "# This linker options list was produced by" $0
+echo "# Input export list description taken from:" $2
+echo "# Target library:" $1
+echo "# Target Operating System:" `uname -msrv`
+echo "# "
+
+XCOMM Extract the globally visible symbols from target library
+XCOMM The NMLIST generated here is later used to cross-check the symbols in the
+XCOMM supplied export-list.
+XCOMM
+nm -p $1 | $AWK '
+ / [cCTDB][S ] [^\$]/{print $3} # Text, Data, BSS, or Secondary symbols
+' > $NMLIST
+
+XCOMM Demangle the global library symbols. This operation is necessary to
+XCOMM convert mangled C++ symbols into their C++ notation.
+${FILTER:-cat} $NMLIST > $FILTLIST
+
+XCOMM
+XCOMM Cleanup the export-list description file.
+XCOMM Note that C++ symbols may have embedded spaces in them.
+XCOMM
+cat $2 | $AWK '
+ BEGIN {
+ csyms = 0; # C language symbols in libfoo.list
+ cplusplus = 0; # C++ language symbols in libfoo.list
+ isyms = 0; # C internal symbols in libfoo.elist
+ icplusplus = 0; # C++ internal symbols in libfoo.elist
+ implicit = ""; # Handling of implicit symbols.
+ }
+ $1 == "default" {
+ # A default clause suppresses warnings about implicit symbols.
+ if ($2 != "" && $2 != "force" && $2 != "public" &&
+ $2 != "private" && $2 != "internal") {
+ print "# Warning: illegal default clause:", $2 | "cat 1>&2";
+ next;
+ }
+ if (implicit != "")
+ print "# Warning: multiple default clauses." | "cat 1>&2";
+ implicit = $2;
+ next;
+ }
+ $1 == "force" || $1 == "public" || $1 == "private" {
+ csyms ++;
+ print $1 ";;" $2;
+ next;
+ }
+ $1 == "publicC++" || $1 == "privateC++" {
+ cplusplus ++;
+ string = $2;
+ for (n = 3; n <= NF; n++)
+ string = string " " $n;
+ print $1 ";;" string;
+ next;
+ }
+ $1 == "internal" {
+ isyms ++;
+ print $1 ";;" $2;
+ next;
+ }
+ $1 == "internalC++" {
+ icplusplus ++;
+ string = $2;
+ for (n = 3; n <= NF; n++)
+ string = string " " $n;
+ print $1 ";;" string;
+ next;
+ }
+ END {
+ printf("# Exporting %d C and %d C++ symbols, hiding %d and %d.\n",
+ csyms, cplusplus, isyms, icplusplus) | "cat 1>&2";
+ if (implicit != "") {
+ print "# Unspecified symbols are " implicit "." | "cat 1>&2";
+ print "default;;" implicit;
+ }
+ }
+' > $EXPORTLIST
+
+XCOMM Read in the above files and write result to stdout. The contents
+XCOMM of NMLIST and FILTLIST are used to construct a symbol lookup table.
+XCOMM The contents of EXPORTLIST are converted with the help of this table.
+XCOMM Use ";" as a delimiter in the symbol lookup table.
+XCOMM
+(pr -m -s";" -t -w1024 $NMLIST $FILTLIST| expand -t 1;cat $EXPORTLIST ) | $AWK '
+ BEGIN {
+ FS = ";";
+ implicit = 0;
+ }
+ NF == 2 {
+ # This is "pr" output, i.e., symbol translation table.
+ syms[$2] = $1;
+ next;
+ }
+ NF == 3 && $1 == "default" {
+ # Treatment of unspecified symbols.
+ if ($3 == "internal" || $3 == "internalC++")
+ implicit = 1;
+ else if ($3 == "private" || $3 == "privateC++")
+ implicit = 2;
+ else if ($3 == "public" || $3 == "publicC++")
+ implicit = 3;
+ else # $3 == "force"
+ implicit = 4;
+ next;
+ }
+ NF == 3 {
+ # Parse our instructions for this symbol.
+ if ($1 == "internal" || $1 == "internalC++")
+ export = 1;
+ else if ($1 == "private" || $1 == "privateC++")
+ export = 2;
+ else if ($1 == "public" || $1 == "publicC++")
+ export = 3;
+ else # $1 == "force"
+ export = 4;
+
+ # Process it.
+ if (length(syms[$3]) > 0) {
+ if (donelist[$3])
+ print "# Warning: Duplicate entry for", $3,
+ "in export list" | "cat 1>&2";
+ if (donelist[$3] < export)
+ donelist[$3] = export;
+ } else {
+ if (export == 4)
+ donelist[$3] = export;
+ else
+ print "# Warning:", $3,
+ "was not in the nm list for this library" | "cat 1>&2";
+ }
+ next;
+ }
+ END {
+ # Force implicit exporting of errno.
+ if (! donelist["errno"])
+ donelist["errno"] = 4;
+
+ # Complain about some implicit symbols.
+ for (i in syms) {
+ if (!donelist[i] && (length(syms[i]) > 0)) {
+ # Ignore automatic symbols generated by the C++ compiler.
+ if (implicit == 0 &&
+ (syms[i] !~ /^__noperfopt__/) &&
+ (syms[i] !~ /^__ptbl_vec__/) &&
+ (syms[i] !~ /^__vtbl__[0-9]*_/) &&
+ (syms[i] !~ /^__cfront_version_[0-9]*_xxxxxxxx$/))
+ print "# Warning:", syms[i],
+ "was not in the export list" | "cat 1>&2";
+ donelist[i] = implicit;
+ }
+ if ((donelist[i] > 1) && (length(syms[i]) > 0))
+ print "-e", syms[i];
+ }
+ }
+'
+
+XCOMM Clean up temporary files
+rm $EXPORTLIST
+rm $NMLIST
+rm $FILTLIST