OSDN Git Service

PR target/47109
[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   if (response_arg)
2091     free (response_arg);
2092
2093   return pex;
2094 }
2095
2096 static void
2097 fork_execute (const char *prog, char **argv)
2098 {
2099   struct pex_obj *pex;
2100
2101   pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2102   do_wait (prog, pex);
2103 }
2104 \f
2105 /* Unlink a file unless we are debugging.  */
2106
2107 static void
2108 maybe_unlink (const char *file)
2109 {
2110   if (!debug)
2111     unlink_if_ordinary (file);
2112   else
2113     notice ("[Leaving %s]\n", file);
2114 }
2115
2116 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST.  */
2117
2118 static void
2119 maybe_unlink_list (char **file_list)
2120 {
2121   char **tmp = file_list;
2122
2123   while (*tmp)
2124     maybe_unlink (*(tmp++));
2125 }
2126
2127 \f
2128 static long sequence_number = 0;
2129
2130 /* Add a name to a linked list.  */
2131
2132 static void
2133 add_to_list (struct head *head_ptr, const char *name)
2134 {
2135   struct id *newid
2136     = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2137   struct id *p;
2138   strcpy (newid->name, name);
2139
2140   if (head_ptr->first)
2141     head_ptr->last->next = newid;
2142   else
2143     head_ptr->first = newid;
2144
2145   /* Check for duplicate symbols.  */
2146   for (p = head_ptr->first;
2147        strcmp (name, p->name) != 0;
2148        p = p->next)
2149     ;
2150   if (p != newid)
2151     {
2152       head_ptr->last->next = 0;
2153       free (newid);
2154       return;
2155     }
2156
2157   newid->sequence = ++sequence_number;
2158   head_ptr->last = newid;
2159   head_ptr->number++;
2160 }
2161
2162 /* Grab the init priority number from an init function name that
2163    looks like "_GLOBAL_.I.12345.foo".  */
2164
2165 static int
2166 extract_init_priority (const char *name)
2167 {
2168   int pos = 0, pri;
2169
2170   while (name[pos] == '_')
2171     ++pos;
2172   pos += 10; /* strlen ("GLOBAL__X_") */
2173
2174   /* Extract init_p number from ctor/dtor name.  */
2175   pri = atoi (name + pos);
2176   return pri ? pri : DEFAULT_INIT_PRIORITY;
2177 }
2178
2179 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2180    ctors will be run from right to left, dtors from left to right.  */
2181
2182 static void
2183 sort_ids (struct head *head_ptr)
2184 {
2185   /* id holds the current element to insert.  id_next holds the next
2186      element to insert.  id_ptr iterates through the already sorted elements
2187      looking for the place to insert id.  */
2188   struct id *id, *id_next, **id_ptr;
2189
2190   id = head_ptr->first;
2191
2192   /* We don't have any sorted elements yet.  */
2193   head_ptr->first = NULL;
2194
2195   for (; id; id = id_next)
2196     {
2197       id_next = id->next;
2198       id->sequence = extract_init_priority (id->name);
2199
2200       for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2201         if (*id_ptr == NULL
2202             /* If the sequence numbers are the same, we put the id from the
2203                file later on the command line later in the list.  */
2204             || id->sequence > (*id_ptr)->sequence
2205             /* Hack: do lexical compare, too.
2206             || (id->sequence == (*id_ptr)->sequence
2207                 && strcmp (id->name, (*id_ptr)->name) > 0) */
2208             )
2209           {
2210             id->next = *id_ptr;
2211             *id_ptr = id;
2212             break;
2213           }
2214     }
2215
2216   /* Now set the sequence numbers properly so write_c_file works.  */
2217   for (id = head_ptr->first; id; id = id->next)
2218     id->sequence = ++sequence_number;
2219 }
2220
2221 /* Write: `prefix', the names on list LIST, `suffix'.  */
2222
2223 static void
2224 write_list (FILE *stream, const char *prefix, struct id *list)
2225 {
2226   while (list)
2227     {
2228       fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2229       list = list->next;
2230     }
2231 }
2232
2233 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2234 /* Given a STRING, return nonzero if it occurs in the list in range
2235    [ARGS_BEGIN,ARGS_END).  */
2236
2237 static int
2238 is_in_args (const char *string, const char **args_begin,
2239             const char **args_end)
2240 {
2241   const char **args_pointer;
2242   for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2243     if (strcmp (string, *args_pointer) == 0)
2244       return 1;
2245   return 0;
2246 }
2247 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2248
2249 #ifdef COLLECT_EXPORT_LIST
2250 /* This function is really used only on AIX, but may be useful.  */
2251 #if 0
2252 static int
2253 is_in_list (const char *prefix, struct id *list)
2254 {
2255   while (list)
2256     {
2257       if (!strcmp (prefix, list->name)) return 1;
2258       list = list->next;
2259     }
2260     return 0;
2261 }
2262 #endif
2263 #endif /* COLLECT_EXPORT_LIST */
2264
2265 /* Added for debugging purpose.  */
2266 #ifdef COLLECT_EXPORT_LIST
2267 static void
2268 dump_list (FILE *stream, const char *prefix, struct id *list)
2269 {
2270   while (list)
2271     {
2272       fprintf (stream, "%s%s,\n", prefix, list->name);
2273       list = list->next;
2274     }
2275 }
2276 #endif
2277
2278 #if 0
2279 static void
2280 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2281 {
2282   while (list)
2283     {
2284       fprintf (stream, "%s%s,\n", prefix, list->prefix);
2285       list = list->next;
2286     }
2287 }
2288 #endif
2289
2290 static void
2291 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2292 {
2293   while (list)
2294     {
2295       fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2296                prefix, list->sequence, list->name);
2297       list = list->next;
2298     }
2299 }
2300
2301 /* Write out the constructor and destructor tables statically (for a shared
2302    object), along with the functions to execute them.  */
2303
2304 static void
2305 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2306 {
2307   const char *p, *q;
2308   char *prefix, *r;
2309   int frames = (frame_tables.number > 0);
2310
2311   /* Figure out name of output_file, stripping off .so version.  */
2312   q = p = lbasename (output_file);
2313
2314   while (q)
2315     {
2316       q = strchr (q,'.');
2317       if (q == 0)
2318         {
2319           q = p + strlen (p);
2320           break;
2321         }
2322       else
2323         {
2324           if (filename_ncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2325             {
2326               q += strlen (SHLIB_SUFFIX);
2327               break;
2328             }
2329           else
2330             q++;
2331         }
2332     }
2333   /* q points to null at end of the string (or . of the .so version) */
2334   prefix = XNEWVEC (char, q - p + 1);
2335   strncpy (prefix, p, q - p);
2336   prefix[q - p] = 0;
2337   for (r = prefix; *r; r++)
2338     if (!ISALNUM ((unsigned char)*r))
2339       *r = '_';
2340   if (debug)
2341     notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2342             output_file, prefix);
2343
2344   initname = concat ("_GLOBAL__FI_", prefix, NULL);
2345   fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2346
2347   free (prefix);
2348
2349   /* Write the tables as C code.  */
2350
2351   fprintf (stream, "static int count;\n");
2352   fprintf (stream, "typedef void entry_pt();\n");
2353   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2354
2355   if (frames)
2356     {
2357       write_list_with_asm (stream, "extern void *", frame_tables.first);
2358
2359       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2360       write_list (stream, "\t\t&", frame_tables.first);
2361       fprintf (stream, "\t0\n};\n");
2362
2363       /* This must match what's in frame.h.  */
2364       fprintf (stream, "struct object {\n");
2365       fprintf (stream, "  void *pc_begin;\n");
2366       fprintf (stream, "  void *pc_end;\n");
2367       fprintf (stream, "  void *fde_begin;\n");
2368       fprintf (stream, "  void *fde_array;\n");
2369       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2370       fprintf (stream, "  struct object *next;\n");
2371       fprintf (stream, "};\n");
2372
2373       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2374       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2375
2376       fprintf (stream, "static void reg_frame () {\n");
2377       fprintf (stream, "\tstatic struct object ob;\n");
2378       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2379       fprintf (stream, "\t}\n");
2380
2381       fprintf (stream, "static void dereg_frame () {\n");
2382       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2383       fprintf (stream, "\t}\n");
2384     }
2385
2386   fprintf (stream, "void %s() {\n", initname);
2387   if (constructors.number > 0 || frames)
2388     {
2389       fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2390       write_list (stream, "\t\t", constructors.first);
2391       if (frames)
2392         fprintf (stream, "\treg_frame,\n");
2393       fprintf (stream, "\t};\n");
2394       fprintf (stream, "\tentry_pt **p;\n");
2395       fprintf (stream, "\tif (count++ != 0) return;\n");
2396       fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2397       fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2398     }
2399   else
2400     fprintf (stream, "\t++count;\n");
2401   fprintf (stream, "}\n");
2402   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2403   fprintf (stream, "void %s() {\n", fininame);
2404   if (destructors.number > 0 || frames)
2405     {
2406       fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2407       write_list (stream, "\t\t", destructors.first);
2408       if (frames)
2409         fprintf (stream, "\tdereg_frame,\n");
2410       fprintf (stream, "\t};\n");
2411       fprintf (stream, "\tentry_pt **p;\n");
2412       fprintf (stream, "\tif (--count != 0) return;\n");
2413       fprintf (stream, "\tp = dtors;\n");
2414       fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2415                destructors.number + frames);
2416     }
2417   fprintf (stream, "}\n");
2418
2419   if (shared_obj)
2420     {
2421       COLLECT_SHARED_INIT_FUNC(stream, initname);
2422       COLLECT_SHARED_FINI_FUNC(stream, fininame);
2423     }
2424 }
2425
2426 /* Write the constructor/destructor tables.  */
2427
2428 #ifndef LD_INIT_SWITCH
2429 static void
2430 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2431 {
2432   /* Write the tables as C code.  */
2433
2434   int frames = (frame_tables.number > 0);
2435
2436   fprintf (stream, "typedef void entry_pt();\n\n");
2437
2438   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2439
2440   if (frames)
2441     {
2442       write_list_with_asm (stream, "extern void *", frame_tables.first);
2443
2444       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2445       write_list (stream, "\t\t&", frame_tables.first);
2446       fprintf (stream, "\t0\n};\n");
2447
2448       /* This must match what's in frame.h.  */
2449       fprintf (stream, "struct object {\n");
2450       fprintf (stream, "  void *pc_begin;\n");
2451       fprintf (stream, "  void *pc_end;\n");
2452       fprintf (stream, "  void *fde_begin;\n");
2453       fprintf (stream, "  void *fde_array;\n");
2454       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2455       fprintf (stream, "  struct object *next;\n");
2456       fprintf (stream, "};\n");
2457
2458       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2459       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2460
2461       fprintf (stream, "static void reg_frame () {\n");
2462       fprintf (stream, "\tstatic struct object ob;\n");
2463       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2464       fprintf (stream, "\t}\n");
2465
2466       fprintf (stream, "static void dereg_frame () {\n");
2467       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2468       fprintf (stream, "\t}\n");
2469     }
2470
2471   fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2472   fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2473   write_list (stream, "\t", constructors.first);
2474   if (frames)
2475     fprintf (stream, "\treg_frame,\n");
2476   fprintf (stream, "\t0\n};\n\n");
2477
2478   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2479
2480   fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2481   fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2482   write_list (stream, "\t", destructors.first);
2483   if (frames)
2484     fprintf (stream, "\tdereg_frame,\n");
2485   fprintf (stream, "\t0\n};\n\n");
2486
2487   fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2488   fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2489 }
2490 #endif /* ! LD_INIT_SWITCH */
2491
2492 static void
2493 write_c_file (FILE *stream, const char *name)
2494 {
2495 #ifndef LD_INIT_SWITCH
2496   if (! shared_obj)
2497     write_c_file_glob (stream, name);
2498   else
2499 #endif
2500     write_c_file_stat (stream, name);
2501 }
2502
2503 #ifdef COLLECT_EXPORT_LIST
2504 static void
2505 write_aix_file (FILE *stream, struct id *list)
2506 {
2507   for (; list; list = list->next)
2508     {
2509       fputs (list->name, stream);
2510       putc ('\n', stream);
2511     }
2512 }
2513 #endif
2514 \f
2515 #ifdef OBJECT_FORMAT_NONE
2516
2517 /* Check to make sure the file is an LTO object file.  */
2518
2519 static bool
2520 maybe_lto_object_file (const char *prog_name)
2521 {
2522   FILE *f;
2523   unsigned char buf[4];
2524   int i;
2525
2526   static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2527   static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2528   static unsigned char coffmagic_x64[2] = { 0x64, 0x86 };
2529   static unsigned char machomagic[4][4] = {
2530     { 0xcf, 0xfa, 0xed, 0xfe },
2531     { 0xce, 0xfa, 0xed, 0xfe },
2532     { 0xfe, 0xed, 0xfa, 0xcf },
2533     { 0xfe, 0xed, 0xfa, 0xce }
2534   };
2535
2536   f = fopen (prog_name, "rb");
2537   if (f == NULL)
2538     return false;
2539   if (fread (buf, sizeof (buf), 1, f) != 1)
2540     buf[0] = 0;
2541   fclose (f);
2542
2543   if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2544       || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0
2545       || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0)
2546     return true;
2547   for (i = 0; i < 4; i++)
2548     if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2549       return true;
2550
2551   return false;
2552 }
2553
2554 /* Generic version to scan the name list of the loaded program for
2555    the symbols g++ uses for static constructors and destructors.  */
2556
2557 static void
2558 scan_prog_file (const char *prog_name, scanpass which_pass,
2559                 scanfilter filter)
2560 {
2561   void (*int_handler) (int);
2562 #ifdef SIGQUIT
2563   void (*quit_handler) (int);
2564 #endif
2565   char *real_nm_argv[4];
2566   const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2567   int argc = 0;
2568   struct pex_obj *pex;
2569   const char *errmsg;
2570   int err;
2571   char *p, buf[1024];
2572   FILE *inf;
2573   int found_lto = 0;
2574
2575   if (which_pass == PASS_SECOND)
2576     return;
2577
2578   /* LTO objects must be in a known format.  This check prevents
2579      us from accepting an archive containing LTO objects, which
2580      gcc cannnot currently handle.  */
2581   if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2582     return;
2583
2584   /* If we do not have an `nm', complain.  */
2585   if (nm_file_name == 0)
2586     fatal ("cannot find 'nm'");
2587
2588   nm_argv[argc++] = nm_file_name;
2589   if (NM_FLAGS[0] != '\0')
2590     nm_argv[argc++] = NM_FLAGS;
2591
2592   nm_argv[argc++] = prog_name;
2593   nm_argv[argc++] = (char *) 0;
2594
2595   /* Trace if needed.  */
2596   if (vflag)
2597     {
2598       const char **p_argv;
2599       const char *str;
2600
2601       for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2602         fprintf (stderr, " %s", str);
2603
2604       fprintf (stderr, "\n");
2605     }
2606
2607   fflush (stdout);
2608   fflush (stderr);
2609
2610   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2611   if (pex == NULL)
2612     fatal_perror ("pex_init failed");
2613
2614   errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2615                     &err);
2616   if (errmsg != NULL)
2617     {
2618       if (err != 0)
2619         {
2620           errno = err;
2621           fatal_perror (errmsg);
2622         }
2623       else
2624         fatal (errmsg);
2625     }
2626
2627   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2628 #ifdef SIGQUIT
2629   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2630 #endif
2631
2632   inf = pex_read_output (pex, 0);
2633   if (inf == NULL)
2634     fatal_perror ("can't open nm output");
2635
2636   if (debug)
2637     {
2638       if (which_pass == PASS_LTOINFO)
2639         fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2640       else
2641         fprintf (stderr, "\nnm output with constructors/destructors.\n");
2642     }
2643
2644   /* Read each line of nm output.  */
2645   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2646     {
2647       int ch, ch2;
2648       char *name, *end;
2649
2650       if (debug)
2651         fprintf (stderr, "\t%s\n", buf);
2652
2653       if (which_pass == PASS_LTOINFO)
2654         {
2655           if (found_lto)
2656             continue;
2657
2658           /* Look for the LTO info marker symbol, and add filename to
2659              the LTO objects list if found.  */
2660           for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2661             if (ch == ' '  && p[1] == '_' && p[2] == '_'
2662                 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2663                 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2664               {
2665                 add_lto_object (&lto_objects, prog_name);
2666
2667                 /* We need to read all the input, so we can't just
2668                    return here.  But we can avoid useless work.  */
2669                 found_lto = 1;
2670
2671                 break;
2672               }
2673
2674           continue;
2675         }
2676
2677       /* If it contains a constructor or destructor name, add the name
2678          to the appropriate list unless this is a kind of symbol we're
2679          not supposed to even consider.  */
2680
2681       for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2682         if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2683           break;
2684
2685       if (ch != '_')
2686         continue;
2687
2688       name = p;
2689       /* Find the end of the symbol name.
2690          Do not include `|', because Encore nm can tack that on the end.  */
2691       for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2692            end++)
2693         continue;
2694
2695
2696       *end = '\0';
2697       switch (is_ctor_dtor (name))
2698         {
2699         case SYM_CTOR:
2700           if (! (filter & SCAN_CTOR))
2701             break;
2702           if (which_pass != PASS_LIB)
2703             add_to_list (&constructors, name);
2704           break;
2705
2706         case SYM_DTOR:
2707           if (! (filter & SCAN_DTOR))
2708             break;
2709           if (which_pass != PASS_LIB)
2710             add_to_list (&destructors, name);
2711           break;
2712
2713         case SYM_INIT:
2714           if (! (filter & SCAN_INIT))
2715             break;
2716           if (which_pass != PASS_LIB)
2717             fatal ("init function found in object %s", prog_name);
2718 #ifndef LD_INIT_SWITCH
2719           add_to_list (&constructors, name);
2720 #endif
2721           break;
2722
2723         case SYM_FINI:
2724           if (! (filter & SCAN_FINI))
2725             break;
2726           if (which_pass != PASS_LIB)
2727             fatal ("fini function found in object %s", prog_name);
2728 #ifndef LD_FINI_SWITCH
2729           add_to_list (&destructors, name);
2730 #endif
2731           break;
2732
2733         case SYM_DWEH:
2734           if (! (filter & SCAN_DWEH))
2735             break;
2736           if (which_pass != PASS_LIB)
2737             add_to_list (&frame_tables, name);
2738           break;
2739
2740         default:                /* not a constructor or destructor */
2741           continue;
2742         }
2743     }
2744
2745   if (debug)
2746     fprintf (stderr, "\n");
2747
2748   do_wait (nm_file_name, pex);
2749
2750   signal (SIGINT,  int_handler);
2751 #ifdef SIGQUIT
2752   signal (SIGQUIT, quit_handler);
2753 #endif
2754 }
2755
2756 #ifdef LDD_SUFFIX
2757
2758 /* Use the List Dynamic Dependencies program to find shared libraries that
2759    the output file depends upon and their initialization/finalization
2760    routines, if any.  */
2761
2762 static void
2763 scan_libraries (const char *prog_name)
2764 {
2765   static struct head libraries;         /* list of shared libraries found */
2766   struct id *list;
2767   void (*int_handler) (int);
2768 #ifdef SIGQUIT
2769   void (*quit_handler) (int);
2770 #endif
2771   char *real_ldd_argv[4];
2772   const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2773   int argc = 0;
2774   struct pex_obj *pex;
2775   const char *errmsg;
2776   int err;
2777   char buf[1024];
2778   FILE *inf;
2779
2780   /* If we do not have an `ldd', complain.  */
2781   if (ldd_file_name == 0)
2782     {
2783       error ("cannot find 'ldd'");
2784       return;
2785     }
2786
2787   ldd_argv[argc++] = ldd_file_name;
2788   ldd_argv[argc++] = prog_name;
2789   ldd_argv[argc++] = (char *) 0;
2790
2791   /* Trace if needed.  */
2792   if (vflag)
2793     {
2794       const char **p_argv;
2795       const char *str;
2796
2797       for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2798         fprintf (stderr, " %s", str);
2799
2800       fprintf (stderr, "\n");
2801     }
2802
2803   fflush (stdout);
2804   fflush (stderr);
2805
2806   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2807   if (pex == NULL)
2808     fatal_perror ("pex_init failed");
2809
2810   errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2811   if (errmsg != NULL)
2812     {
2813       if (err != 0)
2814         {
2815           errno = err;
2816           fatal_perror (errmsg);
2817         }
2818       else
2819         fatal (errmsg);
2820     }
2821
2822   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2823 #ifdef SIGQUIT
2824   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2825 #endif
2826
2827   inf = pex_read_output (pex, 0);
2828   if (inf == NULL)
2829     fatal_perror ("can't open ldd output");
2830
2831   if (debug)
2832     notice ("\nldd output with constructors/destructors.\n");
2833
2834   /* Read each line of ldd output.  */
2835   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2836     {
2837       int ch2;
2838       char *name, *end, *p = buf;
2839
2840       /* Extract names of libraries and add to list.  */
2841       PARSE_LDD_OUTPUT (p);
2842       if (p == 0)
2843         continue;
2844
2845       name = p;
2846       if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2847         fatal ("dynamic dependency %s not found", buf);
2848
2849       /* Find the end of the symbol name.  */
2850       for (end = p;
2851            (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2852            end++)
2853         continue;
2854       *end = '\0';
2855
2856       if (access (name, R_OK) == 0)
2857         add_to_list (&libraries, name);
2858       else
2859         fatal ("unable to open dynamic dependency '%s'", buf);
2860
2861       if (debug)
2862         fprintf (stderr, "\t%s\n", buf);
2863     }
2864   if (debug)
2865     fprintf (stderr, "\n");
2866
2867   do_wait (ldd_file_name, pex);
2868
2869   signal (SIGINT,  int_handler);
2870 #ifdef SIGQUIT
2871   signal (SIGQUIT, quit_handler);
2872 #endif
2873
2874   /* Now iterate through the library list adding their symbols to
2875      the list.  */
2876   for (list = libraries.first; list; list = list->next)
2877     scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2878 }
2879
2880 #endif /* LDD_SUFFIX */
2881
2882 #endif /* OBJECT_FORMAT_NONE */
2883
2884 \f
2885 /*
2886  * COFF specific stuff.
2887  */
2888
2889 #ifdef OBJECT_FORMAT_COFF
2890
2891 #if defined (EXTENDED_COFF)
2892
2893 #   define GCC_SYMBOLS(X)       (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2894 #   define GCC_SYMENT           SYMR
2895 #   define GCC_OK_SYMBOL(X)     ((X).st == stProc || (X).st == stGlobal)
2896 #   define GCC_SYMINC(X)        (1)
2897 #   define GCC_SYMZERO(X)       (SYMHEADER(X).isymMax)
2898 #   define GCC_CHECK_HDR(X)     (PSYMTAB(X) != 0)
2899
2900 #else
2901
2902 #   define GCC_SYMBOLS(X)       (HEADER(ldptr).f_nsyms)
2903 #   define GCC_SYMENT           SYMENT
2904 #   if defined (C_WEAKEXT)
2905 #     define GCC_OK_SYMBOL(X) \
2906        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2907         ((X).n_scnum > N_UNDEF) && \
2908         (aix64_flag \
2909          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2910              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2911 #     define GCC_UNDEF_SYMBOL(X) \
2912        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2913         ((X).n_scnum == N_UNDEF))
2914 #   else
2915 #     define GCC_OK_SYMBOL(X) \
2916        (((X).n_sclass == C_EXT) && \
2917         ((X).n_scnum > N_UNDEF) && \
2918         (aix64_flag \
2919          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2920              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2921 #     define GCC_UNDEF_SYMBOL(X) \
2922        (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2923 #   endif
2924 #   define GCC_SYMINC(X)        ((X).n_numaux+1)
2925 #   define GCC_SYMZERO(X)       0
2926
2927 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2928 #if TARGET_AIX_VERSION >= 51
2929 #   define GCC_CHECK_HDR(X) \
2930      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2931       || (HEADER (X).f_magic == 0767 && aix64_flag))
2932 #else
2933 #   define GCC_CHECK_HDR(X) \
2934      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2935       || (HEADER (X).f_magic == 0757 && aix64_flag))
2936 #endif
2937
2938 #endif
2939
2940 #ifdef COLLECT_EXPORT_LIST
2941 /* Array of standard AIX libraries which should not
2942    be scanned for ctors/dtors.  */
2943 static const char *const aix_std_libs[] = {
2944   "/unix",
2945   "/lib/libc.a",
2946   "/lib/libm.a",
2947   "/lib/libc_r.a",
2948   "/lib/libm_r.a",
2949   "/usr/lib/libc.a",
2950   "/usr/lib/libm.a",
2951   "/usr/lib/libc_r.a",
2952   "/usr/lib/libm_r.a",
2953   "/usr/lib/threads/libc.a",
2954   "/usr/ccs/lib/libc.a",
2955   "/usr/ccs/lib/libm.a",
2956   "/usr/ccs/lib/libc_r.a",
2957   "/usr/ccs/lib/libm_r.a",
2958   NULL
2959 };
2960
2961 /* This function checks the filename and returns 1
2962    if this name matches the location of a standard AIX library.  */
2963 static int ignore_library (const char *);
2964 static int
2965 ignore_library (const char *name)
2966 {
2967   const char *const *p;
2968   size_t length;
2969
2970   if (target_system_root[0] != '\0')
2971     {
2972       length = strlen (target_system_root);
2973       if (strncmp (name, target_system_root, length) != 0)
2974         return 0;
2975       name += length;
2976     }
2977   for (p = &aix_std_libs[0]; *p != NULL; ++p)
2978     if (strcmp (name, *p) == 0)
2979       return 1;
2980   return 0;
2981 }
2982 #endif /* COLLECT_EXPORT_LIST */
2983
2984 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2985 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2986 #endif
2987
2988 /* COFF version to scan the name list of the loaded program for
2989    the symbols g++ uses for static constructors and destructors.  */
2990
2991 static void
2992 scan_prog_file (const char *prog_name, scanpass which_pass,
2993                 scanfilter filter)
2994 {
2995   LDFILE *ldptr = NULL;
2996   int sym_index, sym_count;
2997   int is_shared = 0;
2998
2999   if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
3000     return;
3001
3002 #ifdef COLLECT_EXPORT_LIST
3003   /* We do not need scanning for some standard C libraries.  */
3004   if (which_pass == PASS_FIRST && ignore_library (prog_name))
3005     return;
3006
3007   /* On AIX we have a loop, because there is not much difference
3008      between an object and an archive. This trick allows us to
3009      eliminate scan_libraries() function.  */
3010   do
3011     {
3012 #endif
3013       /* Some platforms (e.g. OSF4) declare ldopen as taking a
3014          non-const char * filename parameter, even though it will not
3015          modify that string.  So we must cast away const-ness here,
3016          using CONST_CAST to prevent complaints from -Wcast-qual.  */
3017       if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
3018         {
3019           if (! MY_ISCOFF (HEADER (ldptr).f_magic))
3020             fatal ("%s: not a COFF file", prog_name);
3021
3022           if (GCC_CHECK_HDR (ldptr))
3023             {
3024               sym_count = GCC_SYMBOLS (ldptr);
3025               sym_index = GCC_SYMZERO (ldptr);
3026
3027 #ifdef COLLECT_EXPORT_LIST
3028               /* Is current archive member a shared object?  */
3029               is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
3030 #endif
3031
3032               while (sym_index < sym_count)
3033                 {
3034                   GCC_SYMENT symbol;
3035
3036                   if (ldtbread (ldptr, sym_index, &symbol) <= 0)
3037                     break;
3038                   sym_index += GCC_SYMINC (symbol);
3039
3040                   if (GCC_OK_SYMBOL (symbol))
3041                     {
3042                       char *name;
3043
3044                       if ((name = ldgetname (ldptr, &symbol)) == NULL)
3045                         continue;               /* Should never happen.  */
3046
3047 #ifdef XCOFF_DEBUGGING_INFO
3048                       /* All AIX function names have a duplicate entry
3049                          beginning with a dot.  */
3050                       if (*name == '.')
3051                         ++name;
3052 #endif
3053
3054                       switch (is_ctor_dtor (name))
3055                         {
3056                         case SYM_CTOR:
3057                           if (! (filter & SCAN_CTOR))
3058                             break;
3059                           if (! is_shared)
3060                             add_to_list (&constructors, name);
3061 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3062                           if (which_pass == PASS_OBJ)
3063                             add_to_list (&exports, name);
3064 #endif
3065                           break;
3066
3067                         case SYM_DTOR:
3068                           if (! (filter & SCAN_DTOR))
3069                             break;
3070                           if (! is_shared)
3071                             add_to_list (&destructors, name);
3072 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3073                           if (which_pass == PASS_OBJ)
3074                             add_to_list (&exports, name);
3075 #endif
3076                           break;
3077
3078 #ifdef COLLECT_EXPORT_LIST
3079                         case SYM_INIT:
3080                           if (! (filter & SCAN_INIT))
3081                             break;
3082 #ifndef LD_INIT_SWITCH
3083                           if (is_shared)
3084                             add_to_list (&constructors, name);
3085 #endif
3086                           break;
3087
3088                         case SYM_FINI:
3089                           if (! (filter & SCAN_FINI))
3090                             break;
3091 #ifndef LD_INIT_SWITCH
3092                           if (is_shared)
3093                             add_to_list (&destructors, name);
3094 #endif
3095                           break;
3096 #endif
3097
3098                         case SYM_DWEH:
3099                           if (! (filter & SCAN_DWEH))
3100                             break;
3101                           if (! is_shared)
3102                             add_to_list (&frame_tables, name);
3103 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3104                           if (which_pass == PASS_OBJ)
3105                             add_to_list (&exports, name);
3106 #endif
3107                           break;
3108
3109                         default:        /* not a constructor or destructor */
3110 #ifdef COLLECT_EXPORT_LIST
3111                           /* Explicitly export all global symbols when
3112                              building a shared object on AIX, but do not
3113                              re-export symbols from another shared object
3114                              and do not export symbols if the user
3115                              provides an explicit export list.  */
3116                           if (shared_obj && !is_shared
3117                               && which_pass == PASS_OBJ && !export_flag)
3118                             add_to_list (&exports, name);
3119 #endif
3120                           continue;
3121                         }
3122
3123                       if (debug)
3124 #if !defined(EXTENDED_COFF)
3125                         fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3126                                  symbol.n_scnum, symbol.n_sclass,
3127                                  (symbol.n_type ? "0" : ""), symbol.n_type,
3128                                  name);
3129 #else
3130                         fprintf (stderr,
3131                                  "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3132                                  symbol.iss, (long) symbol.value, symbol.index, name);
3133 #endif
3134                     }
3135                 }
3136             }
3137 #ifdef COLLECT_EXPORT_LIST
3138           else
3139             {
3140               /* If archive contains both 32-bit and 64-bit objects,
3141                  we want to skip objects in other mode so mismatch normal.  */
3142               if (debug)
3143                 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3144                          prog_name, HEADER (ldptr).f_magic, aix64_flag);
3145             }
3146 #endif
3147         }
3148       else
3149         {
3150           fatal ("%s: cannot open as COFF file", prog_name);
3151         }
3152 #ifdef COLLECT_EXPORT_LIST
3153       /* On AIX loop continues while there are more members in archive.  */
3154     }
3155   while (ldclose (ldptr) == FAILURE);
3156 #else
3157   /* Otherwise we simply close ldptr.  */
3158   (void) ldclose(ldptr);
3159 #endif
3160 }
3161 #endif /* OBJECT_FORMAT_COFF */
3162
3163 #ifdef COLLECT_EXPORT_LIST
3164 /* Given a library name without "lib" prefix, this function
3165    returns a full library name including a path.  */
3166 static char *
3167 resolve_lib_name (const char *name)
3168 {
3169   char *lib_buf;
3170   int i, j, l = 0;
3171   /* Library extensions for AIX dynamic linking.  */
3172   const char * const libexts[2] = {"a", "so"};
3173
3174   for (i = 0; libpaths[i]; i++)
3175     if (libpaths[i]->max_len > l)
3176       l = libpaths[i]->max_len;
3177
3178   lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3179
3180   for (i = 0; libpaths[i]; i++)
3181     {
3182       struct prefix_list *list = libpaths[i]->plist;
3183       for (; list; list = list->next)
3184         {
3185           /* The following lines are needed because path_prefix list
3186              may contain directories both with trailing DIR_SEPARATOR and
3187              without it.  */
3188           const char *p = "";
3189           if (!IS_DIR_SEPARATOR (list->prefix[strlen(list->prefix)-1]))
3190             p = "/";
3191           for (j = 0; j < 2; j++)
3192             {
3193               sprintf (lib_buf, "%s%slib%s.%s",
3194                        list->prefix, p, name,
3195                        libexts[(j + aixrtl_flag) % 2]);
3196               if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3197               if (file_exists (lib_buf))
3198                 {
3199                   if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3200                   return (lib_buf);
3201                 }
3202             }
3203         }
3204     }
3205   if (debug)
3206     fprintf (stderr, "not found\n");
3207   else
3208     fatal ("library lib%s not found", name);
3209   return (NULL);
3210 }
3211 #endif /* COLLECT_EXPORT_LIST */
3212
3213 #ifdef COLLECT_RUN_DSYMUTIL
3214 static int flag_dsym = false;
3215 static int flag_idsym = false;
3216
3217 static void
3218 process_args (int *argcp, char **argv) {
3219   int i, j;
3220   int argc = *argcp;
3221   for (i=0; i<argc; ++i)
3222     {
3223       if (strcmp (argv[i], "-dsym") == 0)
3224         {
3225           flag_dsym = true;
3226           /* Remove the flag, as we handle all processing for it.  */
3227           j = i;
3228           do
3229             argv[j] = argv[j+1];
3230           while (++j < argc);
3231           --i;
3232           argc = --(*argcp);
3233         }
3234       else if (strcmp (argv[i], "-idsym") == 0)
3235         {
3236           flag_idsym = true;
3237           /* Remove the flag, as we handle all processing for it.  */
3238           j = i;
3239           do
3240             argv[j] = argv[j+1];
3241           while (++j < argc);
3242           --i;
3243           argc = --(*argcp);
3244         }
3245     }
3246 }
3247
3248 static void
3249 do_dsymutil (const char *output_file) {
3250   const char *dsymutil = DSYMUTIL + 1;
3251   struct pex_obj *pex;
3252   char **real_argv = XCNEWVEC (char *, 3);
3253   const char ** argv = CONST_CAST2 (const char **, char **,
3254                                     real_argv);
3255
3256   argv[0] = dsymutil;
3257   argv[1] = output_file;
3258   argv[2] = (char *) 0;
3259
3260   pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
3261   do_wait (dsymutil, pex);
3262 }
3263
3264 static void
3265 post_ld_pass (bool temp_file) {
3266   if (!(temp_file && flag_idsym) && !flag_dsym)
3267     return;
3268       
3269   do_dsymutil (output_file);
3270 }
3271 #else
3272 static void
3273 process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { }
3274 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { }
3275 #endif