OSDN Git Service

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