The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

#
# find_writeable_data - find non-const data in Symbian object files
#
# Use this when PETRAN tells you "dll has (un)initialised data".
# Expects to find the Symbian (GNU) nm in the executable path.
#
# Copyright (c) 2004-2005 Nokia.  All rights reserved.
#
# This utility is licensed under the same terms as Perl itself.
#

use strict;

BEGIN {
  unless (exists $ENV{EPOCROOT}) {
    die "$0: EPOCROOT unset\n";
  }
  if (open(my $fh, "nm --version |")) {
    unless (<$fh> =~ /^GNU nm .*-psion-.*/) {
      die "$0: Cannot find the GNU nm from Symbian\n";
    }
    close($fh);
  } else {
      die "$0: Cannot find any nm in the executable path: $!\n";
  }
  unless (@ARGV && $ARGV[0] =~ /\.mmp$/i) {
    die "$0: Must specify target mmp as the first argument\n";
  }
}

use Cwd;
use File::Basename;

my $dir = lc(getcwd());
my $tgt = basename(shift(@ARGV), ".mmp");

$dir =~ s!/!\\!g;
$dir =~ s!^c:!c:$ENV{EPOCROOT}epoc32\\build!;
$dir .= "\\$tgt\\thumb\\urel";

print $dir, "\n";

unless (-d $dir) {
  die "$0: No directory $dir\n";
}

my @o = glob("$dir\\*.o");

unless (@o) {
  die "$0: No objects in $dir\n";
}

for my $o (@o) {
  if (open(my $fh, "nm $o |")) {
    my @d;
    while (<$fh>) {
      next if / [TURtr] /;
      push @d, $_;
    }
    close($fh);
    if (@d) {
      $o =~ s!^\Q$dir\E\\!!;
      print "$o:\n";
      print @d;
    }
  } else {
    warn "$0: nm $o failed: $!\n";
  }
} 

exit(0);