📄 elistgen.ibm
字号:
XCOMM!/bin/shXCOMM $XConsortium: elistgen.ibm /main/2 1996/12/04 10:13:18 swick $XCOMMXCOMM #########################################################################XCOMM Construct shared-library export lists for IBM-AIX based on standardizedXCOMM export list description fileXCOMMXCOMM Usage: elistgen libfoo.sl libfoo.elist > libfoo.loptXCOMMXCOMM libfoo.a => shared library of interestXCOMM libfoo.elist => Meta description of necessary export list.XCOMMXCOMM The output file, "libfoo.lopt" may then be passed to the IBM linker to XCOMM reconstruct the shared library, libfoo.sl.XCOMMXCOMM Author: Yanling Qi 10/03/94, Last updated 10/03/94XCOMM (c) Copyright 1996 Digital Equipment Corporation.XCOMM (c) Copyright 1996 Hewlett-Packard Company.XCOMM (c) Copyright 1994,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.XCOMMXCOMM ##########################################################################define HASH #XCOMM Utility programsFILTER=CXXFILT # C++ symbol demanglerAWK=awk # awkXCOMM For dump, cat, pr, expand, awk, c++filtPATH=/usr/bin:/bin:/usr/ucb:/usr/lpp/xlC/binXCOMM Temporary filesEXPORTLIST=/tmp/elistgen1.$$ # export directives from "libfoo.list"NMLIST=/tmp/elistgen2.$$ # name list from libfoo.slFILTLIST=/tmp/elistgen3.$$ # demangled (C++) version of aboveXCOMM Print useful informationecho "*" `date`echo "* This linker options list was produced by" $0echo "* Input export list description taken from:" $2echo "* Target library:" $1echo "* Target Operating System:" `uname`echo "*"XCOMM Extract the globally visible symbols from target librarydump -g $1 | $AWK '$1 ~ /[0-9][0-9]/ && $2 !~ /^[\.]/ {print $2}' > $NMLISTXCOMM Demangle the global library symbols${FILTER:-cat} $NMLIST > $FILTLISTXCOMMXCOMM Clean up the export-list description file.XCOMM Note that C++ symbols may have embedded spaces in them.XCOMM$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.list iplusplus = 0; # C++ internal symbols in libfoo.list count = 0; # Running count of symbols implicit = ""; # Handling of implicit symbols. } $1 == "default" { HASH 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 ++; symbol[count++] = $1 ";;" $2; next; } $1 == "publicC++" || $1 == "privateC++" { HASH forceC++ is unsupported because we only know how to demangle, HASH not how to mangle symbols, and the final ld input file must HASH be mangled. cplusplus ++; string = $2; for (n = 3; n <= NF; n++) string = string " " $n; symbol[count++] = $1 ";;" string; next; } $1 == "internal" { isyms ++; symbol[count++] = $1 ";;" $2; next; } $1 == "internalC++" { iplusplus ++; string = ";;" $2; for (n = 3; n <= NF; n++) string = string " " $n; symbol[count++] = $1 ";;" string; next; } $1 == "#line" || $1 == "#" { HASH cpp will have removed comments, but may have added other stuff. next; } NF > 0 { print "# Warning: unrecognized directive:", $0 | "cat 1>&2"; next; } END { printf("# Exporting %d C and %d C++ symbols, hiding %d and %d.\n", csyms, cplusplus, isyms, iplusplus) | "cat 1>&2"; if (implicit != "") { print "# Unspecified symbols are " implicit "." | "cat 1>&2"; print "default;;" implicit; } for (i in symbol) print symbol[i]; }' $2 > $EXPORTLISTXCOMMXCOMM Read in the above files and write result to stdout. Use theXCOMM delimiter ";" to identify the entries 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 { HASH This is "pr" output, i.e., symbol translation table r2=$2 gsub(/ /,"",r2); # Remove spaces because c++filt is unpredictable syms[r2] = $1; r1=$1; gsub(/ /,"",r1); mangled[r1] = 1; # Save the mangling because the export lists HASH sometimes use it instead of a prototype. next; } NF == 3 && $1 == "default" { HASH Treatment of unspecified symbols. if ($3 == "internal") 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 { HASH Generate canonical demangled form as an alternate symbol. alt=$3; gsub(/ \.\.\./,",...",alt); # change " ..." to ",..." to match c++filt gsub(/ /,"",alt); # remove all spaces gsub(/\(void\)/,"()",alt); # change "(void)" to "()" to match c++filt HASH 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; HASH Process it. if ((length(syms[alt]) > 0) || mangled[alt]) { HASH This symbol is present in the library. if (donelist[alt]) print "# Warning: Duplicate entry for", $3, "in export list" | "cat 1>&2"; if (donelist[alt] < export) { if (export > 1) print syms[alt]; donelist[alt] = export; } } else { HASH Print forced-export symbols without complaining. if (export == 4) { print alt; donelist[alt] = export; } else { print "# Warning:", $3, "was not in the nm list for this library" | "cat 1>&2"; } } next; } END { HASH Process implicit symbols. for (i in syms) { if ((! donelist[i]) && (length(syms[i]) > 0)) { HASH Do not complain about C++ virtual function tables. if (implicit == 0 && syms[i] !~ /^__vft[0-9]*_/) print "# Warning:", syms[i], "was not in the export list" | "cat 1>&2"; if (implicit > 1) print syms[i]; } } }'XCOMM Clean up temporary filesrm $EXPORTLISTrm $NMLISTrm $FILTLIST
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -