Ignore:
Timestamp:
Dec 15, 2008, 6:17:15 AM (17 years ago)
Author:
Steven Levine
Message:

Ensure symbols sorted by value

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/debugtools/mapsymw.pl

    r979 r1342  
    22# mapsymw - mapsym Watcom map files
    33
    4 # Copyright (c) 2007 Steven Levine and Associates, Inc.
     4# Copyright (c) 2007, 2008 Steven Levine and Associates, Inc.
    55# All rights reserved.
    66
     
    1818# 09 Aug 07 SHL Generate dummy symbol for interior segments with no symbols
    1919# 08 Nov 07 SHL Drop leading keywords from function definitions
     20# 14 Dec 08 SHL Ensure symbols sorted by value - some apps care
    2021
    2122# mapsym requires each segment to have at least 1 symbol
     
    3435use File::Basename;
    3536
    36 our $g_version = '0.2';
     37our $g_version = '0.3';
    3738
    3839our $g_cmdname;
     
    8990  my $is32bit;
    9091  my %segsinfo;
     92  my %syms;
    9193  my $segnum;
    9294  my $offset;
    9395  my $segaddr;
    94   my $imp;
    9596
    9697  my $segfmt;
     
    116117    next if /^=/;
    117118    next if /^ /;
    118     next if /^ /;
     119    next if /^$/;
    119120
    120121    if ($state eq 'segments') {
     
    138139
    139140        if (!$segcnt) {
     141          # First segment - determine address size (16/32 bit)
    140142          $is32bit = length($offset) == 8;
     143          # Output title
    141144          print WRKFILE "\n";
    142145          if ($is32bit) {
     
    165168      # 0        1         2         3         4         5         6
    166169      # 123456789012345678901234567890123456789012345678901234567890
    167       #  Address         Publics by Value
     170      #   Address         Publics by Value
    168171      #  0000:00000000  Imp  WinEmptyClipbrd      (PMWIN.733)
    169172      #  0002:0001ED40       __towlower_dummy
     
    183186
    184187        my $n = hex $offset;
     188        # Remember max symbol offset
    185189        $seginfo->{max_offset} = $n if $n > $seginfo->{max_offset};
    186190        $seginfo->{symcnt}++;
     
    189193
    190194        $segaddr = "$segnum:$offset";
    191 
    192         $imp = $segnum eq '0000' ? 'Imp' : '';
    193195
    194196        # Convert C++ symbols to something mapsym will accept
     
    213215        s/_$//;                 # Drop trailing _ (watcall)
    214216
    215         # Prune to avoid mapsym overflows
     217        # Prune some libc symbols to avoid mapsym overflows
    216218        if ($mapid =~ /libc06/) {
    217219          # 0001:000b73e0  __ZNSt7codecvtIcc11__mbstate_tEC2Ej
     
    221223
    222224        if (!$symcnt) {
     225          # First symbol - output title
    223226          print WRKFILE "\n";
    224227          if ($is32bit) {
    225             print WRKFILE " Address         Publics by Value\n";
     228            print WRKFILE "  Address         Publics by Value\n";
    226229          } else {
    227             print WRKFILE " Address     Publics by Value\n";
     230            print WRKFILE "  Address     Publics by Value\n";
    228231          }
    229232        }
    230233
    231         printf WRKFILE $symfmt, $segaddr, $imp, $_;
     234        $syms{$segaddr} = $_;
     235
    232236        $symcnt++;
    233237      }
     
    264268          $segaddr = "$segnum:0000";
    265269        }
    266         $imp = '';
    267         printf WRKFILE $symfmt, $segaddr, $imp, $_;
     270        $syms{$segaddr} = $_;
    268271        $symcnt++;
    269272      } elsif ($is32bit && $seginfo->{max_offset} < 0x10000) {
     
    271274        $_ = "Seg${segnum}_dummy";
    272275        $segaddr = "$segnum:00010000";
    273         $imp = '';
    274         printf WRKFILE $symfmt, $segaddr, $imp, $_;
     276        $syms{$segaddr} = $_;
    275277        $symcnt++;
    276278      }
    277279    }
    278280  } # 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  }
    279288
    280289  close WRKFILE;
Note: See TracChangeset for help on using the changeset viewer.