OSDN Git Service

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