OSDN Git Service

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