Commit | Line | Data |
a0fd4948 |
1 | #!/usr/bin/perl -w |
2 | |
3 | # |
4 | # find_writeable_data - find non-const data in Symbian object files |
5 | # |
6 | # Use this when PETRAN tells you "dll has (un)initialised data". |
7 | # Expects to find the Symbian (GNU) nm in the executable path. |
8 | # |
9 | # Copyright (c) 2004-2005 Nokia. All rights reserved. |
10 | # |
11 | # This utility is licensed under the same terms as Perl itself. |
12 | # |
13 | |
14 | use strict; |
15 | |
16 | BEGIN { |
17 | unless (exists $ENV{EPOCROOT}) { |
18 | die "$0: EPOCROOT unset\n"; |
19 | } |
20 | if (open(my $fh, "nm --version |")) { |
21 | unless (<$fh> =~ /^GNU nm .*-psion-.*/) { |
22 | die "$0: Cannot find the GNU nm from Symbian\n"; |
23 | } |
24 | close($fh); |
25 | } else { |
26 | die "$0: Cannot find any nm in the executable path: $!\n"; |
27 | } |
28 | unless (@ARGV && $ARGV[0] =~ /\.mmp$/i) { |
29 | die "$0: Must specify target mmp as the first argument\n"; |
30 | } |
31 | } |
32 | |
33 | use Cwd; |
34 | use File::Basename; |
35 | |
36 | my $dir = lc(getcwd()); |
5c271e25 |
37 | my $tgt = basename(shift(@ARGV), ".mmp"); |
a0fd4948 |
38 | |
39 | $dir =~ s!/!\\!g; |
40 | $dir =~ s!^c:!c:$ENV{EPOCROOT}epoc32\\build!; |
41 | $dir .= "\\$tgt\\thumb\\urel"; |
42 | |
43 | print $dir, "\n"; |
44 | |
45 | unless (-d $dir) { |
46 | die "$0: No directory $dir\n"; |
47 | } |
48 | |
49 | my @o = glob("$dir\\*.o"); |
50 | |
51 | unless (@o) { |
52 | die "$0: No objects in $dir\n"; |
53 | } |
54 | |
55 | for my $o (@o) { |
56 | if (open(my $fh, "nm $o |")) { |
57 | my @d; |
58 | while (<$fh>) { |
59 | next if / [TURtr] /; |
60 | push @d, $_; |
61 | } |
62 | close($fh); |
63 | if (@d) { |
64 | $o =~ s!^\Q$dir\E\\!!; |
65 | print "$o:\n"; |
66 | print @d; |
67 | } |
68 | } else { |
69 | warn "$0: nm $o failed: $!\n"; |
70 | } |
71 | } |
72 | |
73 | exit(0); |