-#while (my($src,$target)=each %SYMLINK) {
-# die "$src->$target" if exists $SYMLINK{$target};
-#}
+sub resolve($) {
+ my($binfn)=@_;
+ die if $binfn!~m{^/};
+ return $binfn if !-l ".$binfn";
+ $binfn=".$binfn";
+ my $target=readlink $binfn or die $binfn;
+ $binfn=~s{^[.]}{};
+ my $final;
+ if ($target=~m{^/}) {
+ $final=$target;
+#warn "$binfn,target=final=$final\n";
+ } else {
+ my $base=dirname(".$binfn");
+ my $abs=File::Spec->rel2abs($target,$base);
+ $final="/".File::Spec->abs2rel($abs);
+#warn "$binfn,base=$base,target=$target,abs=$abs,final=$final\n";
+ }
+ 1 while $final=~s{/[^/]+/[.][.]/}{/};
+ 1 while $final=~s{/[^/]+/[.][.]$}{};
+ if ($final=~m{/[.][.]}) {
+ warn "$binfn,target=$target,final=$final\n";
+ return;
+ }
+#warn "$binfn,final=$final\n";
+ return &resolve($final);
+}