⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elistgen.ibm

📁 远程桌面连接工具
💻 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 + -