| : |
| eval 'exec perl -wS $0 ${1+"$@"}' |
| if 0; |
| #************************************************************** |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| #************************************************************** |
| |
| |
| |
| # |
| # mapgen - generate a map file for Unix libraries |
| # |
| |
| #use File::Path; |
| #use File::Copy; |
| |
| #### script id ##### |
| |
| ( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; |
| |
| $id_str = ' $Revision: 1.6 $ '; |
| $id_str =~ /Revision:\s+(\S+)\s+\$/ |
| ? ($script_rev = $1) : ($script_rev = "-"); |
| |
| print "$script_name -- version: $script_rev\n"; |
| print "Multi Platform Enabled Edition\n"; |
| |
| ######################### |
| # # |
| # Globale Variablen # |
| # # |
| ######################### |
| |
| $dump_file = ''; |
| $flt_file = ''; |
| $map_file = ''; |
| $first_string = ''; |
| $tab = ' '; |
| |
| #### main #### |
| |
| &get_options; |
| if (!(open (DUMP_FILE, $dump_file))) { |
| &print_error("Unable open $dump_file"); |
| }; |
| if (!(open (FLT_FILE, $flt_file))) { |
| close DUMP_FILE; |
| &print_error("Unable open $flt_file"); |
| }; |
| unlink $map_file; |
| if (!(open (MAP_FILE, ">>$map_file"))) { |
| close DUMP_FILE; |
| close FLT_FILE; |
| &print_error("Unable open $map_file"); |
| }; |
| |
| if ($ENV{OS} eq 'SOLARIS') { |
| &gen_sol; |
| } elsif ($ENV{OS} eq 'LINUX') { |
| &gen_lnx; |
| } else { |
| &print_error ('Environment not set!!'); |
| }; |
| |
| close DUMP_FILE; |
| close FLT_FILE; |
| close MAP_FILE; |
| |
| #### end of main procedure #### |
| |
| ######################### |
| # # |
| # Procedures # |
| # # |
| ######################### |
| |
| # |
| # Generate a map file for solaris |
| # |
| sub gen_sol { |
| my %symbols = (); |
| foreach (<DUMP_FILE>) { |
| next if (!(/\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*/)); |
| next if (($7 =~ /UNDEF/) || ($7 =~ /ABS/)); |
| next if ($5 eq 'LOCL'); |
| $symbols{$8}++; |
| }; |
| &filter_symbols(\%symbols); |
| }; |
| |
| # |
| # Generate a map file for linux |
| # |
| sub gen_lnx { |
| my %symbols = (); |
| foreach (<DUMP_FILE>) { |
| next if (!(/^\S+ [A|B|C|D|G|I|N|R|S|T|U|V|W|-|\?|-] (\S+)/)); |
| $symbols{$1}++; |
| }; |
| &filter_symbols(\%symbols); |
| } |
| |
| # |
| # Filter symbols with filters from $flt_file |
| # |
| sub filter_symbols { |
| my $symbols = shift; |
| my $env_section = ''; |
| my @filters = (); |
| my @filtered_symbols = (); |
| while (<FLT_FILE>) { |
| s/\r//; |
| s/\n//; |
| $env_section = '1' and next if ((/^# SOLARIS #$/) && ($ENV{OS} eq 'SOLARIS')); |
| $env_section = '1' and next if ((/^# LINUX #$/) && ($ENV{OS} eq 'LINUX')); |
| $env_section = '1' and next if ((/^# FREEBSD #$/) && ($ENV{OS} eq 'FREEBSD')); |
| last if ($env_section && ((/^# SOLARIS #$/) || (/^# FREEBSD #$/) || (/^# LINUX #$/))); |
| next if (!$_ || /^#/); |
| push(@filters, $_); |
| }; |
| foreach my $symbol (keys %$symbols) { |
| my $export = '-'; |
| foreach my $filter_str (@filters) { |
| my $add = substr ($filter_str, 0, 1); |
| my $filter = substr($filter_str, 1); |
| if ($symbol =~ /$filter/) { |
| $export = $add; |
| }; |
| }; |
| if ($export eq '+') { |
| push(@filtered_symbols, $symbol); |
| }; |
| }; |
| &write_mapfile(\@filtered_symbols); |
| }; |
| |
| # |
| # Write a map file |
| # |
| sub write_mapfile { |
| my $symbols = shift; |
| print MAP_FILE $first_string . " {\n$tab" . "global:\n"; |
| foreach (@$symbols) { |
| print MAP_FILE "$tab$tab$_\;\n"; |
| }; |
| print MAP_FILE "$tab" . "local:\n$tab\*\;\n}\;"; |
| }; |
| |
| # |
| # Get all options passed |
| # |
| sub get_options { |
| |
| $dump_file = ''; |
| $flt_file = ''; |
| $map_file = ''; |
| my ($arg); |
| &usage() && exit(0) if ($#ARGV == -1); |
| while ($arg = shift @ARGV) { |
| $arg =~ /^-d$/ and $dump_file = shift @ARGV and next; |
| $arg =~ /^-f$/ and $flt_file = shift @ARGV and next; |
| $arg =~ /^-m$/ and $map_file = shift @ARGV and next; |
| $arg =~ /^-h$/ and &usage and exit(0); |
| $arg =~ /^--help$/ and &usage and exit(0); |
| $arg =~ /^-s$/ and $first_string = shift @ARGV and next; |
| }; |
| if (!$dump_file || |
| !$flt_file || |
| !$first_string || |
| !$map_file) { |
| &usage; |
| exit(1); |
| }; |
| }; |
| |
| sub print_error { |
| my $message = shift; |
| print STDERR "\nERROR: $message\n"; |
| exit(1) |
| }; |
| |
| sub usage { |
| print STDERR "\nmapgen:\n"; |
| print STDERR "Syntax: mapgen -d dump_file -s first_string -f filter_file -m map_file [-h|--help]\n"; |
| }; |
| |