Changes to attempt to silence bcc64x
[ACE_TAO.git] / ACE / bin / ace_ld
blobac4840b2641bc53d631a5bb591cb7941f3df969b
1 eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
2     & eval 'exec perl -S $0 $argv:q'
3     if 0;
5 # Drop-in replacement for "ld" that supports munching.
7 # The first three lines above let this script run without specifying the
8 # full path to perl, as long as it is in the user's PATH.
9 # Taken from perlrun man page.
12 ## Symbols that produce a warning due to size changing.
13 ## This is a harmless known bug with the version of gcc that comes with
14 ## Tornado II.  Anything in this list will be suppressed unless the -w
15 ## option is used.
17 my(@symbols) = ('dequeue__t17ACE_Message_Queue1Z14ACE_NULL_SYNCHRP17ACE_Message_BlockP14ACE_Time_Value',
18                 'activate__t17ACE_Message_Queue1Z14ACE_NULL_SYNCH',
19                );
21 $usage =
22   "usage: $0 [-? | [-w] [-o <VDIR>] [[-C <compile> --] [-m <munch>] [-n <nm>]] [-f]]] " .
23   "<ld command>\n";
25 #### To avoid quoting problems on the command line, all arguments
26 #### between -C and -- are combined into the single compile command.
27 $compile_option = 0;
28 $ss_change_warn = 0;
30 ####
31 #### process command line args
32 ####
33 while ( $#ARGV >= 0  &&  $ARGV[0] =~ /^-/ ) {
34     if ( $ARGV[0] eq '-C' ) {
35         $compile_option = 1;
36         if ( $ARGV[1] !~ /^[-].+$/ ) {
37             $compile = $ARGV[1]; shift;
38         } else {
39             print STDERR "$0:  must provide argument for -c option\n";
40             die $usage;
41         }
42     } elsif ( $ARGV[0] eq '--' ) {
43         $compile_option = 0;
44     } elsif ( $ARGV[0] eq '-m' ) {
45         if ( $ARGV[1] !~ /^[-].+$/ ) {
46             $munch = $ARGV[1]; shift;
47         } else {
48             print STDERR "$0:  must provide argument for -m option\n";
49             die $usage;
50         }
51     } elsif ( $ARGV[0] eq '-n' ) {
52         if ( $ARGV[1] !~ /^[-].+$/ ) {
53             $nm = $ARGV[1]; shift;
54         } else {
55             print STDERR "$0:  must provide argument for -n option\n";
56             die $usage;
57         }
58     } elsif ( $ARGV[0] eq '-o' ) {
59         if ( $ARGV[1] !~ /^[-].+$/ ) {
60             $vdir = $ARGV[1]; shift;
61         } else {
62             print STDERR "$0:  must provide argument for -o option\n";
63             die $usage;
64         }
65     } elsif ( $ARGV[0] eq '-w' ) {
66       $ss_change_warn = 1;
67     } elsif ( $ARGV[0] eq '-?' ) {
68         print "$usage";
69         exit;
70     } else {
71         if ($compile_option) {
72           $compile .= " $ARGV[0]";
73         } else {
74           warn "$0:  unknown option $ARGV[0]\n";
75          die $usage;
76         }
77     }
78     shift;
81 ####
82 #### If $vdir is empty, set default object file directory (.obj)
83 ####
84 if ($vdir eq ''){
85    $vdir = ".obj";
88 ####
89 #### Save link command, i.e., current @ARGV, for use below.
90 ####
91 @args = @ARGV;
94 ####
95 #### Find full path to each library.
96 ####
97 @libDirs = ();
98 $current_dir_in_libDirs = 0;
99 @libs = ();
100 @objs = '';
102 foreach $arg (@ARGV) {
103   if ($arg =~ /^['"]?-L([\S]+)/) {
104     ($dir = $1) =~ s%/+$%%;     #### trim any trailing slashes
105     push (@libDirs, $dir);
106     $current_dir_in_libDirs = 1 if $dir eq '.';
107   } elsif ($arg =~ /^['"]?-l([\S]+)/) {
108     push (@libs, $1);
109   } elsif ($arg =~ /\.o$/) {
110     push (@objs, $arg);
111   }
114 #### Add . to libDirs if it doesn't already have it.
115 push (@libDirs, ".") unless $current_dir_in_libDirs;
117 foreach $lib (@libs) {
118   foreach $libDir (@libDirs) {
119     if (-e "$libDir/lib$lib.a") {
120       $full_path{$lib} = "$libDir/lib$lib.a";
121       last;
122     }
123   }
127 ####
128 #### Set up signal handler.
129 ####
130 $done = 0;
131 $SIG{'HUP'} = $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'cleanup';
134 ####
135 #### Munch, if $munch is non-null.
136 ####
137 if ($munch) {
138   $munch_objs = join (' ', @objs);
139   $munch_libs = join (' ', values %full_path);
141   open (MUNCH, "$nm $munch_objs $munch_libs | $munch |") ||
142     &fail ("$0: unable to run \"$nm\" or \"$munch\"\n");
144   open (CTORDTOR, "> __ctordtor.c") ||
145     &fail ("$0: unable to open \"__ctordtor.c\"\n");
147   while (<MUNCH>) {
148     #### Filter out munch output that contains '.cpp'.  It results from
149     #### .cpp files that have no text or data, e.g., .cpp files that
150     #### only contain template instantiations.  These lines confuse g++.
151     print CTORDTOR unless /\.cpp/;
152   }
154   close CTORDTOR || &fail ("$0: unable to write \"__ctordtor.c\"\n");
155   close MUNCH;
157    system ("$compile -o $vdir/__ctordtor.o __ctordtor.c") &&
158     &fail ("$0: \"$compile\" failed\n");
162 ####
163 #### Construct the link command from @args and perform the link.
164 ####
165 if ($munch) {
166   #### Insert ctordtor object file before first library in link command.
167   $arg_lib = 0;
168   foreach $arg (@ARGV) {
169     if ($arg =~ /^['"]?-l/) {
170       last;
171     }
172     ++$arg_lib;
173   }
174   splice (@args, $arg_lib, 0, "$vdir/__ctordtor.o");
177 $link_command = join (' ', @args);
179 if (open(PP, "$link_command 2>&1 |")) {
180   while(<PP>) {
181     my($line) = $_;
182     if ($ss_change_warn) {
183       print $line;
184     }
185     else {
186       my($found) = 0;
187       foreach my $symbol (@symbols) {
188         if ($line =~ /Warning: size of symbol `$symbol\'/) {
189           $found = 1;
190         }
191       }
192       if (!$found) {
193         print $line;
194       }
195     }
196   }
197   close(PP);
199   if ($? ne 0) {
200     fail ("$0: $link_command failed\n");
201   }
203 else {
204   fail ("$0: $link_command failed\n");
208 $done = 1;
209 &cleanup;
212 ####
213 ####
214 ####
215 sub fail {
216   local ($message) = @_;
218   warn $message;
219   &cleanup;
223 ####
224 #### clean up when done or on signal
225 ####
226 sub cleanup {
227   unlink "__ctordtor.c", "$vdir/__ctordtor.o";
228   if ($done) {
229     exit 0;
230   } else {
231     exit 1;
232   }
235 #### EOF