Blame config/util/elistgen.usl

Packit b099d7
XCOMM!/bin/sh
Packit b099d7
XCOMM $XConsortium: elistgen.usl /main/2 1996/12/04 10:13:26 swick $
Packit b099d7
XCOMM
Packit b099d7
XCOMM #########################################################################
Packit b099d7
XCOMM Construct shared-library export lists for Novell based on standardized
Packit b099d7
XCOMM export list description file
Packit b099d7
XCOMM
Packit b099d7
XCOMM Usage: exportlistgen libFoo.so libFoo.elist > libFoo.lopt
Packit b099d7
XCOMM
Packit b099d7
XCOMM	libFoo.so    => shared library of interest
Packit b099d7
XCOMM	libFoo.elist => Meta description of necessary export list.
Packit b099d7
XCOMM
Packit b099d7
XCOMM    The output file, "libFoo.lopt" may then be passed to the linker to 
Packit b099d7
XCOMM    reconstruct the shared library.
Packit b099d7
XCOMM
Packit b099d7
XCOMM (c) Copyright 1996 Digital Equipment Corporation.
Packit b099d7
XCOMM (c) Copyright 1996 Hewlett-Packard Company.
Packit b099d7
XCOMM (c) Copyright 1996 International Business Machines Corp.
Packit b099d7
XCOMM (c) Copyright 1996 Sun Microsystems, Inc.
Packit b099d7
XCOMM (c) Copyright 1996 Novell, Inc. 
Packit b099d7
XCOMM (c) Copyright 1996 FUJITSU LIMITED.
Packit b099d7
XCOMM (c) Copyright 1996 Hitachi.
Packit b099d7
XCOMM
Packit b099d7
XCOMM #########################################################################
Packit b099d7
Packit b099d7
XCOMM Utility programs
Packit b099d7
FILTER=CXXFILT			# C++ symbol demangler
Packit b099d7
AWK=awk				# awk
Packit b099d7
Packit b099d7
XCOMM For nm, cat, pr, expand, awk, c++filt
Packit b099d7
PATH=/usr/bin:/bin:/usr/ucb:/usr/ccs/bin
Packit b099d7
Packit b099d7
XCOMM Temporary files
Packit b099d7
EXPORTLIST=/tmp/elistgen1.$$	# list of export symbols from "libfoo.elist"
Packit b099d7
NMLIST=/tmp/elistgen2.$$	# name list from libfoo.sl
Packit b099d7
FILTLIST=/tmp/elistgen3.$$	# demangled (C++) version of NMLIST
Packit b099d7
Packit b099d7
XCOMM Print useful information at the top of the output
Packit b099d7
echo "#" `date`
Packit b099d7
echo "# This linker options list was produced by" $0
Packit b099d7
echo "# Input export list description taken from:" $2
Packit b099d7
echo "# Target library:" $1
Packit b099d7
echo "# Target Operating System:" `uname -msrv`
Packit b099d7
echo "# "
Packit b099d7
Packit b099d7
XCOMM Extract the globally visible symbols from target library.
Packit b099d7
XCOMM The NMLIST generated here is later used to cross-check the symbols in the
Packit b099d7
XCOMM supplied export-list.
Packit b099d7
nm -p $1 | $AWK '
Packit b099d7
    / [TD] [^\$]/{print $3}   # Text, Data, BSS, or Secondary symbols
Packit b099d7
' > $NMLIST
Packit b099d7
Packit b099d7
XCOMM Demangle the global library symbols. This operation is necessary to convert
Packit b099d7
XCOMM mangled C++ symbols into their C++ notation.
Packit b099d7
${FILTER:-cat} $NMLIST > $FILTLIST
Packit b099d7
Packit b099d7
XCOMM Clean up the export-list description file.
Packit b099d7
XCOMM Note that C++ symbols may have embedded spaces in them.
Packit b099d7
cat $2 | $AWK '
Packit b099d7
    BEGIN           {
Packit b099d7
	csyms     = 0;		# C   language symbols in libfoo.list
Packit b099d7
	cplusplus = 0;		# C++ language symbols in libfoo.list
Packit b099d7
	isyms     = 0;		# C   internal symbols in libfoo.elist
Packit b099d7
	iplusplus = 0;		# C++ internal symbols in libfoo.elist
Packit b099d7
	implicit  = "";		# Handling of implicit symbols
Packit b099d7
    }
Packit b099d7
    $1 == "default" {
Packit b099d7
	# A default clause suppresses warnings about implicit symbols.
Packit b099d7
	if ($2 != "" && $2 != "force" && $2 != "public" && 
Packit b099d7
	    $2 != "private" && $2 != "internal") {
Packit b099d7
	    print "# Warning: illegal default clause:", $2 | "cat 1>&2;;
Packit b099d7
	    next;
Packit b099d7
	}
Packit b099d7
	if (implicit != "")
Packit b099d7
	    print "# Warning: multiple default clauses." | "cat 1>&2;;
Packit b099d7
        implicit = $2;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    $1 == "force" || $1 == "public" || $1 == "private" {
Packit b099d7
	csyms ++;
Packit b099d7
	print $1 ";;" $2;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    $1 == "publicC++" || $1 == "privateC++" {
Packit b099d7
	cplusplus ++;
Packit b099d7
	string = $2;
Packit b099d7
	for (n = 3; n <= NF; n++) {
Packit b099d7
	    string = string " " $n;
Packit b099d7
	}
Packit b099d7
	print $1 ";;" string;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    $1 == "internal" {
Packit b099d7
	isyms ++;
Packit b099d7
	print $1 ";;" $2;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    $1 == "internalC++" {
Packit b099d7
	iplusplus ++;
Packit b099d7
	string = $2;
Packit b099d7
	for (n = 3; n <= NF; n++) {
Packit b099d7
	    string = string " " $n;
Packit b099d7
	}
Packit b099d7
	print $1 ";;" string;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    $1 == "#line" || $1 == "#" {
Packit b099d7
	# cpp will have removed comments, but may have added other stuff.
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    NF > 0 {
Packit b099d7
	print "# Warning: unrecognized directive:", $0 | "cat 1>&2;;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    END  {
Packit b099d7
	printf("# Exporting %d C and %d C++ symbols, hiding %d and %d.\n",
Packit b099d7
			    csyms, cplusplus, isyms, iplusplus) | "cat 1>&2;;
Packit b099d7
	if (implicit != "") {
Packit b099d7
	    print "# Unspecified symbols are " implicit "." | "cat 1>&2;;
Packit b099d7
	    print "default;;" implicit;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
' > $EXPORTLIST
Packit b099d7
Packit b099d7
XCOMM Read in the above files and write result to stdout.  The contents
Packit b099d7
XCOMM of NMLIST and FILTLIST are used to construct a symbol lookup table.
Packit b099d7
XCOMM The contents of EXPORTLIST are converted with the help of this table.
Packit b099d7
XCOMM Use ";" as a delimiter in the symbol lookup table.
Packit b099d7
(pr -m -s";" -t -w1024 $NMLIST $FILTLIST | expand -1; cat $EXPORTLIST) | $AWK '
Packit b099d7
    BEGIN {
Packit b099d7
	FS = ";";
Packit b099d7
	implicit = 0;
Packit b099d7
    }
Packit b099d7
    NF == 2 {
Packit b099d7
	# This is "pr" output, i.e., symbol translation table
Packit b099d7
	syms[$2] = $1;
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    NF == 3 && $1 == "default" {
Packit b099d7
	# Treatment of unspecified symbols.
Packit b099d7
	if ($3 == "internal")
Packit b099d7
	    implicit = 1;
Packit b099d7
	else if ($3 == "private" || $3 == "privateC++")
Packit b099d7
	    implicit = 2;
Packit b099d7
	else if ($3 == "public" || $3 == "publicC++")
Packit b099d7
	    implicit = 3;
Packit b099d7
	else # $3 == "force"
Packit b099d7
	    implicit = 4;
Packit b099d7
        next;
Packit b099d7
    }
Packit b099d7
    NF == 3 {
Packit b099d7
	# Parse our instructions for this symbol.
Packit b099d7
	if ($1 == "internal" || $1 == "internalC++")
Packit b099d7
	    export = 1;
Packit b099d7
	else if ($1 == "private" || $1 == "privateC++")
Packit b099d7
	    export = 2;
Packit b099d7
	else if ($1 == "public" || $1 == "publicC++")
Packit b099d7
	    export = 3;
Packit b099d7
	else # $1 == "force"
Packit b099d7
	    export = 4;
Packit b099d7
Packit b099d7
	# Process it.
Packit b099d7
	if (length(syms[$3]) > 0) {
Packit b099d7
	    # This symbol is present in the library.
Packit b099d7
	    if (donelist[$3])
Packit b099d7
		print "# Warning: Duplicate entry for", $3, 
Packit b099d7
		    "in export list" | "cat 1>&2;;
Packit b099d7
	    if (donelist[$3] < export) {
Packit b099d7
		if (export > 1)
Packit b099d7
		    print syms[$3];
Packit b099d7
		donelist[$3] = export;
Packit b099d7
	    }
Packit b099d7
	} else { 
Packit b099d7
	    # Do not complain about unknown forced-export symbols.
Packit b099d7
	    if (export == 4) {
Packit b099d7
		print $3;
Packit b099d7
		donelist[$3] = export;
Packit b099d7
	    } else
Packit b099d7
		print "# Warning:", $3,
Packit b099d7
		    "was not in the nm list for this library" | "cat 1>&2;;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	next;
Packit b099d7
    }
Packit b099d7
    END { 
Packit b099d7
	# Ignore built-in linker symbols.
Packit b099d7
	if (implicit == 0) {
Packit b099d7
	    if (!donelist["_DYNAMIC"])
Packit b099d7
		donelist["_DYNAMIC"] = 1;
Packit b099d7
	    if (!donelist["_GLOBAL_OFFSET_TABLE_"])
Packit b099d7
		donelist["_GLOBAL_OFFSET_TABLE_"] = 1;
Packit b099d7
	    if (!donelist["_edata"])
Packit b099d7
		donelist["_edata"] = 1;
Packit b099d7
	    if (!donelist["_end"])
Packit b099d7
		donelist["_end"] = 1;
Packit b099d7
	    if (!donelist["_etext"])
Packit b099d7
		donelist["_etext"] = 1;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	# Process implicit symbols.
Packit b099d7
	for (i in syms) {
Packit b099d7
	    if (!donelist[i] && (length(syms[i]) > 0)) {
Packit b099d7
		# Ignore C++ compiler symbols
Packit b099d7
		if (implicit == 0 &&
Packit b099d7
		    (syms[i] !~ /^__vtbl__[0-9]*_/) &&
Packit b099d7
		    (syms[i] !~ /^__cpp_unixware_[0-9]*$/))
Packit b099d7
		    print "# Warning:", syms[i],
Packit b099d7
		          "was not in the export list" | "cat 1>&2;;
Packit b099d7
	        if (implicit > 1)
Packit b099d7
		    print syms[i];
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
'
Packit b099d7
Packit b099d7
XCOMM Clean up temporary files
Packit b099d7
rm $EXPORTLIST
Packit b099d7
rm $NMLIST
Packit b099d7
rm $FILTLIST