OSDN Git Service

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