 55b0f00d5e
			
		
	
	55b0f00d5e
	
	
	
		
			
			The export symbol list for ASN.1 on Windows is generated by scanning all the .obj files and extracting the symbols defined in them. The generated list did not specify which were functions and which were data symbols. This distinction is necessary for generating correct import library stubs.
		
			
				
	
	
		
			84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| my $show_module_name = 1;
 | |
| my $use_indent = 1;
 | |
| my $strip_leading_underscore = 0;
 | |
| 
 | |
| # Dump all symbols for the given object file that are defined and have
 | |
| # external scope.
 | |
| 
 | |
| sub dump_symbols_for_file($)
 | |
| {
 | |
|     $fn = shift;
 | |
| 
 | |
|     print STDERR "Opening dump of object [$fn]\n";
 | |
| 
 | |
|     open(SP, '-|', "dumpbin /symbols \"".$fn."\"") or die "Can't open pipe for $fn";
 | |
| 
 | |
|   LINE:
 | |
|     while (<SP>) {
 | |
| 	# 008 00000000 SECT3  notype ()    External     | _encode_AccessDescription
 | |
| 
 | |
| 	/^[[:xdigit:]]{3,}\s[[:xdigit:]]{8,}\s(\w+)\s+\w*\s+(\(\)|  )\s+(\w+)\s+\|\s+([0-9a-zA-Z\@\_]+)$/ && do {
 | |
| 	    my ($section, $type, $visibility, $symbol) = ($1, $2, $3, $4);
 | |
| 
 | |
| 	    if ($section ne "UNDEF" && $visibility eq "External") {
 | |
| 		print $fn if $show_module_name;
 | |
| 		print "\t" if $use_indent || $show_module_name;
 | |
| 
 | |
| 		if ($strip_leading_underscore && $symbol =~ /_(.*)/) {
 | |
| 		    $symbol = $1;
 | |
| 		}
 | |
| 		if ($strip_leading_underscore && $symbol =~ /(.*)\@.*$/) {
 | |
| 		    $symbol = $1;
 | |
| 		}
 | |
| 		print $symbol;
 | |
|                 if ($type ne "()") {
 | |
|                     print "\tDATA";
 | |
|                 }
 | |
| 		print "\n";
 | |
| 	    }
 | |
| 	};
 | |
|     }
 | |
| 
 | |
|     close SP;
 | |
| }
 | |
| 
 | |
| sub use_response_file($)
 | |
| {
 | |
|     $fn = shift;
 | |
| 
 | |
|     open (RF, '<', $fn) or die "Can't open response file $fn";
 | |
| 
 | |
|     while (<RF>) {
 | |
| 	/(\S+)/ && do {
 | |
| 	    dump_symbols_for_file($1);
 | |
| 	}
 | |
|     }
 | |
|     close RF;
 | |
| }
 | |
| 
 | |
| for (@ARGV) {
 | |
|     ARG: {
 | |
| 	/-q/ && do {
 | |
| 	    $show_module_name = 0;
 | |
| 	    last ARG;
 | |
| 	};
 | |
| 
 | |
| 	/-1/ && do {
 | |
| 	    $use_indent = 0;
 | |
| 	    last ARG;
 | |
| 	};
 | |
| 
 | |
| 	/-u/ && do {
 | |
| 	    $strip_leading_underscore = 1;
 | |
| 	    last ARG;
 | |
| 	};
 | |
| 
 | |
| 	/@(.*)/ && do {
 | |
| 	    use_response_file($1);
 | |
| 	    last ARG;
 | |
| 	};
 | |
| 
 | |
| 	dump_symbols_for_file($_);
 | |
|     }
 | |
| }
 |