OSDN Git Service

- fix whitespace in laste gcc/ChangeLog entry
[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
34 /* TARGET_64BIT may be defined to use driver specific functionality. */
35 #undef TARGET_64BIT
36 #define TARGET_64BIT TARGET_64BIT_DEFAULT
37
38 #ifndef LIBRARY_PATH_ENV
39 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
40 #endif
41
42 #define COLLECT
43
44 #include "collect2.h"
45 #include "collect2-aix.h"
46 #include "demangle.h"
47 #include "obstack.h"
48 #include "intl.h"
49 #include "version.h"
50 \f
51 /* On certain systems, we have code that works by scanning the object file
52    directly.  But this code uses system-specific header files and library
53    functions, so turn it off in a cross-compiler.  Likewise, the names of
54    the utilities are not correct for a cross-compiler; we have to hope that
55    cross-versions are in the proper directories.  */
56
57 #ifdef CROSS_DIRECTORY_STRUCTURE
58 #ifndef CROSS_AIX_SUPPORT
59 #undef OBJECT_FORMAT_COFF
60 #endif
61 #undef MD_EXEC_PREFIX
62 #undef REAL_LD_FILE_NAME
63 #undef REAL_NM_FILE_NAME
64 #undef REAL_STRIP_FILE_NAME
65 #endif
66
67 /* If we cannot use a special method, use the ordinary one:
68    run nm to find what symbols are present.
69    In a cross-compiler, this means you need a cross nm,
70    but that is not quite as unpleasant as special headers.  */
71
72 #if !defined (OBJECT_FORMAT_COFF)
73 #define OBJECT_FORMAT_NONE
74 #endif
75
76 #ifdef OBJECT_FORMAT_COFF
77
78 #ifndef CROSS_DIRECTORY_STRUCTURE
79 #include <a.out.h>
80 #include <ar.h>
81
82 #ifdef UMAX
83 #include <sgs.h>
84 #endif
85
86 /* Many versions of ldfcn.h define these.  */
87 #ifdef FREAD
88 #undef FREAD
89 #undef FWRITE
90 #endif
91
92 #include <ldfcn.h>
93 #endif
94
95 /* Some systems have an ISCOFF macro, but others do not.  In some cases
96    the macro may be wrong.  MY_ISCOFF is defined in tm.h files for machines
97    that either do not have an ISCOFF macro in /usr/include or for those
98    where it is wrong.  */
99
100 #ifndef MY_ISCOFF
101 #define MY_ISCOFF(X) ISCOFF (X)
102 #endif
103
104 #endif /* OBJECT_FORMAT_COFF */
105
106 #ifdef OBJECT_FORMAT_NONE
107
108 /* Default flags to pass to nm.  */
109 #ifndef NM_FLAGS
110 #define NM_FLAGS "-n"
111 #endif
112
113 #endif /* OBJECT_FORMAT_NONE */
114
115 /* Some systems use __main in a way incompatible with its use in gcc, in these
116    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
117    give the same symbol without quotes for an alternative entry point.  */
118 #ifndef NAME__MAIN
119 #define NAME__MAIN "__main"
120 #endif
121
122 /* This must match tree.h.  */
123 #define DEFAULT_INIT_PRIORITY 65535
124
125 #ifndef COLLECT_SHARED_INIT_FUNC
126 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
127   fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
128 #endif
129 #ifndef COLLECT_SHARED_FINI_FUNC
130 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
131   fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
132 #endif
133
134 #ifdef LDD_SUFFIX
135 #define SCAN_LIBRARIES
136 #endif
137
138 #ifndef SHLIB_SUFFIX
139 #define SHLIB_SUFFIX ".so"
140 #endif
141
142 #ifdef USE_COLLECT2
143 int do_collecting = 1;
144 #else
145 int do_collecting = 0;
146 #endif
147
148 /* Cook up an always defined indication of whether we proceed the
149    "EXPORT_LIST" way.  */
150
151 #ifdef COLLECT_EXPORT_LIST
152 #define DO_COLLECT_EXPORT_LIST 1
153 #else
154 #define DO_COLLECT_EXPORT_LIST 0
155 #endif
156
157 /* Nonzero if we should suppress the automatic demangling of identifiers
158    in linker error messages.  Set from COLLECT_NO_DEMANGLE.  */
159 int no_demangle;
160 \f
161 /* Linked lists of constructor and destructor names.  */
162
163 struct id
164 {
165   struct id *next;
166   int sequence;
167   char name[1];
168 };
169
170 struct head
171 {
172   struct id *first;
173   struct id *last;
174   int number;
175 };
176
177 bool vflag;                             /* true if -v or --version */ 
178 static int rflag;                       /* true if -r */
179 static int strip_flag;                  /* true if -s */
180 static const char *demangle_flag;
181 #ifdef COLLECT_EXPORT_LIST
182 static int export_flag;                 /* true if -bE */
183 static int aix64_flag;                  /* true if -b64 */
184 static int aixrtl_flag;                 /* true if -brtl */
185 #endif
186
187 enum lto_mode_d {
188   LTO_MODE_NONE,                        /* Not doing LTO.  */
189   LTO_MODE_LTO,                         /* Normal LTO.  */
190   LTO_MODE_WHOPR                        /* WHOPR.  */
191 };
192
193 /* Current LTO mode.  */
194 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
195
196 bool debug;                             /* true if -debug */
197 bool helpflag;                  /* true if --help */
198
199 static int shared_obj;                  /* true if -shared */
200
201 static const char *c_file;              /* <xxx>.c for constructor/destructor list.  */
202 static const char *o_file;              /* <xxx>.o for constructor/destructor list.  */
203 #ifdef COLLECT_EXPORT_LIST
204 static const char *export_file;         /* <xxx>.x for AIX export list.  */
205 #endif
206 static char **lto_o_files;              /* Output files for LTO.  */
207 const char *ldout;                      /* File for ld stdout.  */
208 const char *lderrout;                   /* File for ld stderr.  */
209 static const char *output_file;         /* Output file for ld.  */
210 static const char *nm_file_name;        /* pathname of nm */
211 #ifdef LDD_SUFFIX
212 static const char *ldd_file_name;       /* pathname of ldd (or equivalent) */
213 #endif
214 static const char *strip_file_name;             /* pathname of strip */
215 const char *c_file_name;                /* pathname of gcc */
216 static char *initname, *fininame;       /* names of init and fini funcs */
217
218 static struct head constructors;        /* list of constructors found */
219 static struct head destructors;         /* list of destructors found */
220 #ifdef COLLECT_EXPORT_LIST
221 static struct head exports;             /* list of exported symbols */
222 #endif
223 static struct head frame_tables;        /* list of frame unwind info tables */
224
225 static bool at_file_supplied;           /* Whether to use @file arguments */
226 static char *response_file;             /* Name of any current response file */
227
228 struct obstack temporary_obstack;
229 char * temporary_firstobj;
230
231 /* A string that must be prepended to a target OS path in order to find
232    it on the host system.  */
233 #ifdef TARGET_SYSTEM_ROOT
234 static const char *target_system_root = TARGET_SYSTEM_ROOT;
235 #else
236 static const char *target_system_root = "";
237 #endif
238
239 /* Structure to hold all the directories in which to search for files to
240    execute.  */
241
242 struct prefix_list
243 {
244   const char *prefix;         /* String to prepend to the path.  */
245   struct prefix_list *next;   /* Next in linked list.  */
246 };
247
248 struct path_prefix
249 {
250   struct prefix_list *plist;  /* List of prefixes to try */
251   int max_len;                /* Max length of a prefix in PLIST */
252   const char *name;           /* Name of this list (used in config stuff) */
253 };
254
255 #ifdef COLLECT_EXPORT_LIST
256 /* Lists to keep libraries to be scanned for global constructors/destructors.  */
257 static struct head libs;                    /* list of libraries */
258 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
259 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
260 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
261                                           &libpath_lib_dirs, NULL};
262 #endif
263
264 /* List of names of object files containing LTO information.
265    These are a subset of the object file names appearing on the
266    command line, and must be identical, in the sense of pointer
267    equality, with the names passed to maybe_run_lto_and_relink().  */
268
269 struct lto_object
270 {
271   const char *name;             /* Name of object file.  */
272   struct lto_object *next;      /* Next in linked list.  */
273 };
274
275 struct lto_object_list
276 {
277   struct lto_object *first;     /* First list element.  */
278   struct lto_object *last;      /* Last list element.  */
279 };
280
281 static struct lto_object_list lto_objects;
282
283 /* Special kinds of symbols that a name may denote.  */
284
285 typedef enum {
286   SYM_REGULAR = 0,  /* nothing special  */
287
288   SYM_CTOR = 1,  /* constructor */
289   SYM_DTOR = 2,  /* destructor  */
290   SYM_INIT = 3,  /* shared object routine that calls all the ctors  */
291   SYM_FINI = 4,  /* shared object routine that calls all the dtors  */
292   SYM_DWEH = 5   /* DWARF exception handling table  */
293 } symkind;
294
295 static symkind is_ctor_dtor (const char *);
296
297 static void handler (int);
298 static char *find_a_file (struct path_prefix *, const char *);
299 static void add_prefix (struct path_prefix *, const char *);
300 static void prefix_from_env (const char *, struct path_prefix *);
301 static void prefix_from_string (const char *, struct path_prefix *);
302 static void do_wait (const char *, struct pex_obj *);
303 static void fork_execute (const char *, char **);
304 static void maybe_unlink (const char *);
305 static void maybe_unlink_list (char **);
306 static void add_to_list (struct head *, const char *);
307 static int extract_init_priority (const char *);
308 static void sort_ids (struct head *);
309 static void write_list (FILE *, const char *, struct id *);
310 #ifdef COLLECT_EXPORT_LIST
311 static void dump_list (FILE *, const char *, struct id *);
312 #endif
313 #if 0
314 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
315 #endif
316 static void write_list_with_asm (FILE *, const char *, struct id *);
317 static void write_c_file (FILE *, const char *);
318 static void write_c_file_stat (FILE *, const char *);
319 #ifndef LD_INIT_SWITCH
320 static void write_c_file_glob (FILE *, const char *);
321 #endif
322 #ifdef SCAN_LIBRARIES
323 static void scan_libraries (const char *);
324 #endif
325 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
326 static int is_in_args (const char *, const char **, const char **);
327 #endif
328 #ifdef COLLECT_EXPORT_LIST
329 #if 0
330 static int is_in_list (const char *, struct id *);
331 #endif
332 static void write_aix_file (FILE *, struct id *);
333 static char *resolve_lib_name (const char *);
334 #endif
335 static char *extract_string (const char **);
336 static void post_ld_pass (bool);
337 static void process_args (int *argcp, char **argv);
338
339 /* Enumerations describing which pass this is for scanning the
340    program file ...  */
341
342 typedef enum {
343   PASS_FIRST,                           /* without constructors */
344   PASS_OBJ,                             /* individual objects */
345   PASS_LIB,                             /* looking for shared libraries */
346   PASS_SECOND,                          /* with constructors linked in */
347   PASS_LTOINFO                          /* looking for objects with LTO info */
348 } scanpass;
349
350 /* ... and which kinds of symbols are to be considered.  */
351
352 enum scanfilter_masks {
353   SCAN_NOTHING = 0,
354
355   SCAN_CTOR = 1 << SYM_CTOR,
356   SCAN_DTOR = 1 << SYM_DTOR,
357   SCAN_INIT = 1 << SYM_INIT,
358   SCAN_FINI = 1 << SYM_FINI,
359   SCAN_DWEH = 1 << SYM_DWEH,
360   SCAN_ALL  = ~0
361 };
362
363 /* This type is used for parameters and variables which hold
364    combinations of the flags in enum scanfilter_masks.  */
365 typedef int scanfilter;
366
367 /* Scan the name list of the loaded program for the symbols g++ uses for
368    static constructors and destructors.
369
370    The SCANPASS argument tells which collect processing pass this is for and
371    the SCANFILTER argument tells which kinds of symbols to consider in this
372    pass.  Symbols of a special kind not in the filter mask are considered as
373    regular ones.
374
375    The constructor table begins at __CTOR_LIST__ and contains a count of the
376    number of pointers (or -1 if the constructors are built in a separate
377    section by the linker), followed by the pointers to the constructor
378    functions, terminated with a null pointer.  The destructor table has the
379    same format, and begins at __DTOR_LIST__.  */
380
381 static void scan_prog_file (const char *, scanpass, scanfilter);
382
383 \f
384 /* Delete tempfiles and exit function.  */
385
386 void
387 collect_exit (int status)
388 {
389   if (c_file != 0 && c_file[0])
390     maybe_unlink (c_file);
391
392   if (o_file != 0 && o_file[0])
393     maybe_unlink (o_file);
394
395 #ifdef COLLECT_EXPORT_LIST
396   if (export_file != 0 && export_file[0])
397     maybe_unlink (export_file);
398 #endif
399
400   if (lto_o_files)
401     maybe_unlink_list (lto_o_files);
402
403   if (ldout != 0 && ldout[0])
404     {
405       dump_file (ldout, stdout);
406       maybe_unlink (ldout);
407     }
408
409   if (lderrout != 0 && lderrout[0])
410     {
411       dump_file (lderrout, stderr);
412       maybe_unlink (lderrout);
413     }
414
415   if (status != 0 && output_file != 0 && output_file[0])
416     maybe_unlink (output_file);
417
418   if (response_file)
419     maybe_unlink (response_file);
420
421   exit (status);
422 }
423
424 \f
425 /* Notify user of a non-error.  */
426 void
427 notice (const char *cmsgid, ...)
428 {
429   va_list ap;
430
431   va_start (ap, cmsgid);
432   vfprintf (stderr, _(cmsgid), ap);
433   va_end (ap);
434 }
435
436 /* Notify user of a non-error, without translating the format string.  */
437 void
438 notice_translated (const char *cmsgid, ...)
439 {
440   va_list ap;
441
442   va_start (ap, cmsgid);
443   vfprintf (stderr, cmsgid, ap);
444   va_end (ap);
445 }
446
447 /* Die when sys call fails.  */
448
449 void
450 fatal_perror (const char * cmsgid, ...)
451 {
452   int e = errno;
453   va_list ap;
454
455   va_start (ap, cmsgid);
456   fprintf (stderr, "collect2: ");
457   vfprintf (stderr, _(cmsgid), ap);
458   fprintf (stderr, ": %s\n", xstrerror (e));
459   va_end (ap);
460
461   collect_exit (FATAL_EXIT_CODE);
462 }
463
464 /* Just die.  */
465
466 void
467 fatal (const char * cmsgid, ...)
468 {
469   va_list ap;
470
471   va_start (ap, cmsgid);
472   fprintf (stderr, "collect2: ");
473   vfprintf (stderr, _(cmsgid), ap);
474   fprintf (stderr, "\n");
475   va_end (ap);
476
477   collect_exit (FATAL_EXIT_CODE);
478 }
479
480 /* Write error message.  */
481
482 void
483 error (const char * gmsgid, ...)
484 {
485   va_list ap;
486
487   va_start (ap, gmsgid);
488   fprintf (stderr, "collect2: ");
489   vfprintf (stderr, _(gmsgid), ap);
490   fprintf (stderr, "\n");
491   va_end(ap);
492 }
493
494 /* In case obstack is linked in, and abort is defined to fancy_abort,
495    provide a default entry.  */
496
497 void
498 fancy_abort (const char *file, int line, const char *func)
499 {
500   fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
501 }
502 \f
503 static void
504 handler (int signo)
505 {
506   if (c_file != 0 && c_file[0])
507     maybe_unlink (c_file);
508
509   if (o_file != 0 && o_file[0])
510     maybe_unlink (o_file);
511
512   if (ldout != 0 && ldout[0])
513     maybe_unlink (ldout);
514
515   if (lderrout != 0 && lderrout[0])
516     maybe_unlink (lderrout);
517
518 #ifdef COLLECT_EXPORT_LIST
519   if (export_file != 0 && export_file[0])
520     maybe_unlink (export_file);
521 #endif
522
523   if (lto_o_files)
524     maybe_unlink_list (lto_o_files);
525
526   if (response_file)
527     maybe_unlink (response_file);
528
529   signal (signo, SIG_DFL);
530   raise (signo);
531 }
532
533 \f
534 int
535 file_exists (const char *name)
536 {
537   return access (name, R_OK) == 0;
538 }
539
540 /* Parse a reasonable subset of shell quoting syntax.  */
541
542 static char *
543 extract_string (const char **pp)
544 {
545   const char *p = *pp;
546   int backquote = 0;
547   int inside = 0;
548
549   for (;;)
550     {
551       char c = *p;
552       if (c == '\0')
553         break;
554       ++p;
555       if (backquote)
556         obstack_1grow (&temporary_obstack, c);
557       else if (! inside && c == ' ')
558         break;
559       else if (! inside && c == '\\')
560         backquote = 1;
561       else if (c == '\'')
562         inside = !inside;
563       else
564         obstack_1grow (&temporary_obstack, c);
565     }
566
567   obstack_1grow (&temporary_obstack, '\0');
568   *pp = p;
569   return XOBFINISH (&temporary_obstack, char *);
570 }
571 \f
572 void
573 dump_file (const char *name, FILE *to)
574 {
575   FILE *stream = fopen (name, "r");
576
577   if (stream == 0)
578     return;
579   while (1)
580     {
581       int c;
582       while (c = getc (stream),
583              c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
584         obstack_1grow (&temporary_obstack, c);
585       if (obstack_object_size (&temporary_obstack) > 0)
586         {
587           const char *word, *p;
588           char *result;
589           obstack_1grow (&temporary_obstack, '\0');
590           word = XOBFINISH (&temporary_obstack, const char *);
591
592           if (*word == '.')
593             ++word, putc ('.', to);
594           p = word;
595           if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
596             p += strlen (USER_LABEL_PREFIX);
597
598 #ifdef HAVE_LD_DEMANGLE
599           result = 0;
600 #else
601           if (no_demangle)
602             result = 0;
603           else
604             result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
605 #endif
606
607           if (result)
608             {
609               int diff;
610               fputs (result, to);
611
612               diff = strlen (word) - strlen (result);
613               while (diff > 0 && c == ' ')
614                 --diff, putc (' ', to);
615               if (diff < 0 && c == ' ')
616                 {
617                   while (diff < 0 && c == ' ')
618                     ++diff, c = getc (stream);
619                   if (!ISSPACE (c))
620                     {
621                       /* Make sure we output at least one space, or
622                          the demangled symbol name will run into
623                          whatever text follows.  */
624                       putc (' ', to);
625                     }
626                 }
627
628               free (result);
629             }
630           else
631             fputs (word, to);
632
633           fflush (to);
634           obstack_free (&temporary_obstack, temporary_firstobj);
635         }
636       if (c == EOF)
637         break;
638       putc (c, to);
639     }
640   fclose (stream);
641 }
642 \f
643 /* Return the kind of symbol denoted by name S.  */
644
645 static symkind
646 is_ctor_dtor (const char *s)
647 {
648   struct names { const char *const name; const int len; symkind ret;
649     const int two_underscores; };
650
651   const struct names *p;
652   int ch;
653   const char *orig_s = s;
654
655   static const struct names special[] = {
656 #ifndef NO_DOLLAR_IN_LABEL
657     { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
658     { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
659 #else
660 #ifndef NO_DOT_IN_LABEL
661     { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
662     { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
663 #endif /* NO_DOT_IN_LABEL */
664 #endif /* NO_DOLLAR_IN_LABEL */
665     { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
666     { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
667     { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
668     { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
669     { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
670     { NULL, 0, SYM_REGULAR, 0 }
671   };
672
673   while ((ch = *s) == '_')
674     ++s;
675
676   if (s == orig_s)
677     return SYM_REGULAR;
678
679   for (p = &special[0]; p->len > 0; p++)
680     {
681       if (ch == p->name[0]
682           && (!p->two_underscores || ((s - orig_s) >= 2))
683           && strncmp(s, p->name, p->len) == 0)
684         {
685           return p->ret;
686         }
687     }
688   return SYM_REGULAR;
689 }
690 \f
691 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
692    and one from the PATH variable.  */
693
694 static struct path_prefix cpath, path;
695
696 #ifdef CROSS_DIRECTORY_STRUCTURE
697 /* This is the name of the target machine.  We use it to form the name
698    of the files to execute.  */
699
700 static const char *const target_machine = TARGET_MACHINE;
701 #endif
702
703 /* Search for NAME using prefix list PPREFIX.  We only look for executable
704    files.
705
706    Return 0 if not found, otherwise return its name, allocated with malloc.  */
707
708 static char *
709 find_a_file (struct path_prefix *pprefix, const char *name)
710 {
711   char *temp;
712   struct prefix_list *pl;
713   int len = pprefix->max_len + strlen (name) + 1;
714
715   if (debug)
716     fprintf (stderr, "Looking for '%s'\n", name);
717
718 #ifdef HOST_EXECUTABLE_SUFFIX
719   len += strlen (HOST_EXECUTABLE_SUFFIX);
720 #endif
721
722   temp = XNEWVEC (char, len);
723
724   /* Determine the filename to execute (special case for absolute paths).  */
725
726   if (IS_ABSOLUTE_PATH (name))
727     {
728       if (access (name, X_OK) == 0)
729         {
730           strcpy (temp, name);
731
732           if (debug)
733             fprintf (stderr, "  - found: absolute path\n");
734
735           return temp;
736         }
737
738 #ifdef HOST_EXECUTABLE_SUFFIX
739         /* Some systems have a suffix for executable files.
740            So try appending that.  */
741       strcpy (temp, name);
742         strcat (temp, HOST_EXECUTABLE_SUFFIX);
743
744         if (access (temp, X_OK) == 0)
745           return temp;
746 #endif
747
748       if (debug)
749         fprintf (stderr, "  - failed to locate using absolute path\n");
750     }
751   else
752     for (pl = pprefix->plist; pl; pl = pl->next)
753       {
754         struct stat st;
755
756         strcpy (temp, pl->prefix);
757         strcat (temp, name);
758
759         if (stat (temp, &st) >= 0
760             && ! S_ISDIR (st.st_mode)
761             && access (temp, X_OK) == 0)
762           return temp;
763
764 #ifdef HOST_EXECUTABLE_SUFFIX
765         /* Some systems have a suffix for executable files.
766            So try appending that.  */
767         strcat (temp, HOST_EXECUTABLE_SUFFIX);
768
769         if (stat (temp, &st) >= 0
770             && ! S_ISDIR (st.st_mode)
771             && access (temp, X_OK) == 0)
772           return temp;
773 #endif
774       }
775
776   if (debug && pprefix->plist == NULL)
777     fprintf (stderr, "  - failed: no entries in prefix list\n");
778
779   free (temp);
780   return 0;
781 }
782
783 /* Add an entry for PREFIX to prefix list PPREFIX.  */
784
785 static void
786 add_prefix (struct path_prefix *pprefix, const char *prefix)
787 {
788   struct prefix_list *pl, **prev;
789   int len;
790
791   if (pprefix->plist)
792     {
793       for (pl = pprefix->plist; pl->next; pl = pl->next)
794         ;
795       prev = &pl->next;
796     }
797   else
798     prev = &pprefix->plist;
799
800   /* Keep track of the longest prefix.  */
801
802   len = strlen (prefix);
803   if (len > pprefix->max_len)
804     pprefix->max_len = len;
805
806   pl = XNEW (struct prefix_list);
807   pl->prefix = xstrdup (prefix);
808
809   if (*prev)
810     pl->next = *prev;
811   else
812     pl->next = (struct prefix_list *) 0;
813   *prev = pl;
814 }
815 \f
816 /* Take the value of the environment variable ENV, break it into a path, and
817    add of the entries to PPREFIX.  */
818
819 static void
820 prefix_from_env (const char *env, struct path_prefix *pprefix)
821 {
822   const char *p;
823   p = getenv (env);
824
825   if (p)
826     prefix_from_string (p, pprefix);
827 }
828
829 static void
830 prefix_from_string (const char *p, struct path_prefix *pprefix)
831 {
832   const char *startp, *endp;
833   char *nstore = XNEWVEC (char, strlen (p) + 3);
834
835   if (debug)
836     fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR);
837
838   startp = endp = p;
839   while (1)
840     {
841       if (*endp == PATH_SEPARATOR || *endp == 0)
842         {
843           strncpy (nstore, startp, endp-startp);
844           if (endp == startp)
845             {
846               strcpy (nstore, "./");
847             }
848           else if (! IS_DIR_SEPARATOR (endp[-1]))
849             {
850               nstore[endp-startp] = DIR_SEPARATOR;
851               nstore[endp-startp+1] = 0;
852             }
853           else
854             nstore[endp-startp] = 0;
855
856           if (debug)
857             fprintf (stderr, "  - add prefix: %s\n", nstore);
858
859           add_prefix (pprefix, nstore);
860           if (*endp == 0)
861             break;
862           endp = startp = endp + 1;
863         }
864       else
865         endp++;
866     }
867   free (nstore);
868 }
869
870 #ifdef OBJECT_FORMAT_NONE
871
872 /* Add an entry for the object file NAME to object file list LIST.
873    New entries are added at the end of the list. The original pointer
874    value of NAME is preserved, i.e., no string copy is performed.  */
875
876 static void
877 add_lto_object (struct lto_object_list *list, const char *name)
878 {
879   struct lto_object *n = XNEW (struct lto_object);
880   n->name = name;
881   n->next = NULL;
882
883   if (list->last)
884     list->last->next = n;
885   else
886     list->first = n;
887
888   list->last = n;
889 }
890 #endif /* OBJECT_FORMAT_NONE */
891
892
893 /* Perform a link-time recompilation and relink if any of the object
894    files contain LTO info.  The linker command line LTO_LD_ARGV
895    represents the linker command that would produce a final executable
896    without the use of LTO. OBJECT_LST is a vector of object file names
897    appearing in LTO_LD_ARGV that are to be considerd for link-time
898    recompilation, where OBJECT is a pointer to the last valid element.
899    (This awkward convention avoids an impedance mismatch with the
900    usage of similarly-named variables in main().)  The elements of
901    OBJECT_LST must be identical, i.e., pointer equal, to the
902    corresponding arguments in LTO_LD_ARGV.
903
904    Upon entry, at least one linker run has been performed without the
905    use of any LTO info that might be present.  Any recompilations
906    necessary for template instantiations have been performed, and
907    initializer/finalizer tables have been created if needed and
908    included in the linker command line LTO_LD_ARGV. If any of the
909    object files contain LTO info, we run the LTO back end on all such
910    files, and perform the final link with the LTO back end output
911    substituted for the LTO-optimized files.  In some cases, a final
912    link with all link-time generated code has already been performed,
913    so there is no need to relink if no LTO info is found.  In other
914    cases, our caller has not produced the final executable, and is
915    relying on us to perform the required link whether LTO info is
916    present or not.  In that case, the FORCE argument should be true.
917    Note that the linker command line argument LTO_LD_ARGV passed into
918    this function may be modified in place.  */
919
920 static void
921 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
922                           const char **object, bool force)
923 {
924   const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
925
926   int num_lto_c_args = 1;    /* Allow space for the terminating NULL.  */
927
928   while (object_file < object)
929   {
930     /* If file contains LTO info, add it to the list of LTO objects.  */
931     scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
932
933     /* Increment the argument count by the number of object file arguments
934        we will add.  An upper bound suffices, so just count all of the
935        object files regardless of whether they contain LTO info.  */
936     num_lto_c_args++;
937   }
938
939   if (lto_objects.first)
940     {
941       char **lto_c_argv;
942       const char **lto_c_ptr;
943       char **p;
944       char **lto_o_ptr;
945       struct lto_object *list;
946       char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
947       struct pex_obj *pex;
948       const char *prog = "lto-wrapper";
949       int lto_ld_argv_size = 0;
950       char **out_lto_ld_argv;
951       int out_lto_ld_argv_size;
952       size_t num_files;
953
954       if (!lto_wrapper)
955         fatal ("COLLECT_LTO_WRAPPER must be set");
956
957       num_lto_c_args++;
958
959       /* There is at least one object file containing LTO info,
960          so we need to run the LTO back end and relink.
961
962          To do so we build updated ld arguments with first
963          LTO object replaced by all partitions and other LTO
964          objects removed.  */
965
966       lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
967       lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
968
969       *lto_c_ptr++ = lto_wrapper;
970
971       /* Add LTO objects to the wrapper command line.  */
972       for (list = lto_objects.first; list; list = list->next)
973         *lto_c_ptr++ = list->name;
974
975       *lto_c_ptr = NULL;
976
977       /* Run the LTO back end.  */
978       pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
979       {
980         int c;
981         FILE *stream;
982         size_t i;
983         char *start, *end;
984
985         stream = pex_read_output (pex, 0);
986         gcc_assert (stream);
987
988         num_files = 0;
989         while ((c = getc (stream)) != EOF)
990           {
991             obstack_1grow (&temporary_obstack, c);
992             if (c == '\n')
993               ++num_files;
994           }
995
996         lto_o_files = XNEWVEC (char *, num_files + 1);
997         lto_o_files[num_files] = NULL;
998         start = XOBFINISH (&temporary_obstack, char *);
999         for (i = 0; i < num_files; ++i)
1000           {
1001             end = start;
1002             while (*end != '\n')
1003               ++end;
1004             *end = '\0';
1005
1006             lto_o_files[i] = xstrdup (start);
1007
1008             start = end + 1;
1009           }
1010
1011         obstack_free (&temporary_obstack, temporary_firstobj);
1012       }
1013       do_wait (prog, pex);
1014       pex = NULL;
1015
1016       /* Compute memory needed for new LD arguments.  At most number of original arguemtns
1017          plus number of partitions.  */
1018       for (lto_ld_argv_size = 0; lto_ld_argv[lto_ld_argv_size]; lto_ld_argv_size++)
1019         ;
1020       out_lto_ld_argv = XCNEWVEC(char *, num_files + lto_ld_argv_size + 1);
1021       out_lto_ld_argv_size = 0;
1022
1023       /* After running the LTO back end, we will relink, substituting
1024          the LTO output for the object files that we submitted to the
1025          LTO. Here, we modify the linker command line for the relink.  */
1026
1027       /* Copy all arguments until we find first LTO file.  */
1028       p = lto_ld_argv;
1029       while (*p != NULL)
1030         {
1031           for (list = lto_objects.first; list; list = list->next)
1032             if (*p == list->name) /* Note test for pointer equality!  */
1033               break;
1034           if (list)
1035             break;
1036           out_lto_ld_argv[out_lto_ld_argv_size++] = *p++;
1037         }
1038
1039       /* Now insert all LTO partitions.  */
1040       lto_o_ptr = lto_o_files;
1041       while (*lto_o_ptr)
1042         out_lto_ld_argv[out_lto_ld_argv_size++] = *lto_o_ptr++;
1043
1044       /* ... and copy the rest.  */
1045       while (*p != NULL)
1046         {
1047           for (list = lto_objects.first; list; list = list->next)
1048             if (*p == list->name) /* Note test for pointer equality!  */
1049               break;
1050           if (!list)
1051             out_lto_ld_argv[out_lto_ld_argv_size++] = *p;
1052           p++;
1053         }
1054       out_lto_ld_argv[out_lto_ld_argv_size++] = 0;
1055
1056       /* Run the linker again, this time replacing the object files
1057          optimized by the LTO with the temporary file generated by the LTO.  */
1058       fork_execute ("ld", out_lto_ld_argv);
1059       post_ld_pass (true);
1060       free (lto_ld_argv);
1061
1062       maybe_unlink_list (lto_o_files);
1063     }
1064   else if (force)
1065     {
1066       /* Our caller is relying on us to do the link
1067          even though there is no LTO back end work to be done.  */
1068       fork_execute ("ld", lto_ld_argv);
1069       post_ld_pass (false);
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   old_argv = argv;
1154   expandargv (&argc, &argv);
1155   if (argv != old_argv)
1156     at_file_supplied = 1;
1157
1158   process_args (&argc, argv);
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           lto_mode = LTO_MODE_WHOPR;
1214         else if (!strncmp (argv[i], "-fno-lto", 8))
1215           lto_mode = LTO_MODE_NONE;
1216         else if (! strcmp (argv[i], "-plugin"))
1217           {
1218             use_plugin = true;
1219             lto_mode = LTO_MODE_NONE;
1220           }
1221 #ifdef COLLECT_EXPORT_LIST
1222         /* since -brtl, -bexport, -b64 are not position dependent
1223            also check for them here */
1224         if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1225           {
1226             arg = argv[i];
1227             /* We want to disable automatic exports on AIX when user
1228                explicitly puts an export list in command line */
1229             if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1230               export_flag = 1;
1231             else if (arg[2] == '6' && arg[3] == '4')
1232               aix64_flag = 1;
1233             else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1234               aixrtl_flag = 1;
1235           }
1236 #endif
1237       }
1238     vflag = debug;
1239     if (no_partition && lto_mode == LTO_MODE_WHOPR)
1240       lto_mode = LTO_MODE_LTO;
1241   }
1242
1243 #ifndef DEFAULT_A_OUT_NAME
1244   output_file = "a.out";
1245 #else
1246   output_file = DEFAULT_A_OUT_NAME;
1247 #endif
1248
1249   obstack_begin (&temporary_obstack, 0);
1250   temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1251
1252 #ifndef HAVE_LD_DEMANGLE
1253   current_demangling_style = auto_demangling;
1254 #endif
1255   p = getenv ("COLLECT_GCC_OPTIONS");
1256   while (p && *p)
1257     {
1258       const char *q = extract_string (&p);
1259       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1260         num_c_args++;
1261     }
1262   obstack_free (&temporary_obstack, temporary_firstobj);
1263
1264   /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1265      -fno-exceptions -w -fno-whole-program */
1266   num_c_args += 6;
1267
1268   c_argv = XCNEWVEC (char *, num_c_args);
1269   c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1270
1271   if (argc < 2)
1272     fatal ("no arguments");
1273
1274 #ifdef SIGQUIT
1275   if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1276     signal (SIGQUIT, handler);
1277 #endif
1278   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1279     signal (SIGINT, handler);
1280 #ifdef SIGALRM
1281   if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1282     signal (SIGALRM, handler);
1283 #endif
1284 #ifdef SIGHUP
1285   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1286     signal (SIGHUP, handler);
1287 #endif
1288   if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1289     signal (SIGSEGV, handler);
1290 #ifdef SIGBUS
1291   if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1292     signal (SIGBUS, handler);
1293 #endif
1294
1295   /* Extract COMPILER_PATH and PATH into our prefix list.  */
1296   prefix_from_env ("COMPILER_PATH", &cpath);
1297   prefix_from_env ("PATH", &path);
1298
1299   /* Try to discover a valid linker/nm/strip to use.  */
1300
1301   /* Maybe we know the right file to use (if not cross).  */
1302   ld_file_name = 0;
1303 #ifdef DEFAULT_LINKER
1304   if (access (DEFAULT_LINKER, X_OK) == 0)
1305     ld_file_name = DEFAULT_LINKER;
1306   if (ld_file_name == 0)
1307 #endif
1308 #ifdef REAL_LD_FILE_NAME
1309   ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1310   if (ld_file_name == 0)
1311 #endif
1312   /* Search the (target-specific) compiler dirs for ld'.  */
1313   ld_file_name = find_a_file (&cpath, real_ld_suffix);
1314   /* Likewise for `collect-ld'.  */
1315   if (ld_file_name == 0)
1316     ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1317   /* Search the compiler directories for `ld'.  We have protection against
1318      recursive calls in find_a_file.  */
1319   if (ld_file_name == 0)
1320     ld_file_name = find_a_file (&cpath,
1321                                 use_plugin
1322                                 ? plugin_ld_suffix
1323                                 : ld_suffix);
1324   /* Search the ordinary system bin directories
1325      for `ld' (if native linking) or `TARGET-ld' (if cross).  */
1326   if (ld_file_name == 0)
1327     ld_file_name = find_a_file (&path,
1328                                 use_plugin
1329                                 ? full_plugin_ld_suffix
1330                                 : full_ld_suffix);
1331
1332 #ifdef REAL_NM_FILE_NAME
1333   nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1334   if (nm_file_name == 0)
1335 #endif
1336   nm_file_name = find_a_file (&cpath, gnm_suffix);
1337   if (nm_file_name == 0)
1338     nm_file_name = find_a_file (&path, full_gnm_suffix);
1339   if (nm_file_name == 0)
1340     nm_file_name = find_a_file (&cpath, nm_suffix);
1341   if (nm_file_name == 0)
1342     nm_file_name = find_a_file (&path, full_nm_suffix);
1343
1344 #ifdef LDD_SUFFIX
1345   ldd_file_name = find_a_file (&cpath, ldd_suffix);
1346   if (ldd_file_name == 0)
1347     ldd_file_name = find_a_file (&path, full_ldd_suffix);
1348 #endif
1349
1350 #ifdef REAL_STRIP_FILE_NAME
1351   strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1352   if (strip_file_name == 0)
1353 #endif
1354   strip_file_name = find_a_file (&cpath, gstrip_suffix);
1355   if (strip_file_name == 0)
1356     strip_file_name = find_a_file (&path, full_gstrip_suffix);
1357   if (strip_file_name == 0)
1358     strip_file_name = find_a_file (&cpath, strip_suffix);
1359   if (strip_file_name == 0)
1360     strip_file_name = find_a_file (&path, full_strip_suffix);
1361
1362   /* Determine the full path name of the C compiler to use.  */
1363   c_file_name = getenv ("COLLECT_GCC");
1364   if (c_file_name == 0)
1365     {
1366 #ifdef CROSS_DIRECTORY_STRUCTURE
1367       c_file_name = concat (target_machine, "-gcc", NULL);
1368 #else
1369       c_file_name = "gcc";
1370 #endif
1371     }
1372
1373   p = find_a_file (&cpath, c_file_name);
1374
1375   /* Here it should be safe to use the system search path since we should have
1376      already qualified the name of the compiler when it is needed.  */
1377   if (p == 0)
1378     p = find_a_file (&path, c_file_name);
1379
1380   if (p)
1381     c_file_name = p;
1382
1383   *ld1++ = *ld2++ = ld_file_name;
1384
1385   /* Make temp file names.  */
1386   c_file = make_temp_file (".c");
1387   o_file = make_temp_file (".o");
1388 #ifdef COLLECT_EXPORT_LIST
1389   export_file = make_temp_file (".x");
1390 #endif
1391   ldout = make_temp_file (".ld");
1392   lderrout = make_temp_file (".le");
1393   *c_ptr++ = c_file_name;
1394   *c_ptr++ = "-x";
1395   *c_ptr++ = "c";
1396   *c_ptr++ = "-c";
1397   *c_ptr++ = "-o";
1398   *c_ptr++ = o_file;
1399
1400 #ifdef COLLECT_EXPORT_LIST
1401   /* Generate a list of directories from LIBPATH.  */
1402   prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1403   /* Add to this list also two standard directories where
1404      AIX loader always searches for libraries.  */
1405   add_prefix (&libpath_lib_dirs, "/lib");
1406   add_prefix (&libpath_lib_dirs, "/usr/lib");
1407 #endif
1408
1409   /* Get any options that the upper GCC wants to pass to the sub-GCC.
1410
1411      AIX support needs to know if -shared has been specified before
1412      parsing commandline arguments.  */
1413
1414   p = getenv ("COLLECT_GCC_OPTIONS");
1415   while (p && *p)
1416     {
1417       const char *q = extract_string (&p);
1418       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1419         *c_ptr++ = xstrdup (q);
1420       if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1421         *c_ptr++ = xstrdup (q);
1422       if (strcmp (q, "-shared") == 0)
1423         shared_obj = 1;
1424       if (*q == '-' && q[1] == 'B')
1425         {
1426           *c_ptr++ = xstrdup (q);
1427           if (q[2] == 0)
1428             {
1429               q = extract_string (&p);
1430               *c_ptr++ = xstrdup (q);
1431             }
1432         }
1433     }
1434   obstack_free (&temporary_obstack, temporary_firstobj);
1435   *c_ptr++ = "-fno-profile-arcs";
1436   *c_ptr++ = "-fno-test-coverage";
1437   *c_ptr++ = "-fno-branch-probabilities";
1438   *c_ptr++ = "-fno-exceptions";
1439   *c_ptr++ = "-w";
1440   *c_ptr++ = "-fno-whole-program";
1441
1442   /* !!! When GCC calls collect2,
1443      it does not know whether it is calling collect2 or ld.
1444      So collect2 cannot meaningfully understand any options
1445      except those ld understands.
1446      If you propose to make GCC pass some other option,
1447      just imagine what will happen if ld is really ld!!!  */
1448
1449   /* Parse arguments.  Remember output file spec, pass the rest to ld.  */
1450   /* After the first file, put in the c++ rt0.  */
1451
1452   first_file = 1;
1453 #ifdef HAVE_LD_DEMANGLE
1454   if (!demangle_flag && !no_demangle)
1455     demangle_flag = "--demangle";
1456   if (demangle_flag)
1457     *ld1++ = *ld2++ = demangle_flag;
1458 #endif
1459   while ((arg = *++argv) != (char *) 0)
1460     {
1461       *ld1++ = *ld2++ = arg;
1462
1463       if (arg[0] == '-')
1464         {
1465           switch (arg[1])
1466             {
1467             case 'd':
1468               if (!strcmp (arg, "-debug"))
1469                 {
1470                   /* Already parsed.  */
1471                   ld1--;
1472                   ld2--;
1473                 }
1474               if (!strcmp (arg, "-dynamic-linker") && argv[1])
1475                 {
1476                   ++argv;
1477                   *ld1++ = *ld2++ = *argv;
1478                 }
1479               break;
1480
1481             case 'f':
1482               if (strncmp (arg, "-flto", 5) == 0)
1483                 {
1484 #ifdef ENABLE_LTO
1485                   /* Do not pass LTO flag to the linker. */
1486                   ld1--;
1487                   ld2--;
1488 #else
1489                   error ("LTO support has not been enabled in this "
1490                          "configuration");
1491 #endif
1492                 }
1493               break;
1494
1495             case 'l':
1496               if (first_file)
1497                 {
1498                   /* place o_file BEFORE this argument! */
1499                   first_file = 0;
1500                   ld2--;
1501                   *ld2++ = o_file;
1502                   *ld2++ = arg;
1503                 }
1504 #ifdef COLLECT_EXPORT_LIST
1505               {
1506                 /* Resolving full library name.  */
1507                 const char *s = resolve_lib_name (arg+2);
1508
1509                 /* Saving a full library name.  */
1510                 add_to_list (&libs, s);
1511               }
1512 #endif
1513               break;
1514
1515 #ifdef COLLECT_EXPORT_LIST
1516             /* Saving directories where to search for libraries.  */
1517             case 'L':
1518               add_prefix (&cmdline_lib_dirs, arg+2);
1519               break;
1520 #else
1521 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1522             case 'L':
1523               if (is_in_args (arg,
1524                               CONST_CAST2 (const char **, char **, ld1_argv),
1525                               ld1 - 1))
1526                 --ld1;
1527               break;
1528 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1529 #endif
1530
1531             case 'o':
1532               if (arg[2] == '\0')
1533                 output_file = *ld1++ = *ld2++ = *++argv;
1534               else
1535                 output_file = &arg[2];
1536               break;
1537
1538             case 'r':
1539               if (arg[2] == '\0')
1540                 rflag = 1;
1541               break;
1542
1543             case 's':
1544               if (arg[2] == '\0' && do_collecting)
1545                 {
1546                   /* We must strip after the nm run, otherwise C++ linking
1547                      will not work.  Thus we strip in the second ld run, or
1548                      else with strip if there is no second ld run.  */
1549                   strip_flag = 1;
1550                   ld1--;
1551                 }
1552               break;
1553
1554             case 'v':
1555               if (arg[2] == '\0')
1556                 vflag = true;
1557               break;
1558
1559             case '-':
1560               if (strcmp (arg, "--no-demangle") == 0)
1561                 {
1562                   demangle_flag = arg;
1563                   no_demangle = 1;
1564                   ld1--;
1565                   ld2--;
1566                 }
1567               else if (strncmp (arg, "--demangle", 10) == 0)
1568                 {
1569                   demangle_flag = arg;
1570                   no_demangle = 0;
1571 #ifndef HAVE_LD_DEMANGLE
1572                   if (arg[10] == '=')
1573                     {
1574                       enum demangling_styles style
1575                         = cplus_demangle_name_to_style (arg+11);
1576                       if (style == unknown_demangling)
1577                         error ("unknown demangling style '%s'", arg+11);
1578                       else
1579                         current_demangling_style = style;
1580                     }
1581 #endif
1582                   ld1--;
1583                   ld2--;
1584                 }
1585               else if (strncmp (arg, "--sysroot=", 10) == 0)
1586                 target_system_root = arg + 10;
1587               else if (strcmp (arg, "--version") == 0)
1588                 vflag = true;
1589               else if (strcmp (arg, "--help") == 0)
1590                 helpflag = true;
1591               break;
1592             }
1593         }
1594       else if ((p = strrchr (arg, '.')) != (char *) 0
1595                && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1596                    || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1597                    || strcmp (p, ".obj") == 0))
1598         {
1599           if (first_file)
1600             {
1601               first_file = 0;
1602               if (p[1] == 'o')
1603                 *ld2++ = o_file;
1604               else
1605                 {
1606                   /* place o_file BEFORE this argument! */
1607                   ld2--;
1608                   *ld2++ = o_file;
1609                   *ld2++ = arg;
1610                 }
1611             }
1612           if (p[1] == 'o' || p[1] == 'l')
1613             *object++ = arg;
1614 #ifdef COLLECT_EXPORT_LIST
1615           /* libraries can be specified directly, i.e. without -l flag.  */
1616           else
1617             {
1618               /* Saving a full library name.  */
1619               add_to_list (&libs, arg);
1620             }
1621 #endif
1622         }
1623     }
1624
1625 #ifdef COLLECT_EXPORT_LIST
1626   /* This is added only for debugging purposes.  */
1627   if (debug)
1628     {
1629       fprintf (stderr, "List of libraries:\n");
1630       dump_list (stderr, "\t", libs.first);
1631     }
1632
1633   /* The AIX linker will discard static constructors in object files if
1634      nothing else in the file is referenced, so look at them first.  Unless
1635      we are building a shared object, ignore the eh frame tables, as we
1636      would otherwise reference them all, hence drag all the corresponding
1637      objects even if nothing else is referenced.  */
1638   {
1639     const char **export_object_lst
1640       = CONST_CAST2 (const char **, char **, object_lst);
1641
1642     struct id *list = libs.first;
1643
1644     /* Compute the filter to use from the current one, do scan, then adjust
1645        the "current" filter to remove what we just included here.  This will
1646        control whether we need a first pass link later on or not, and what
1647        will remain to be scanned there.  */
1648
1649     scanfilter this_filter = ld1_filter;
1650 #if HAVE_AS_REF
1651     if (!shared_obj)
1652       this_filter &= ~SCAN_DWEH;
1653 #endif
1654
1655     while (export_object_lst < object)
1656       scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1657
1658     for (; list; list = list->next)
1659       scan_prog_file (list->name, PASS_FIRST, this_filter);
1660
1661     ld1_filter = ld1_filter & ~this_filter;
1662   }
1663
1664   if (exports.first)
1665     {
1666       char *buf = concat ("-bE:", export_file, NULL);
1667
1668       *ld1++ = buf;
1669       *ld2++ = buf;
1670
1671       exportf = fopen (export_file, "w");
1672       if (exportf == (FILE *) 0)
1673         fatal_perror ("fopen %s", export_file);
1674       write_aix_file (exportf, exports.first);
1675       if (fclose (exportf))
1676         fatal_perror ("fclose %s", export_file);
1677     }
1678 #endif
1679
1680   *c_ptr++ = c_file;
1681   *c_ptr = *ld1 = *object = (char *) 0;
1682
1683   if (vflag)
1684     {
1685       notice ("collect2 version %s", version_string);
1686 #ifdef TARGET_VERSION
1687       TARGET_VERSION;
1688 #endif
1689       fprintf (stderr, "\n");
1690     }
1691
1692   if (helpflag)
1693     {
1694       printf ("Usage: collect2 [options]\n");
1695       printf (" Wrap linker and generate constructor code if needed.\n");
1696       printf (" Options:\n");
1697       printf ("  -debug          Enable debug output\n");
1698       printf ("  --help          Display this information\n");
1699       printf ("  -v, --version   Display this program's version number\n");
1700       printf ("\n");
1701       printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1702       printf ("Report bugs: %s\n", bug_report_url);
1703       printf ("\n");
1704     }
1705
1706   if (debug)
1707     {
1708       const char *ptr;
1709       fprintf (stderr, "ld_file_name        = %s\n",
1710                (ld_file_name ? ld_file_name : "not found"));
1711       fprintf (stderr, "c_file_name         = %s\n",
1712                (c_file_name ? c_file_name : "not found"));
1713       fprintf (stderr, "nm_file_name        = %s\n",
1714                (nm_file_name ? nm_file_name : "not found"));
1715 #ifdef LDD_SUFFIX
1716       fprintf (stderr, "ldd_file_name       = %s\n",
1717                (ldd_file_name ? ldd_file_name : "not found"));
1718 #endif
1719       fprintf (stderr, "strip_file_name     = %s\n",
1720                (strip_file_name ? strip_file_name : "not found"));
1721       fprintf (stderr, "c_file              = %s\n",
1722                (c_file ? c_file : "not found"));
1723       fprintf (stderr, "o_file              = %s\n",
1724                (o_file ? o_file : "not found"));
1725
1726       ptr = getenv ("COLLECT_GCC_OPTIONS");
1727       if (ptr)
1728         fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1729
1730       ptr = getenv ("COLLECT_GCC");
1731       if (ptr)
1732         fprintf (stderr, "COLLECT_GCC         = %s\n", ptr);
1733
1734       ptr = getenv ("COMPILER_PATH");
1735       if (ptr)
1736         fprintf (stderr, "COMPILER_PATH       = %s\n", ptr);
1737
1738       ptr = getenv (LIBRARY_PATH_ENV);
1739       if (ptr)
1740         fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1741
1742       fprintf (stderr, "\n");
1743     }
1744
1745   /* Load the program, searching all libraries and attempting to provide
1746      undefined symbols from repository information.
1747
1748      If -r or they will be run via some other method, do not build the
1749      constructor or destructor list, just return now.  */
1750   {
1751     bool early_exit
1752       = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1753
1754     /* Perform the first pass link now, if we're about to exit or if we need
1755        to scan for things we haven't collected yet before pursuing further.
1756
1757        On AIX, the latter typically includes nothing for shared objects or
1758        frame tables for an executable, out of what the required early scan on
1759        objects and libraries has performed above.  In the !shared_obj case, we
1760        expect the relevant tables to be dragged together with their associated
1761        functions from precise cross reference insertions by the compiler.  */
1762
1763     if (early_exit || ld1_filter != SCAN_NOTHING)
1764       do_tlink (ld1_argv, object_lst);
1765
1766     if (early_exit)
1767       {
1768 #ifdef COLLECT_EXPORT_LIST
1769         /* Make sure we delete the export file we may have created.  */
1770         if (export_file != 0 && export_file[0])
1771           maybe_unlink (export_file);
1772 #endif
1773         if (lto_mode != LTO_MODE_NONE)
1774           maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1775         else
1776           post_ld_pass (false);
1777
1778         maybe_unlink (c_file);
1779         maybe_unlink (o_file);
1780         return 0;
1781       }
1782   }
1783
1784   /* Unless we have done it all already, examine the namelist and search for
1785      static constructors and destructors to call.  Write the constructor and
1786      destructor tables to a .s file and reload.  */
1787
1788   if (ld1_filter != SCAN_NOTHING)
1789     scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1790
1791 #ifdef SCAN_LIBRARIES
1792   scan_libraries (output_file);
1793 #endif
1794
1795   if (debug)
1796     {
1797       notice_translated (ngettext ("%d constructor found\n",
1798                                    "%d constructors found\n",
1799                                    constructors.number),
1800                          constructors.number);
1801       notice_translated (ngettext ("%d destructor found\n",
1802                                    "%d destructors found\n",
1803                                    destructors.number),
1804                          destructors.number);
1805       notice_translated (ngettext("%d frame table found\n",
1806                                   "%d frame tables found\n",
1807                                   frame_tables.number),
1808                          frame_tables.number);
1809     }
1810
1811   /* If the scan exposed nothing of special interest, there's no need to
1812      generate the glue code and relink so return now.  */
1813
1814   if (constructors.number == 0 && destructors.number == 0
1815       && frame_tables.number == 0
1816 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1817       /* If we will be running these functions ourselves, we want to emit
1818          stubs into the shared library so that we do not have to relink
1819          dependent programs when we add static objects.  */
1820       && ! shared_obj
1821 #endif
1822       )
1823     {
1824       /* Do tlink without additional code generation now if we didn't
1825          do it earlier for scanning purposes.  */
1826       if (ld1_filter == SCAN_NOTHING)
1827         do_tlink (ld1_argv, object_lst);
1828
1829       if (lto_mode)
1830         maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1831
1832       /* Strip now if it was requested on the command line.  */
1833       if (strip_flag)
1834         {
1835           char **real_strip_argv = XCNEWVEC (char *, 3);
1836           const char ** strip_argv = CONST_CAST2 (const char **, char **,
1837                                                   real_strip_argv);
1838
1839           strip_argv[0] = strip_file_name;
1840           strip_argv[1] = output_file;
1841           strip_argv[2] = (char *) 0;
1842           fork_execute ("strip", real_strip_argv);
1843         }
1844
1845 #ifdef COLLECT_EXPORT_LIST
1846       maybe_unlink (export_file);
1847 #endif
1848       post_ld_pass (false);
1849
1850       maybe_unlink (c_file);
1851       maybe_unlink (o_file);
1852       return 0;
1853     }
1854
1855   /* Sort ctor and dtor lists by priority.  */
1856   sort_ids (&constructors);
1857   sort_ids (&destructors);
1858
1859   maybe_unlink(output_file);
1860   outf = fopen (c_file, "w");
1861   if (outf == (FILE *) 0)
1862     fatal_perror ("fopen %s", c_file);
1863
1864   write_c_file (outf, c_file);
1865
1866   if (fclose (outf))
1867     fatal_perror ("fclose %s", c_file);
1868
1869   /* Tell the linker that we have initializer and finalizer functions.  */
1870 #ifdef LD_INIT_SWITCH
1871 #ifdef COLLECT_EXPORT_LIST
1872   *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1873 #else
1874   *ld2++ = LD_INIT_SWITCH;
1875   *ld2++ = initname;
1876   *ld2++ = LD_FINI_SWITCH;
1877   *ld2++ = fininame;
1878 #endif
1879 #endif
1880
1881 #ifdef COLLECT_EXPORT_LIST
1882   if (shared_obj)
1883     {
1884       /* If we did not add export flag to link arguments before, add it to
1885          second link phase now.  No new exports should have been added.  */
1886       if (! exports.first)
1887         *ld2++ = concat ("-bE:", export_file, NULL);
1888
1889 #ifndef LD_INIT_SWITCH
1890       add_to_list (&exports, initname);
1891       add_to_list (&exports, fininame);
1892       add_to_list (&exports, "_GLOBAL__DI");
1893       add_to_list (&exports, "_GLOBAL__DD");
1894 #endif
1895       exportf = fopen (export_file, "w");
1896       if (exportf == (FILE *) 0)
1897         fatal_perror ("fopen %s", export_file);
1898       write_aix_file (exportf, exports.first);
1899       if (fclose (exportf))
1900         fatal_perror ("fclose %s", export_file);
1901     }
1902 #endif
1903
1904   /* End of arguments to second link phase.  */
1905   *ld2 = (char*) 0;
1906
1907   if (debug)
1908     {
1909       fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1910                output_file, c_file);
1911       write_c_file (stderr, "stderr");
1912       fprintf (stderr, "========== end of c_file\n\n");
1913 #ifdef COLLECT_EXPORT_LIST
1914       fprintf (stderr, "\n========== export_file = %s\n", export_file);
1915       write_aix_file (stderr, exports.first);
1916       fprintf (stderr, "========== end of export_file\n\n");
1917 #endif
1918     }
1919
1920   /* Assemble the constructor and destructor tables.
1921      Link the tables in with the rest of the program.  */
1922
1923   fork_execute ("gcc",  c_argv);
1924 #ifdef COLLECT_EXPORT_LIST
1925   /* On AIX we must call tlink because of possible templates resolution.  */
1926   do_tlink (ld2_argv, object_lst);
1927
1928   if (lto_mode)
1929     maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1930 #else
1931   /* Otherwise, simply call ld because tlink is already done.  */
1932   if (lto_mode)
1933     maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1934   else
1935     {
1936       fork_execute ("ld", ld2_argv);
1937       post_ld_pass (false);
1938     }
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 */
3221
3222 #ifdef COLLECT_RUN_DSYMUTIL
3223 static int flag_dsym = false;
3224 static int flag_idsym = false;
3225
3226 static void
3227 process_args (int *argcp, char **argv) {
3228   int i, j;
3229   int argc = *argcp;
3230   for (i=0; i<argc; ++i)
3231     {
3232       if (strcmp (argv[i], "-dsym") == 0)
3233         {
3234           flag_dsym = true;
3235           /* Remove the flag, as we handle all processing for it.  */
3236           j = i;
3237           do
3238             argv[j] = argv[j+1];
3239           while (++j < argc);
3240           --i;
3241           argc = --(*argcp);
3242         }
3243       else if (strcmp (argv[i], "-idsym") == 0)
3244         {
3245           flag_idsym = true;
3246           /* Remove the flag, as we handle all processing for it.  */
3247           j = i;
3248           do
3249             argv[j] = argv[j+1];
3250           while (++j < argc);
3251           --i;
3252           argc = --(*argcp);
3253         }
3254     }
3255 }
3256
3257 static void
3258 do_dsymutil (const char *output_file) {
3259   const char *dsymutil = DSYMUTIL + 1;
3260   struct pex_obj *pex;
3261   char **real_argv = XCNEWVEC (char *, 3);
3262   const char ** argv = CONST_CAST2 (const char **, char **,
3263                                     real_argv);
3264
3265   argv[0] = dsymutil;
3266   argv[1] = output_file;
3267   argv[2] = (char *) 0;
3268
3269   pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
3270   do_wait (dsymutil, pex);
3271 }
3272
3273 static void
3274 post_ld_pass (bool temp_file) {
3275   if (!(temp_file && flag_idsym) && !flag_dsym)
3276     return;
3277       
3278   do_dsymutil (output_file);
3279 }
3280 #else
3281 static void
3282 process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { }
3283 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { }
3284 #endif