OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Procedure>: Set default
[pf3gnuchains/gcc-fork.git] / gcc / collect2.c
1 /* Collect static initialization info into data structures that can be
2    traversed by C++ initialization and finalization routines.
3    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
5    Free Software Foundation, Inc.
6    Contributed by Chris Smith (csmith@convex.com).
7    Heavily modified by Michael Meissner (meissner@cygnus.com),
8    Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
9
10 This file is part of GCC.
11
12 GCC is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 3, or (at your option) any later
15 version.
16
17 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
18 WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3.  If not see
24 <http://www.gnu.org/licenses/>.  */
25
26
27 /* Build tables of static constructors and destructors and run ld.  */
28
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include <signal.h>
34 #if ! defined( SIGCHLD ) && defined( SIGCLD )
35 #  define SIGCHLD SIGCLD
36 #endif
37
38 #ifndef LIBRARY_PATH_ENV
39 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
40 #endif
41
42 #define COLLECT
43
44 #include "collect2.h"
45 #include "collect2-aix.h"
46 #include "demangle.h"
47 #include "obstack.h"
48 #include "intl.h"
49 #include "version.h"
50 \f
51 /* On certain systems, we have code that works by scanning the object file
52    directly.  But this code uses system-specific header files and library
53    functions, so turn it off in a cross-compiler.  Likewise, the names of
54    the utilities are not correct for a cross-compiler; we have to hope that
55    cross-versions are in the proper directories.  */
56
57 #ifdef CROSS_DIRECTORY_STRUCTURE
58 #ifndef CROSS_AIX_SUPPORT
59 #undef OBJECT_FORMAT_COFF
60 #endif
61 #undef MD_EXEC_PREFIX
62 #undef REAL_LD_FILE_NAME
63 #undef REAL_NM_FILE_NAME
64 #undef REAL_STRIP_FILE_NAME
65 #endif
66
67 /* If we cannot use a special method, use the ordinary one:
68    run nm to find what symbols are present.
69    In a cross-compiler, this means you need a cross nm,
70    but that is not quite as unpleasant as special headers.  */
71
72 #if !defined (OBJECT_FORMAT_COFF)
73 #define OBJECT_FORMAT_NONE
74 #endif
75
76 #ifdef OBJECT_FORMAT_COFF
77
78 #ifndef CROSS_DIRECTORY_STRUCTURE
79 #include <a.out.h>
80 #include <ar.h>
81
82 #ifdef UMAX
83 #include <sgs.h>
84 #endif
85
86 /* Many versions of ldfcn.h define these.  */
87 #ifdef FREAD
88 #undef FREAD
89 #undef FWRITE
90 #endif
91
92 #include <ldfcn.h>
93 #endif
94
95 /* Some systems have an ISCOFF macro, but others do not.  In some cases
96    the macro may be wrong.  MY_ISCOFF is defined in tm.h files for machines
97    that either do not have an ISCOFF macro in /usr/include or for those
98    where it is wrong.  */
99
100 #ifndef MY_ISCOFF
101 #define MY_ISCOFF(X) ISCOFF (X)
102 #endif
103
104 #endif /* OBJECT_FORMAT_COFF */
105
106 #ifdef OBJECT_FORMAT_NONE
107
108 /* Default flags to pass to nm.  */
109 #ifndef NM_FLAGS
110 #define NM_FLAGS "-n"
111 #endif
112
113 #endif /* OBJECT_FORMAT_NONE */
114
115 /* Some systems use __main in a way incompatible with its use in gcc, in these
116    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
117    give the same symbol without quotes for an alternative entry point.  */
118 #ifndef NAME__MAIN
119 #define NAME__MAIN "__main"
120 #endif
121
122 /* This must match tree.h.  */
123 #define DEFAULT_INIT_PRIORITY 65535
124
125 #ifndef COLLECT_SHARED_INIT_FUNC
126 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
127   fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
128 #endif
129 #ifndef COLLECT_SHARED_FINI_FUNC
130 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
131   fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
132 #endif
133
134 #ifdef LDD_SUFFIX
135 #define SCAN_LIBRARIES
136 #endif
137
138 #ifndef SHLIB_SUFFIX
139 #define SHLIB_SUFFIX ".so"
140 #endif
141
142 #ifdef USE_COLLECT2
143 int do_collecting = 1;
144 #else
145 int do_collecting = 0;
146 #endif
147
148 /* Cook up an always defined indication of whether we proceed the
149    "EXPORT_LIST" way.  */
150
151 #ifdef COLLECT_EXPORT_LIST
152 #define DO_COLLECT_EXPORT_LIST 1
153 #else
154 #define DO_COLLECT_EXPORT_LIST 0
155 #endif
156
157 /* Nonzero if we should suppress the automatic demangling of identifiers
158    in linker error messages.  Set from COLLECT_NO_DEMANGLE.  */
159 int no_demangle;
160 \f
161 /* Linked lists of constructor and destructor names.  */
162
163 struct id
164 {
165   struct id *next;
166   int sequence;
167   char name[1];
168 };
169
170 struct head
171 {
172   struct id *first;
173   struct id *last;
174   int number;
175 };
176
177 int vflag;                              /* true if -v */
178 static int rflag;                       /* true if -r */
179 static int strip_flag;                  /* true if -s */
180 static const char *demangle_flag;
181 #ifdef COLLECT_EXPORT_LIST
182 static int export_flag;                 /* true if -bE */
183 static int aix64_flag;                  /* true if -b64 */
184 static int aixrtl_flag;                 /* true if -brtl */
185 #endif
186
187 enum lto_mode_d {
188   LTO_MODE_NONE,                        /* Not doing LTO.  */
189   LTO_MODE_LTO,                         /* Normal LTO.  */
190   LTO_MODE_WHOPR                        /* WHOPR.  */
191 };
192
193 /* Current LTO mode.  */
194 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
195
196 int debug;                              /* true if -debug */
197
198 static int shared_obj;                  /* true if -shared */
199
200 static const char *c_file;              /* <xxx>.c for constructor/destructor list.  */
201 static const char *o_file;              /* <xxx>.o for constructor/destructor list.  */
202 #ifdef COLLECT_EXPORT_LIST
203 static const char *export_file;         /* <xxx>.x for AIX export list.  */
204 #endif
205 static char **lto_o_files;              /* Output files for LTO.  */
206 const char *ldout;                      /* File for ld stdout.  */
207 const char *lderrout;                   /* File for ld stderr.  */
208 static const char *output_file;         /* Output file for ld.  */
209 static const char *nm_file_name;        /* pathname of nm */
210 #ifdef LDD_SUFFIX
211 static const char *ldd_file_name;       /* pathname of ldd (or equivalent) */
212 #endif
213 static const char *strip_file_name;             /* pathname of strip */
214 const char *c_file_name;                /* pathname of gcc */
215 static char *initname, *fininame;       /* names of init and fini funcs */
216
217 static struct head constructors;        /* list of constructors found */
218 static struct head destructors;         /* list of destructors found */
219 #ifdef COLLECT_EXPORT_LIST
220 static struct head exports;             /* list of exported symbols */
221 #endif
222 static struct head frame_tables;        /* list of frame unwind info tables */
223
224 static bool at_file_supplied;           /* Whether to use @file arguments */
225 static char *response_file;             /* Name of any current response file */
226
227 struct obstack temporary_obstack;
228 char * temporary_firstobj;
229
230 /* A string that must be prepended to a target OS path in order to find
231    it on the host system.  */
232 #ifdef TARGET_SYSTEM_ROOT
233 static const char *target_system_root = TARGET_SYSTEM_ROOT;
234 #else
235 static const char *target_system_root = "";
236 #endif
237
238 /* Structure to hold all the directories in which to search for files to
239    execute.  */
240
241 struct prefix_list
242 {
243   const char *prefix;         /* String to prepend to the path.  */
244   struct prefix_list *next;   /* Next in linked list.  */
245 };
246
247 struct path_prefix
248 {
249   struct prefix_list *plist;  /* List of prefixes to try */
250   int max_len;                /* Max length of a prefix in PLIST */
251   const char *name;           /* Name of this list (used in config stuff) */
252 };
253
254 #ifdef COLLECT_EXPORT_LIST
255 /* Lists to keep libraries to be scanned for global constructors/destructors.  */
256 static struct head libs;                    /* list of libraries */
257 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
258 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
259 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
260                                           &libpath_lib_dirs, NULL};
261 #endif
262
263 /* List of names of object files containing LTO information.
264    These are a subset of the object file names appearing on the
265    command line, and must be identical, in the sense of pointer
266    equality, with the names passed to maybe_run_lto_and_relink().  */
267
268 struct lto_object
269 {
270   const char *name;             /* Name of object file.  */
271   struct lto_object *next;      /* Next in linked list.  */
272 };
273
274 struct lto_object_list
275 {
276   struct lto_object *first;     /* First list element.  */
277   struct lto_object *last;      /* Last list element.  */
278 };
279
280 static struct lto_object_list lto_objects;
281
282 /* Special kinds of symbols that a name may denote.  */
283
284 typedef enum {
285   SYM_REGULAR = 0,  /* nothing special  */
286
287   SYM_CTOR = 1,  /* constructor */
288   SYM_DTOR = 2,  /* destructor  */
289   SYM_INIT = 3,  /* shared object routine that calls all the ctors  */
290   SYM_FINI = 4,  /* shared object routine that calls all the dtors  */
291   SYM_DWEH = 5   /* DWARF exception handling table  */
292 } symkind;
293
294 static symkind is_ctor_dtor (const char *);
295
296 static void handler (int);
297 static char *find_a_file (struct path_prefix *, const char *);
298 static void add_prefix (struct path_prefix *, const char *);
299 static void prefix_from_env (const char *, struct path_prefix *);
300 static void prefix_from_string (const char *, struct path_prefix *);
301 static void do_wait (const char *, struct pex_obj *);
302 static void fork_execute (const char *, char **);
303 static void maybe_unlink (const char *);
304 static void maybe_unlink_list (char **);
305 static void add_to_list (struct head *, const char *);
306 static int extract_init_priority (const char *);
307 static void sort_ids (struct head *);
308 static void write_list (FILE *, const char *, struct id *);
309 #ifdef COLLECT_EXPORT_LIST
310 static void dump_list (FILE *, const char *, struct id *);
311 #endif
312 #if 0
313 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
314 #endif
315 static void write_list_with_asm (FILE *, const char *, struct id *);
316 static void write_c_file (FILE *, const char *);
317 static void write_c_file_stat (FILE *, const char *);
318 #ifndef LD_INIT_SWITCH
319 static void write_c_file_glob (FILE *, const char *);
320 #endif
321 #ifdef SCAN_LIBRARIES
322 static void scan_libraries (const char *);
323 #endif
324 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
325 static int is_in_args (const char *, const char **, const char **);
326 #endif
327 #ifdef COLLECT_EXPORT_LIST
328 #if 0
329 static int is_in_list (const char *, struct id *);
330 #endif
331 static void write_aix_file (FILE *, struct id *);
332 static char *resolve_lib_name (const char *);
333 #endif
334 static char *extract_string (const char **);
335
336 /* Enumerations describing which pass this is for scanning the
337    program file ...  */
338
339 typedef enum {
340   PASS_FIRST,                           /* without constructors */
341   PASS_OBJ,                             /* individual objects */
342   PASS_LIB,                             /* looking for shared libraries */
343   PASS_SECOND,                          /* with constructors linked in */
344   PASS_LTOINFO                          /* looking for objects with LTO info */
345 } scanpass;
346
347 /* ... and which kinds of symbols are to be considered.  */
348
349 enum scanfilter_masks {
350   SCAN_NOTHING = 0,
351
352   SCAN_CTOR = 1 << SYM_CTOR,
353   SCAN_DTOR = 1 << SYM_DTOR,
354   SCAN_INIT = 1 << SYM_INIT,
355   SCAN_FINI = 1 << SYM_FINI,
356   SCAN_DWEH = 1 << SYM_DWEH,
357   SCAN_ALL  = ~0
358 };
359
360 /* This type is used for parameters and variables which hold
361    combinations of the flags in enum scanfilter_masks.  */
362 typedef int scanfilter;
363
364 /* Scan the name list of the loaded program for the symbols g++ uses for
365    static constructors and destructors.
366
367    The SCANPASS argument tells which collect processing pass this is for and
368    the SCANFILTER argument tells which kinds of symbols to consider in this
369    pass.  Symbols of a special kind not in the filter mask are considered as
370    regular ones.
371
372    The constructor table begins at __CTOR_LIST__ and contains a count of the
373    number of pointers (or -1 if the constructors are built in a separate
374    section by the linker), followed by the pointers to the constructor
375    functions, terminated with a null pointer.  The destructor table has the
376    same format, and begins at __DTOR_LIST__.  */
377
378 static void scan_prog_file (const char *, scanpass, scanfilter);
379
380 \f
381 /* Delete tempfiles and exit function.  */
382
383 void
384 collect_exit (int status)
385 {
386   if (c_file != 0 && c_file[0])
387     maybe_unlink (c_file);
388
389   if (o_file != 0 && o_file[0])
390     maybe_unlink (o_file);
391
392 #ifdef COLLECT_EXPORT_LIST
393   if (export_file != 0 && export_file[0])
394     maybe_unlink (export_file);
395 #endif
396
397   if (lto_o_files)
398     maybe_unlink_list (lto_o_files);
399
400   if (ldout != 0 && ldout[0])
401     {
402       dump_file (ldout, stdout);
403       maybe_unlink (ldout);
404     }
405
406   if (lderrout != 0 && lderrout[0])
407     {
408       dump_file (lderrout, stderr);
409       maybe_unlink (lderrout);
410     }
411
412   if (status != 0 && output_file != 0 && output_file[0])
413     maybe_unlink (output_file);
414
415   if (response_file)
416     maybe_unlink (response_file);
417
418   exit (status);
419 }
420
421 \f
422 /* Notify user of a non-error.  */
423 void
424 notice (const char *cmsgid, ...)
425 {
426   va_list ap;
427
428   va_start (ap, cmsgid);
429   vfprintf (stderr, _(cmsgid), ap);
430   va_end (ap);
431 }
432
433 /* Notify user of a non-error, without translating the format string.  */
434 void
435 notice_translated (const char *cmsgid, ...)
436 {
437   va_list ap;
438
439   va_start (ap, cmsgid);
440   vfprintf (stderr, cmsgid, ap);
441   va_end (ap);
442 }
443
444 /* Die when sys call fails.  */
445
446 void
447 fatal_perror (const char * cmsgid, ...)
448 {
449   int e = errno;
450   va_list ap;
451
452   va_start (ap, cmsgid);
453   fprintf (stderr, "collect2: ");
454   vfprintf (stderr, _(cmsgid), ap);
455   fprintf (stderr, ": %s\n", xstrerror (e));
456   va_end (ap);
457
458   collect_exit (FATAL_EXIT_CODE);
459 }
460
461 /* Just die.  */
462
463 void
464 fatal (const char * cmsgid, ...)
465 {
466   va_list ap;
467
468   va_start (ap, cmsgid);
469   fprintf (stderr, "collect2: ");
470   vfprintf (stderr, _(cmsgid), ap);
471   fprintf (stderr, "\n");
472   va_end (ap);
473
474   collect_exit (FATAL_EXIT_CODE);
475 }
476
477 /* Write error message.  */
478
479 void
480 error (const char * gmsgid, ...)
481 {
482   va_list ap;
483
484   va_start (ap, gmsgid);
485   fprintf (stderr, "collect2: ");
486   vfprintf (stderr, _(gmsgid), ap);
487   fprintf (stderr, "\n");
488   va_end(ap);
489 }
490
491 /* In case obstack is linked in, and abort is defined to fancy_abort,
492    provide a default entry.  */
493
494 void
495 fancy_abort (const char *file, int line, const char *func)
496 {
497   fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
498 }
499 \f
500 static void
501 handler (int signo)
502 {
503   if (c_file != 0 && c_file[0])
504     maybe_unlink (c_file);
505
506   if (o_file != 0 && o_file[0])
507     maybe_unlink (o_file);
508
509   if (ldout != 0 && ldout[0])
510     maybe_unlink (ldout);
511
512   if (lderrout != 0 && lderrout[0])
513     maybe_unlink (lderrout);
514
515 #ifdef COLLECT_EXPORT_LIST
516   if (export_file != 0 && export_file[0])
517     maybe_unlink (export_file);
518 #endif
519
520   if (lto_o_files)
521     maybe_unlink_list (lto_o_files);
522
523   if (response_file)
524     maybe_unlink (response_file);
525
526   signal (signo, SIG_DFL);
527   raise (signo);
528 }
529
530 \f
531 int
532 file_exists (const char *name)
533 {
534   return access (name, R_OK) == 0;
535 }
536
537 /* Parse a reasonable subset of shell quoting syntax.  */
538
539 static char *
540 extract_string (const char **pp)
541 {
542   const char *p = *pp;
543   int backquote = 0;
544   int inside = 0;
545
546   for (;;)
547     {
548       char c = *p;
549       if (c == '\0')
550         break;
551       ++p;
552       if (backquote)
553         obstack_1grow (&temporary_obstack, c);
554       else if (! inside && c == ' ')
555         break;
556       else if (! inside && c == '\\')
557         backquote = 1;
558       else if (c == '\'')
559         inside = !inside;
560       else
561         obstack_1grow (&temporary_obstack, c);
562     }
563
564   obstack_1grow (&temporary_obstack, '\0');
565   *pp = p;
566   return XOBFINISH (&temporary_obstack, char *);
567 }
568 \f
569 void
570 dump_file (const char *name, FILE *to)
571 {
572   FILE *stream = fopen (name, "r");
573
574   if (stream == 0)
575     return;
576   while (1)
577     {
578       int c;
579       while (c = getc (stream),
580              c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
581         obstack_1grow (&temporary_obstack, c);
582       if (obstack_object_size (&temporary_obstack) > 0)
583         {
584           const char *word, *p;
585           char *result;
586           obstack_1grow (&temporary_obstack, '\0');
587           word = XOBFINISH (&temporary_obstack, const char *);
588
589           if (*word == '.')
590             ++word, putc ('.', to);
591           p = word;
592           if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
593             p += strlen (USER_LABEL_PREFIX);
594
595 #ifdef HAVE_LD_DEMANGLE
596           result = 0;
597 #else
598           if (no_demangle)
599             result = 0;
600           else
601             result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
602 #endif
603
604           if (result)
605             {
606               int diff;
607               fputs (result, to);
608
609               diff = strlen (word) - strlen (result);
610               while (diff > 0 && c == ' ')
611                 --diff, putc (' ', to);
612               if (diff < 0 && c == ' ')
613                 {
614                   while (diff < 0 && c == ' ')
615                     ++diff, c = getc (stream);
616                   if (!ISSPACE (c))
617                     {
618                       /* Make sure we output at least one space, or
619                          the demangled symbol name will run into
620                          whatever text follows.  */
621                       putc (' ', to);
622                     }
623                 }
624
625               free (result);
626             }
627           else
628             fputs (word, to);
629
630           fflush (to);
631           obstack_free (&temporary_obstack, temporary_firstobj);
632         }
633       if (c == EOF)
634         break;
635       putc (c, to);
636     }
637   fclose (stream);
638 }
639 \f
640 /* Return the kind of symbol denoted by name S.  */
641
642 static symkind
643 is_ctor_dtor (const char *s)
644 {
645   struct names { const char *const name; const int len; symkind ret;
646     const int two_underscores; };
647
648   const struct names *p;
649   int ch;
650   const char *orig_s = s;
651
652   static const struct names special[] = {
653 #ifndef NO_DOLLAR_IN_LABEL
654     { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
655     { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
656 #else
657 #ifndef NO_DOT_IN_LABEL
658     { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
659     { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
660 #endif /* NO_DOT_IN_LABEL */
661 #endif /* NO_DOLLAR_IN_LABEL */
662     { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
663     { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
664     { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
665     { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
666     { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
667     { NULL, 0, SYM_REGULAR, 0 }
668   };
669
670   while ((ch = *s) == '_')
671     ++s;
672
673   if (s == orig_s)
674     return SYM_REGULAR;
675
676   for (p = &special[0]; p->len > 0; p++)
677     {
678       if (ch == p->name[0]
679           && (!p->two_underscores || ((s - orig_s) >= 2))
680           && strncmp(s, p->name, p->len) == 0)
681         {
682           return p->ret;
683         }
684     }
685   return SYM_REGULAR;
686 }
687 \f
688 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
689    and one from the PATH variable.  */
690
691 static struct path_prefix cpath, path;
692
693 #ifdef CROSS_DIRECTORY_STRUCTURE
694 /* This is the name of the target machine.  We use it to form the name
695    of the files to execute.  */
696
697 static const char *const target_machine = TARGET_MACHINE;
698 #endif
699
700 /* Search for NAME using prefix list PPREFIX.  We only look for executable
701    files.
702
703    Return 0 if not found, otherwise return its name, allocated with malloc.  */
704
705 static char *
706 find_a_file (struct path_prefix *pprefix, const char *name)
707 {
708   char *temp;
709   struct prefix_list *pl;
710   int len = pprefix->max_len + strlen (name) + 1;
711
712   if (debug)
713     fprintf (stderr, "Looking for '%s'\n", name);
714
715 #ifdef HOST_EXECUTABLE_SUFFIX
716   len += strlen (HOST_EXECUTABLE_SUFFIX);
717 #endif
718
719   temp = XNEWVEC (char, len);
720
721   /* Determine the filename to execute (special case for absolute paths).  */
722
723   if (IS_ABSOLUTE_PATH (name))
724     {
725       if (access (name, X_OK) == 0)
726         {
727           strcpy (temp, name);
728
729           if (debug)
730             fprintf (stderr, "  - found: absolute path\n");
731
732           return temp;
733         }
734
735 #ifdef HOST_EXECUTABLE_SUFFIX
736         /* Some systems have a suffix for executable files.
737            So try appending that.  */
738       strcpy (temp, name);
739         strcat (temp, HOST_EXECUTABLE_SUFFIX);
740
741         if (access (temp, X_OK) == 0)
742           return temp;
743 #endif
744
745       if (debug)
746         fprintf (stderr, "  - failed to locate using absolute path\n");
747     }
748   else
749     for (pl = pprefix->plist; pl; pl = pl->next)
750       {
751         struct stat st;
752
753         strcpy (temp, pl->prefix);
754         strcat (temp, name);
755
756         if (stat (temp, &st) >= 0
757             && ! S_ISDIR (st.st_mode)
758             && access (temp, X_OK) == 0)
759           return temp;
760
761 #ifdef HOST_EXECUTABLE_SUFFIX
762         /* Some systems have a suffix for executable files.
763            So try appending that.  */
764         strcat (temp, HOST_EXECUTABLE_SUFFIX);
765
766         if (stat (temp, &st) >= 0
767             && ! S_ISDIR (st.st_mode)
768             && access (temp, X_OK) == 0)
769           return temp;
770 #endif
771       }
772
773   if (debug && pprefix->plist == NULL)
774     fprintf (stderr, "  - failed: no entries in prefix list\n");
775
776   free (temp);
777   return 0;
778 }
779
780 /* Add an entry for PREFIX to prefix list PPREFIX.  */
781
782 static void
783 add_prefix (struct path_prefix *pprefix, const char *prefix)
784 {
785   struct prefix_list *pl, **prev;
786   int len;
787
788   if (pprefix->plist)
789     {
790       for (pl = pprefix->plist; pl->next; pl = pl->next)
791         ;
792       prev = &pl->next;
793     }
794   else
795     prev = &pprefix->plist;
796
797   /* Keep track of the longest prefix.  */
798
799   len = strlen (prefix);
800   if (len > pprefix->max_len)
801     pprefix->max_len = len;
802
803   pl = XNEW (struct prefix_list);
804   pl->prefix = xstrdup (prefix);
805
806   if (*prev)
807     pl->next = *prev;
808   else
809     pl->next = (struct prefix_list *) 0;
810   *prev = pl;
811 }
812 \f
813 /* Take the value of the environment variable ENV, break it into a path, and
814    add of the entries to PPREFIX.  */
815
816 static void
817 prefix_from_env (const char *env, struct path_prefix *pprefix)
818 {
819   const char *p;
820   GET_ENVIRONMENT (p, env);
821
822   if (p)
823     prefix_from_string (p, pprefix);
824 }
825
826 static void
827 prefix_from_string (const char *p, struct path_prefix *pprefix)
828 {
829   const char *startp, *endp;
830   char *nstore = XNEWVEC (char, strlen (p) + 3);
831
832   if (debug)
833     fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR);
834
835   startp = endp = p;
836   while (1)
837     {
838       if (*endp == PATH_SEPARATOR || *endp == 0)
839         {
840           strncpy (nstore, startp, endp-startp);
841           if (endp == startp)
842             {
843               strcpy (nstore, "./");
844             }
845           else if (! IS_DIR_SEPARATOR (endp[-1]))
846             {
847               nstore[endp-startp] = DIR_SEPARATOR;
848               nstore[endp-startp+1] = 0;
849             }
850           else
851             nstore[endp-startp] = 0;
852
853           if (debug)
854             fprintf (stderr, "  - add prefix: %s\n", nstore);
855
856           add_prefix (pprefix, nstore);
857           if (*endp == 0)
858             break;
859           endp = startp = endp + 1;
860         }
861       else
862         endp++;
863     }
864   free (nstore);
865 }
866
867 #ifdef OBJECT_FORMAT_NONE
868
869 /* Add an entry for the object file NAME to object file list LIST.
870    New entries are added at the end of the list. The original pointer
871    value of NAME is preserved, i.e., no string copy is performed.  */
872
873 static void
874 add_lto_object (struct lto_object_list *list, const char *name)
875 {
876   struct lto_object *n = XNEW (struct lto_object);
877   n->name = name;
878   n->next = NULL;
879
880   if (list->last)
881     list->last->next = n;
882   else
883     list->first = n;
884
885   list->last = n;
886 }
887 #endif /* OBJECT_FORMAT_NONE */
888
889
890 /* Perform a link-time recompilation and relink if any of the object
891    files contain LTO info.  The linker command line LTO_LD_ARGV
892    represents the linker command that would produce a final executable
893    without the use of LTO. OBJECT_LST is a vector of object file names
894    appearing in LTO_LD_ARGV that are to be considerd for link-time
895    recompilation, where OBJECT is a pointer to the last valid element.
896    (This awkward convention avoids an impedance mismatch with the
897    usage of similarly-named variables in main().)  The elements of
898    OBJECT_LST must be identical, i.e., pointer equal, to the
899    corresponding arguments in LTO_LD_ARGV.
900
901    Upon entry, at least one linker run has been performed without the
902    use of any LTO info that might be present.  Any recompilations
903    necessary for template instantiations have been performed, and
904    initializer/finalizer tables have been created if needed and
905    included in the linker command line LTO_LD_ARGV. If any of the
906    object files contain LTO info, we run the LTO back end on all such
907    files, and perform the final link with the LTO back end output
908    substituted for the LTO-optimized files.  In some cases, a final
909    link with all link-time generated code has already been performed,
910    so there is no need to relink if no LTO info is found.  In other
911    cases, our caller has not produced the final executable, and is
912    relying on us to perform the required link whether LTO info is
913    present or not.  In that case, the FORCE argument should be true.
914    Note that the linker command line argument LTO_LD_ARGV passed into
915    this function may be modified in place.  */
916
917 static void
918 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
919                           const char **object, bool force)
920 {
921   const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
922
923   int num_lto_c_args = 1;    /* Allow space for the terminating NULL.  */
924
925   while (object_file < object)
926   {
927     /* If file contains LTO info, add it to the list of LTO objects.  */
928     scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
929
930     /* Increment the argument count by the number of object file arguments
931        we will add.  An upper bound suffices, so just count all of the
932        object files regardless of whether they contain LTO info.  */
933     num_lto_c_args++;
934   }
935
936   if (lto_objects.first)
937     {
938       const char *opts;
939       char **lto_c_argv;
940       const char **lto_c_ptr;
941       const char *cp;
942       const char **p, **q, **r;
943       const char **lto_o_ptr;
944       struct lto_object *list;
945       char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
946       struct pex_obj *pex;
947       const char *prog = "lto-wrapper";
948
949       if (!lto_wrapper)
950         fatal ("COLLECT_LTO_WRAPPER must be set.");
951
952       /* There is at least one object file containing LTO info,
953          so we need to run the LTO back end and relink.  */
954
955       /* Get compiler options passed down from the parent `gcc' command.
956          These must be passed to the LTO back end.  */
957       opts = getenv ("COLLECT_GCC_OPTIONS");
958
959       /* Increment the argument count by the number of inherited options.
960          Some arguments may be filtered out later.  Again, an upper bound
961          suffices.  */
962
963       cp = opts;
964
965       while (cp && *cp)
966         {
967           extract_string (&cp);
968           num_lto_c_args++;
969         }
970       obstack_free (&temporary_obstack, temporary_firstobj);
971
972       if (debug)
973         num_lto_c_args++;
974
975       /* Increment the argument count by the number of initial
976          arguments added below.  */
977       num_lto_c_args += 9;
978
979       lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
980       lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
981
982       *lto_c_ptr++ = lto_wrapper;
983       *lto_c_ptr++ = c_file_name;
984
985       cp = opts;
986
987       while (cp && *cp)
988         {
989           const char *s = extract_string (&cp);
990
991           /* Pass the option or argument to the wrapper.  */
992           *lto_c_ptr++ = xstrdup (s);
993         }
994       obstack_free (&temporary_obstack, temporary_firstobj);
995
996       if (debug)
997         *lto_c_ptr++ = xstrdup ("-debug");
998
999       /* Add LTO objects to the wrapper command line.  */
1000       for (list = lto_objects.first; list; list = list->next)
1001         *lto_c_ptr++ = list->name;
1002
1003       *lto_c_ptr = NULL;
1004
1005       /* Save intermediate WPA files in lto1 if debug.  */
1006       if (debug)
1007         putenv (xstrdup ("WPA_SAVE_LTRANS=1"));
1008
1009       /* Run the LTO back end.  */
1010       pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
1011       {
1012         int c;
1013         FILE *stream;
1014         size_t i, num_files;
1015         char *start, *end;
1016
1017         stream = pex_read_output (pex, 0);
1018         gcc_assert (stream);
1019
1020         num_files = 0;
1021         while ((c = getc (stream)) != EOF)
1022           {
1023             obstack_1grow (&temporary_obstack, c);
1024             if (c == '\n')
1025               ++num_files;
1026           }
1027
1028         lto_o_files = XNEWVEC (char *, num_files + 1);
1029         lto_o_files[num_files] = NULL;
1030         start = XOBFINISH (&temporary_obstack, char *);
1031         for (i = 0; i < num_files; ++i)
1032           {
1033             end = start;
1034             while (*end != '\n')
1035               ++end;
1036             *end = '\0';
1037
1038             lto_o_files[i] = xstrdup (start);
1039
1040             start = end + 1;
1041           }
1042
1043         obstack_free (&temporary_obstack, temporary_firstobj);
1044       }
1045       do_wait (prog, pex);
1046       pex = NULL;
1047
1048       /* After running the LTO back end, we will relink, substituting
1049          the LTO output for the object files that we submitted to the
1050          LTO. Here, we modify the linker command line for the relink.  */
1051       p = CONST_CAST2 (const char **, char **, lto_ld_argv);
1052       lto_o_ptr = CONST_CAST2 (const char **, char **, lto_o_files);
1053
1054       while (*p != NULL)
1055         {
1056           for (list = lto_objects.first; list; list = list->next)
1057             {
1058               if (*p == list->name) /* Note test for pointer equality!  */
1059                 {
1060                   /* Excise argument from linker command line.  */
1061                   if (*lto_o_ptr)
1062                     {
1063                       /* Replace first argument with LTO output file.  */
1064                       *p++ = *lto_o_ptr++;
1065                     }
1066                   else
1067                     {
1068                       /* Move following arguments one position earlier,
1069                          overwriting the current argument.  */
1070                       q = p;
1071                       r = p + 1;
1072                       while (*r != NULL)
1073                         *q++ = *r++;
1074                       *q = NULL;
1075                     }
1076
1077                   /* No need to continue searching the LTO object list.  */
1078                   break;
1079                 }
1080             }
1081
1082           /* If we didn't find a match, move on to the next argument.
1083              Otherwise, P has been set to the correct argument position
1084              at which to continue.  */
1085           if (!list) ++p;
1086         }
1087
1088       /* The code above assumes we will never have more lto output files than
1089          input files.  Otherwise, we need to resize lto_ld_argv.  Check this
1090          assumption.  */
1091       if (*lto_o_ptr)
1092         fatal ("too many lto output files");
1093
1094       /* Run the linker again, this time replacing the object files
1095          optimized by the LTO with the temporary file generated by the LTO.  */
1096       fork_execute ("ld", lto_ld_argv);
1097
1098       maybe_unlink_list (lto_o_files);
1099     }
1100   else if (force)
1101     {
1102       /* Our caller is relying on us to do the link
1103          even though there is no LTO back end work to be done.  */
1104       fork_execute  ("ld", lto_ld_argv);
1105     }
1106 }
1107 \f
1108 /* Main program.  */
1109
1110 int
1111 main (int argc, char **argv)
1112 {
1113   static const char *const ld_suffix    = "ld";
1114   static const char *const plugin_ld_suffix = PLUGIN_LD;
1115   static const char *const real_ld_suffix = "real-ld";
1116   static const char *const collect_ld_suffix = "collect-ld";
1117   static const char *const nm_suffix    = "nm";
1118   static const char *const gnm_suffix   = "gnm";
1119 #ifdef LDD_SUFFIX
1120   static const char *const ldd_suffix   = LDD_SUFFIX;
1121 #endif
1122   static const char *const strip_suffix = "strip";
1123   static const char *const gstrip_suffix = "gstrip";
1124
1125 #ifdef CROSS_DIRECTORY_STRUCTURE
1126   /* If we look for a program in the compiler directories, we just use
1127      the short name, since these directories are already system-specific.
1128      But it we look for a program in the system directories, we need to
1129      qualify the program name with the target machine.  */
1130
1131   const char *const full_ld_suffix =
1132     concat(target_machine, "-", ld_suffix, NULL);
1133   const char *const full_plugin_ld_suffix =
1134     concat(target_machine, "-", plugin_ld_suffix, NULL);
1135   const char *const full_nm_suffix =
1136     concat (target_machine, "-", nm_suffix, NULL);
1137   const char *const full_gnm_suffix =
1138     concat (target_machine, "-", gnm_suffix, NULL);
1139 #ifdef LDD_SUFFIX
1140   const char *const full_ldd_suffix =
1141     concat (target_machine, "-", ldd_suffix, NULL);
1142 #endif
1143   const char *const full_strip_suffix =
1144     concat (target_machine, "-", strip_suffix, NULL);
1145   const char *const full_gstrip_suffix =
1146     concat (target_machine, "-", gstrip_suffix, NULL);
1147 #else
1148   const char *const full_ld_suffix      = ld_suffix;
1149   const char *const full_plugin_ld_suffix = plugin_ld_suffix;
1150   const char *const full_nm_suffix      = nm_suffix;
1151   const char *const full_gnm_suffix     = gnm_suffix;
1152 #ifdef LDD_SUFFIX
1153   const char *const full_ldd_suffix     = ldd_suffix;
1154 #endif
1155   const char *const full_strip_suffix   = strip_suffix;
1156   const char *const full_gstrip_suffix  = gstrip_suffix;
1157 #endif /* CROSS_DIRECTORY_STRUCTURE */
1158
1159   const char *arg;
1160   FILE *outf;
1161 #ifdef COLLECT_EXPORT_LIST
1162   FILE *exportf;
1163 #endif
1164   const char *ld_file_name;
1165   const char *p;
1166   char **c_argv;
1167   const char **c_ptr;
1168   char **ld1_argv;
1169   const char **ld1;
1170   bool use_plugin = false;
1171
1172   /* The kinds of symbols we will have to consider when scanning the
1173      outcome of a first pass link.  This is ALL to start with, then might
1174      be adjusted before getting to the first pass link per se, typically on
1175      AIX where we perform an early scan of objects and libraries to fetch
1176      the list of global ctors/dtors and make sure they are not garbage
1177      collected.  */
1178   scanfilter ld1_filter = SCAN_ALL;
1179
1180   char **ld2_argv;
1181   const char **ld2;
1182   char **object_lst;
1183   const char **object;
1184   int first_file;
1185   int num_c_args;
1186   char **old_argv;
1187
1188   bool use_verbose = false;
1189
1190   old_argv = argv;
1191   expandargv (&argc, &argv);
1192   if (argv != old_argv)
1193     at_file_supplied = 1;
1194
1195   num_c_args = argc + 9;
1196
1197   no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
1198
1199   /* Suppress demangling by the real linker, which may be broken.  */
1200   putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1201
1202 #if defined (COLLECT2_HOST_INITIALIZATION)
1203   /* Perform system dependent initialization, if necessary.  */
1204   COLLECT2_HOST_INITIALIZATION;
1205 #endif
1206
1207 #ifdef SIGCHLD
1208   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1209      receive the signal.  A different setting is inheritable */
1210   signal (SIGCHLD, SIG_DFL);
1211 #endif
1212
1213   /* Unlock the stdio streams.  */
1214   unlock_std_streams ();
1215
1216   gcc_init_libintl ();
1217
1218   /* Do not invoke xcalloc before this point, since locale needs to be
1219      set first, in case a diagnostic is issued.  */
1220
1221   ld1_argv = XCNEWVEC (char *, argc + 4);
1222   ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
1223   ld2_argv = XCNEWVEC (char *, argc + 11);
1224   ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
1225   object_lst = XCNEWVEC (char *, argc);
1226   object = CONST_CAST2 (const char **, char **, object_lst);
1227
1228 #ifdef DEBUG
1229   debug = 1;
1230 #endif
1231
1232   /* Parse command line early for instances of -debug.  This allows
1233      the debug flag to be set before functions like find_a_file()
1234      are called.  We also look for the -flto or -fwhopr flag to know
1235      what LTO mode we are in.  */
1236   {
1237     int i;
1238
1239     for (i = 1; argv[i] != NULL; i ++)
1240       {
1241         if (! strcmp (argv[i], "-debug"))
1242           debug = 1;
1243         else if (! strcmp (argv[i], "-flto") && ! use_plugin)
1244           {
1245             use_verbose = true;
1246             lto_mode = LTO_MODE_LTO;
1247           }
1248         else if (! strcmp (argv[i], "-fwhopr") && ! use_plugin)
1249           {
1250             use_verbose = true;
1251             lto_mode = LTO_MODE_WHOPR;
1252           }
1253         else if (! strcmp (argv[i], "-plugin"))
1254           {
1255             use_plugin = true;
1256             use_verbose = true;
1257             lto_mode = LTO_MODE_NONE;
1258           }
1259 #ifdef COLLECT_EXPORT_LIST
1260         /* since -brtl, -bexport, -b64 are not position dependent
1261            also check for them here */
1262         if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1263           {
1264             arg = argv[i];
1265             /* We want to disable automatic exports on AIX when user
1266                explicitly puts an export list in command line */
1267             if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1268               export_flag = 1;
1269             else if (arg[2] == '6' && arg[3] == '4')
1270               aix64_flag = 1;
1271             else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1272               aixrtl_flag = 1;
1273           }
1274 #endif
1275       }
1276     vflag = debug;
1277   }
1278
1279 #ifndef DEFAULT_A_OUT_NAME
1280   output_file = "a.out";
1281 #else
1282   output_file = DEFAULT_A_OUT_NAME;
1283 #endif
1284
1285   obstack_begin (&temporary_obstack, 0);
1286   temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1287
1288 #ifndef HAVE_LD_DEMANGLE
1289   current_demangling_style = auto_demangling;
1290 #endif
1291   p = getenv ("COLLECT_GCC_OPTIONS");
1292   while (p && *p)
1293     {
1294       const char *q = extract_string (&p);
1295       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1296         num_c_args++;
1297     }
1298   obstack_free (&temporary_obstack, temporary_firstobj);
1299
1300   /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1301      -fno-exceptions -w -fno-whole-program */
1302   num_c_args += 6;
1303
1304   c_argv = XCNEWVEC (char *, num_c_args);
1305   c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1306
1307   if (argc < 2)
1308     fatal ("no arguments");
1309
1310 #ifdef SIGQUIT
1311   if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1312     signal (SIGQUIT, handler);
1313 #endif
1314   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1315     signal (SIGINT, handler);
1316 #ifdef SIGALRM
1317   if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1318     signal (SIGALRM, handler);
1319 #endif
1320 #ifdef SIGHUP
1321   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1322     signal (SIGHUP, handler);
1323 #endif
1324   if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1325     signal (SIGSEGV, handler);
1326 #ifdef SIGBUS
1327   if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1328     signal (SIGBUS, handler);
1329 #endif
1330
1331   /* Extract COMPILER_PATH and PATH into our prefix list.  */
1332   prefix_from_env ("COMPILER_PATH", &cpath);
1333   prefix_from_env ("PATH", &path);
1334
1335   /* Try to discover a valid linker/nm/strip to use.  */
1336
1337   /* Maybe we know the right file to use (if not cross).  */
1338   ld_file_name = 0;
1339 #ifdef DEFAULT_LINKER
1340   if (access (DEFAULT_LINKER, X_OK) == 0)
1341     ld_file_name = DEFAULT_LINKER;
1342   if (ld_file_name == 0)
1343 #endif
1344 #ifdef REAL_LD_FILE_NAME
1345   ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1346   if (ld_file_name == 0)
1347 #endif
1348   /* Search the (target-specific) compiler dirs for ld'.  */
1349   ld_file_name = find_a_file (&cpath, real_ld_suffix);
1350   /* Likewise for `collect-ld'.  */
1351   if (ld_file_name == 0)
1352     ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1353   /* Search the compiler directories for `ld'.  We have protection against
1354      recursive calls in find_a_file.  */
1355   if (ld_file_name == 0)
1356     ld_file_name = find_a_file (&cpath,
1357                                 use_plugin
1358                                 ? plugin_ld_suffix
1359                                 : ld_suffix);
1360   /* Search the ordinary system bin directories
1361      for `ld' (if native linking) or `TARGET-ld' (if cross).  */
1362   if (ld_file_name == 0)
1363     ld_file_name = find_a_file (&path,
1364                                 use_plugin
1365                                 ? full_plugin_ld_suffix
1366                                 : full_ld_suffix);
1367
1368 #ifdef REAL_NM_FILE_NAME
1369   nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1370   if (nm_file_name == 0)
1371 #endif
1372   nm_file_name = find_a_file (&cpath, gnm_suffix);
1373   if (nm_file_name == 0)
1374     nm_file_name = find_a_file (&path, full_gnm_suffix);
1375   if (nm_file_name == 0)
1376     nm_file_name = find_a_file (&cpath, nm_suffix);
1377   if (nm_file_name == 0)
1378     nm_file_name = find_a_file (&path, full_nm_suffix);
1379
1380 #ifdef LDD_SUFFIX
1381   ldd_file_name = find_a_file (&cpath, ldd_suffix);
1382   if (ldd_file_name == 0)
1383     ldd_file_name = find_a_file (&path, full_ldd_suffix);
1384 #endif
1385
1386 #ifdef REAL_STRIP_FILE_NAME
1387   strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1388   if (strip_file_name == 0)
1389 #endif
1390   strip_file_name = find_a_file (&cpath, gstrip_suffix);
1391   if (strip_file_name == 0)
1392     strip_file_name = find_a_file (&path, full_gstrip_suffix);
1393   if (strip_file_name == 0)
1394     strip_file_name = find_a_file (&cpath, strip_suffix);
1395   if (strip_file_name == 0)
1396     strip_file_name = find_a_file (&path, full_strip_suffix);
1397
1398   /* Determine the full path name of the C compiler to use.  */
1399   c_file_name = getenv ("COLLECT_GCC");
1400   if (c_file_name == 0)
1401     {
1402 #ifdef CROSS_DIRECTORY_STRUCTURE
1403       c_file_name = concat (target_machine, "-gcc", NULL);
1404 #else
1405       c_file_name = "gcc";
1406 #endif
1407     }
1408
1409   p = find_a_file (&cpath, c_file_name);
1410
1411   /* Here it should be safe to use the system search path since we should have
1412      already qualified the name of the compiler when it is needed.  */
1413   if (p == 0)
1414     p = find_a_file (&path, c_file_name);
1415
1416   if (p)
1417     c_file_name = p;
1418
1419   *ld1++ = *ld2++ = ld_file_name;
1420
1421   /* Make temp file names.  */
1422   c_file = make_temp_file (".c");
1423   o_file = make_temp_file (".o");
1424 #ifdef COLLECT_EXPORT_LIST
1425   export_file = make_temp_file (".x");
1426 #endif
1427   ldout = make_temp_file (".ld");
1428   lderrout = make_temp_file (".le");
1429   *c_ptr++ = c_file_name;
1430   *c_ptr++ = "-x";
1431   *c_ptr++ = "c";
1432   *c_ptr++ = "-c";
1433   *c_ptr++ = "-o";
1434   *c_ptr++ = o_file;
1435
1436 #ifdef COLLECT_EXPORT_LIST
1437   /* Generate a list of directories from LIBPATH.  */
1438   prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1439   /* Add to this list also two standard directories where
1440      AIX loader always searches for libraries.  */
1441   add_prefix (&libpath_lib_dirs, "/lib");
1442   add_prefix (&libpath_lib_dirs, "/usr/lib");
1443 #endif
1444
1445   /* Get any options that the upper GCC wants to pass to the sub-GCC.
1446
1447      AIX support needs to know if -shared has been specified before
1448      parsing commandline arguments.  */
1449
1450   p = getenv ("COLLECT_GCC_OPTIONS");
1451   while (p && *p)
1452     {
1453       const char *q = extract_string (&p);
1454       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1455         *c_ptr++ = xstrdup (q);
1456       if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1457         *c_ptr++ = xstrdup (q);
1458       if (strcmp (q, "-shared") == 0)
1459         shared_obj = 1;
1460       if (*q == '-' && q[1] == 'B')
1461         {
1462           *c_ptr++ = xstrdup (q);
1463           if (q[2] == 0)
1464             {
1465               q = extract_string (&p);
1466               *c_ptr++ = xstrdup (q);
1467             }
1468         }
1469       if (use_verbose && *q == '-' && q[1] == 'v' && q[2] == 0)
1470         {
1471           /* Turn on trace in collect2 if needed.  */
1472           vflag = 1;
1473         }
1474     }
1475   obstack_free (&temporary_obstack, temporary_firstobj);
1476   *c_ptr++ = "-fno-profile-arcs";
1477   *c_ptr++ = "-fno-test-coverage";
1478   *c_ptr++ = "-fno-branch-probabilities";
1479   *c_ptr++ = "-fno-exceptions";
1480   *c_ptr++ = "-w";
1481   *c_ptr++ = "-fno-whole-program";
1482
1483   /* !!! When GCC calls collect2,
1484      it does not know whether it is calling collect2 or ld.
1485      So collect2 cannot meaningfully understand any options
1486      except those ld understands.
1487      If you propose to make GCC pass some other option,
1488      just imagine what will happen if ld is really ld!!!  */
1489
1490   /* Parse arguments.  Remember output file spec, pass the rest to ld.  */
1491   /* After the first file, put in the c++ rt0.  */
1492
1493   first_file = 1;
1494 #ifdef HAVE_LD_DEMANGLE
1495   if (!demangle_flag && !no_demangle)
1496     demangle_flag = "--demangle";
1497   if (demangle_flag)
1498     *ld1++ = *ld2++ = demangle_flag;
1499 #endif
1500   while ((arg = *++argv) != (char *) 0)
1501     {
1502       *ld1++ = *ld2++ = arg;
1503
1504       if (arg[0] == '-')
1505         {
1506           switch (arg[1])
1507             {
1508             case 'd':
1509               if (!strcmp (arg, "-debug"))
1510                 {
1511                   /* Already parsed.  */
1512                   ld1--;
1513                   ld2--;
1514                 }
1515               if (!strcmp (arg, "-dynamic-linker") && argv[1])
1516                 {
1517                   ++argv;
1518                   *ld1++ = *ld2++ = *argv;
1519                 }
1520               break;
1521
1522             case 'f':
1523               if (strcmp (arg, "-flto") == 0 || strcmp (arg, "-fwhopr") == 0)
1524                 {
1525 #ifdef ENABLE_LTO
1526                   /* Do not pass LTO flag to the linker. */
1527                   ld1--;
1528                   ld2--;
1529 #else
1530                   error ("LTO support has not been enabled in this "
1531                          "configuration");
1532 #endif
1533                 }
1534               break;
1535
1536             case 'l':
1537               if (first_file)
1538                 {
1539                   /* place o_file BEFORE this argument! */
1540                   first_file = 0;
1541                   ld2--;
1542                   *ld2++ = o_file;
1543                   *ld2++ = arg;
1544                 }
1545 #ifdef COLLECT_EXPORT_LIST
1546               {
1547                 /* Resolving full library name.  */
1548                 const char *s = resolve_lib_name (arg+2);
1549
1550                 /* Saving a full library name.  */
1551                 add_to_list (&libs, s);
1552               }
1553 #endif
1554               break;
1555
1556 #ifdef COLLECT_EXPORT_LIST
1557             /* Saving directories where to search for libraries.  */
1558             case 'L':
1559               add_prefix (&cmdline_lib_dirs, arg+2);
1560               break;
1561 #else
1562 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1563             case 'L':
1564               if (is_in_args (arg,
1565                               CONST_CAST2 (const char **, char **, ld1_argv),
1566                               ld1 - 1))
1567                 --ld1;
1568               break;
1569 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1570 #endif
1571
1572             case 'o':
1573               if (arg[2] == '\0')
1574                 output_file = *ld1++ = *ld2++ = *++argv;
1575               else if (1
1576 #ifdef SWITCHES_NEED_SPACES
1577                        && ! strchr (SWITCHES_NEED_SPACES, arg[1])
1578 #endif
1579                        )
1580
1581                 output_file = &arg[2];
1582               break;
1583
1584             case 'r':
1585               if (arg[2] == '\0')
1586                 rflag = 1;
1587               break;
1588
1589             case 's':
1590               if (arg[2] == '\0' && do_collecting)
1591                 {
1592                   /* We must strip after the nm run, otherwise C++ linking
1593                      will not work.  Thus we strip in the second ld run, or
1594                      else with strip if there is no second ld run.  */
1595                   strip_flag = 1;
1596                   ld1--;
1597                 }
1598               break;
1599
1600             case 'v':
1601               if (arg[2] == '\0')
1602                 vflag = 1;
1603               break;
1604
1605             case '-':
1606               if (strcmp (arg, "--no-demangle") == 0)
1607                 {
1608                   demangle_flag = arg;
1609                   no_demangle = 1;
1610                   ld1--;
1611                   ld2--;
1612                 }
1613               else if (strncmp (arg, "--demangle", 10) == 0)
1614                 {
1615                   demangle_flag = arg;
1616                   no_demangle = 0;
1617 #ifndef HAVE_LD_DEMANGLE
1618                   if (arg[10] == '=')
1619                     {
1620                       enum demangling_styles style
1621                         = cplus_demangle_name_to_style (arg+11);
1622                       if (style == unknown_demangling)
1623                         error ("unknown demangling style '%s'", arg+11);
1624                       else
1625                         current_demangling_style = style;
1626                     }
1627 #endif
1628                   ld1--;
1629                   ld2--;
1630                 }
1631               else if (strncmp (arg, "--sysroot=", 10) == 0)
1632                 target_system_root = arg + 10;
1633               break;
1634             }
1635         }
1636       else if ((p = strrchr (arg, '.')) != (char *) 0
1637                && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1638                    || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1639                    || strcmp (p, ".obj") == 0))
1640         {
1641           if (first_file)
1642             {
1643               first_file = 0;
1644               if (p[1] == 'o')
1645                 *ld2++ = o_file;
1646               else
1647                 {
1648                   /* place o_file BEFORE this argument! */
1649                   ld2--;
1650                   *ld2++ = o_file;
1651                   *ld2++ = arg;
1652                 }
1653             }
1654           if (p[1] == 'o' || p[1] == 'l')
1655             *object++ = arg;
1656 #ifdef COLLECT_EXPORT_LIST
1657           /* libraries can be specified directly, i.e. without -l flag.  */
1658           else
1659             {
1660               /* Saving a full library name.  */
1661               add_to_list (&libs, arg);
1662             }
1663 #endif
1664         }
1665     }
1666
1667 #ifdef COLLECT_EXPORT_LIST
1668   /* This is added only for debugging purposes.  */
1669   if (debug)
1670     {
1671       fprintf (stderr, "List of libraries:\n");
1672       dump_list (stderr, "\t", libs.first);
1673     }
1674
1675   /* The AIX linker will discard static constructors in object files if
1676      nothing else in the file is referenced, so look at them first.  Unless
1677      we are building a shared object, ignore the eh frame tables, as we
1678      would otherwise reference them all, hence drag all the corresponding
1679      objects even if nothing else is referenced.  */
1680   {
1681     const char **export_object_lst
1682       = CONST_CAST2 (const char **, char **, object_lst);
1683
1684     struct id *list = libs.first;
1685
1686     /* Compute the filter to use from the current one, do scan, then adjust
1687        the "current" filter to remove what we just included here.  This will
1688        control whether we need a first pass link later on or not, and what
1689        will remain to be scanned there.  */
1690
1691     scanfilter this_filter = ld1_filter;
1692 #if HAVE_AS_REF
1693     if (!shared_obj)
1694       this_filter &= ~SCAN_DWEH;
1695 #endif
1696
1697     while (export_object_lst < object)
1698       scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1699
1700     for (; list; list = list->next)
1701       scan_prog_file (list->name, PASS_FIRST, this_filter);
1702
1703     ld1_filter = ld1_filter & ~this_filter;
1704   }
1705
1706   if (exports.first)
1707     {
1708       char *buf = concat ("-bE:", export_file, NULL);
1709
1710       *ld1++ = buf;
1711       *ld2++ = buf;
1712
1713       exportf = fopen (export_file, "w");
1714       if (exportf == (FILE *) 0)
1715         fatal_perror ("fopen %s", export_file);
1716       write_aix_file (exportf, exports.first);
1717       if (fclose (exportf))
1718         fatal_perror ("fclose %s", export_file);
1719     }
1720 #endif
1721
1722   *c_ptr++ = c_file;
1723   *c_ptr = *ld1 = *object = (char *) 0;
1724
1725   if (vflag)
1726     {
1727       notice ("collect2 version %s", version_string);
1728 #ifdef TARGET_VERSION
1729       TARGET_VERSION;
1730 #endif
1731       fprintf (stderr, "\n");
1732     }
1733
1734   if (debug)
1735     {
1736       const char *ptr;
1737       fprintf (stderr, "ld_file_name        = %s\n",
1738                (ld_file_name ? ld_file_name : "not found"));
1739       fprintf (stderr, "c_file_name         = %s\n",
1740                (c_file_name ? c_file_name : "not found"));
1741       fprintf (stderr, "nm_file_name        = %s\n",
1742                (nm_file_name ? nm_file_name : "not found"));
1743 #ifdef LDD_SUFFIX
1744       fprintf (stderr, "ldd_file_name       = %s\n",
1745                (ldd_file_name ? ldd_file_name : "not found"));
1746 #endif
1747       fprintf (stderr, "strip_file_name     = %s\n",
1748                (strip_file_name ? strip_file_name : "not found"));
1749       fprintf (stderr, "c_file              = %s\n",
1750                (c_file ? c_file : "not found"));
1751       fprintf (stderr, "o_file              = %s\n",
1752                (o_file ? o_file : "not found"));
1753
1754       ptr = getenv ("COLLECT_GCC_OPTIONS");
1755       if (ptr)
1756         fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1757
1758       ptr = getenv ("COLLECT_GCC");
1759       if (ptr)
1760         fprintf (stderr, "COLLECT_GCC         = %s\n", ptr);
1761
1762       ptr = getenv ("COMPILER_PATH");
1763       if (ptr)
1764         fprintf (stderr, "COMPILER_PATH       = %s\n", ptr);
1765
1766       ptr = getenv (LIBRARY_PATH_ENV);
1767       if (ptr)
1768         fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1769
1770       fprintf (stderr, "\n");
1771     }
1772
1773   /* Load the program, searching all libraries and attempting to provide
1774      undefined symbols from repository information.
1775
1776      If -r or they will be run via some other method, do not build the
1777      constructor or destructor list, just return now.  */
1778   {
1779     bool early_exit
1780       = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1781
1782     /* Perform the first pass link now, if we're about to exit or if we need
1783        to scan for things we haven't collected yet before pursuing further.
1784
1785        On AIX, the latter typically includes nothing for shared objects or
1786        frame tables for an executable, out of what the required early scan on
1787        objects and libraries has performed above.  In the !shared_obj case, we
1788        expect the relevant tables to be dragged together with their associated
1789        functions from precise cross reference insertions by the compiler.  */
1790
1791     if (early_exit || ld1_filter != SCAN_NOTHING)
1792       do_tlink (ld1_argv, object_lst);
1793
1794     if (early_exit)
1795       {
1796 #ifdef COLLECT_EXPORT_LIST
1797         /* Make sure we delete the export file we may have created.  */
1798         if (export_file != 0 && export_file[0])
1799           maybe_unlink (export_file);
1800 #endif
1801         if (lto_mode)
1802           maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1803
1804         maybe_unlink (c_file);
1805         maybe_unlink (o_file);
1806         return 0;
1807       }
1808   }
1809
1810   /* Unless we have done it all already, examine the namelist and search for
1811      static constructors and destructors to call.  Write the constructor and
1812      destructor tables to a .s file and reload.  */
1813
1814   if (ld1_filter != SCAN_NOTHING)
1815     scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1816
1817 #ifdef SCAN_LIBRARIES
1818   scan_libraries (output_file);
1819 #endif
1820
1821   if (debug)
1822     {
1823       notice_translated (ngettext ("%d constructor found\n",
1824                                    "%d constructors found\n",
1825                                    constructors.number),
1826                          constructors.number);
1827       notice_translated (ngettext ("%d destructor found\n",
1828                                    "%d destructors found\n",
1829                                    destructors.number),
1830                          destructors.number);
1831       notice_translated (ngettext("%d frame table found\n",
1832                                   "%d frame tables found\n",
1833                                   frame_tables.number),
1834                          frame_tables.number);
1835     }
1836
1837   /* If the scan exposed nothing of special interest, there's no need to
1838      generate the glue code and relink so return now.  */
1839
1840   if (constructors.number == 0 && destructors.number == 0
1841       && frame_tables.number == 0
1842 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1843       /* If we will be running these functions ourselves, we want to emit
1844          stubs into the shared library so that we do not have to relink
1845          dependent programs when we add static objects.  */
1846       && ! shared_obj
1847 #endif
1848       )
1849     {
1850       /* Do tlink without additional code generation now if we didn't
1851          do it earlier for scanning purposes.  */
1852       if (ld1_filter == SCAN_NOTHING)
1853         do_tlink (ld1_argv, object_lst);
1854
1855       if (lto_mode)
1856         maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1857
1858       /* Strip now if it was requested on the command line.  */
1859       if (strip_flag)
1860         {
1861           char **real_strip_argv = XCNEWVEC (char *, 3);
1862           const char ** strip_argv = CONST_CAST2 (const char **, char **,
1863                                                   real_strip_argv);
1864
1865           strip_argv[0] = strip_file_name;
1866           strip_argv[1] = output_file;
1867           strip_argv[2] = (char *) 0;
1868           fork_execute ("strip", real_strip_argv);
1869         }
1870
1871 #ifdef COLLECT_EXPORT_LIST
1872       maybe_unlink (export_file);
1873 #endif
1874       maybe_unlink (c_file);
1875       maybe_unlink (o_file);
1876       return 0;
1877     }
1878
1879   /* Sort ctor and dtor lists by priority.  */
1880   sort_ids (&constructors);
1881   sort_ids (&destructors);
1882
1883   maybe_unlink(output_file);
1884   outf = fopen (c_file, "w");
1885   if (outf == (FILE *) 0)
1886     fatal_perror ("fopen %s", c_file);
1887
1888   write_c_file (outf, c_file);
1889
1890   if (fclose (outf))
1891     fatal_perror ("fclose %s", c_file);
1892
1893   /* Tell the linker that we have initializer and finalizer functions.  */
1894 #ifdef LD_INIT_SWITCH
1895 #ifdef COLLECT_EXPORT_LIST
1896   *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1897 #else
1898   *ld2++ = LD_INIT_SWITCH;
1899   *ld2++ = initname;
1900   *ld2++ = LD_FINI_SWITCH;
1901   *ld2++ = fininame;
1902 #endif
1903 #endif
1904
1905 #ifdef COLLECT_EXPORT_LIST
1906   if (shared_obj)
1907     {
1908       /* If we did not add export flag to link arguments before, add it to
1909          second link phase now.  No new exports should have been added.  */
1910       if (! exports.first)
1911         *ld2++ = concat ("-bE:", export_file, NULL);
1912
1913 #ifndef LD_INIT_SWITCH
1914       add_to_list (&exports, initname);
1915       add_to_list (&exports, fininame);
1916       add_to_list (&exports, "_GLOBAL__DI");
1917       add_to_list (&exports, "_GLOBAL__DD");
1918 #endif
1919       exportf = fopen (export_file, "w");
1920       if (exportf == (FILE *) 0)
1921         fatal_perror ("fopen %s", export_file);
1922       write_aix_file (exportf, exports.first);
1923       if (fclose (exportf))
1924         fatal_perror ("fclose %s", export_file);
1925     }
1926 #endif
1927
1928   /* End of arguments to second link phase.  */
1929   *ld2 = (char*) 0;
1930
1931   if (debug)
1932     {
1933       fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1934                output_file, c_file);
1935       write_c_file (stderr, "stderr");
1936       fprintf (stderr, "========== end of c_file\n\n");
1937 #ifdef COLLECT_EXPORT_LIST
1938       fprintf (stderr, "\n========== export_file = %s\n", export_file);
1939       write_aix_file (stderr, exports.first);
1940       fprintf (stderr, "========== end of export_file\n\n");
1941 #endif
1942     }
1943
1944   /* Assemble the constructor and destructor tables.
1945      Link the tables in with the rest of the program.  */
1946
1947   fork_execute ("gcc",  c_argv);
1948 #ifdef COLLECT_EXPORT_LIST
1949   /* On AIX we must call tlink because of possible templates resolution.  */
1950   do_tlink (ld2_argv, object_lst);
1951
1952   if (lto_mode)
1953     maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1954 #else
1955   /* Otherwise, simply call ld because tlink is already done.  */
1956   if (lto_mode)
1957     maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1958   else
1959     fork_execute ("ld", ld2_argv);
1960
1961   /* Let scan_prog_file do any final mods (OSF/rose needs this for
1962      constructors/destructors in shared libraries.  */
1963   scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1964 #endif
1965
1966   maybe_unlink (c_file);
1967   maybe_unlink (o_file);
1968
1969 #ifdef COLLECT_EXPORT_LIST
1970   maybe_unlink (export_file);
1971 #endif
1972
1973   return 0;
1974 }
1975
1976 \f
1977 /* Wait for a process to finish, and exit if a nonzero status is found.  */
1978
1979 int
1980 collect_wait (const char *prog, struct pex_obj *pex)
1981 {
1982   int status;
1983
1984   if (!pex_get_status (pex, 1, &status))
1985     fatal_perror ("can't get program status");
1986   pex_free (pex);
1987
1988   if (status)
1989     {
1990       if (WIFSIGNALED (status))
1991         {
1992           int sig = WTERMSIG (status);
1993           error ("%s terminated with signal %d [%s]%s",
1994                  prog, sig, strsignal(sig),
1995                  WCOREDUMP(status) ? ", core dumped" : "");
1996           collect_exit (FATAL_EXIT_CODE);
1997         }
1998
1999       if (WIFEXITED (status))
2000         return WEXITSTATUS (status);
2001     }
2002   return 0;
2003 }
2004
2005 static void
2006 do_wait (const char *prog, struct pex_obj *pex)
2007 {
2008   int ret = collect_wait (prog, pex);
2009   if (ret != 0)
2010     {
2011       error ("%s returned %d exit status", prog, ret);
2012       collect_exit (ret);
2013     }
2014
2015   if (response_file)
2016     {
2017       unlink (response_file);
2018       response_file = NULL;
2019     }
2020 }
2021
2022 \f
2023 /* Execute a program, and wait for the reply.  */
2024
2025 struct pex_obj *
2026 collect_execute (const char *prog, char **argv, const char *outname,
2027                  const char *errname, int flags)
2028 {
2029   struct pex_obj *pex;
2030   const char *errmsg;
2031   int err;
2032   char *response_arg = NULL;
2033   char *response_argv[3] ATTRIBUTE_UNUSED;
2034
2035   if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
2036     {
2037       /* If using @file arguments, create a temporary file and put the
2038          contents of argv into it.  Then change argv to an array corresponding
2039          to a single argument @FILE, where FILE is the temporary filename.  */
2040
2041       char **current_argv = argv + 1;
2042       char *argv0 = argv[0];
2043       int status;
2044       FILE *f;
2045
2046       /* Note: we assume argv contains at least one element; this is
2047          checked above.  */
2048
2049       response_file = make_temp_file ("");
2050
2051       f = fopen (response_file, "w");
2052
2053       if (f == NULL)
2054         fatal ("could not open response file %s", response_file);
2055
2056       status = writeargv (current_argv, f);
2057
2058       if (status)
2059         fatal ("could not write to response file %s", response_file);
2060
2061       status = fclose (f);
2062
2063       if (EOF == status)
2064         fatal ("could not close response file %s", response_file);
2065
2066       response_arg = concat ("@", response_file, NULL);
2067       response_argv[0] = argv0;
2068       response_argv[1] = response_arg;
2069       response_argv[2] = NULL;
2070
2071       argv = response_argv;
2072     }
2073
2074   if (vflag || debug)
2075     {
2076       char **p_argv;
2077       const char *str;
2078
2079       if (argv[0])
2080         fprintf (stderr, "%s", argv[0]);
2081       else
2082         notice ("[cannot find %s]", prog);
2083
2084       for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
2085         fprintf (stderr, " %s", str);
2086
2087       fprintf (stderr, "\n");
2088     }
2089
2090   fflush (stdout);
2091   fflush (stderr);
2092
2093   /* If we cannot find a program we need, complain error.  Do this here
2094      since we might not end up needing something that we could not find.  */
2095
2096   if (argv[0] == 0)
2097     fatal ("cannot find '%s'", prog);
2098
2099   pex = pex_init (0, "collect2", NULL);
2100   if (pex == NULL)
2101     fatal_perror ("pex_init failed");
2102
2103   errmsg = pex_run (pex, flags, argv[0], argv, outname,
2104                     errname, &err);
2105   if (errmsg != NULL)
2106     {
2107       if (err != 0)
2108         {
2109           errno = err;
2110           fatal_perror (errmsg);
2111         }
2112       else
2113         fatal (errmsg);
2114     }
2115
2116   if (response_arg)
2117     free (response_arg);
2118
2119   return pex;
2120 }
2121
2122 static void
2123 fork_execute (const char *prog, char **argv)
2124 {
2125   struct pex_obj *pex;
2126
2127   pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2128   do_wait (prog, pex);
2129 }
2130 \f
2131 /* Unlink a file unless we are debugging.  */
2132
2133 static void
2134 maybe_unlink (const char *file)
2135 {
2136   if (!debug)
2137     unlink_if_ordinary (file);
2138   else
2139     notice ("[Leaving %s]\n", file);
2140 }
2141
2142 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST.  */
2143
2144 static void
2145 maybe_unlink_list (char **file_list)
2146 {
2147   char **tmp = file_list;
2148
2149   while (*tmp)
2150     maybe_unlink (*(tmp++));
2151 }
2152
2153 \f
2154 static long sequence_number = 0;
2155
2156 /* Add a name to a linked list.  */
2157
2158 static void
2159 add_to_list (struct head *head_ptr, const char *name)
2160 {
2161   struct id *newid
2162     = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2163   struct id *p;
2164   strcpy (newid->name, name);
2165
2166   if (head_ptr->first)
2167     head_ptr->last->next = newid;
2168   else
2169     head_ptr->first = newid;
2170
2171   /* Check for duplicate symbols.  */
2172   for (p = head_ptr->first;
2173        strcmp (name, p->name) != 0;
2174        p = p->next)
2175     ;
2176   if (p != newid)
2177     {
2178       head_ptr->last->next = 0;
2179       free (newid);
2180       return;
2181     }
2182
2183   newid->sequence = ++sequence_number;
2184   head_ptr->last = newid;
2185   head_ptr->number++;
2186 }
2187
2188 /* Grab the init priority number from an init function name that
2189    looks like "_GLOBAL_.I.12345.foo".  */
2190
2191 static int
2192 extract_init_priority (const char *name)
2193 {
2194   int pos = 0, pri;
2195
2196   while (name[pos] == '_')
2197     ++pos;
2198   pos += 10; /* strlen ("GLOBAL__X_") */
2199
2200   /* Extract init_p number from ctor/dtor name.  */
2201   pri = atoi (name + pos);
2202   return pri ? pri : DEFAULT_INIT_PRIORITY;
2203 }
2204
2205 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2206    ctors will be run from right to left, dtors from left to right.  */
2207
2208 static void
2209 sort_ids (struct head *head_ptr)
2210 {
2211   /* id holds the current element to insert.  id_next holds the next
2212      element to insert.  id_ptr iterates through the already sorted elements
2213      looking for the place to insert id.  */
2214   struct id *id, *id_next, **id_ptr;
2215
2216   id = head_ptr->first;
2217
2218   /* We don't have any sorted elements yet.  */
2219   head_ptr->first = NULL;
2220
2221   for (; id; id = id_next)
2222     {
2223       id_next = id->next;
2224       id->sequence = extract_init_priority (id->name);
2225
2226       for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2227         if (*id_ptr == NULL
2228             /* If the sequence numbers are the same, we put the id from the
2229                file later on the command line later in the list.  */
2230             || id->sequence > (*id_ptr)->sequence
2231             /* Hack: do lexical compare, too.
2232             || (id->sequence == (*id_ptr)->sequence
2233                 && strcmp (id->name, (*id_ptr)->name) > 0) */
2234             )
2235           {
2236             id->next = *id_ptr;
2237             *id_ptr = id;
2238             break;
2239           }
2240     }
2241
2242   /* Now set the sequence numbers properly so write_c_file works.  */
2243   for (id = head_ptr->first; id; id = id->next)
2244     id->sequence = ++sequence_number;
2245 }
2246
2247 /* Write: `prefix', the names on list LIST, `suffix'.  */
2248
2249 static void
2250 write_list (FILE *stream, const char *prefix, struct id *list)
2251 {
2252   while (list)
2253     {
2254       fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2255       list = list->next;
2256     }
2257 }
2258
2259 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2260 /* Given a STRING, return nonzero if it occurs in the list in range
2261    [ARGS_BEGIN,ARGS_END).  */
2262
2263 static int
2264 is_in_args (const char *string, const char **args_begin,
2265             const char **args_end)
2266 {
2267   const char **args_pointer;
2268   for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2269     if (strcmp (string, *args_pointer) == 0)
2270       return 1;
2271   return 0;
2272 }
2273 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2274
2275 #ifdef COLLECT_EXPORT_LIST
2276 /* This function is really used only on AIX, but may be useful.  */
2277 #if 0
2278 static int
2279 is_in_list (const char *prefix, struct id *list)
2280 {
2281   while (list)
2282     {
2283       if (!strcmp (prefix, list->name)) return 1;
2284       list = list->next;
2285     }
2286     return 0;
2287 }
2288 #endif
2289 #endif /* COLLECT_EXPORT_LIST */
2290
2291 /* Added for debugging purpose.  */
2292 #ifdef COLLECT_EXPORT_LIST
2293 static void
2294 dump_list (FILE *stream, const char *prefix, struct id *list)
2295 {
2296   while (list)
2297     {
2298       fprintf (stream, "%s%s,\n", prefix, list->name);
2299       list = list->next;
2300     }
2301 }
2302 #endif
2303
2304 #if 0
2305 static void
2306 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2307 {
2308   while (list)
2309     {
2310       fprintf (stream, "%s%s,\n", prefix, list->prefix);
2311       list = list->next;
2312     }
2313 }
2314 #endif
2315
2316 static void
2317 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2318 {
2319   while (list)
2320     {
2321       fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2322                prefix, list->sequence, list->name);
2323       list = list->next;
2324     }
2325 }
2326
2327 /* Write out the constructor and destructor tables statically (for a shared
2328    object), along with the functions to execute them.  */
2329
2330 static void
2331 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2332 {
2333   const char *p, *q;
2334   char *prefix, *r;
2335   int frames = (frame_tables.number > 0);
2336
2337   /* Figure out name of output_file, stripping off .so version.  */
2338   p = strrchr (output_file, '/');
2339   if (p == 0)
2340     p = output_file;
2341   else
2342     p++;
2343   q = p;
2344   while (q)
2345     {
2346       q = strchr (q,'.');
2347       if (q == 0)
2348         {
2349           q = p + strlen (p);
2350           break;
2351         }
2352       else
2353         {
2354           if (strncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2355             {
2356               q += strlen (SHLIB_SUFFIX);
2357               break;
2358             }
2359           else
2360             q++;
2361         }
2362     }
2363   /* q points to null at end of the string (or . of the .so version) */
2364   prefix = XNEWVEC (char, q - p + 1);
2365   strncpy (prefix, p, q - p);
2366   prefix[q - p] = 0;
2367   for (r = prefix; *r; r++)
2368     if (!ISALNUM ((unsigned char)*r))
2369       *r = '_';
2370   if (debug)
2371     notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2372             output_file, prefix);
2373
2374   initname = concat ("_GLOBAL__FI_", prefix, NULL);
2375   fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2376
2377   free (prefix);
2378
2379   /* Write the tables as C code.  */
2380
2381   fprintf (stream, "static int count;\n");
2382   fprintf (stream, "typedef void entry_pt();\n");
2383   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2384
2385   if (frames)
2386     {
2387       write_list_with_asm (stream, "extern void *", frame_tables.first);
2388
2389       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2390       write_list (stream, "\t\t&", frame_tables.first);
2391       fprintf (stream, "\t0\n};\n");
2392
2393       /* This must match what's in frame.h.  */
2394       fprintf (stream, "struct object {\n");
2395       fprintf (stream, "  void *pc_begin;\n");
2396       fprintf (stream, "  void *pc_end;\n");
2397       fprintf (stream, "  void *fde_begin;\n");
2398       fprintf (stream, "  void *fde_array;\n");
2399       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2400       fprintf (stream, "  struct object *next;\n");
2401       fprintf (stream, "};\n");
2402
2403       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2404       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2405
2406       fprintf (stream, "static void reg_frame () {\n");
2407       fprintf (stream, "\tstatic struct object ob;\n");
2408       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2409       fprintf (stream, "\t}\n");
2410
2411       fprintf (stream, "static void dereg_frame () {\n");
2412       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2413       fprintf (stream, "\t}\n");
2414     }
2415
2416   fprintf (stream, "void %s() {\n", initname);
2417   if (constructors.number > 0 || frames)
2418     {
2419       fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2420       write_list (stream, "\t\t", constructors.first);
2421       if (frames)
2422         fprintf (stream, "\treg_frame,\n");
2423       fprintf (stream, "\t};\n");
2424       fprintf (stream, "\tentry_pt **p;\n");
2425       fprintf (stream, "\tif (count++ != 0) return;\n");
2426       fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2427       fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2428     }
2429   else
2430     fprintf (stream, "\t++count;\n");
2431   fprintf (stream, "}\n");
2432   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2433   fprintf (stream, "void %s() {\n", fininame);
2434   if (destructors.number > 0 || frames)
2435     {
2436       fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2437       write_list (stream, "\t\t", destructors.first);
2438       if (frames)
2439         fprintf (stream, "\tdereg_frame,\n");
2440       fprintf (stream, "\t};\n");
2441       fprintf (stream, "\tentry_pt **p;\n");
2442       fprintf (stream, "\tif (--count != 0) return;\n");
2443       fprintf (stream, "\tp = dtors;\n");
2444       fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2445                destructors.number + frames);
2446     }
2447   fprintf (stream, "}\n");
2448
2449   if (shared_obj)
2450     {
2451       COLLECT_SHARED_INIT_FUNC(stream, initname);
2452       COLLECT_SHARED_FINI_FUNC(stream, fininame);
2453     }
2454 }
2455
2456 /* Write the constructor/destructor tables.  */
2457
2458 #ifndef LD_INIT_SWITCH
2459 static void
2460 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2461 {
2462   /* Write the tables as C code.  */
2463
2464   int frames = (frame_tables.number > 0);
2465
2466   fprintf (stream, "typedef void entry_pt();\n\n");
2467
2468   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2469
2470   if (frames)
2471     {
2472       write_list_with_asm (stream, "extern void *", frame_tables.first);
2473
2474       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2475       write_list (stream, "\t\t&", frame_tables.first);
2476       fprintf (stream, "\t0\n};\n");
2477
2478       /* This must match what's in frame.h.  */
2479       fprintf (stream, "struct object {\n");
2480       fprintf (stream, "  void *pc_begin;\n");
2481       fprintf (stream, "  void *pc_end;\n");
2482       fprintf (stream, "  void *fde_begin;\n");
2483       fprintf (stream, "  void *fde_array;\n");
2484       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2485       fprintf (stream, "  struct object *next;\n");
2486       fprintf (stream, "};\n");
2487
2488       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2489       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2490
2491       fprintf (stream, "static void reg_frame () {\n");
2492       fprintf (stream, "\tstatic struct object ob;\n");
2493       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2494       fprintf (stream, "\t}\n");
2495
2496       fprintf (stream, "static void dereg_frame () {\n");
2497       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2498       fprintf (stream, "\t}\n");
2499     }
2500
2501   fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2502   fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2503   write_list (stream, "\t", constructors.first);
2504   if (frames)
2505     fprintf (stream, "\treg_frame,\n");
2506   fprintf (stream, "\t0\n};\n\n");
2507
2508   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2509
2510   fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2511   fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2512   write_list (stream, "\t", destructors.first);
2513   if (frames)
2514     fprintf (stream, "\tdereg_frame,\n");
2515   fprintf (stream, "\t0\n};\n\n");
2516
2517   fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2518   fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2519 }
2520 #endif /* ! LD_INIT_SWITCH */
2521
2522 static void
2523 write_c_file (FILE *stream, const char *name)
2524 {
2525 #ifndef LD_INIT_SWITCH
2526   if (! shared_obj)
2527     write_c_file_glob (stream, name);
2528   else
2529 #endif
2530     write_c_file_stat (stream, name);
2531 }
2532
2533 #ifdef COLLECT_EXPORT_LIST
2534 static void
2535 write_aix_file (FILE *stream, struct id *list)
2536 {
2537   for (; list; list = list->next)
2538     {
2539       fputs (list->name, stream);
2540       putc ('\n', stream);
2541     }
2542 }
2543 #endif
2544 \f
2545 #ifdef OBJECT_FORMAT_NONE
2546
2547 /* Check to make sure the file is an ELF file.  LTO objects must
2548    be in ELF format.  */
2549
2550 static bool
2551 is_elf (const char *prog_name)
2552 {
2553   FILE *f;
2554   char buf[4];
2555   static char magic[4] = { 0x7f, 'E', 'L', 'F' };
2556
2557   f = fopen (prog_name, "r");
2558   if (f == NULL)
2559     return false;
2560   if (fread (buf, sizeof (buf), 1, f) != 1)
2561     buf[0] = 0;
2562   fclose (f);
2563   return memcmp (buf, magic, sizeof (magic)) == 0;
2564 }
2565
2566 /* Generic version to scan the name list of the loaded program for
2567    the symbols g++ uses for static constructors and destructors.  */
2568
2569 static void
2570 scan_prog_file (const char *prog_name, scanpass which_pass,
2571                 scanfilter filter)
2572 {
2573   void (*int_handler) (int);
2574 #ifdef SIGQUIT
2575   void (*quit_handler) (int);
2576 #endif
2577   char *real_nm_argv[4];
2578   const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2579   int argc = 0;
2580   struct pex_obj *pex;
2581   const char *errmsg;
2582   int err;
2583   char *p, buf[1024];
2584   FILE *inf;
2585   int found_lto = 0;
2586
2587   if (which_pass == PASS_SECOND)
2588     return;
2589
2590   /* LTO objects must be in ELF format.  This check prevents
2591      us from accepting an archive containing LTO objects, which
2592      gcc cannnot currently handle.  */
2593   if (which_pass == PASS_LTOINFO && !is_elf (prog_name))
2594     return;
2595
2596   /* If we do not have an `nm', complain.  */
2597   if (nm_file_name == 0)
2598     fatal ("cannot find 'nm'");
2599
2600   nm_argv[argc++] = nm_file_name;
2601   if (NM_FLAGS[0] != '\0')
2602     nm_argv[argc++] = NM_FLAGS;
2603
2604   nm_argv[argc++] = prog_name;
2605   nm_argv[argc++] = (char *) 0;
2606
2607   /* Trace if needed.  */
2608   if (vflag)
2609     {
2610       const char **p_argv;
2611       const char *str;
2612
2613       for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2614         fprintf (stderr, " %s", str);
2615
2616       fprintf (stderr, "\n");
2617     }
2618
2619   fflush (stdout);
2620   fflush (stderr);
2621
2622   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2623   if (pex == NULL)
2624     fatal_perror ("pex_init failed");
2625
2626   errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2627                     &err);
2628   if (errmsg != NULL)
2629     {
2630       if (err != 0)
2631         {
2632           errno = err;
2633           fatal_perror (errmsg);
2634         }
2635       else
2636         fatal (errmsg);
2637     }
2638
2639   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2640 #ifdef SIGQUIT
2641   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2642 #endif
2643
2644   inf = pex_read_output (pex, 0);
2645   if (inf == NULL)
2646     fatal_perror ("can't open nm output");
2647
2648   if (debug)
2649     {
2650       if (which_pass == PASS_LTOINFO)
2651         fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2652       else
2653         fprintf (stderr, "\nnm output with constructors/destructors.\n");
2654     }
2655
2656   /* Read each line of nm output.  */
2657   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2658     {
2659       int ch, ch2;
2660       char *name, *end;
2661
2662       if (debug)
2663         fprintf (stderr, "\t%s\n", buf);
2664
2665       if (which_pass == PASS_LTOINFO)
2666         {
2667           if (found_lto)
2668             continue;
2669
2670           /* Look for the LTO info marker symbol, and add filename to
2671              the LTO objects list if found.  */
2672           for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2673             if (ch == ' '
2674                 && (strncmp (p + 1, "__gnu_lto_v1", 12) == 0)
2675                 && ISSPACE (p[13]))
2676               {
2677                 add_lto_object (&lto_objects, prog_name);
2678
2679                 /* We need to read all the input, so we can't just
2680                    return here.  But we can avoid useless work.  */
2681                 found_lto = 1;
2682
2683                 break;
2684               }
2685
2686           continue;
2687         }
2688
2689       /* If it contains a constructor or destructor name, add the name
2690          to the appropriate list unless this is a kind of symbol we're
2691          not supposed to even consider.  */
2692
2693       for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2694         if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2695           break;
2696
2697       if (ch != '_')
2698         continue;
2699
2700       name = p;
2701       /* Find the end of the symbol name.
2702          Do not include `|', because Encore nm can tack that on the end.  */
2703       for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2704            end++)
2705         continue;
2706
2707
2708       *end = '\0';
2709       switch (is_ctor_dtor (name))
2710         {
2711         case SYM_CTOR:
2712           if (! (filter & SCAN_CTOR))
2713             break;
2714           if (which_pass != PASS_LIB)
2715             add_to_list (&constructors, name);
2716           break;
2717
2718         case SYM_DTOR:
2719           if (! (filter & SCAN_DTOR))
2720             break;
2721           if (which_pass != PASS_LIB)
2722             add_to_list (&destructors, name);
2723           break;
2724
2725         case SYM_INIT:
2726           if (! (filter & SCAN_INIT))
2727             break;
2728           if (which_pass != PASS_LIB)
2729             fatal ("init function found in object %s", prog_name);
2730 #ifndef LD_INIT_SWITCH
2731           add_to_list (&constructors, name);
2732 #endif
2733           break;
2734
2735         case SYM_FINI:
2736           if (! (filter & SCAN_FINI))
2737             break;
2738           if (which_pass != PASS_LIB)
2739             fatal ("fini function found in object %s", prog_name);
2740 #ifndef LD_FINI_SWITCH
2741           add_to_list (&destructors, name);
2742 #endif
2743           break;
2744
2745         case SYM_DWEH:
2746           if (! (filter & SCAN_DWEH))
2747             break;
2748           if (which_pass != PASS_LIB)
2749             add_to_list (&frame_tables, name);
2750           break;
2751
2752         default:                /* not a constructor or destructor */
2753           continue;
2754         }
2755     }
2756
2757   if (debug)
2758     fprintf (stderr, "\n");
2759
2760   do_wait (nm_file_name, pex);
2761
2762   signal (SIGINT,  int_handler);
2763 #ifdef SIGQUIT
2764   signal (SIGQUIT, quit_handler);
2765 #endif
2766 }
2767
2768 #ifdef LDD_SUFFIX
2769
2770 /* Use the List Dynamic Dependencies program to find shared libraries that
2771    the output file depends upon and their initialization/finalization
2772    routines, if any.  */
2773
2774 static void
2775 scan_libraries (const char *prog_name)
2776 {
2777   static struct head libraries;         /* list of shared libraries found */
2778   struct id *list;
2779   void (*int_handler) (int);
2780 #ifdef SIGQUIT
2781   void (*quit_handler) (int);
2782 #endif
2783   char *real_ldd_argv[4];
2784   const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2785   int argc = 0;
2786   struct pex_obj *pex;
2787   const char *errmsg;
2788   int err;
2789   char buf[1024];
2790   FILE *inf;
2791
2792   /* If we do not have an `ldd', complain.  */
2793   if (ldd_file_name == 0)
2794     {
2795       error ("cannot find 'ldd'");
2796       return;
2797     }
2798
2799   ldd_argv[argc++] = ldd_file_name;
2800   ldd_argv[argc++] = prog_name;
2801   ldd_argv[argc++] = (char *) 0;
2802
2803   /* Trace if needed.  */
2804   if (vflag)
2805     {
2806       const char **p_argv;
2807       const char *str;
2808
2809       for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2810         fprintf (stderr, " %s", str);
2811
2812       fprintf (stderr, "\n");
2813     }
2814
2815   fflush (stdout);
2816   fflush (stderr);
2817
2818   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2819   if (pex == NULL)
2820     fatal_perror ("pex_init failed");
2821
2822   errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2823   if (errmsg != NULL)
2824     {
2825       if (err != 0)
2826         {
2827           errno = err;
2828           fatal_perror (errmsg);
2829         }
2830       else
2831         fatal (errmsg);
2832     }
2833
2834   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2835 #ifdef SIGQUIT
2836   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2837 #endif
2838
2839   inf = pex_read_output (pex, 0);
2840   if (inf == NULL)
2841     fatal_perror ("can't open ldd output");
2842
2843   if (debug)
2844     notice ("\nldd output with constructors/destructors.\n");
2845
2846   /* Read each line of ldd output.  */
2847   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2848     {
2849       int ch2;
2850       char *name, *end, *p = buf;
2851
2852       /* Extract names of libraries and add to list.  */
2853       PARSE_LDD_OUTPUT (p);
2854       if (p == 0)
2855         continue;
2856
2857       name = p;
2858       if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2859         fatal ("dynamic dependency %s not found", buf);
2860
2861       /* Find the end of the symbol name.  */
2862       for (end = p;
2863            (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2864            end++)
2865         continue;
2866       *end = '\0';
2867
2868       if (access (name, R_OK) == 0)
2869         add_to_list (&libraries, name);
2870       else
2871         fatal ("unable to open dynamic dependency '%s'", buf);
2872
2873       if (debug)
2874         fprintf (stderr, "\t%s\n", buf);
2875     }
2876   if (debug)
2877     fprintf (stderr, "\n");
2878
2879   do_wait (ldd_file_name, pex);
2880
2881   signal (SIGINT,  int_handler);
2882 #ifdef SIGQUIT
2883   signal (SIGQUIT, quit_handler);
2884 #endif
2885
2886   /* Now iterate through the library list adding their symbols to
2887      the list.  */
2888   for (list = libraries.first; list; list = list->next)
2889     scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2890 }
2891
2892 #endif /* LDD_SUFFIX */
2893
2894 #endif /* OBJECT_FORMAT_NONE */
2895
2896 \f
2897 /*
2898  * COFF specific stuff.
2899  */
2900
2901 #ifdef OBJECT_FORMAT_COFF
2902
2903 #if defined (EXTENDED_COFF)
2904
2905 #   define GCC_SYMBOLS(X)       (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2906 #   define GCC_SYMENT           SYMR
2907 #   define GCC_OK_SYMBOL(X)     ((X).st == stProc || (X).st == stGlobal)
2908 #   define GCC_SYMINC(X)        (1)
2909 #   define GCC_SYMZERO(X)       (SYMHEADER(X).isymMax)
2910 #   define GCC_CHECK_HDR(X)     (PSYMTAB(X) != 0)
2911
2912 #else
2913
2914 #   define GCC_SYMBOLS(X)       (HEADER(ldptr).f_nsyms)
2915 #   define GCC_SYMENT           SYMENT
2916 #   if defined (C_WEAKEXT)
2917 #     define GCC_OK_SYMBOL(X) \
2918        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2919         ((X).n_scnum > N_UNDEF) && \
2920         (aix64_flag \
2921          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2922              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2923 #     define GCC_UNDEF_SYMBOL(X) \
2924        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2925         ((X).n_scnum == N_UNDEF))
2926 #   else
2927 #     define GCC_OK_SYMBOL(X) \
2928        (((X).n_sclass == C_EXT) && \
2929         ((X).n_scnum > N_UNDEF) && \
2930         (aix64_flag \
2931          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2932              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2933 #     define GCC_UNDEF_SYMBOL(X) \
2934        (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2935 #   endif
2936 #   define GCC_SYMINC(X)        ((X).n_numaux+1)
2937 #   define GCC_SYMZERO(X)       0
2938
2939 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2940 #if TARGET_AIX_VERSION >= 51
2941 #   define GCC_CHECK_HDR(X) \
2942      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2943       || (HEADER (X).f_magic == 0767 && aix64_flag))
2944 #else
2945 #   define GCC_CHECK_HDR(X) \
2946      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2947       || (HEADER (X).f_magic == 0757 && aix64_flag))
2948 #endif
2949
2950 #endif
2951
2952 #ifdef COLLECT_EXPORT_LIST
2953 /* Array of standard AIX libraries which should not
2954    be scanned for ctors/dtors.  */
2955 static const char *const aix_std_libs[] = {
2956   "/unix",
2957   "/lib/libc.a",
2958   "/lib/libm.a",
2959   "/lib/libc_r.a",
2960   "/lib/libm_r.a",
2961   "/usr/lib/libc.a",
2962   "/usr/lib/libm.a",
2963   "/usr/lib/libc_r.a",
2964   "/usr/lib/libm_r.a",
2965   "/usr/lib/threads/libc.a",
2966   "/usr/ccs/lib/libc.a",
2967   "/usr/ccs/lib/libm.a",
2968   "/usr/ccs/lib/libc_r.a",
2969   "/usr/ccs/lib/libm_r.a",
2970   NULL
2971 };
2972
2973 /* This function checks the filename and returns 1
2974    if this name matches the location of a standard AIX library.  */
2975 static int ignore_library (const char *);
2976 static int
2977 ignore_library (const char *name)
2978 {
2979   const char *const *p;
2980   size_t length;
2981
2982   if (target_system_root[0] != '\0')
2983     {
2984       length = strlen (target_system_root);
2985       if (strncmp (name, target_system_root, length) != 0)
2986         return 0;
2987       name += length;
2988     }
2989   for (p = &aix_std_libs[0]; *p != NULL; ++p)
2990     if (strcmp (name, *p) == 0)
2991       return 1;
2992   return 0;
2993 }
2994 #endif /* COLLECT_EXPORT_LIST */
2995
2996 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2997 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2998 #endif
2999
3000 /* COFF version to scan the name list of the loaded program for
3001    the symbols g++ uses for static constructors and destructors.  */
3002
3003 static void
3004 scan_prog_file (const char *prog_name, scanpass which_pass,
3005                 scanfilter filter)
3006 {
3007   LDFILE *ldptr = NULL;
3008   int sym_index, sym_count;
3009   int is_shared = 0;
3010
3011   if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
3012     return;
3013
3014 #ifdef COLLECT_EXPORT_LIST
3015   /* We do not need scanning for some standard C libraries.  */
3016   if (which_pass == PASS_FIRST && ignore_library (prog_name))
3017     return;
3018
3019   /* On AIX we have a loop, because there is not much difference
3020      between an object and an archive. This trick allows us to
3021      eliminate scan_libraries() function.  */
3022   do
3023     {
3024 #endif
3025       /* Some platforms (e.g. OSF4) declare ldopen as taking a
3026          non-const char * filename parameter, even though it will not
3027          modify that string.  So we must cast away const-ness here,
3028          using CONST_CAST to prevent complaints from -Wcast-qual.  */
3029       if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
3030         {
3031           if (! MY_ISCOFF (HEADER (ldptr).f_magic))
3032             fatal ("%s: not a COFF file", prog_name);
3033
3034           if (GCC_CHECK_HDR (ldptr))
3035             {
3036               sym_count = GCC_SYMBOLS (ldptr);
3037               sym_index = GCC_SYMZERO (ldptr);
3038
3039 #ifdef COLLECT_EXPORT_LIST
3040               /* Is current archive member a shared object?  */
3041               is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
3042 #endif
3043
3044               while (sym_index < sym_count)
3045                 {
3046                   GCC_SYMENT symbol;
3047
3048                   if (ldtbread (ldptr, sym_index, &symbol) <= 0)
3049                     break;
3050                   sym_index += GCC_SYMINC (symbol);
3051
3052                   if (GCC_OK_SYMBOL (symbol))
3053                     {
3054                       char *name;
3055
3056                       if ((name = ldgetname (ldptr, &symbol)) == NULL)
3057                         continue;               /* Should never happen.  */
3058
3059 #ifdef XCOFF_DEBUGGING_INFO
3060                       /* All AIX function names have a duplicate entry
3061                          beginning with a dot.  */
3062                       if (*name == '.')
3063                         ++name;
3064 #endif
3065
3066                       switch (is_ctor_dtor (name))
3067                         {
3068                         case SYM_CTOR:
3069                           if (! (filter & SCAN_CTOR))
3070                             break;
3071                           if (! is_shared)
3072                             add_to_list (&constructors, name);
3073 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3074                           if (which_pass == PASS_OBJ)
3075                             add_to_list (&exports, name);
3076 #endif
3077                           break;
3078
3079                         case SYM_DTOR:
3080                           if (! (filter & SCAN_DTOR))
3081                             break;
3082                           if (! is_shared)
3083                             add_to_list (&destructors, name);
3084 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3085                           if (which_pass == PASS_OBJ)
3086                             add_to_list (&exports, name);
3087 #endif
3088                           break;
3089
3090 #ifdef COLLECT_EXPORT_LIST
3091                         case SYM_INIT:
3092                           if (! (filter & SCAN_INIT))
3093                             break;
3094 #ifndef LD_INIT_SWITCH
3095                           if (is_shared)
3096                             add_to_list (&constructors, name);
3097 #endif
3098                           break;
3099
3100                         case SYM_FINI:
3101                           if (! (filter & SCAN_FINI))
3102                             break;
3103 #ifndef LD_INIT_SWITCH
3104                           if (is_shared)
3105                             add_to_list (&destructors, name);
3106 #endif
3107                           break;
3108 #endif
3109
3110                         case SYM_DWEH:
3111                           if (! (filter & SCAN_DWEH))
3112                             break;
3113                           if (! is_shared)
3114                             add_to_list (&frame_tables, name);
3115 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3116                           if (which_pass == PASS_OBJ)
3117                             add_to_list (&exports, name);
3118 #endif
3119                           break;
3120
3121                         default:        /* not a constructor or destructor */
3122 #ifdef COLLECT_EXPORT_LIST
3123                           /* Explicitly export all global symbols when
3124                              building a shared object on AIX, but do not
3125                              re-export symbols from another shared object
3126                              and do not export symbols if the user
3127                              provides an explicit export list.  */
3128                           if (shared_obj && !is_shared
3129                               && which_pass == PASS_OBJ && !export_flag)
3130                             add_to_list (&exports, name);
3131 #endif
3132                           continue;
3133                         }
3134
3135                       if (debug)
3136 #if !defined(EXTENDED_COFF)
3137                         fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3138                                  symbol.n_scnum, symbol.n_sclass,
3139                                  (symbol.n_type ? "0" : ""), symbol.n_type,
3140                                  name);
3141 #else
3142                         fprintf (stderr,
3143                                  "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3144                                  symbol.iss, (long) symbol.value, symbol.index, name);
3145 #endif
3146                     }
3147                 }
3148             }
3149 #ifdef COLLECT_EXPORT_LIST
3150           else
3151             {
3152               /* If archive contains both 32-bit and 64-bit objects,
3153                  we want to skip objects in other mode so mismatch normal.  */
3154               if (debug)
3155                 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3156                          prog_name, HEADER (ldptr).f_magic, aix64_flag);
3157             }
3158 #endif
3159         }
3160       else
3161         {
3162           fatal ("%s: cannot open as COFF file", prog_name);
3163         }
3164 #ifdef COLLECT_EXPORT_LIST
3165       /* On AIX loop continues while there are more members in archive.  */
3166     }
3167   while (ldclose (ldptr) == FAILURE);
3168 #else
3169   /* Otherwise we simply close ldptr.  */
3170   (void) ldclose(ldptr);
3171 #endif
3172 }
3173 #endif /* OBJECT_FORMAT_COFF */
3174
3175 #ifdef COLLECT_EXPORT_LIST
3176 /* Given a library name without "lib" prefix, this function
3177    returns a full library name including a path.  */
3178 static char *
3179 resolve_lib_name (const char *name)
3180 {
3181   char *lib_buf;
3182   int i, j, l = 0;
3183   /* Library extensions for AIX dynamic linking.  */
3184   const char * const libexts[2] = {"a", "so"};
3185
3186   for (i = 0; libpaths[i]; i++)
3187     if (libpaths[i]->max_len > l)
3188       l = libpaths[i]->max_len;
3189
3190   lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3191
3192   for (i = 0; libpaths[i]; i++)
3193     {
3194       struct prefix_list *list = libpaths[i]->plist;
3195       for (; list; list = list->next)
3196         {
3197           /* The following lines are needed because path_prefix list
3198              may contain directories both with trailing '/' and
3199              without it.  */
3200           const char *p = "";
3201           if (list->prefix[strlen(list->prefix)-1] != '/')
3202             p = "/";
3203           for (j = 0; j < 2; j++)
3204             {
3205               sprintf (lib_buf, "%s%slib%s.%s",
3206                        list->prefix, p, name,
3207                        libexts[(j + aixrtl_flag) % 2]);
3208               if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3209               if (file_exists (lib_buf))
3210                 {
3211                   if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3212                   return (lib_buf);
3213                 }
3214             }
3215         }
3216     }
3217   if (debug)
3218     fprintf (stderr, "not found\n");
3219   else
3220     fatal ("library lib%s not found", name);
3221   return (NULL);
3222 }
3223 #endif /* COLLECT_EXPORT_LIST */