|
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
|