summaryrefslogtreecommitdiff
path: root/Porting/findrfuncs
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2002-03-08 17:50:21 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2002-03-08 17:50:21 +0000
commitbb304ec8d8e029b37ee317ef1c3ab3a4f3743b3b (patch)
treebd3fa789f77f13ff1e91a005e45e26874aec28bf /Porting/findrfuncs
parentc29a771d3f5d4c2b623f61b706064fd8db958f3a (diff)
downloadperl-bb304ec8d8e029b37ee317ef1c3ab3a4f3743b3b.tar.gz
Nice porting script from Sarathy. Well, less nice
in the sense that it shows the looong road ahead. p4raw-id: //depot/perl@15111
Diffstat (limited to 'Porting/findrfuncs')
-rw-r--r--Porting/findrfuncs81
1 files changed, 81 insertions, 0 deletions
diff --git a/Porting/findrfuncs b/Porting/findrfuncs
new file mode 100644
index 0000000000..0e1d3d0ecb
--- /dev/null
+++ b/Porting/findrfuncs
@@ -0,0 +1,81 @@
+#!/usr/bin/perl -w
+
+#
+# findrfuncs: find reentrant variants of functions used in an executable.
+# Requires a functional "nm -u". Searches headers in /usr/include
+# to find available *_r functions and looks for non-reentrant
+# variants used in the supplied executable.
+#
+# Gurusamy Sarathy
+# gsar@ActiveState.com
+#
+# Hacked to automatically find the executable and shared objects.
+# --jhi
+
+use strict;
+use File::Find;
+
+my @EXES;
+my $NMU = 'nm -u';
+my @INCDIRS = qw(/usr/include);
+my $SO = 'so';
+my $EXE = '';
+
+if (open(CONFIG, "config.sh")) {
+ local $/;
+ my $CONFIG = <CONFIG>;
+ $SO = $1 if $CONFIG =~ /^so='(\w+)'/m;
+ $EXE = $1 if $CONFIG =~ /^_exe='\.(\w+)'/m;
+}
+
+push @EXES, "perl$EXE";
+
+find(sub {push @EXES, $File::Find::name if /.$SO$/}, '.' );
+
+push @EXES, @ARGV;
+
+if ($^O eq 'dec_osf') {
+ $NMU = 'nm -Bu';
+}
+
+my %rfuncs;
+my @syms;
+find(sub {
+ return unless -f $File::Find::name;
+ open my $F, "<$File::Find::name"
+ or die "Can't open $File::Find::name: $!";
+ my $line;
+ while (defined ($line = <$F>)) {
+ if ($line =~ /\b(\w+_r)\b/) {
+ #warn "$1 => $File::Find::name\n";
+ $rfuncs{$1} = $File::Find::name;
+ }
+ }
+ close $F;
+ }, @INCDIRS);
+
+# delete bogus symbols grepped out of comments and such
+delete $rfuncs{setlocale_r} if $^O eq 'linux';
+
+for my $exe (@EXES) {
+ for my $sym (`$NMU $exe`) {
+ chomp $sym;
+ $sym =~ s/^\s+[Uu]\s+//;
+ $sym =~ s/^\s+//;
+ next if /\s/;
+ $sym =~ s/\@.*\z//; # remove @@GLIBC_2.0 etc
+ # warn "#### $sym\n";
+ if (exists $rfuncs{"${sym}_r"}) {
+ push @syms, $sym;
+ }
+ }
+
+ if (@syms) {
+ print "\nFollowing symbols in $exe have reentrant versions:\n";
+ for my $sym (@syms) {
+ print "$sym => $sym" . "_r (in file " . $rfuncs{"${sym}_r"} . ")\n";
+ }
+ }
+ @syms = ();
+}
+