OSDN Git Service

2010-01-24 David S. Miller <davem@davemloft.net>
[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 = ld1_filter;
1681 #if HAVE_AS_REF
1682     if (!shared_obj)
1683       this_filter &= ~SCAN_DWEH;
1684 #endif
1685
1686     while (export_object_lst < object)
1687       scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1688
1689     for (; list; list = list->next)
1690       scan_prog_file (list->name, PASS_FIRST, this_filter);
1691
1692     ld1_filter = ld1_filter & ~this_filter;
1693   }
1694
1695   if (exports.first)
1696     {
1697       char *buf = concat ("-bE:", export_file, NULL);
1698
1699       *ld1++ = buf;
1700       *ld2++ = buf;
1701
1702       exportf = fopen (export_file, "w");
1703       if (exportf == (FILE *) 0)
1704         fatal_perror ("fopen %s", export_file);
1705       write_aix_file (exportf, exports.first);
1706       if (fclose (exportf))
1707         fatal_perror ("fclose %s", export_file);
1708     }
1709 #endif
1710
1711   *c_ptr++ = c_file;
1712   *c_ptr = *ld1 = *object = (char *) 0;
1713
1714   if (vflag)
1715     {
1716       notice ("collect2 version %s", version_string);
1717 #ifdef TARGET_VERSION
1718       TARGET_VERSION;
1719 #endif
1720       fprintf (stderr, "\n");
1721     }
1722
1723   if (debug)
1724     {
1725       const char *ptr;
1726       fprintf (stderr, "ld_file_name        = %s\n",
1727                (ld_file_name ? ld_file_name : "not found"));
1728       fprintf (stderr, "c_file_name         = %s\n",
1729                (c_file_name ? c_file_name : "not found"));
1730       fprintf (stderr, "nm_file_name        = %s\n",
1731                (nm_file_name ? nm_file_name : "not found"));
1732 #ifdef LDD_SUFFIX
1733       fprintf (stderr, "ldd_file_name       = %s\n",
1734                (ldd_file_name ? ldd_file_name : "not found"));
1735 #endif
1736       fprintf (stderr, "strip_file_name     = %s\n",
1737                (strip_file_name ? strip_file_name : "not found"));
1738       fprintf (stderr, "c_file              = %s\n",
1739                (c_file ? c_file : "not found"));
1740       fprintf (stderr, "o_file              = %s\n",
1741                (o_file ? o_file : "not found"));
1742
1743       ptr = getenv ("COLLECT_GCC_OPTIONS");
1744       if (ptr)
1745         fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1746
1747       ptr = getenv ("COLLECT_GCC");
1748       if (ptr)
1749         fprintf (stderr, "COLLECT_GCC         = %s\n", ptr);
1750
1751       ptr = getenv ("COMPILER_PATH");
1752       if (ptr)
1753         fprintf (stderr, "COMPILER_PATH       = %s\n", ptr);
1754
1755       ptr = getenv (LIBRARY_PATH_ENV);
1756       if (ptr)
1757         fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1758
1759       fprintf (stderr, "\n");
1760     }
1761
1762   /* Load the program, searching all libraries and attempting to provide
1763      undefined symbols from repository information.
1764
1765      If -r or they will be run via some other method, do not build the
1766      constructor or destructor list, just return now.  */
1767   {
1768     bool early_exit
1769       = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1770
1771     /* Perform the first pass link now, if we're about to exit or if we need
1772        to scan for things we haven't collected yet before pursuing further.
1773
1774        On AIX, the latter typically includes nothing for shared objects or
1775        frame tables for an executable, out of what the required early scan on
1776        objects and libraries has performed above.  In the !shared_obj case, we
1777        expect the relevant tables to be dragged together with their associated
1778        functions from precise cross reference insertions by the compiler.  */
1779
1780     if (early_exit || ld1_filter != SCAN_NOTHING)
1781       do_tlink (ld1_argv, object_lst);
1782
1783     if (early_exit)
1784       {
1785 #ifdef COLLECT_EXPORT_LIST
1786         /* Make sure we delete the export file we may have created.  */
1787         if (export_file != 0 && export_file[0])
1788           maybe_unlink (export_file);
1789 #endif
1790         if (lto_mode)
1791           maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1792
1793         maybe_unlink (c_file);
1794         maybe_unlink (o_file);
1795         return 0;
1796       }
1797   }
1798
1799   /* Unless we have done it all already, examine the namelist and search for
1800      static constructors and destructors to call.  Write the constructor and
1801      destructor tables to a .s file and reload.  */
1802
1803   if (ld1_filter != SCAN_NOTHING)
1804     scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1805
1806 #ifdef SCAN_LIBRARIES
1807   scan_libraries (output_file);
1808 #endif
1809
1810   if (debug)
1811     {
1812       notice ("%d constructor(s) found\n", constructors.number);
1813       notice ("%d destructor(s)  found\n", destructors.number);
1814       notice ("%d frame table(s) found\n", frame_tables.number);
1815     }
1816
1817   /* If the scan exposed nothing of special interest, there's no need to
1818      generate the glue code and relink so return now.  */
1819
1820   if (constructors.number == 0 && destructors.number == 0
1821       && frame_tables.number == 0
1822 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1823       /* If we will be running these functions ourselves, we want to emit
1824          stubs into the shared library so that we do not have to relink
1825          dependent programs when we add static objects.  */
1826       && ! shared_obj
1827 #endif
1828       )
1829     {
1830       /* Do tlink without additional code generation now if we didn't
1831          do it earlier for scanning purposes.  */
1832       if (ld1_filter == SCAN_NOTHING)
1833         do_tlink (ld1_argv, object_lst);
1834
1835       if (lto_mode)
1836         maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1837
1838       /* Strip now if it was requested on the command line.  */
1839       if (strip_flag)
1840         {
1841           char **real_strip_argv = XCNEWVEC (char *, 3);
1842           const char ** strip_argv = CONST_CAST2 (const char **, char **,
1843                                                   real_strip_argv);
1844
1845           strip_argv[0] = strip_file_name;
1846           strip_argv[1] = output_file;
1847           strip_argv[2] = (char *) 0;
1848           fork_execute ("strip", real_strip_argv);
1849         }
1850
1851 #ifdef COLLECT_EXPORT_LIST
1852       maybe_unlink (export_file);
1853 #endif
1854       maybe_unlink (c_file);
1855       maybe_unlink (o_file);
1856       return 0;
1857     }
1858
1859   /* Sort ctor and dtor lists by priority.  */
1860   sort_ids (&constructors);
1861   sort_ids (&destructors);
1862
1863   maybe_unlink(output_file);
1864   outf = fopen (c_file, "w");
1865   if (outf == (FILE *) 0)
1866     fatal_perror ("fopen %s", c_file);
1867
1868   write_c_file (outf, c_file);
1869
1870   if (fclose (outf))
1871     fatal_perror ("fclose %s", c_file);
1872
1873   /* Tell the linker that we have initializer and finalizer functions.  */
1874 #ifdef LD_INIT_SWITCH
1875 #ifdef COLLECT_EXPORT_LIST
1876   *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1877 #else
1878   *ld2++ = LD_INIT_SWITCH;
1879   *ld2++ = initname;
1880   *ld2++ = LD_FINI_SWITCH;
1881   *ld2++ = fininame;
1882 #endif
1883 #endif
1884
1885 #ifdef COLLECT_EXPORT_LIST
1886   if (shared_obj)
1887     {
1888       /* If we did not add export flag to link arguments before, add it to
1889          second link phase now.  No new exports should have been added.  */
1890       if (! exports.first)
1891         *ld2++ = concat ("-bE:", export_file, NULL);
1892
1893 #ifndef LD_INIT_SWITCH
1894       add_to_list (&exports, initname);
1895       add_to_list (&exports, fininame);
1896       add_to_list (&exports, "_GLOBAL__DI");
1897       add_to_list (&exports, "_GLOBAL__DD");
1898 #endif
1899       exportf = fopen (export_file, "w");
1900       if (exportf == (FILE *) 0)
1901         fatal_perror ("fopen %s", export_file);
1902       write_aix_file (exportf, exports.first);
1903       if (fclose (exportf))
1904         fatal_perror ("fclose %s", export_file);
1905     }
1906 #endif
1907
1908   /* End of arguments to second link phase.  */
1909   *ld2 = (char*) 0;
1910
1911   if (debug)
1912     {
1913       fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1914                output_file, c_file);
1915       write_c_file (stderr, "stderr");
1916       fprintf (stderr, "========== end of c_file\n\n");
1917 #ifdef COLLECT_EXPORT_LIST
1918       fprintf (stderr, "\n========== export_file = %s\n", export_file);
1919       write_aix_file (stderr, exports.first);
1920       fprintf (stderr, "========== end of export_file\n\n");
1921 #endif
1922     }
1923
1924   /* Assemble the constructor and destructor tables.
1925      Link the tables in with the rest of the program.  */
1926
1927   fork_execute ("gcc",  c_argv);
1928 #ifdef COLLECT_EXPORT_LIST
1929   /* On AIX we must call tlink because of possible templates resolution.  */
1930   do_tlink (ld2_argv, object_lst);
1931
1932   if (lto_mode)
1933     maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1934 #else
1935   /* Otherwise, simply call ld because tlink is already done.  */
1936   if (lto_mode)
1937     maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1938   else
1939     fork_execute ("ld", ld2_argv);
1940
1941   /* Let scan_prog_file do any final mods (OSF/rose needs this for
1942      constructors/destructors in shared libraries.  */
1943   scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1944 #endif
1945
1946   maybe_unlink (c_file);
1947   maybe_unlink (o_file);
1948
1949 #ifdef COLLECT_EXPORT_LIST
1950   maybe_unlink (export_file);
1951 #endif
1952
1953   return 0;
1954 }
1955
1956 \f
1957 /* Wait for a process to finish, and exit if a nonzero status is found.  */
1958
1959 int
1960 collect_wait (const char *prog, struct pex_obj *pex)
1961 {
1962   int status;
1963
1964   if (!pex_get_status (pex, 1, &status))
1965     fatal_perror ("can't get program status");
1966   pex_free (pex);
1967
1968   if (status)
1969     {
1970       if (WIFSIGNALED (status))
1971         {
1972           int sig = WTERMSIG (status);
1973           error ("%s terminated with signal %d [%s]%s",
1974                  prog, sig, strsignal(sig),
1975                  WCOREDUMP(status) ? ", core dumped" : "");
1976           collect_exit (FATAL_EXIT_CODE);
1977         }
1978
1979       if (WIFEXITED (status))
1980         return WEXITSTATUS (status);
1981     }
1982   return 0;
1983 }
1984
1985 static void
1986 do_wait (const char *prog, struct pex_obj *pex)
1987 {
1988   int ret = collect_wait (prog, pex);
1989   if (ret != 0)
1990     {
1991       error ("%s returned %d exit status", prog, ret);
1992       collect_exit (ret);
1993     }
1994
1995   if (response_file)
1996     {
1997       unlink (response_file);
1998       response_file = NULL;
1999     }
2000 }
2001
2002 \f
2003 /* Execute a program, and wait for the reply.  */
2004
2005 struct pex_obj *
2006 collect_execute (const char *prog, char **argv, const char *outname,
2007                  const char *errname, int flags)
2008 {
2009   struct pex_obj *pex;
2010   const char *errmsg;
2011   int err;
2012   char *response_arg = NULL;
2013   char *response_argv[3] ATTRIBUTE_UNUSED;
2014
2015   if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
2016     {
2017       /* If using @file arguments, create a temporary file and put the
2018          contents of argv into it.  Then change argv to an array corresponding
2019          to a single argument @FILE, where FILE is the temporary filename.  */
2020
2021       char **current_argv = argv + 1;
2022       char *argv0 = argv[0];
2023       int status;
2024       FILE *f;
2025
2026       /* Note: we assume argv contains at least one element; this is
2027          checked above.  */
2028
2029       response_file = make_temp_file ("");
2030
2031       f = fopen (response_file, "w");
2032
2033       if (f == NULL)
2034         fatal ("could not open response file %s", response_file);
2035
2036       status = writeargv (current_argv, f);
2037
2038       if (status)
2039         fatal ("could not write to response file %s", response_file);
2040
2041       status = fclose (f);
2042
2043       if (EOF == status)
2044         fatal ("could not close response file %s", response_file);
2045
2046       response_arg = concat ("@", response_file, NULL);
2047       response_argv[0] = argv0;
2048       response_argv[1] = response_arg;
2049       response_argv[2] = NULL;
2050
2051       argv = response_argv;
2052     }
2053
2054   if (vflag || debug)
2055     {
2056       char **p_argv;
2057       const char *str;
2058
2059       if (argv[0])
2060         fprintf (stderr, "%s", argv[0]);
2061       else
2062         notice ("[cannot find %s]", prog);
2063
2064       for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
2065         fprintf (stderr, " %s", str);
2066
2067       fprintf (stderr, "\n");
2068     }
2069
2070   fflush (stdout);
2071   fflush (stderr);
2072
2073   /* If we cannot find a program we need, complain error.  Do this here
2074      since we might not end up needing something that we could not find.  */
2075
2076   if (argv[0] == 0)
2077     fatal ("cannot find '%s'", prog);
2078
2079   pex = pex_init (0, "collect2", NULL);
2080   if (pex == NULL)
2081     fatal_perror ("pex_init failed");
2082
2083   errmsg = pex_run (pex, flags, argv[0], argv, outname,
2084                     errname, &err);
2085   if (errmsg != NULL)
2086     {
2087       if (err != 0)
2088         {
2089           errno = err;
2090           fatal_perror (errmsg);
2091         }
2092       else
2093         fatal (errmsg);
2094     }
2095
2096   if (response_arg)
2097     free (response_arg);
2098
2099   return pex;
2100 }
2101
2102 static void
2103 fork_execute (const char *prog, char **argv)
2104 {
2105   struct pex_obj *pex;
2106
2107   pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2108   do_wait (prog, pex);
2109 }
2110 \f
2111 /* Unlink a file unless we are debugging.  */
2112
2113 static void
2114 maybe_unlink (const char *file)
2115 {
2116   if (!debug)
2117     unlink_if_ordinary (file);
2118   else
2119     notice ("[Leaving %s]\n", file);
2120 }
2121
2122 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST.  */
2123
2124 static void
2125 maybe_unlink_list (char **file_list)
2126 {
2127   char **tmp = file_list;
2128
2129   while (*tmp)
2130     maybe_unlink (*(tmp++));
2131 }
2132
2133 \f
2134 static long sequence_number = 0;
2135
2136 /* Add a name to a linked list.  */
2137
2138 static void
2139 add_to_list (struct head *head_ptr, const char *name)
2140 {
2141   struct id *newid
2142     = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2143   struct id *p;
2144   strcpy (newid->name, name);
2145
2146   if (head_ptr->first)
2147     head_ptr->last->next = newid;
2148   else
2149     head_ptr->first = newid;
2150
2151   /* Check for duplicate symbols.  */
2152   for (p = head_ptr->first;
2153        strcmp (name, p->name) != 0;
2154        p = p->next)
2155     ;
2156   if (p != newid)
2157     {
2158       head_ptr->last->next = 0;
2159       free (newid);
2160       return;
2161     }
2162
2163   newid->sequence = ++sequence_number;
2164   head_ptr->last = newid;
2165   head_ptr->number++;
2166 }
2167
2168 /* Grab the init priority number from an init function name that
2169    looks like "_GLOBAL_.I.12345.foo".  */
2170
2171 static int
2172 extract_init_priority (const char *name)
2173 {
2174   int pos = 0, pri;
2175
2176   while (name[pos] == '_')
2177     ++pos;
2178   pos += 10; /* strlen ("GLOBAL__X_") */
2179
2180   /* Extract init_p number from ctor/dtor name.  */
2181   pri = atoi (name + pos);
2182   return pri ? pri : DEFAULT_INIT_PRIORITY;
2183 }
2184
2185 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2186    ctors will be run from right to left, dtors from left to right.  */
2187
2188 static void
2189 sort_ids (struct head *head_ptr)
2190 {
2191   /* id holds the current element to insert.  id_next holds the next
2192      element to insert.  id_ptr iterates through the already sorted elements
2193      looking for the place to insert id.  */
2194   struct id *id, *id_next, **id_ptr;
2195
2196   id = head_ptr->first;
2197
2198   /* We don't have any sorted elements yet.  */
2199   head_ptr->first = NULL;
2200
2201   for (; id; id = id_next)
2202     {
2203       id_next = id->next;
2204       id->sequence = extract_init_priority (id->name);
2205
2206       for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2207         if (*id_ptr == NULL
2208             /* If the sequence numbers are the same, we put the id from the
2209                file later on the command line later in the list.  */
2210             || id->sequence > (*id_ptr)->sequence
2211             /* Hack: do lexical compare, too.
2212             || (id->sequence == (*id_ptr)->sequence
2213                 && strcmp (id->name, (*id_ptr)->name) > 0) */
2214             )
2215           {
2216             id->next = *id_ptr;
2217             *id_ptr = id;
2218             break;
2219           }
2220     }
2221
2222   /* Now set the sequence numbers properly so write_c_file works.  */
2223   for (id = head_ptr->first; id; id = id->next)
2224     id->sequence = ++sequence_number;
2225 }
2226
2227 /* Write: `prefix', the names on list LIST, `suffix'.  */
2228
2229 static void
2230 write_list (FILE *stream, const char *prefix, struct id *list)
2231 {
2232   while (list)
2233     {
2234       fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2235       list = list->next;
2236     }
2237 }
2238
2239 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2240 /* Given a STRING, return nonzero if it occurs in the list in range
2241    [ARGS_BEGIN,ARGS_END).  */
2242
2243 static int
2244 is_in_args (const char *string, const char **args_begin,
2245             const char **args_end)
2246 {
2247   const char **args_pointer;
2248   for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2249     if (strcmp (string, *args_pointer) == 0)
2250       return 1;
2251   return 0;
2252 }
2253 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2254
2255 #ifdef COLLECT_EXPORT_LIST
2256 /* This function is really used only on AIX, but may be useful.  */
2257 #if 0
2258 static int
2259 is_in_list (const char *prefix, struct id *list)
2260 {
2261   while (list)
2262     {
2263       if (!strcmp (prefix, list->name)) return 1;
2264       list = list->next;
2265     }
2266     return 0;
2267 }
2268 #endif
2269 #endif /* COLLECT_EXPORT_LIST */
2270
2271 /* Added for debugging purpose.  */
2272 #ifdef COLLECT_EXPORT_LIST
2273 static void
2274 dump_list (FILE *stream, const char *prefix, struct id *list)
2275 {
2276   while (list)
2277     {
2278       fprintf (stream, "%s%s,\n", prefix, list->name);
2279       list = list->next;
2280     }
2281 }
2282 #endif
2283
2284 #if 0
2285 static void
2286 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2287 {
2288   while (list)
2289     {
2290       fprintf (stream, "%s%s,\n", prefix, list->prefix);
2291       list = list->next;
2292     }
2293 }
2294 #endif
2295
2296 static void
2297 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2298 {
2299   while (list)
2300     {
2301       fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2302                prefix, list->sequence, list->name);
2303       list = list->next;
2304     }
2305 }
2306
2307 /* Write out the constructor and destructor tables statically (for a shared
2308    object), along with the functions to execute them.  */
2309
2310 static void
2311 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2312 {
2313   const char *p, *q;
2314   char *prefix, *r;
2315   int frames = (frame_tables.number > 0);
2316
2317   /* Figure out name of output_file, stripping off .so version.  */
2318   p = strrchr (output_file, '/');
2319   if (p == 0)
2320     p = output_file;
2321   else
2322     p++;
2323   q = p;
2324   while (q)
2325     {
2326       q = strchr (q,'.');
2327       if (q == 0)
2328         {
2329           q = p + strlen (p);
2330           break;
2331         }
2332       else
2333         {
2334           if (strncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2335             {
2336               q += strlen (SHLIB_SUFFIX);
2337               break;
2338             }
2339           else
2340             q++;
2341         }
2342     }
2343   /* q points to null at end of the string (or . of the .so version) */
2344   prefix = XNEWVEC (char, q - p + 1);
2345   strncpy (prefix, p, q - p);
2346   prefix[q - p] = 0;
2347   for (r = prefix; *r; r++)
2348     if (!ISALNUM ((unsigned char)*r))
2349       *r = '_';
2350   if (debug)
2351     notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2352             output_file, prefix);
2353
2354   initname = concat ("_GLOBAL__FI_", prefix, NULL);
2355   fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2356
2357   free (prefix);
2358
2359   /* Write the tables as C code.  */
2360
2361   fprintf (stream, "static int count;\n");
2362   fprintf (stream, "typedef void entry_pt();\n");
2363   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2364
2365   if (frames)
2366     {
2367       write_list_with_asm (stream, "extern void *", frame_tables.first);
2368
2369       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2370       write_list (stream, "\t\t&", frame_tables.first);
2371       fprintf (stream, "\t0\n};\n");
2372
2373       /* This must match what's in frame.h.  */
2374       fprintf (stream, "struct object {\n");
2375       fprintf (stream, "  void *pc_begin;\n");
2376       fprintf (stream, "  void *pc_end;\n");
2377       fprintf (stream, "  void *fde_begin;\n");
2378       fprintf (stream, "  void *fde_array;\n");
2379       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2380       fprintf (stream, "  struct object *next;\n");
2381       fprintf (stream, "};\n");
2382
2383       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2384       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2385
2386       fprintf (stream, "static void reg_frame () {\n");
2387       fprintf (stream, "\tstatic struct object ob;\n");
2388       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2389       fprintf (stream, "\t}\n");
2390
2391       fprintf (stream, "static void dereg_frame () {\n");
2392       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2393       fprintf (stream, "\t}\n");
2394     }
2395
2396   fprintf (stream, "void %s() {\n", initname);
2397   if (constructors.number > 0 || frames)
2398     {
2399       fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2400       write_list (stream, "\t\t", constructors.first);
2401       if (frames)
2402         fprintf (stream, "\treg_frame,\n");
2403       fprintf (stream, "\t};\n");
2404       fprintf (stream, "\tentry_pt **p;\n");
2405       fprintf (stream, "\tif (count++ != 0) return;\n");
2406       fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2407       fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2408     }
2409   else
2410     fprintf (stream, "\t++count;\n");
2411   fprintf (stream, "}\n");
2412   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2413   fprintf (stream, "void %s() {\n", fininame);
2414   if (destructors.number > 0 || frames)
2415     {
2416       fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2417       write_list (stream, "\t\t", destructors.first);
2418       if (frames)
2419         fprintf (stream, "\tdereg_frame,\n");
2420       fprintf (stream, "\t};\n");
2421       fprintf (stream, "\tentry_pt **p;\n");
2422       fprintf (stream, "\tif (--count != 0) return;\n");
2423       fprintf (stream, "\tp = dtors;\n");
2424       fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2425                destructors.number + frames);
2426     }
2427   fprintf (stream, "}\n");
2428
2429   if (shared_obj)
2430     {
2431       COLLECT_SHARED_INIT_FUNC(stream, initname);
2432       COLLECT_SHARED_FINI_FUNC(stream, fininame);
2433     }
2434 }
2435
2436 /* Write the constructor/destructor tables.  */
2437
2438 #ifndef LD_INIT_SWITCH
2439 static void
2440 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2441 {
2442   /* Write the tables as C code.  */
2443
2444   int frames = (frame_tables.number > 0);
2445
2446   fprintf (stream, "typedef void entry_pt();\n\n");
2447
2448   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2449
2450   if (frames)
2451     {
2452       write_list_with_asm (stream, "extern void *", frame_tables.first);
2453
2454       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2455       write_list (stream, "\t\t&", frame_tables.first);
2456       fprintf (stream, "\t0\n};\n");
2457
2458       /* This must match what's in frame.h.  */
2459       fprintf (stream, "struct object {\n");
2460       fprintf (stream, "  void *pc_begin;\n");
2461       fprintf (stream, "  void *pc_end;\n");
2462       fprintf (stream, "  void *fde_begin;\n");
2463       fprintf (stream, "  void *fde_array;\n");
2464       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2465       fprintf (stream, "  struct object *next;\n");
2466       fprintf (stream, "};\n");
2467
2468       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2469       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2470
2471       fprintf (stream, "static void reg_frame () {\n");
2472       fprintf (stream, "\tstatic struct object ob;\n");
2473       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2474       fprintf (stream, "\t}\n");
2475
2476       fprintf (stream, "static void dereg_frame () {\n");
2477       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2478       fprintf (stream, "\t}\n");
2479     }
2480
2481   fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2482   fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2483   write_list (stream, "\t", constructors.first);
2484   if (frames)
2485     fprintf (stream, "\treg_frame,\n");
2486   fprintf (stream, "\t0\n};\n\n");
2487
2488   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2489
2490   fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2491   fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2492   write_list (stream, "\t", destructors.first);
2493   if (frames)
2494     fprintf (stream, "\tdereg_frame,\n");
2495   fprintf (stream, "\t0\n};\n\n");
2496
2497   fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2498   fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2499 }
2500 #endif /* ! LD_INIT_SWITCH */
2501
2502 static void
2503 write_c_file (FILE *stream, const char *name)
2504 {
2505 #ifndef LD_INIT_SWITCH
2506   if (! shared_obj)
2507     write_c_file_glob (stream, name);
2508   else
2509 #endif
2510     write_c_file_stat (stream, name);
2511 }
2512
2513 #ifdef COLLECT_EXPORT_LIST
2514 static void
2515 write_aix_file (FILE *stream, struct id *list)
2516 {
2517   for (; list; list = list->next)
2518     {
2519       fputs (list->name, stream);
2520       putc ('\n', stream);
2521     }
2522 }
2523 #endif
2524 \f
2525 #ifdef OBJECT_FORMAT_NONE
2526
2527 /* Check to make sure the file is an ELF file.  LTO objects must
2528    be in ELF format.  */
2529
2530 static bool
2531 is_elf (const char *prog_name)
2532 {
2533   FILE *f;
2534   char buf[4];
2535   static char magic[4] = { 0x7f, 'E', 'L', 'F' };
2536
2537   f = fopen (prog_name, "r");
2538   if (f == NULL)
2539     return false;
2540   if (fread (buf, sizeof (buf), 1, f) != 1)
2541     buf[0] = 0;
2542   fclose (f);
2543   return memcmp (buf, magic, sizeof (magic)) == 0;
2544 }
2545
2546 /* Generic version to scan the name list of the loaded program for
2547    the symbols g++ uses for static constructors and destructors.  */
2548
2549 static void
2550 scan_prog_file (const char *prog_name, scanpass which_pass,
2551                 scanfilter filter)
2552 {
2553   void (*int_handler) (int);
2554 #ifdef SIGQUIT
2555   void (*quit_handler) (int);
2556 #endif
2557   char *real_nm_argv[4];
2558   const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2559   int argc = 0;
2560   struct pex_obj *pex;
2561   const char *errmsg;
2562   int err;
2563   char *p, buf[1024];
2564   FILE *inf;
2565   int found_lto = 0;
2566
2567   if (which_pass == PASS_SECOND)
2568     return;
2569
2570   /* LTO objects must be in ELF format.  This check prevents
2571      us from accepting an archive containing LTO objects, which
2572      gcc cannnot currently handle.  */
2573   if (which_pass == PASS_LTOINFO && !is_elf (prog_name))
2574     return;
2575
2576   /* If we do not have an `nm', complain.  */
2577   if (nm_file_name == 0)
2578     fatal ("cannot find 'nm'");
2579
2580   nm_argv[argc++] = nm_file_name;
2581   if (NM_FLAGS[0] != '\0')
2582     nm_argv[argc++] = NM_FLAGS;
2583
2584   nm_argv[argc++] = prog_name;
2585   nm_argv[argc++] = (char *) 0;
2586
2587   /* Trace if needed.  */
2588   if (vflag)
2589     {
2590       const char **p_argv;
2591       const char *str;
2592
2593       for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2594         fprintf (stderr, " %s", str);
2595
2596       fprintf (stderr, "\n");
2597     }
2598
2599   fflush (stdout);
2600   fflush (stderr);
2601
2602   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2603   if (pex == NULL)
2604     fatal_perror ("pex_init failed");
2605
2606   errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2607                     &err);
2608   if (errmsg != NULL)
2609     {
2610       if (err != 0)
2611         {
2612           errno = err;
2613           fatal_perror (errmsg);
2614         }
2615       else
2616         fatal (errmsg);
2617     }
2618
2619   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2620 #ifdef SIGQUIT
2621   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2622 #endif
2623
2624   inf = pex_read_output (pex, 0);
2625   if (inf == NULL)
2626     fatal_perror ("can't open nm output");
2627
2628   if (debug)
2629     {
2630       if (which_pass == PASS_LTOINFO)
2631         fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2632       else
2633         fprintf (stderr, "\nnm output with constructors/destructors.\n");
2634     }
2635
2636   /* Read each line of nm output.  */
2637   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2638     {
2639       int ch, ch2;
2640       char *name, *end;
2641
2642       if (debug)
2643         fprintf (stderr, "\t%s\n", buf);
2644
2645       if (which_pass == PASS_LTOINFO)
2646         {
2647           if (found_lto)
2648             continue;
2649
2650           /* Look for the LTO info marker symbol, and add filename to
2651              the LTO objects list if found.  */
2652           for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2653             if (ch == ' '
2654                 && (strncmp (p + 1, "__gnu_lto_v1", 12) == 0)
2655                 && ISSPACE (p[13]))
2656               {
2657                 add_lto_object (&lto_objects, prog_name);
2658
2659                 /* We need to read all the input, so we can't just
2660                    return here.  But we can avoid useless work.  */
2661                 found_lto = 1;
2662
2663                 break;
2664               }
2665
2666           continue;
2667         }
2668
2669       /* If it contains a constructor or destructor name, add the name
2670          to the appropriate list unless this is a kind of symbol we're
2671          not supposed to even consider.  */
2672
2673       for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2674         if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2675           break;
2676
2677       if (ch != '_')
2678         continue;
2679
2680       name = p;
2681       /* Find the end of the symbol name.
2682          Do not include `|', because Encore nm can tack that on the end.  */
2683       for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2684            end++)
2685         continue;
2686
2687
2688       *end = '\0';
2689       switch (is_ctor_dtor (name))
2690         {
2691         case SYM_CTOR:
2692           if (! (filter & SCAN_CTOR))
2693             break;
2694           if (which_pass != PASS_LIB)
2695             add_to_list (&constructors, name);
2696           break;
2697
2698         case SYM_DTOR:
2699           if (! (filter & SCAN_DTOR))
2700             break;
2701           if (which_pass != PASS_LIB)
2702             add_to_list (&destructors, name);
2703           break;
2704
2705         case SYM_INIT:
2706           if (! (filter & SCAN_INIT))
2707             break;
2708           if (which_pass != PASS_LIB)
2709             fatal ("init function found in object %s", prog_name);
2710 #ifndef LD_INIT_SWITCH
2711           add_to_list (&constructors, name);
2712 #endif
2713           break;
2714
2715         case SYM_FINI:
2716           if (! (filter & SCAN_FINI))
2717             break;
2718           if (which_pass != PASS_LIB)
2719             fatal ("fini function found in object %s", prog_name);
2720 #ifndef LD_FINI_SWITCH
2721           add_to_list (&destructors, name);
2722 #endif
2723           break;
2724
2725         case SYM_DWEH:
2726           if (! (filter & SCAN_DWEH))
2727             break;
2728           if (which_pass != PASS_LIB)
2729             add_to_list (&frame_tables, name);
2730           break;
2731
2732         default:                /* not a constructor or destructor */
2733           continue;
2734         }
2735     }
2736
2737   if (debug)
2738     fprintf (stderr, "\n");
2739
2740   do_wait (nm_file_name, pex);
2741
2742   signal (SIGINT,  int_handler);
2743 #ifdef SIGQUIT
2744   signal (SIGQUIT, quit_handler);
2745 #endif
2746 }
2747
2748 #ifdef LDD_SUFFIX
2749
2750 /* Use the List Dynamic Dependencies program to find shared libraries that
2751    the output file depends upon and their initialization/finalization
2752    routines, if any.  */
2753
2754 static void
2755 scan_libraries (const char *prog_name)
2756 {
2757   static struct head libraries;         /* list of shared libraries found */
2758   struct id *list;
2759   void (*int_handler) (int);
2760 #ifdef SIGQUIT
2761   void (*quit_handler) (int);
2762 #endif
2763   char *real_ldd_argv[4];
2764   const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2765   int argc = 0;
2766   struct pex_obj *pex;
2767   const char *errmsg;
2768   int err;
2769   char buf[1024];
2770   FILE *inf;
2771
2772   /* If we do not have an `ldd', complain.  */
2773   if (ldd_file_name == 0)
2774     {
2775       error ("cannot find 'ldd'");
2776       return;
2777     }
2778
2779   ldd_argv[argc++] = ldd_file_name;
2780   ldd_argv[argc++] = prog_name;
2781   ldd_argv[argc++] = (char *) 0;
2782
2783   /* Trace if needed.  */
2784   if (vflag)
2785     {
2786       const char **p_argv;
2787       const char *str;
2788
2789       for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2790         fprintf (stderr, " %s", str);
2791
2792       fprintf (stderr, "\n");
2793     }
2794
2795   fflush (stdout);
2796   fflush (stderr);
2797
2798   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2799   if (pex == NULL)
2800     fatal_perror ("pex_init failed");
2801
2802   errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2803   if (errmsg != NULL)
2804     {
2805       if (err != 0)
2806         {
2807           errno = err;
2808           fatal_perror (errmsg);
2809         }
2810       else
2811         fatal (errmsg);
2812     }
2813
2814   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2815 #ifdef SIGQUIT
2816   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2817 #endif
2818
2819   inf = pex_read_output (pex, 0);
2820   if (inf == NULL)
2821     fatal_perror ("can't open ldd output");
2822
2823   if (debug)
2824     notice ("\nldd output with constructors/destructors.\n");
2825
2826   /* Read each line of ldd output.  */
2827   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2828     {
2829       int ch2;
2830       char *name, *end, *p = buf;
2831
2832       /* Extract names of libraries and add to list.  */
2833       PARSE_LDD_OUTPUT (p);
2834       if (p == 0)
2835         continue;
2836
2837       name = p;
2838       if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2839         fatal ("dynamic dependency %s not found", buf);
2840
2841       /* Find the end of the symbol name.  */
2842       for (end = p;
2843            (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2844            end++)
2845         continue;
2846       *end = '\0';
2847
2848       if (access (name, R_OK) == 0)
2849         add_to_list (&libraries, name);
2850       else
2851         fatal ("unable to open dynamic dependency '%s'", buf);
2852
2853       if (debug)
2854         fprintf (stderr, "\t%s\n", buf);
2855     }
2856   if (debug)
2857     fprintf (stderr, "\n");
2858
2859   do_wait (ldd_file_name, pex);
2860
2861   signal (SIGINT,  int_handler);
2862 #ifdef SIGQUIT
2863   signal (SIGQUIT, quit_handler);
2864 #endif
2865
2866   /* Now iterate through the library list adding their symbols to
2867      the list.  */
2868   for (list = libraries.first; list; list = list->next)
2869     scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2870 }
2871
2872 #endif /* LDD_SUFFIX */
2873
2874 #endif /* OBJECT_FORMAT_NONE */
2875
2876 \f
2877 /*
2878  * COFF specific stuff.
2879  */
2880
2881 #ifdef OBJECT_FORMAT_COFF
2882
2883 #if defined (EXTENDED_COFF)
2884
2885 #   define GCC_SYMBOLS(X)       (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2886 #   define GCC_SYMENT           SYMR
2887 #   define GCC_OK_SYMBOL(X)     ((X).st == stProc || (X).st == stGlobal)
2888 #   define GCC_SYMINC(X)        (1)
2889 #   define GCC_SYMZERO(X)       (SYMHEADER(X).isymMax)
2890 #   define GCC_CHECK_HDR(X)     (PSYMTAB(X) != 0)
2891
2892 #else
2893
2894 #   define GCC_SYMBOLS(X)       (HEADER(ldptr).f_nsyms)
2895 #   define GCC_SYMENT           SYMENT
2896 #   if defined (C_WEAKEXT)
2897 #     define GCC_OK_SYMBOL(X) \
2898        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2899         ((X).n_scnum > N_UNDEF) && \
2900         (aix64_flag \
2901          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2902              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2903 #     define GCC_UNDEF_SYMBOL(X) \
2904        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2905         ((X).n_scnum == N_UNDEF))
2906 #   else
2907 #     define GCC_OK_SYMBOL(X) \
2908        (((X).n_sclass == C_EXT) && \
2909         ((X).n_scnum > N_UNDEF) && \
2910         (aix64_flag \
2911          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2912              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2913 #     define GCC_UNDEF_SYMBOL(X) \
2914        (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2915 #   endif
2916 #   define GCC_SYMINC(X)        ((X).n_numaux+1)
2917 #   define GCC_SYMZERO(X)       0
2918
2919 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2920 #if TARGET_AIX_VERSION >= 51
2921 #   define GCC_CHECK_HDR(X) \
2922      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2923       || (HEADER (X).f_magic == 0767 && aix64_flag))
2924 #else
2925 #   define GCC_CHECK_HDR(X) \
2926      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2927       || (HEADER (X).f_magic == 0757 && aix64_flag))
2928 #endif
2929
2930 #endif
2931
2932 #ifdef COLLECT_EXPORT_LIST
2933 /* Array of standard AIX libraries which should not
2934    be scanned for ctors/dtors.  */
2935 static const char *const aix_std_libs[] = {
2936   "/unix",
2937   "/lib/libc.a",
2938   "/lib/libm.a",
2939   "/lib/libc_r.a",
2940   "/lib/libm_r.a",
2941   "/usr/lib/libc.a",
2942   "/usr/lib/libm.a",
2943   "/usr/lib/libc_r.a",
2944   "/usr/lib/libm_r.a",
2945   "/usr/lib/threads/libc.a",
2946   "/usr/ccs/lib/libc.a",
2947   "/usr/ccs/lib/libm.a",
2948   "/usr/ccs/lib/libc_r.a",
2949   "/usr/ccs/lib/libm_r.a",
2950   NULL
2951 };
2952
2953 /* This function checks the filename and returns 1
2954    if this name matches the location of a standard AIX library.  */
2955 static int ignore_library (const char *);
2956 static int
2957 ignore_library (const char *name)
2958 {
2959   const char *const *p;
2960   size_t length;
2961
2962   if (target_system_root[0] != '\0')
2963     {
2964       length = strlen (target_system_root);
2965       if (strncmp (name, target_system_root, length) != 0)
2966         return 0;
2967       name += length;
2968     }
2969   for (p = &aix_std_libs[0]; *p != NULL; ++p)
2970     if (strcmp (name, *p) == 0)
2971       return 1;
2972   return 0;
2973 }
2974 #endif /* COLLECT_EXPORT_LIST */
2975
2976 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2977 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2978 #endif
2979
2980 /* COFF version to scan the name list of the loaded program for
2981    the symbols g++ uses for static constructors and destructors.  */
2982
2983 static void
2984 scan_prog_file (const char *prog_name, scanpass which_pass,
2985                 scanfilter filter)
2986 {
2987   LDFILE *ldptr = NULL;
2988   int sym_index, sym_count;
2989   int is_shared = 0;
2990
2991   if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2992     return;
2993
2994 #ifdef COLLECT_EXPORT_LIST
2995   /* We do not need scanning for some standard C libraries.  */
2996   if (which_pass == PASS_FIRST && ignore_library (prog_name))
2997     return;
2998
2999   /* On AIX we have a loop, because there is not much difference
3000      between an object and an archive. This trick allows us to
3001      eliminate scan_libraries() function.  */
3002   do
3003     {
3004 #endif
3005       /* Some platforms (e.g. OSF4) declare ldopen as taking a
3006          non-const char * filename parameter, even though it will not
3007          modify that string.  So we must cast away const-ness here,
3008          using CONST_CAST to prevent complaints from -Wcast-qual.  */
3009       if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
3010         {
3011           if (! MY_ISCOFF (HEADER (ldptr).f_magic))
3012             fatal ("%s: not a COFF file", prog_name);
3013
3014           if (GCC_CHECK_HDR (ldptr))
3015             {
3016               sym_count = GCC_SYMBOLS (ldptr);
3017               sym_index = GCC_SYMZERO (ldptr);
3018
3019 #ifdef COLLECT_EXPORT_LIST
3020               /* Is current archive member a shared object?  */
3021               is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
3022 #endif
3023
3024               while (sym_index < sym_count)
3025                 {
3026                   GCC_SYMENT symbol;
3027
3028                   if (ldtbread (ldptr, sym_index, &symbol) <= 0)
3029                     break;
3030                   sym_index += GCC_SYMINC (symbol);
3031
3032                   if (GCC_OK_SYMBOL (symbol))
3033                     {
3034                       char *name;
3035
3036                       if ((name = ldgetname (ldptr, &symbol)) == NULL)
3037                         continue;               /* Should never happen.  */
3038
3039 #ifdef XCOFF_DEBUGGING_INFO
3040                       /* All AIX function names have a duplicate entry
3041                          beginning with a dot.  */
3042                       if (*name == '.')
3043                         ++name;
3044 #endif
3045
3046                       switch (is_ctor_dtor (name))
3047                         {
3048                         case SYM_CTOR:
3049                           if (! (filter & SCAN_CTOR))
3050                             break;
3051                           if (! is_shared)
3052                             add_to_list (&constructors, name);
3053 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3054                           if (which_pass == PASS_OBJ)
3055                             add_to_list (&exports, name);
3056 #endif
3057                           break;
3058
3059                         case SYM_DTOR:
3060                           if (! (filter & SCAN_DTOR))
3061                             break;
3062                           if (! is_shared)
3063                             add_to_list (&destructors, name);
3064 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3065                           if (which_pass == PASS_OBJ)
3066                             add_to_list (&exports, name);
3067 #endif
3068                           break;
3069
3070 #ifdef COLLECT_EXPORT_LIST
3071                         case SYM_INIT:
3072                           if (! (filter & SCAN_INIT))
3073                             break;
3074 #ifndef LD_INIT_SWITCH
3075                           if (is_shared)
3076                             add_to_list (&constructors, name);
3077 #endif
3078                           break;
3079
3080                         case SYM_FINI:
3081                           if (! (filter & SCAN_FINI))
3082                             break;
3083 #ifndef LD_INIT_SWITCH
3084                           if (is_shared)
3085                             add_to_list (&destructors, name);
3086 #endif
3087                           break;
3088 #endif
3089
3090                         case SYM_DWEH:
3091                           if (! (filter & SCAN_DWEH))
3092                             break;
3093                           if (! is_shared)
3094                             add_to_list (&frame_tables, name);
3095 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3096                           if (which_pass == PASS_OBJ)
3097                             add_to_list (&exports, name);
3098 #endif
3099                           break;
3100
3101                         default:        /* not a constructor or destructor */
3102 #ifdef COLLECT_EXPORT_LIST
3103                           /* Explicitly export all global symbols when
3104                              building a shared object on AIX, but do not
3105                              re-export symbols from another shared object
3106                              and do not export symbols if the user
3107                              provides an explicit export list.  */
3108                           if (shared_obj && !is_shared
3109                               && which_pass == PASS_OBJ && !export_flag)
3110                             add_to_list (&exports, name);
3111 #endif
3112                           continue;
3113                         }
3114
3115                       if (debug)
3116 #if !defined(EXTENDED_COFF)
3117                         fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3118                                  symbol.n_scnum, symbol.n_sclass,
3119                                  (symbol.n_type ? "0" : ""), symbol.n_type,
3120                                  name);
3121 #else
3122                         fprintf (stderr,
3123                                  "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3124                                  symbol.iss, (long) symbol.value, symbol.index, name);
3125 #endif
3126                     }
3127                 }
3128             }
3129 #ifdef COLLECT_EXPORT_LIST
3130           else
3131             {
3132               /* If archive contains both 32-bit and 64-bit objects,
3133                  we want to skip objects in other mode so mismatch normal.  */
3134               if (debug)
3135                 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3136                          prog_name, HEADER (ldptr).f_magic, aix64_flag);
3137             }
3138 #endif
3139         }
3140       else
3141         {
3142           fatal ("%s: cannot open as COFF file", prog_name);
3143         }
3144 #ifdef COLLECT_EXPORT_LIST
3145       /* On AIX loop continues while there are more members in archive.  */
3146     }
3147   while (ldclose (ldptr) == FAILURE);
3148 #else
3149   /* Otherwise we simply close ldptr.  */
3150   (void) ldclose(ldptr);
3151 #endif
3152 }
3153 #endif /* OBJECT_FORMAT_COFF */
3154
3155 #ifdef COLLECT_EXPORT_LIST
3156 /* Given a library name without "lib" prefix, this function
3157    returns a full library name including a path.  */
3158 static char *
3159 resolve_lib_name (const char *name)
3160 {
3161   char *lib_buf;
3162   int i, j, l = 0;
3163   /* Library extensions for AIX dynamic linking.  */
3164   const char * const libexts[2] = {"a", "so"};
3165
3166   for (i = 0; libpaths[i]; i++)
3167     if (libpaths[i]->max_len > l)
3168       l = libpaths[i]->max_len;
3169
3170   lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3171
3172   for (i = 0; libpaths[i]; i++)
3173     {
3174       struct prefix_list *list = libpaths[i]->plist;
3175       for (; list; list = list->next)
3176         {
3177           /* The following lines are needed because path_prefix list
3178              may contain directories both with trailing '/' and
3179              without it.  */
3180           const char *p = "";
3181           if (list->prefix[strlen(list->prefix)-1] != '/')
3182             p = "/";
3183           for (j = 0; j < 2; j++)
3184             {
3185               sprintf (lib_buf, "%s%slib%s.%s",
3186                        list->prefix, p, name,
3187                        libexts[(j + aixrtl_flag) % 2]);
3188               if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3189               if (file_exists (lib_buf))
3190                 {
3191                   if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3192                   return (lib_buf);
3193                 }
3194             }
3195         }
3196     }
3197   if (debug)
3198     fprintf (stderr, "not found\n");
3199   else
3200     fatal ("library lib%s not found", name);
3201   return (NULL);
3202 }
3203 #endif /* COLLECT_EXPORT_LIST */