Changeset 1894
- Timestamp:
- Aug 6, 2022, 9:35:08 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/debugtools/mapsymw.pl
r1551 r1894 1 1 #!perl -w 2 # mapsymw - mapsym wrapper Watcom map files 3 # $Id: $ 4 # Copyright (c) 2007, 2010 Steven Levine and Associates, Inc. 2 # mapsymw - mapsym wrapper form OpenWatcom map files 3 # Generate IBM format map file and run mapsym 4 # Writes IBM format map file to OpenWatcom map file directory 5 6 # Copyright (c) 2007-2019 Steven Levine and Associates, Inc. 5 7 # All rights reserved. 6 8 … … 9 11 # gnugpl2.txt or at http://www.gnu.org/licenses/licenses.html#GPL 10 12 11 # 02 Jul 07 SHL Baseline 12 # 02 Jul 07 SHL Adapt from mapsymb.pl 13 # 28 Jul 07 SHL Relax module name detect 14 # 30 Jul 07 SHL Auto-trim libstdc++ symbols from libc06x maps 15 # 09 Aug 07 SHL Generate dummy symbol for interior segments with no symbols 16 # 08 Nov 07 SHL Drop leading keywords from function definitions 17 # 14 Dec 08 SHL Ensure symbols sorted by value - some apps care 18 # 03 May 10 SHL Comments 19 # 14 Jun 10 SHL Avoid missing C++ symbols 13 # 2007-07-02 SHL Baseline 14 # 2008-12-14 SHL Ensure symbols sorted by value - some apps care 15 # 2012-03-19 SHL Segment names must be uppercase for pmdf 16 # 2014-06-13 SHL Correct typos 17 # 2014-11-01 SHL Generate ibm map files in watcom map file directory 18 # 2015-01-31 SHL Use unix slashes to keep kLIBC sh.exe happy 19 # 2019-03-02 SHL More C++ logic 20 # 2019-03-03 SHL Rework dup logic and sym length limiting 21 # 2019-03-22 SHL Disable debug code 22 # 2019-04-09 SHL Comments 20 23 21 24 # mapsym requires each segment to have at least 1 symbol … … 31 34 use POSIX qw(strftime); 32 35 use Getopt::Std; 33 use File::Spec;34 36 use File::Basename; 35 37 36 our $g_version = '0. 3';38 our $g_version = '0.4'; 37 39 38 40 our $g_cmdname; 39 our $g_tmpdir;40 41 our @g_mapfiles; # All map files 41 42 our $g_mapfile; # Current .map file name … … 50 51 51 52 foreach $g_mapfile (@g_mapfiles) { 53 $g_mapfile =~ tr|\\|/|; # 2015-01-31 SHL Unix slashes for sh.exe 52 54 &mapsym; 53 55 } … … 57 59 # end main 58 60 59 #=== initialize() In tialize globals ===61 #=== initialize() Initialize globals === 60 62 61 63 sub initialize { 62 64 63 65 &set_cmd_name; 64 &get_tmp_dir;65 66 66 67 } # initialize … … 79 80 open MAPFILE, $g_mapfile or die "open $g_mapfile $!"; 80 81 81 my $g_wrkfile = File::Spec->catfile($g_tmpdir, "$mapid.map"); 82 my $g_wrkfile = $g_mapfile . '-ibm'; 83 $g_wrkfile =~ s/-watcom-ibm$/-ibm/; # In case renamed from .map 82 84 unlink $g_wrkfile || die "unlink $g_wrkfile $!" if -f $g_wrkfile; 83 85 open WRKFILE, ">$g_wrkfile" or die "open $g_wrkfile $!"; … … 99 101 while (<MAPFILE>) { 100 102 101 chomp; # EOL103 chomp; # EOL 102 104 103 105 if (/Executable Image: (\S+)\.\w+$/) { … … 177 179 178 180 my $seginfo; 179 if (defined($segsinfo{$1})) { 180 $seginfo = $segsinfo{$1}; 181 } 182 else { 181 if (defined($segsinfo{$segnum})) { 182 $seginfo = $segsinfo{$segnum}; 183 } else { 183 184 $seginfo = {max_offset => 0, 184 185 symcnt => 0}; … … 190 191 $seginfo->{symcnt}++; 191 192 192 $segsinfo{$ 1} = $seginfo;193 $segsinfo{$segnum} = $seginfo; 193 194 194 195 $segaddr = "$segnum:$offset"; 195 196 196 197 # Convert C++ symbols to something mapsym will accept 197 # warn " $sym\n";198 # warn "\n$sym\n"; 198 199 199 200 $_ = $sym; 200 201 201 # s/\bIdle\b/ /; # Drop Idle keyword - obsolete done later 202 s/\(.*\).*$//; # Drop (...) tails 203 204 s/::~/__x/; # Replace ::~ with __x 205 s/::/__/; # Replace :: with __ 206 207 s/[<,]/_/g; # Replace < and , with _ 208 s/[>]//g; # Replace > with nothing 209 s/[\[\]]//g; # Replace [] with nothing 210 # s/_*$//; # Drop trailing _ 211 # s/\W+\w//; # Drop leading keywords (including Idle) 212 s/\b.*\b\s+//g; # Drop leading keywords (including Idle) 202 s/\s+\(.*\)//; # Drop (...) comments preceeded by whitespace 203 204 # Make C++ compatible with mapsym 205 206 # Drop keywords and decorations 207 s/\b(near|int|short|unsigned|long|void|char|const|wchar_t)\b\s*[*&]?\s*//g; 208 209 # s/<[^<>]+>//g; # Replace < > templates with nothing 210 211 s/std::\s*/std/g; # Replace std:: with std 212 s/::~/__x/g; # Replace destructor ::~ with __x 213 s/::/__/g; # Replace :: with __ 214 215 s/[\[\]()<>,]/ /g; # Replace [ ] < > and , with spaces 216 s/\s+/_/g; # Replace whitespace with single _ 217 s/__+/_/g; # Replace multiple _ with single _ 213 218 214 219 # Drop leading and trailing _ to match source code 215 220 216 s/^_//; # Drop leading _ (cdecl) 217 s/_$//; # Drop trailing _ (watcall) 218 219 # warn "$_\n"; 221 s/^_//; # Drop leading _ (cdecl) 222 s/_$//; # Drop trailing _ (watcall) 223 224 $_ = substr($_, 0, 63) if length($_) > 63; # limit 225 226 # warn "\n$_\n"; 220 227 221 228 # Prune some libc symbols to avoid mapsym overflows … … 261 268 if (defined($segsinfo{$segnum})) { 262 269 $seginfo = $segsinfo{$segnum}; 263 } 264 else { 270 } else { 265 271 $seginfo = {max_offset => 0, 266 272 symcnt => 0}; … … 268 274 if ($seginfo->{symcnt} == 0) { 269 275 warn "Segment $segnum has no symbols - generating dummy symbol\n"; 270 $_ = "S eg${segnum}_dummy";276 $_ = "SEG${segnum}_dummy"; 271 277 if ($is32bit) { 272 278 $segaddr = "$segnum:00010000"; … … 278 284 } elsif ($is32bit && $seginfo->{max_offset} < 0x10000) { 279 285 warn "32 bit segment $segnum is smaller than 64K - generating dummy symbol\n"; 280 $_ = "S eg${segnum}_dummy";286 $_ = "SEG${segnum}_dummy"; 281 287 $segaddr = "$segnum:00010000"; 282 288 $syms{$segaddr} = $_; … … 284 290 } 285 291 } 286 } # foreach 292 } # foreach $segnum 287 293 288 294 # Generate symbols by value listing 289 290 my $lastsym = ''; 291 my $seq = 0; 295 # FIXME to warn if may overflow 64K limit 296 292 297 @keys = sort keys %syms; 298 my %used; 293 299 foreach $segaddr (@keys) { 294 300 my $sym = $syms{$segaddr}; 295 301 my $imp = substr($segaddr, 0, 4) eq '0000' ? 'Imp' : ''; 296 if ($sym ne $lastsym) { 297 $lastsym = $sym; 298 $seq = 0; 302 # Avoid dups 303 if (defined $used{$sym}) { 304 my $seq = $used{$sym}; 305 $seq++; 306 $used{$sym} = $seq; 307 $sym = "${sym}_$seq"; 299 308 } else { 300 $seq++; 301 $sym = "${sym}_$seq"; 309 $used{$sym} = 0; 302 310 } 303 311 printf WRKFILE $symfmt, $segaddr, $imp, $sym; 304 } 312 } # foreach 305 313 306 314 close WRKFILE; … … 416 424 } # set_cmd_name 417 425 418 #=== get_tmp_dir() Get TMP dir name with trailing backslash, set Gbl. ===419 420 sub get_tmp_dir {421 422 $g_tmpdir = File::Spec->tmpdir();423 die "Need to have TMP or TMPDIR or TEMP defined" unless $g_tmpdir;424 425 } # get_tmp_dir426 427 426 # The end
Note:
See TracChangeset
for help on using the changeset viewer.