Changeset 1342
- Timestamp:
- Dec 15, 2008, 6:17:15 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/debugtools/mapsymw.pl
r979 r1342 2 2 # mapsymw - mapsym Watcom map files 3 3 4 # Copyright (c) 2007 Steven Levine and Associates, Inc.4 # Copyright (c) 2007, 2008 Steven Levine and Associates, Inc. 5 5 # All rights reserved. 6 6 … … 18 18 # 09 Aug 07 SHL Generate dummy symbol for interior segments with no symbols 19 19 # 08 Nov 07 SHL Drop leading keywords from function definitions 20 # 14 Dec 08 SHL Ensure symbols sorted by value - some apps care 20 21 21 22 # mapsym requires each segment to have at least 1 symbol … … 34 35 use File::Basename; 35 36 36 our $g_version = '0. 2';37 our $g_version = '0.3'; 37 38 38 39 our $g_cmdname; … … 89 90 my $is32bit; 90 91 my %segsinfo; 92 my %syms; 91 93 my $segnum; 92 94 my $offset; 93 95 my $segaddr; 94 my $imp;95 96 96 97 my $segfmt; … … 116 117 next if /^=/; 117 118 next if /^ /; 118 next if /^ 119 next if /^$/; 119 120 120 121 if ($state eq 'segments') { … … 138 139 139 140 if (!$segcnt) { 141 # First segment - determine address size (16/32 bit) 140 142 $is32bit = length($offset) == 8; 143 # Output title 141 144 print WRKFILE "\n"; 142 145 if ($is32bit) { … … 165 168 # 0 1 2 3 4 5 6 166 169 # 123456789012345678901234567890123456789012345678901234567890 167 # Address Publics by Value170 # Address Publics by Value 168 171 # 0000:00000000 Imp WinEmptyClipbrd (PMWIN.733) 169 172 # 0002:0001ED40 __towlower_dummy … … 183 186 184 187 my $n = hex $offset; 188 # Remember max symbol offset 185 189 $seginfo->{max_offset} = $n if $n > $seginfo->{max_offset}; 186 190 $seginfo->{symcnt}++; … … 189 193 190 194 $segaddr = "$segnum:$offset"; 191 192 $imp = $segnum eq '0000' ? 'Imp' : '';193 195 194 196 # Convert C++ symbols to something mapsym will accept … … 213 215 s/_$//; # Drop trailing _ (watcall) 214 216 215 # Prune to avoid mapsym overflows217 # Prune some libc symbols to avoid mapsym overflows 216 218 if ($mapid =~ /libc06/) { 217 219 # 0001:000b73e0 __ZNSt7codecvtIcc11__mbstate_tEC2Ej … … 221 223 222 224 if (!$symcnt) { 225 # First symbol - output title 223 226 print WRKFILE "\n"; 224 227 if ($is32bit) { 225 print WRKFILE " Address Publics by Value\n";228 print WRKFILE " Address Publics by Value\n"; 226 229 } else { 227 print WRKFILE " Address Publics by Value\n";230 print WRKFILE " Address Publics by Value\n"; 228 231 } 229 232 } 230 233 231 printf WRKFILE $symfmt, $segaddr, $imp, $_; 234 $syms{$segaddr} = $_; 235 232 236 $symcnt++; 233 237 } … … 264 268 $segaddr = "$segnum:0000"; 265 269 } 266 $imp = ''; 267 printf WRKFILE $symfmt, $segaddr, $imp, $_; 270 $syms{$segaddr} = $_; 268 271 $symcnt++; 269 272 } elsif ($is32bit && $seginfo->{max_offset} < 0x10000) { … … 271 274 $_ = "Seg${segnum}_dummy"; 272 275 $segaddr = "$segnum:00010000"; 273 $imp = ''; 274 printf WRKFILE $symfmt, $segaddr, $imp, $_; 276 $syms{$segaddr} = $_; 275 277 $symcnt++; 276 278 } 277 279 } 278 280 } # foreach 281 282 @keys = sort keys %syms; 283 foreach $segaddr (@keys) { 284 my $sym = $syms{$segaddr}; 285 my $imp = substr($segaddr, 0, 4) eq '0000' ? 'Imp' : ''; 286 printf WRKFILE $symfmt, $segaddr, $imp, $sym; 287 } 279 288 280 289 close WRKFILE;
Note:
See TracChangeset
for help on using the changeset viewer.