OSDN Git Service

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