OSDN Git Service

Merge lto branch into trunk.
[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
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 /* Add an entry for the object file NAME to object file list LIST.
857    New entries are added at the end of the list. The original pointer
858    value of NAME is preserved, i.e., no string copy is performed.  */
859
860 static void
861 add_lto_object (struct lto_object_list *list, const char *name)
862 {
863   struct lto_object *n = XNEW (struct lto_object);
864   n->name = name;
865   n->next = NULL;
866
867   if (list->last)
868     list->last->next = n;
869   else
870     list->first = n;
871
872   list->last = n;
873 }
874
875
876 /* Perform a link-time recompilation and relink if any of the object
877    files contain LTO info.  The linker command line LTO_LD_ARGV
878    represents the linker command that would produce a final executable
879    without the use of LTO. OBJECT_LST is a vector of object file names
880    appearing in LTO_LD_ARGV that are to be considerd for link-time
881    recompilation, where OBJECT is a pointer to the last valid element.
882    (This awkward convention avoids an impedance mismatch with the
883    usage of similarly-named variables in main().)  The elements of
884    OBJECT_LST must be identical, i.e., pointer equal, to the
885    corresponding arguments in LTO_LD_ARGV.
886
887    Upon entry, at least one linker run has been performed without the
888    use of any LTO info that might be present.  Any recompilations
889    necessary for template instantiations have been performed, and
890    initializer/finalizer tables have been created if needed and
891    included in the linker command line LTO_LD_ARGV. If any of the
892    object files contain LTO info, we run the LTO back end on all such
893    files, and perform the final link with the LTO back end output
894    substituted for the LTO-optimized files.  In some cases, a final
895    link with all link-time generated code has already been performed,
896    so there is no need to relink if no LTO info is found.  In other
897    cases, our caller has not produced the final executable, and is
898    relying on us to perform the required link whether LTO info is
899    present or not.  In that case, the FORCE argument should be true.
900    Note that the linker command line argument LTO_LD_ARGV passed into
901    this function may be modified in place.  */
902
903 static void
904 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
905                           const char **object, bool force)
906 {
907   const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
908
909   int num_lto_c_args = 1;    /* Allow space for the terminating NULL.  */
910
911   while (object_file < object)
912   {
913     /* If file contains LTO info, add it to the list of LTO objects.  */
914     scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
915
916     /* Increment the argument count by the number of object file arguments
917        we will add.  An upper bound suffices, so just count all of the
918        object files regardless of whether they contain LTO info.  */
919     num_lto_c_args++;
920   }
921
922   if (lto_objects.first)
923     {
924       const char *opts;
925       char **lto_c_argv;
926       const char **lto_c_ptr;
927       const char *cp;
928       const char **p, **q, **r;
929       const char **lto_o_ptr;
930       struct lto_object *list;
931       char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
932       struct pex_obj *pex;
933       const char *prog = "lto-wrapper";
934
935       if (!lto_wrapper)
936         fatal ("COLLECT_LTO_WRAPPER must be set.");
937
938       /* There is at least one object file containing LTO info,
939          so we need to run the LTO back end and relink.  */
940
941       /* Get compiler options passed down from the parent `gcc' command.
942          These must be passed to the LTO back end.  */
943       opts = getenv ("COLLECT_GCC_OPTIONS");
944
945       /* Increment the argument count by the number of inherited options.
946          Some arguments may be filtered out later.  Again, an upper bound
947          suffices.  */
948
949       cp = opts;
950
951       while (cp && *cp)
952         {
953           extract_string (&cp);
954           num_lto_c_args++;
955         }
956       obstack_free (&temporary_obstack, temporary_firstobj);
957
958       if (debug)
959         num_lto_c_args++;
960
961       /* Increment the argument count by the number of initial
962          arguments added below.  */
963       num_lto_c_args += 9;
964
965       lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
966       lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
967
968       *lto_c_ptr++ = lto_wrapper;
969       *lto_c_ptr++ = c_file_name;
970
971       cp = opts;
972
973       while (cp && *cp)
974         {
975           const char *s = extract_string (&cp);
976
977           /* Pass the option or argument to the wrapper.  */
978           *lto_c_ptr++ = xstrdup (s);
979         }
980       obstack_free (&temporary_obstack, temporary_firstobj);
981
982       if (debug)
983         *lto_c_ptr++ = xstrdup ("-debug");
984
985       /* Add LTO objects to the wrapper command line.  */
986       for (list = lto_objects.first; list; list = list->next)
987         *lto_c_ptr++ = list->name;
988
989       *lto_c_ptr = NULL;
990
991       /* Save intermediate WPA files in lto1 if debug.  */
992       if (debug)
993         putenv (xstrdup ("WPA_SAVE_LTRANS=1"));
994
995       /* Run the LTO back end.  */
996       pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
997       {
998         int c;
999         FILE *stream;
1000         size_t i, num_files;
1001         char *start, *end;
1002
1003         stream = pex_read_output (pex, 0);
1004         gcc_assert (stream);
1005
1006         num_files = 0;
1007         while ((c = getc (stream)) != EOF)
1008           {
1009             obstack_1grow (&temporary_obstack, c);
1010             if (c == '\n')
1011               ++num_files;
1012           }
1013
1014         lto_o_files = XNEWVEC (char *, num_files + 1);
1015         lto_o_files[num_files] = NULL;
1016         start = XOBFINISH (&temporary_obstack, char *);
1017         for (i = 0; i < num_files; ++i)
1018           {
1019             end = start;
1020             while (*end != '\n')
1021               ++end;
1022             *end = '\0';
1023
1024             lto_o_files[i] = xstrdup (start);
1025
1026             start = end + 1;
1027           }
1028
1029         obstack_free (&temporary_obstack, temporary_firstobj);
1030       }
1031       do_wait (prog, pex);
1032       pex = NULL;
1033
1034       /* After running the LTO back end, we will relink, substituting
1035          the LTO output for the object files that we submitted to the
1036          LTO. Here, we modify the linker command line for the relink.  */
1037       p = CONST_CAST2 (const char **, char **, lto_ld_argv);
1038       lto_o_ptr = CONST_CAST2 (const char **, char **, lto_o_files);
1039
1040       while (*p != NULL)
1041         {
1042           for (list = lto_objects.first; list; list = list->next)
1043             {
1044               if (*p == list->name) /* Note test for pointer equality!  */
1045                 {
1046                   /* Excise argument from linker command line.  */
1047                   if (*lto_o_ptr)
1048                     {
1049                       /* Replace first argument with LTO output file.  */
1050                       *p++ = *lto_o_ptr++;
1051                     }
1052                   else
1053                     {
1054                       /* Move following arguments one position earlier,
1055                          overwriting the current argument.  */
1056                       q = p;
1057                       r = p + 1;
1058                       while (*r != NULL)
1059                         *q++ = *r++;
1060                       *q = NULL;
1061                     }
1062
1063                   /* No need to continue searching the LTO object list.  */
1064                   break;
1065                 }
1066             }
1067
1068           /* If we didn't find a match, move on to the next argument.
1069              Otherwise, P has been set to the correct argument position
1070              at which to continue.  */
1071           if (!list) ++p;
1072         }
1073
1074       /* The code above assumes we will never have more lto output files than
1075          input files.  Otherwise, we need to resize lto_ld_argv.  Check this
1076          assumption.  */
1077       if (*lto_o_ptr)
1078         fatal ("too many lto output files");
1079
1080       /* Run the linker again, this time replacing the object files
1081          optimized by the LTO with the temporary file generated by the LTO.  */
1082       fork_execute ("ld", lto_ld_argv);
1083
1084       maybe_unlink_list (lto_o_files);
1085     }
1086   else if (force)
1087     {
1088       /* Our caller is relying on us to do the link
1089          even though there is no LTO back end work to be done.  */
1090       fork_execute  ("ld", lto_ld_argv);
1091     }
1092 }
1093 \f
1094 /* Main program.  */
1095
1096 int
1097 main (int argc, char **argv)
1098 {
1099   static const char *const ld_suffix    = "ld";
1100   static const char *const real_ld_suffix = "real-ld";
1101   static const char *const collect_ld_suffix = "collect-ld";
1102   static const char *const nm_suffix    = "nm";
1103   static const char *const gnm_suffix   = "gnm";
1104 #ifdef LDD_SUFFIX
1105   static const char *const ldd_suffix   = LDD_SUFFIX;
1106 #endif
1107   static const char *const strip_suffix = "strip";
1108   static const char *const gstrip_suffix = "gstrip";
1109
1110 #ifdef CROSS_DIRECTORY_STRUCTURE
1111   /* If we look for a program in the compiler directories, we just use
1112      the short name, since these directories are already system-specific.
1113      But it we look for a program in the system directories, we need to
1114      qualify the program name with the target machine.  */
1115
1116   const char *const full_ld_suffix =
1117     concat(target_machine, "-", ld_suffix, NULL);
1118   const char *const full_nm_suffix =
1119     concat (target_machine, "-", nm_suffix, NULL);
1120   const char *const full_gnm_suffix =
1121     concat (target_machine, "-", gnm_suffix, NULL);
1122 #ifdef LDD_SUFFIX
1123   const char *const full_ldd_suffix =
1124     concat (target_machine, "-", ldd_suffix, NULL);
1125 #endif
1126   const char *const full_strip_suffix =
1127     concat (target_machine, "-", strip_suffix, NULL);
1128   const char *const full_gstrip_suffix =
1129     concat (target_machine, "-", gstrip_suffix, NULL);
1130 #else
1131   const char *const full_ld_suffix      = ld_suffix;
1132   const char *const full_nm_suffix      = nm_suffix;
1133   const char *const full_gnm_suffix     = gnm_suffix;
1134 #ifdef LDD_SUFFIX
1135   const char *const full_ldd_suffix     = ldd_suffix;
1136 #endif
1137   const char *const full_strip_suffix   = strip_suffix;
1138   const char *const full_gstrip_suffix  = gstrip_suffix;
1139 #endif /* CROSS_DIRECTORY_STRUCTURE */
1140
1141   const char *arg;
1142   FILE *outf;
1143 #ifdef COLLECT_EXPORT_LIST
1144   FILE *exportf;
1145 #endif
1146   const char *ld_file_name;
1147   const char *p;
1148   char **c_argv;
1149   const char **c_ptr;
1150   char **ld1_argv;
1151   const char **ld1;
1152   
1153   /* The kinds of symbols we will have to consider when scanning the
1154      outcome of a first pass link.  This is ALL to start with, then might
1155      be adjusted before getting to the first pass link per se, typically on
1156      AIX where we perform an early scan of objects and libraries to fetch
1157      the list of global ctors/dtors and make sure they are not garbage
1158      collected.  */
1159   scanfilter ld1_filter = SCAN_ALL;
1160
1161   char **ld2_argv;
1162   const char **ld2;
1163   char **object_lst;
1164   const char **object;
1165   int first_file;
1166   int num_c_args;
1167   char **old_argv;
1168
1169   old_argv = argv;
1170   expandargv (&argc, &argv);
1171   if (argv != old_argv)
1172     at_file_supplied = 1;
1173
1174   num_c_args = argc + 9;
1175
1176   no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
1177
1178   /* Suppress demangling by the real linker, which may be broken.  */
1179   putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1180
1181 #if defined (COLLECT2_HOST_INITIALIZATION)
1182   /* Perform system dependent initialization, if necessary.  */
1183   COLLECT2_HOST_INITIALIZATION;
1184 #endif
1185
1186 #ifdef SIGCHLD
1187   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1188      receive the signal.  A different setting is inheritable */
1189   signal (SIGCHLD, SIG_DFL);
1190 #endif
1191
1192   /* Unlock the stdio streams.  */
1193   unlock_std_streams ();
1194
1195   gcc_init_libintl ();
1196
1197   /* Do not invoke xcalloc before this point, since locale needs to be
1198      set first, in case a diagnostic is issued.  */
1199
1200   ld1_argv = XCNEWVEC (char *, argc + 4);
1201   ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
1202   ld2_argv = XCNEWVEC (char *, argc + 11);
1203   ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
1204   object_lst = XCNEWVEC (char *, argc);
1205   object = CONST_CAST2 (const char **, char **, object_lst);
1206
1207 #ifdef DEBUG
1208   debug = 1;
1209 #endif
1210
1211   /* Parse command line early for instances of -debug.  This allows
1212      the debug flag to be set before functions like find_a_file()
1213      are called.  We also look for the -flto or -fwhopr flag to know
1214      what LTO mode we are in.  */
1215   {
1216     int i;
1217     bool use_plugin = false;
1218
1219     for (i = 1; argv[i] != NULL; i ++)
1220       {
1221         if (! strcmp (argv[i], "-debug"))
1222           debug = 1;
1223         else if (! strcmp (argv[i], "-flto") && ! use_plugin)
1224           lto_mode = LTO_MODE_LTO;
1225         else if (! strcmp (argv[i], "-fwhopr") && ! use_plugin)
1226           lto_mode = LTO_MODE_WHOPR;
1227         else if (! strcmp (argv[i], "-plugin"))
1228           {
1229             use_plugin = true;
1230             lto_mode = LTO_MODE_NONE;
1231           }
1232 #ifdef COLLECT_EXPORT_LIST
1233         /* since -brtl, -bexport, -b64 are not position dependent
1234            also check for them here */
1235         if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1236           {
1237             arg = argv[i];
1238             /* We want to disable automatic exports on AIX when user
1239                explicitly puts an export list in command line */
1240             if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1241               export_flag = 1;
1242             else if (arg[2] == '6' && arg[3] == '4')
1243               aix64_flag = 1;
1244             else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1245               aixrtl_flag = 1;
1246           }
1247 #endif
1248       }
1249     vflag = debug;
1250   }
1251
1252 #ifndef DEFAULT_A_OUT_NAME
1253   output_file = "a.out";
1254 #else
1255   output_file = DEFAULT_A_OUT_NAME;
1256 #endif
1257
1258   obstack_begin (&temporary_obstack, 0);
1259   temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1260
1261 #ifndef HAVE_LD_DEMANGLE
1262   current_demangling_style = auto_demangling;
1263 #endif
1264   p = getenv ("COLLECT_GCC_OPTIONS");
1265   while (p && *p)
1266     {
1267       const char *q = extract_string (&p);
1268       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1269         num_c_args++;
1270     }
1271   obstack_free (&temporary_obstack, temporary_firstobj);
1272
1273   /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1274      -fno-exceptions -w */
1275   num_c_args += 5;
1276
1277   c_argv = XCNEWVEC (char *, num_c_args);
1278   c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1279
1280   if (argc < 2)
1281     fatal ("no arguments");
1282
1283 #ifdef SIGQUIT
1284   if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1285     signal (SIGQUIT, handler);
1286 #endif
1287   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1288     signal (SIGINT, handler);
1289 #ifdef SIGALRM
1290   if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1291     signal (SIGALRM, handler);
1292 #endif
1293 #ifdef SIGHUP
1294   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1295     signal (SIGHUP, handler);
1296 #endif
1297   if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1298     signal (SIGSEGV, handler);
1299 #ifdef SIGBUS
1300   if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1301     signal (SIGBUS, handler);
1302 #endif
1303
1304   /* Extract COMPILER_PATH and PATH into our prefix list.  */
1305   prefix_from_env ("COMPILER_PATH", &cpath);
1306   prefix_from_env ("PATH", &path);
1307
1308   /* Try to discover a valid linker/nm/strip to use.  */
1309
1310   /* Maybe we know the right file to use (if not cross).  */
1311   ld_file_name = 0;
1312 #ifdef DEFAULT_LINKER
1313   if (access (DEFAULT_LINKER, X_OK) == 0)
1314     ld_file_name = DEFAULT_LINKER;
1315   if (ld_file_name == 0)
1316 #endif
1317 #ifdef REAL_LD_FILE_NAME
1318   ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1319   if (ld_file_name == 0)
1320 #endif
1321   /* Search the (target-specific) compiler dirs for ld'.  */
1322   ld_file_name = find_a_file (&cpath, real_ld_suffix);
1323   /* Likewise for `collect-ld'.  */
1324   if (ld_file_name == 0)
1325     ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1326   /* Search the compiler directories for `ld'.  We have protection against
1327      recursive calls in find_a_file.  */
1328   if (ld_file_name == 0)
1329     ld_file_name = find_a_file (&cpath, ld_suffix);
1330   /* Search the ordinary system bin directories
1331      for `ld' (if native linking) or `TARGET-ld' (if cross).  */
1332   if (ld_file_name == 0)
1333     ld_file_name = find_a_file (&path, full_ld_suffix);
1334
1335 #ifdef REAL_NM_FILE_NAME
1336   nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1337   if (nm_file_name == 0)
1338 #endif
1339   nm_file_name = find_a_file (&cpath, gnm_suffix);
1340   if (nm_file_name == 0)
1341     nm_file_name = find_a_file (&path, full_gnm_suffix);
1342   if (nm_file_name == 0)
1343     nm_file_name = find_a_file (&cpath, nm_suffix);
1344   if (nm_file_name == 0)
1345     nm_file_name = find_a_file (&path, full_nm_suffix);
1346
1347 #ifdef LDD_SUFFIX
1348   ldd_file_name = find_a_file (&cpath, ldd_suffix);
1349   if (ldd_file_name == 0)
1350     ldd_file_name = find_a_file (&path, full_ldd_suffix);
1351 #endif
1352
1353 #ifdef REAL_STRIP_FILE_NAME
1354   strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1355   if (strip_file_name == 0)
1356 #endif
1357   strip_file_name = find_a_file (&cpath, gstrip_suffix);
1358   if (strip_file_name == 0)
1359     strip_file_name = find_a_file (&path, full_gstrip_suffix);
1360   if (strip_file_name == 0)
1361     strip_file_name = find_a_file (&cpath, strip_suffix);
1362   if (strip_file_name == 0)
1363     strip_file_name = find_a_file (&path, full_strip_suffix);
1364
1365   /* Determine the full path name of the C compiler to use.  */
1366   c_file_name = getenv ("COLLECT_GCC");
1367   if (c_file_name == 0)
1368     {
1369 #ifdef CROSS_DIRECTORY_STRUCTURE
1370       c_file_name = concat (target_machine, "-gcc", NULL);
1371 #else
1372       c_file_name = "gcc";
1373 #endif
1374     }
1375
1376   p = find_a_file (&cpath, c_file_name);
1377
1378   /* Here it should be safe to use the system search path since we should have
1379      already qualified the name of the compiler when it is needed.  */
1380   if (p == 0)
1381     p = find_a_file (&path, c_file_name);
1382
1383   if (p)
1384     c_file_name = p;
1385
1386   *ld1++ = *ld2++ = ld_file_name;
1387
1388   /* Make temp file names.  */
1389   c_file = make_temp_file (".c");
1390   o_file = make_temp_file (".o");
1391 #ifdef COLLECT_EXPORT_LIST
1392   export_file = make_temp_file (".x");
1393 #endif
1394   ldout = make_temp_file (".ld");
1395   lderrout = make_temp_file (".le");
1396   *c_ptr++ = c_file_name;
1397   *c_ptr++ = "-x";
1398   *c_ptr++ = "c";
1399   *c_ptr++ = "-c";
1400   *c_ptr++ = "-o";
1401   *c_ptr++ = o_file;
1402
1403 #ifdef COLLECT_EXPORT_LIST
1404   /* Generate a list of directories from LIBPATH.  */
1405   prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1406   /* Add to this list also two standard directories where
1407      AIX loader always searches for libraries.  */
1408   add_prefix (&libpath_lib_dirs, "/lib");
1409   add_prefix (&libpath_lib_dirs, "/usr/lib");
1410 #endif
1411
1412   /* Get any options that the upper GCC wants to pass to the sub-GCC.
1413
1414      AIX support needs to know if -shared has been specified before
1415      parsing commandline arguments.  */
1416
1417   p = getenv ("COLLECT_GCC_OPTIONS");
1418   while (p && *p)
1419     {
1420       const char *q = extract_string (&p);
1421       if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1422         *c_ptr++ = xstrdup (q);
1423       if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1424         *c_ptr++ = xstrdup (q);
1425       if (strcmp (q, "-shared") == 0)
1426         shared_obj = 1;
1427       if (*q == '-' && q[1] == 'B')
1428         {
1429           *c_ptr++ = xstrdup (q);
1430           if (q[2] == 0)
1431             {
1432               q = extract_string (&p);
1433               *c_ptr++ = xstrdup (q);
1434             }
1435         }
1436     }
1437   obstack_free (&temporary_obstack, temporary_firstobj);
1438   *c_ptr++ = "-fno-profile-arcs";
1439   *c_ptr++ = "-fno-test-coverage";
1440   *c_ptr++ = "-fno-branch-probabilities";
1441   *c_ptr++ = "-fno-exceptions";
1442   *c_ptr++ = "-w";
1443
1444   /* !!! When GCC calls collect2,
1445      it does not know whether it is calling collect2 or ld.
1446      So collect2 cannot meaningfully understand any options
1447      except those ld understands.
1448      If you propose to make GCC pass some other option,
1449      just imagine what will happen if ld is really ld!!!  */
1450
1451   /* Parse arguments.  Remember output file spec, pass the rest to ld.  */
1452   /* After the first file, put in the c++ rt0.  */
1453
1454   first_file = 1;
1455 #ifdef HAVE_LD_DEMANGLE
1456   if (!demangle_flag && !no_demangle)
1457     demangle_flag = "--demangle";
1458   if (demangle_flag)
1459     *ld1++ = *ld2++ = demangle_flag;
1460 #endif
1461   while ((arg = *++argv) != (char *) 0)
1462     {
1463       *ld1++ = *ld2++ = arg;
1464
1465       if (arg[0] == '-')
1466         {
1467           switch (arg[1])
1468             {
1469             case 'd':
1470               if (!strcmp (arg, "-debug"))
1471                 {
1472                   /* Already parsed.  */
1473                   ld1--;
1474                   ld2--;
1475                 }
1476               if (!strcmp (arg, "-dynamic-linker") && argv[1])
1477                 {
1478                   ++argv;
1479                   *ld1++ = *ld2++ = *argv;
1480                 }
1481               break;
1482
1483             case 'f':
1484               if (strcmp (arg, "-flto") == 0 || strcmp (arg, "-fwhopr") == 0)
1485                 {
1486 #ifdef ENABLE_LTO
1487                   /* Do not pass LTO flag to the linker. */
1488                   ld1--;
1489                   ld2--;
1490 #else
1491                   error ("LTO support has not been enabled in this "
1492                          "configuration");
1493 #endif
1494                 }
1495               break;
1496
1497             case 'l':
1498               if (first_file)
1499                 {
1500                   /* place o_file BEFORE this argument! */
1501                   first_file = 0;
1502                   ld2--;
1503                   *ld2++ = o_file;
1504                   *ld2++ = arg;
1505                 }
1506 #ifdef COLLECT_EXPORT_LIST
1507               {
1508                 /* Resolving full library name.  */
1509                 const char *s = resolve_lib_name (arg+2);
1510
1511                 /* Saving a full library name.  */
1512                 add_to_list (&libs, s);
1513               }
1514 #endif
1515               break;
1516
1517 #ifdef COLLECT_EXPORT_LIST
1518             /* Saving directories where to search for libraries.  */
1519             case 'L':
1520               add_prefix (&cmdline_lib_dirs, arg+2);
1521               break;
1522 #else
1523 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1524             case 'L':
1525               if (is_in_args (arg,
1526                               CONST_CAST2 (const char **, char **, ld1_argv),
1527                               ld1 - 1))
1528                 --ld1;
1529               break;
1530 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1531 #endif
1532
1533             case 'o':
1534               if (arg[2] == '\0')
1535                 output_file = *ld1++ = *ld2++ = *++argv;
1536               else if (1
1537 #ifdef SWITCHES_NEED_SPACES
1538                        && ! strchr (SWITCHES_NEED_SPACES, arg[1])
1539 #endif
1540                        )
1541
1542                 output_file = &arg[2];
1543               break;
1544
1545             case 'r':
1546               if (arg[2] == '\0')
1547                 rflag = 1;
1548               break;
1549
1550             case 's':
1551               if (arg[2] == '\0' && do_collecting)
1552                 {
1553                   /* We must strip after the nm run, otherwise C++ linking
1554                      will not work.  Thus we strip in the second ld run, or
1555                      else with strip if there is no second ld run.  */
1556                   strip_flag = 1;
1557                   ld1--;
1558                 }
1559               break;
1560
1561             case 'v':
1562               if (arg[2] == '\0')
1563                 vflag = 1;
1564               break;
1565
1566             case '-':
1567               if (strcmp (arg, "--no-demangle") == 0)
1568                 {
1569                   demangle_flag = arg;
1570                   no_demangle = 1;
1571                   ld1--;
1572                   ld2--;
1573                 }
1574               else if (strncmp (arg, "--demangle", 10) == 0)
1575                 {
1576                   demangle_flag = arg;
1577                   no_demangle = 0;
1578 #ifndef HAVE_LD_DEMANGLE
1579                   if (arg[10] == '=')
1580                     {
1581                       enum demangling_styles style
1582                         = cplus_demangle_name_to_style (arg+11);
1583                       if (style == unknown_demangling)
1584                         error ("unknown demangling style '%s'", arg+11);
1585                       else
1586                         current_demangling_style = style;
1587                     }
1588 #endif
1589                   ld1--;
1590                   ld2--;
1591                 }
1592               else if (strncmp (arg, "--sysroot=", 10) == 0)
1593                 target_system_root = arg + 10;
1594               break;
1595             }
1596         }
1597       else if ((p = strrchr (arg, '.')) != (char *) 0
1598                && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1599                    || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1600                    || strcmp (p, ".obj") == 0))
1601         {
1602           if (first_file)
1603             {
1604               first_file = 0;
1605               if (p[1] == 'o')
1606                 *ld2++ = o_file;
1607               else
1608                 {
1609                   /* place o_file BEFORE this argument! */
1610                   ld2--;
1611                   *ld2++ = o_file;
1612                   *ld2++ = arg;
1613                 }
1614             }
1615           if (p[1] == 'o' || p[1] == 'l')
1616             *object++ = arg;
1617 #ifdef COLLECT_EXPORT_LIST
1618           /* libraries can be specified directly, i.e. without -l flag.  */
1619           else
1620             {
1621               /* Saving a full library name.  */
1622               add_to_list (&libs, arg);
1623             }
1624 #endif
1625         }
1626     }
1627
1628 #ifdef COLLECT_EXPORT_LIST
1629   /* This is added only for debugging purposes.  */
1630   if (debug)
1631     {
1632       fprintf (stderr, "List of libraries:\n");
1633       dump_list (stderr, "\t", libs.first);
1634     }
1635
1636   /* The AIX linker will discard static constructors in object files if
1637      nothing else in the file is referenced, so look at them first.  Unless
1638      we are building a shared object, ignore the eh frame tables, as we
1639      would otherwise reference them all, hence drag all the corresponding
1640      objects even if nothing else is referenced.  */
1641   {
1642     const char **export_object_lst 
1643       = CONST_CAST2 (const char **, char **, object_lst);
1644     
1645     struct id *list = libs.first;
1646
1647     /* Compute the filter to use from the current one, do scan, then adjust
1648        the "current" filter to remove what we just included here.  This will
1649        control whether we need a first pass link later on or not, and what
1650        will remain to be scanned there.  */
1651     
1652     scanfilter this_filter
1653       = shared_obj ? ld1_filter : (ld1_filter & ~SCAN_DWEH);
1654     
1655     while (export_object_lst < object)
1656       scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1657     
1658     for (; list; list = list->next)
1659       scan_prog_file (list->name, PASS_FIRST, this_filter);
1660     
1661     ld1_filter = ld1_filter & ~this_filter;
1662   }
1663
1664   if (exports.first)
1665     {
1666       char *buf = concat ("-bE:", export_file, NULL);
1667
1668       *ld1++ = buf;
1669       *ld2++ = buf;
1670
1671       exportf = fopen (export_file, "w");
1672       if (exportf == (FILE *) 0)
1673         fatal_perror ("fopen %s", export_file);
1674       write_aix_file (exportf, exports.first);
1675       if (fclose (exportf))
1676         fatal_perror ("fclose %s", export_file);
1677     }
1678 #endif
1679
1680   *c_ptr++ = c_file;
1681   *c_ptr = *ld1 = *object = (char *) 0;
1682
1683   if (vflag)
1684     {
1685       notice ("collect2 version %s", version_string);
1686 #ifdef TARGET_VERSION
1687       TARGET_VERSION;
1688 #endif
1689       fprintf (stderr, "\n");
1690     }
1691
1692   if (debug)
1693     {
1694       const char *ptr;
1695       fprintf (stderr, "ld_file_name        = %s\n",
1696                (ld_file_name ? ld_file_name : "not found"));
1697       fprintf (stderr, "c_file_name         = %s\n",
1698                (c_file_name ? c_file_name : "not found"));
1699       fprintf (stderr, "nm_file_name        = %s\n",
1700                (nm_file_name ? nm_file_name : "not found"));
1701 #ifdef LDD_SUFFIX
1702       fprintf (stderr, "ldd_file_name       = %s\n",
1703                (ldd_file_name ? ldd_file_name : "not found"));
1704 #endif
1705       fprintf (stderr, "strip_file_name     = %s\n",
1706                (strip_file_name ? strip_file_name : "not found"));
1707       fprintf (stderr, "c_file              = %s\n",
1708                (c_file ? c_file : "not found"));
1709       fprintf (stderr, "o_file              = %s\n",
1710                (o_file ? o_file : "not found"));
1711
1712       ptr = getenv ("COLLECT_GCC_OPTIONS");
1713       if (ptr)
1714         fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1715
1716       ptr = getenv ("COLLECT_GCC");
1717       if (ptr)
1718         fprintf (stderr, "COLLECT_GCC         = %s\n", ptr);
1719
1720       ptr = getenv ("COMPILER_PATH");
1721       if (ptr)
1722         fprintf (stderr, "COMPILER_PATH       = %s\n", ptr);
1723
1724       ptr = getenv (LIBRARY_PATH_ENV);
1725       if (ptr)
1726         fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1727
1728       fprintf (stderr, "\n");
1729     }
1730
1731   /* Load the program, searching all libraries and attempting to provide
1732      undefined symbols from repository information.
1733      
1734      If -r or they will be run via some other method, do not build the
1735      constructor or destructor list, just return now.  */  
1736   {
1737     bool early_exit
1738       = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1739
1740     /* Perform the first pass link now, if we're about to exit or if we need
1741        to scan for things we haven't collected yet before pursuing further.
1742
1743        On AIX, the latter typically includes nothing for shared objects or
1744        frame tables for an executable, out of what the required early scan on
1745        objects and libraries has performed above.  In the !shared_obj case, we
1746        expect the relevant tables to be dragged together with their associated
1747        functions from precise cross reference insertions by the compiler.  */
1748        
1749     if (early_exit || ld1_filter != SCAN_NOTHING)
1750       do_tlink (ld1_argv, object_lst);
1751     
1752     if (early_exit)
1753       {
1754 #ifdef COLLECT_EXPORT_LIST
1755         /* Make sure we delete the export file we may have created.  */
1756         if (export_file != 0 && export_file[0])
1757           maybe_unlink (export_file);
1758 #endif
1759         if (lto_mode)
1760           maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1761
1762         maybe_unlink (c_file);
1763         maybe_unlink (o_file);
1764         return 0;
1765       }
1766   }
1767
1768   /* Unless we have done it all already, examine the namelist and search for
1769      static constructors and destructors to call.  Write the constructor and
1770      destructor tables to a .s file and reload.  */
1771
1772   if (ld1_filter != SCAN_NOTHING)
1773     scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1774
1775 #ifdef SCAN_LIBRARIES
1776   scan_libraries (output_file);
1777 #endif
1778
1779   if (debug)
1780     {
1781       notice ("%d constructor(s) found\n", constructors.number);
1782       notice ("%d destructor(s)  found\n", destructors.number);
1783       notice ("%d frame table(s) found\n", frame_tables.number);
1784     }
1785
1786   /* If the scan exposed nothing of special interest, there's no need to
1787      generate the glue code and relink so return now.  */
1788
1789   if (constructors.number == 0 && destructors.number == 0
1790       && frame_tables.number == 0
1791 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1792       /* If we will be running these functions ourselves, we want to emit
1793          stubs into the shared library so that we do not have to relink
1794          dependent programs when we add static objects.  */
1795       && ! shared_obj
1796 #endif
1797       )
1798     {
1799       /* Do tlink without additional code generation now if we didn't
1800          do it earlier for scanning purposes.  */
1801       if (ld1_filter == SCAN_NOTHING)
1802         do_tlink (ld1_argv, object_lst);
1803
1804       if (lto_mode)
1805         maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1806
1807       /* Strip now if it was requested on the command line.  */
1808       if (strip_flag)
1809         {
1810           char **real_strip_argv = XCNEWVEC (char *, 3);
1811           const char ** strip_argv = CONST_CAST2 (const char **, char **,
1812                                                   real_strip_argv);
1813
1814           strip_argv[0] = strip_file_name;
1815           strip_argv[1] = output_file;
1816           strip_argv[2] = (char *) 0;
1817           fork_execute ("strip", real_strip_argv);
1818         }
1819
1820 #ifdef COLLECT_EXPORT_LIST
1821       maybe_unlink (export_file);
1822 #endif
1823       maybe_unlink (c_file);
1824       maybe_unlink (o_file);
1825       return 0;
1826     }
1827
1828   /* Sort ctor and dtor lists by priority.  */
1829   sort_ids (&constructors);
1830   sort_ids (&destructors);
1831
1832   maybe_unlink(output_file);
1833   outf = fopen (c_file, "w");
1834   if (outf == (FILE *) 0)
1835     fatal_perror ("fopen %s", c_file);
1836
1837   write_c_file (outf, c_file);
1838
1839   if (fclose (outf))
1840     fatal_perror ("fclose %s", c_file);
1841
1842   /* Tell the linker that we have initializer and finalizer functions.  */
1843 #ifdef LD_INIT_SWITCH
1844 #ifdef COLLECT_EXPORT_LIST
1845   *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1846 #else
1847   *ld2++ = LD_INIT_SWITCH;
1848   *ld2++ = initname;
1849   *ld2++ = LD_FINI_SWITCH;
1850   *ld2++ = fininame;
1851 #endif
1852 #endif
1853
1854 #ifdef COLLECT_EXPORT_LIST
1855   if (shared_obj)
1856     {
1857       /* If we did not add export flag to link arguments before, add it to
1858          second link phase now.  No new exports should have been added.  */
1859       if (! exports.first)
1860         *ld2++ = concat ("-bE:", export_file, NULL);
1861
1862 #ifndef LD_INIT_SWITCH
1863       add_to_list (&exports, initname);
1864       add_to_list (&exports, fininame);
1865       add_to_list (&exports, "_GLOBAL__DI");
1866       add_to_list (&exports, "_GLOBAL__DD");
1867 #endif
1868       exportf = fopen (export_file, "w");
1869       if (exportf == (FILE *) 0)
1870         fatal_perror ("fopen %s", export_file);
1871       write_aix_file (exportf, exports.first);
1872       if (fclose (exportf))
1873         fatal_perror ("fclose %s", export_file);
1874     }
1875 #endif
1876
1877   /* End of arguments to second link phase.  */
1878   *ld2 = (char*) 0;
1879
1880   if (debug)
1881     {
1882       fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1883                output_file, c_file);
1884       write_c_file (stderr, "stderr");
1885       fprintf (stderr, "========== end of c_file\n\n");
1886 #ifdef COLLECT_EXPORT_LIST
1887       fprintf (stderr, "\n========== export_file = %s\n", export_file);
1888       write_aix_file (stderr, exports.first);
1889       fprintf (stderr, "========== end of export_file\n\n");
1890 #endif
1891     }
1892
1893   /* Assemble the constructor and destructor tables.
1894      Link the tables in with the rest of the program.  */
1895
1896   fork_execute ("gcc",  c_argv);
1897 #ifdef COLLECT_EXPORT_LIST
1898   /* On AIX we must call tlink because of possible templates resolution.  */
1899   do_tlink (ld2_argv, object_lst);
1900
1901   if (lto_mode)
1902     maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1903 #else
1904   /* Otherwise, simply call ld because tlink is already done.  */
1905   if (lto_mode)
1906     maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1907   else
1908     fork_execute ("ld", ld2_argv);
1909
1910   /* Let scan_prog_file do any final mods (OSF/rose needs this for
1911      constructors/destructors in shared libraries.  */
1912   scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1913 #endif
1914
1915   maybe_unlink (c_file);
1916   maybe_unlink (o_file);
1917
1918 #ifdef COLLECT_EXPORT_LIST
1919   maybe_unlink (export_file);
1920 #endif
1921
1922   return 0;
1923 }
1924
1925 \f
1926 /* Wait for a process to finish, and exit if a nonzero status is found.  */
1927
1928 int
1929 collect_wait (const char *prog, struct pex_obj *pex)
1930 {
1931   int status;
1932
1933   if (!pex_get_status (pex, 1, &status))
1934     fatal_perror ("can't get program status");
1935   pex_free (pex);
1936
1937   if (status)
1938     {
1939       if (WIFSIGNALED (status))
1940         {
1941           int sig = WTERMSIG (status);
1942           error ("%s terminated with signal %d [%s]%s",
1943                  prog, sig, strsignal(sig),
1944                  WCOREDUMP(status) ? ", core dumped" : "");
1945           collect_exit (FATAL_EXIT_CODE);
1946         }
1947
1948       if (WIFEXITED (status))
1949         return WEXITSTATUS (status);
1950     }
1951   return 0;
1952 }
1953
1954 static void
1955 do_wait (const char *prog, struct pex_obj *pex)
1956 {
1957   int ret = collect_wait (prog, pex);
1958   if (ret != 0)
1959     {
1960       error ("%s returned %d exit status", prog, ret);
1961       collect_exit (ret);
1962     }
1963
1964   if (response_file)
1965     {
1966       unlink (response_file);
1967       response_file = NULL;
1968     }
1969 }
1970
1971 \f
1972 /* Execute a program, and wait for the reply.  */
1973
1974 struct pex_obj *
1975 collect_execute (const char *prog, char **argv, const char *outname,
1976                  const char *errname, int flags)
1977 {
1978   struct pex_obj *pex;
1979   const char *errmsg;
1980   int err;
1981   char *response_arg = NULL;
1982   char *response_argv[3] ATTRIBUTE_UNUSED;
1983
1984   if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
1985     {
1986       /* If using @file arguments, create a temporary file and put the
1987          contents of argv into it.  Then change argv to an array corresponding
1988          to a single argument @FILE, where FILE is the temporary filename.  */
1989
1990       char **current_argv = argv + 1;
1991       char *argv0 = argv[0];
1992       int status;
1993       FILE *f;
1994
1995       /* Note: we assume argv contains at least one element; this is
1996          checked above.  */
1997
1998       response_file = make_temp_file ("");
1999
2000       f = fopen (response_file, "w");
2001
2002       if (f == NULL)
2003         fatal ("could not open response file %s", response_file);
2004
2005       status = writeargv (current_argv, f);
2006
2007       if (status)
2008         fatal ("could not write to response file %s", response_file);
2009
2010       status = fclose (f);
2011
2012       if (EOF == status)
2013         fatal ("could not close response file %s", response_file);
2014
2015       response_arg = concat ("@", response_file, NULL);
2016       response_argv[0] = argv0;
2017       response_argv[1] = response_arg;
2018       response_argv[2] = NULL;
2019
2020       argv = response_argv;
2021     }
2022
2023   if (vflag || debug)
2024     {
2025       char **p_argv;
2026       const char *str;
2027
2028       if (argv[0])
2029         fprintf (stderr, "%s", argv[0]);
2030       else
2031         notice ("[cannot find %s]", prog);
2032
2033       for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
2034         fprintf (stderr, " %s", str);
2035
2036       fprintf (stderr, "\n");
2037     }
2038
2039   fflush (stdout);
2040   fflush (stderr);
2041
2042   /* If we cannot find a program we need, complain error.  Do this here
2043      since we might not end up needing something that we could not find.  */
2044
2045   if (argv[0] == 0)
2046     fatal ("cannot find '%s'", prog);
2047
2048   pex = pex_init (0, "collect2", NULL);
2049   if (pex == NULL)
2050     fatal_perror ("pex_init failed");
2051
2052   errmsg = pex_run (pex, flags, argv[0], argv, outname,
2053                     errname, &err);
2054   if (errmsg != NULL)
2055     {
2056       if (err != 0)
2057         {
2058           errno = err;
2059           fatal_perror (errmsg);
2060         }
2061       else
2062         fatal (errmsg);
2063     }
2064
2065   if (response_arg)
2066     free (response_arg);
2067
2068   return pex;
2069 }
2070
2071 static void
2072 fork_execute (const char *prog, char **argv)
2073 {
2074   struct pex_obj *pex;
2075
2076   pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2077   do_wait (prog, pex);
2078 }
2079 \f
2080 /* Unlink a file unless we are debugging.  */
2081
2082 static void
2083 maybe_unlink (const char *file)
2084 {
2085   if (!debug)
2086     unlink_if_ordinary (file);
2087   else
2088     notice ("[Leaving %s]\n", file);
2089 }
2090
2091 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST.  */
2092
2093 static void
2094 maybe_unlink_list (char **file_list)
2095 {
2096   char **tmp = file_list;
2097
2098   while (*tmp)
2099     maybe_unlink (*(tmp++));
2100 }
2101
2102 \f
2103 static long sequence_number = 0;
2104
2105 /* Add a name to a linked list.  */
2106
2107 static void
2108 add_to_list (struct head *head_ptr, const char *name)
2109 {
2110   struct id *newid
2111     = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2112   struct id *p;
2113   strcpy (newid->name, name);
2114
2115   if (head_ptr->first)
2116     head_ptr->last->next = newid;
2117   else
2118     head_ptr->first = newid;
2119
2120   /* Check for duplicate symbols.  */
2121   for (p = head_ptr->first;
2122        strcmp (name, p->name) != 0;
2123        p = p->next)
2124     ;
2125   if (p != newid)
2126     {
2127       head_ptr->last->next = 0;
2128       free (newid);
2129       return;
2130     }
2131
2132   newid->sequence = ++sequence_number;
2133   head_ptr->last = newid;
2134   head_ptr->number++;
2135 }
2136
2137 /* Grab the init priority number from an init function name that
2138    looks like "_GLOBAL_.I.12345.foo".  */
2139
2140 static int
2141 extract_init_priority (const char *name)
2142 {
2143   int pos = 0, pri;
2144
2145   while (name[pos] == '_')
2146     ++pos;
2147   pos += 10; /* strlen ("GLOBAL__X_") */
2148
2149   /* Extract init_p number from ctor/dtor name.  */
2150   pri = atoi (name + pos);
2151   return pri ? pri : DEFAULT_INIT_PRIORITY;
2152 }
2153
2154 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2155    ctors will be run from right to left, dtors from left to right.  */
2156
2157 static void
2158 sort_ids (struct head *head_ptr)
2159 {
2160   /* id holds the current element to insert.  id_next holds the next
2161      element to insert.  id_ptr iterates through the already sorted elements
2162      looking for the place to insert id.  */
2163   struct id *id, *id_next, **id_ptr;
2164
2165   id = head_ptr->first;
2166
2167   /* We don't have any sorted elements yet.  */
2168   head_ptr->first = NULL;
2169
2170   for (; id; id = id_next)
2171     {
2172       id_next = id->next;
2173       id->sequence = extract_init_priority (id->name);
2174
2175       for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2176         if (*id_ptr == NULL
2177             /* If the sequence numbers are the same, we put the id from the
2178                file later on the command line later in the list.  */
2179             || id->sequence > (*id_ptr)->sequence
2180             /* Hack: do lexical compare, too.
2181             || (id->sequence == (*id_ptr)->sequence
2182                 && strcmp (id->name, (*id_ptr)->name) > 0) */
2183             )
2184           {
2185             id->next = *id_ptr;
2186             *id_ptr = id;
2187             break;
2188           }
2189     }
2190
2191   /* Now set the sequence numbers properly so write_c_file works.  */
2192   for (id = head_ptr->first; id; id = id->next)
2193     id->sequence = ++sequence_number;
2194 }
2195
2196 /* Write: `prefix', the names on list LIST, `suffix'.  */
2197
2198 static void
2199 write_list (FILE *stream, const char *prefix, struct id *list)
2200 {
2201   while (list)
2202     {
2203       fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2204       list = list->next;
2205     }
2206 }
2207
2208 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2209 /* Given a STRING, return nonzero if it occurs in the list in range
2210    [ARGS_BEGIN,ARGS_END).  */
2211
2212 static int
2213 is_in_args (const char *string, const char **args_begin,
2214             const char **args_end)
2215 {
2216   const char **args_pointer;
2217   for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2218     if (strcmp (string, *args_pointer) == 0)
2219       return 1;
2220   return 0;
2221 }
2222 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2223
2224 #ifdef COLLECT_EXPORT_LIST
2225 /* This function is really used only on AIX, but may be useful.  */
2226 #if 0
2227 static int
2228 is_in_list (const char *prefix, struct id *list)
2229 {
2230   while (list)
2231     {
2232       if (!strcmp (prefix, list->name)) return 1;
2233       list = list->next;
2234     }
2235     return 0;
2236 }
2237 #endif
2238 #endif /* COLLECT_EXPORT_LIST */
2239
2240 /* Added for debugging purpose.  */
2241 #ifdef COLLECT_EXPORT_LIST
2242 static void
2243 dump_list (FILE *stream, const char *prefix, struct id *list)
2244 {
2245   while (list)
2246     {
2247       fprintf (stream, "%s%s,\n", prefix, list->name);
2248       list = list->next;
2249     }
2250 }
2251 #endif
2252
2253 #if 0
2254 static void
2255 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2256 {
2257   while (list)
2258     {
2259       fprintf (stream, "%s%s,\n", prefix, list->prefix);
2260       list = list->next;
2261     }
2262 }
2263 #endif
2264
2265 static void
2266 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2267 {
2268   while (list)
2269     {
2270       fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2271                prefix, list->sequence, list->name);
2272       list = list->next;
2273     }
2274 }
2275
2276 /* Write out the constructor and destructor tables statically (for a shared
2277    object), along with the functions to execute them.  */
2278
2279 static void
2280 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2281 {
2282   const char *p, *q;
2283   char *prefix, *r;
2284   int frames = (frame_tables.number > 0);
2285
2286   /* Figure out name of output_file, stripping off .so version.  */
2287   p = strrchr (output_file, '/');
2288   if (p == 0)
2289     p = output_file;
2290   else
2291     p++;
2292   q = p;
2293   while (q)
2294     {
2295       q = strchr (q,'.');
2296       if (q == 0)
2297         {
2298           q = p + strlen (p);
2299           break;
2300         }
2301       else
2302         {
2303           if (strncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2304             {
2305               q += strlen (SHLIB_SUFFIX);
2306               break;
2307             }
2308           else
2309             q++;
2310         }
2311     }
2312   /* q points to null at end of the string (or . of the .so version) */
2313   prefix = XNEWVEC (char, q - p + 1);
2314   strncpy (prefix, p, q - p);
2315   prefix[q - p] = 0;
2316   for (r = prefix; *r; r++)
2317     if (!ISALNUM ((unsigned char)*r))
2318       *r = '_';
2319   if (debug)
2320     notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2321             output_file, prefix);
2322
2323   initname = concat ("_GLOBAL__FI_", prefix, NULL);
2324   fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2325
2326   free (prefix);
2327
2328   /* Write the tables as C code.  */
2329
2330   fprintf (stream, "static int count;\n");
2331   fprintf (stream, "typedef void entry_pt();\n");
2332   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2333
2334   if (frames)
2335     {
2336       write_list_with_asm (stream, "extern void *", frame_tables.first);
2337
2338       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2339       write_list (stream, "\t\t&", frame_tables.first);
2340       fprintf (stream, "\t0\n};\n");
2341
2342       /* This must match what's in frame.h.  */
2343       fprintf (stream, "struct object {\n");
2344       fprintf (stream, "  void *pc_begin;\n");
2345       fprintf (stream, "  void *pc_end;\n");
2346       fprintf (stream, "  void *fde_begin;\n");
2347       fprintf (stream, "  void *fde_array;\n");
2348       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2349       fprintf (stream, "  struct object *next;\n");
2350       fprintf (stream, "};\n");
2351
2352       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2353       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2354
2355       fprintf (stream, "static void reg_frame () {\n");
2356       fprintf (stream, "\tstatic struct object ob;\n");
2357       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2358       fprintf (stream, "\t}\n");
2359
2360       fprintf (stream, "static void dereg_frame () {\n");
2361       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2362       fprintf (stream, "\t}\n");
2363     }
2364
2365   fprintf (stream, "void %s() {\n", initname);
2366   if (constructors.number > 0 || frames)
2367     {
2368       fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2369       write_list (stream, "\t\t", constructors.first);
2370       if (frames)
2371         fprintf (stream, "\treg_frame,\n");
2372       fprintf (stream, "\t};\n");
2373       fprintf (stream, "\tentry_pt **p;\n");
2374       fprintf (stream, "\tif (count++ != 0) return;\n");
2375       fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2376       fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2377     }
2378   else
2379     fprintf (stream, "\t++count;\n");
2380   fprintf (stream, "}\n");
2381   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2382   fprintf (stream, "void %s() {\n", fininame);
2383   if (destructors.number > 0 || frames)
2384     {
2385       fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2386       write_list (stream, "\t\t", destructors.first);
2387       if (frames)
2388         fprintf (stream, "\tdereg_frame,\n");
2389       fprintf (stream, "\t};\n");
2390       fprintf (stream, "\tentry_pt **p;\n");
2391       fprintf (stream, "\tif (--count != 0) return;\n");
2392       fprintf (stream, "\tp = dtors;\n");
2393       fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2394                destructors.number + frames);
2395     }
2396   fprintf (stream, "}\n");
2397
2398   if (shared_obj)
2399     {
2400       COLLECT_SHARED_INIT_FUNC(stream, initname);
2401       COLLECT_SHARED_FINI_FUNC(stream, fininame);
2402     }
2403 }
2404
2405 /* Write the constructor/destructor tables.  */
2406
2407 #ifndef LD_INIT_SWITCH
2408 static void
2409 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2410 {
2411   /* Write the tables as C code.  */
2412
2413   int frames = (frame_tables.number > 0);
2414
2415   fprintf (stream, "typedef void entry_pt();\n\n");
2416
2417   write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2418
2419   if (frames)
2420     {
2421       write_list_with_asm (stream, "extern void *", frame_tables.first);
2422
2423       fprintf (stream, "\tstatic void *frame_table[] = {\n");
2424       write_list (stream, "\t\t&", frame_tables.first);
2425       fprintf (stream, "\t0\n};\n");
2426
2427       /* This must match what's in frame.h.  */
2428       fprintf (stream, "struct object {\n");
2429       fprintf (stream, "  void *pc_begin;\n");
2430       fprintf (stream, "  void *pc_end;\n");
2431       fprintf (stream, "  void *fde_begin;\n");
2432       fprintf (stream, "  void *fde_array;\n");
2433       fprintf (stream, "  __SIZE_TYPE__ count;\n");
2434       fprintf (stream, "  struct object *next;\n");
2435       fprintf (stream, "};\n");
2436
2437       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2438       fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2439
2440       fprintf (stream, "static void reg_frame () {\n");
2441       fprintf (stream, "\tstatic struct object ob;\n");
2442       fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2443       fprintf (stream, "\t}\n");
2444
2445       fprintf (stream, "static void dereg_frame () {\n");
2446       fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2447       fprintf (stream, "\t}\n");
2448     }
2449
2450   fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2451   fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2452   write_list (stream, "\t", constructors.first);
2453   if (frames)
2454     fprintf (stream, "\treg_frame,\n");
2455   fprintf (stream, "\t0\n};\n\n");
2456
2457   write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2458
2459   fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2460   fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2461   write_list (stream, "\t", destructors.first);
2462   if (frames)
2463     fprintf (stream, "\tdereg_frame,\n");
2464   fprintf (stream, "\t0\n};\n\n");
2465
2466   fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2467   fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2468 }
2469 #endif /* ! LD_INIT_SWITCH */
2470
2471 static void
2472 write_c_file (FILE *stream, const char *name)
2473 {
2474 #ifndef LD_INIT_SWITCH
2475   if (! shared_obj)
2476     write_c_file_glob (stream, name);
2477   else
2478 #endif
2479     write_c_file_stat (stream, name);
2480 }
2481
2482 #ifdef COLLECT_EXPORT_LIST
2483 static void
2484 write_aix_file (FILE *stream, struct id *list)
2485 {
2486   for (; list; list = list->next)
2487     {
2488       fputs (list->name, stream);
2489       putc ('\n', stream);
2490     }
2491 }
2492 #endif
2493 \f
2494 #ifdef OBJECT_FORMAT_NONE
2495
2496 /* Check to make sure the file is an ELF file.  LTO objects must
2497    be in ELF format.  */
2498
2499 static bool
2500 is_elf (const char *prog_name)
2501 {
2502   FILE *f;
2503   char buf[4];
2504   static char magic[4] = { 0x7f, 'E', 'L', 'F' };
2505
2506   f = fopen (prog_name, "r");
2507   if (f == NULL)
2508     return false;
2509   if (fread (buf, sizeof (buf), 1, f) != 1)
2510     buf[0] = 0;
2511   fclose (f);
2512   return memcmp (buf, magic, sizeof (magic)) == 0;
2513 }
2514
2515 /* Generic version to scan the name list of the loaded program for
2516    the symbols g++ uses for static constructors and destructors.  */
2517
2518 static void
2519 scan_prog_file (const char *prog_name, scanpass which_pass,
2520                 scanfilter filter)
2521 {
2522   void (*int_handler) (int);
2523 #ifdef SIGQUIT
2524   void (*quit_handler) (int);
2525 #endif
2526   char *real_nm_argv[4];
2527   const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2528   int argc = 0;
2529   struct pex_obj *pex;
2530   const char *errmsg;
2531   int err;
2532   char *p, buf[1024];
2533   FILE *inf;
2534   int found_lto = 0;
2535
2536   if (which_pass == PASS_SECOND)
2537     return;
2538
2539   /* LTO objects must be in ELF format.  This check prevents
2540      us from accepting an archive containing LTO objects, which
2541      gcc cannnot currently handle.  */
2542   if (which_pass == PASS_LTOINFO && !is_elf (prog_name))
2543     return;
2544
2545   /* If we do not have an `nm', complain.  */
2546   if (nm_file_name == 0)
2547     fatal ("cannot find 'nm'");
2548
2549   nm_argv[argc++] = nm_file_name;
2550   if (NM_FLAGS[0] != '\0')
2551     nm_argv[argc++] = NM_FLAGS;
2552
2553   nm_argv[argc++] = prog_name;
2554   nm_argv[argc++] = (char *) 0;
2555
2556   /* Trace if needed.  */
2557   if (vflag)
2558     {
2559       const char **p_argv;
2560       const char *str;
2561
2562       for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2563         fprintf (stderr, " %s", str);
2564
2565       fprintf (stderr, "\n");
2566     }
2567
2568   fflush (stdout);
2569   fflush (stderr);
2570
2571   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2572   if (pex == NULL)
2573     fatal_perror ("pex_init failed");
2574
2575   errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2576                     &err);
2577   if (errmsg != NULL)
2578     {
2579       if (err != 0)
2580         {
2581           errno = err;
2582           fatal_perror (errmsg);
2583         }
2584       else
2585         fatal (errmsg);
2586     }
2587
2588   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2589 #ifdef SIGQUIT
2590   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2591 #endif
2592
2593   inf = pex_read_output (pex, 0);
2594   if (inf == NULL)
2595     fatal_perror ("can't open nm output");
2596
2597   if (debug)
2598     {
2599       if (which_pass == PASS_LTOINFO)
2600         fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2601       else
2602         fprintf (stderr, "\nnm output with constructors/destructors.\n");
2603     }
2604
2605   /* Read each line of nm output.  */
2606   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2607     {
2608       int ch, ch2;
2609       char *name, *end;
2610
2611       if (debug)
2612         fprintf (stderr, "\t%s\n", buf);
2613
2614       if (which_pass == PASS_LTOINFO)
2615         {
2616           if (found_lto)
2617             continue;
2618
2619           /* Look for the LTO info marker symbol, and add filename to
2620              the LTO objects list if found.  */
2621           for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2622             if (ch == ' '
2623                 && (strncmp (p +1 , "gnu_lto_v1", 10) == 0)
2624                 && ISSPACE( p[11]))
2625               {
2626                 add_lto_object (&lto_objects, prog_name);
2627
2628                 /* We need to read all the input, so we can't just
2629                    return here.  But we can avoid useless work.  */
2630                 found_lto = 1;
2631
2632                 break;
2633               }
2634
2635           continue;
2636         }
2637
2638       /* If it contains a constructor or destructor name, add the name
2639          to the appropriate list unless this is a kind of symbol we're
2640          not supposed to even consider.  */
2641
2642       for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2643         if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2644           break;
2645
2646       if (ch != '_')
2647         continue;
2648
2649       name = p;
2650       /* Find the end of the symbol name.
2651          Do not include `|', because Encore nm can tack that on the end.  */
2652       for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2653            end++)
2654         continue;
2655
2656
2657       *end = '\0';
2658       switch (is_ctor_dtor (name))
2659         {
2660         case SYM_CTOR:
2661           if (! (filter & SCAN_CTOR))
2662             break;
2663           if (which_pass != PASS_LIB)
2664             add_to_list (&constructors, name);
2665           break;
2666
2667         case SYM_DTOR:
2668           if (! (filter & SCAN_DTOR))
2669             break;
2670           if (which_pass != PASS_LIB)
2671             add_to_list (&destructors, name);
2672           break;
2673
2674         case SYM_INIT:
2675           if (! (filter & SCAN_INIT))
2676             break;
2677           if (which_pass != PASS_LIB)
2678             fatal ("init function found in object %s", prog_name);
2679 #ifndef LD_INIT_SWITCH
2680           add_to_list (&constructors, name);
2681 #endif
2682           break;
2683
2684         case SYM_FINI:
2685           if (! (filter & SCAN_FINI))
2686             break;
2687           if (which_pass != PASS_LIB)
2688             fatal ("fini function found in object %s", prog_name);
2689 #ifndef LD_FINI_SWITCH
2690           add_to_list (&destructors, name);
2691 #endif
2692           break;
2693
2694         case SYM_DWEH:
2695           if (! (filter & SCAN_DWEH))
2696             break;
2697           if (which_pass != PASS_LIB)
2698             add_to_list (&frame_tables, name);
2699           break;
2700
2701         default:                /* not a constructor or destructor */
2702           continue;
2703         }
2704     }
2705
2706   if (debug)
2707     fprintf (stderr, "\n");
2708
2709   do_wait (nm_file_name, pex);
2710
2711   signal (SIGINT,  int_handler);
2712 #ifdef SIGQUIT
2713   signal (SIGQUIT, quit_handler);
2714 #endif
2715 }
2716
2717 #ifdef LDD_SUFFIX
2718
2719 /* Use the List Dynamic Dependencies program to find shared libraries that
2720    the output file depends upon and their initialization/finalization
2721    routines, if any.  */
2722
2723 static void
2724 scan_libraries (const char *prog_name)
2725 {
2726   static struct head libraries;         /* list of shared libraries found */
2727   struct id *list;
2728   void (*int_handler) (int);
2729 #ifdef SIGQUIT
2730   void (*quit_handler) (int);
2731 #endif
2732   char *real_ldd_argv[4];
2733   const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2734   int argc = 0;
2735   struct pex_obj *pex;
2736   const char *errmsg;
2737   int err;
2738   char buf[1024];
2739   FILE *inf;
2740
2741   /* If we do not have an `ldd', complain.  */
2742   if (ldd_file_name == 0)
2743     {
2744       error ("cannot find 'ldd'");
2745       return;
2746     }
2747
2748   ldd_argv[argc++] = ldd_file_name;
2749   ldd_argv[argc++] = prog_name;
2750   ldd_argv[argc++] = (char *) 0;
2751
2752   /* Trace if needed.  */
2753   if (vflag)
2754     {
2755       const char **p_argv;
2756       const char *str;
2757
2758       for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2759         fprintf (stderr, " %s", str);
2760
2761       fprintf (stderr, "\n");
2762     }
2763
2764   fflush (stdout);
2765   fflush (stderr);
2766
2767   pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2768   if (pex == NULL)
2769     fatal_perror ("pex_init failed");
2770
2771   errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2772   if (errmsg != NULL)
2773     {
2774       if (err != 0)
2775         {
2776           errno = err;
2777           fatal_perror (errmsg);
2778         }
2779       else
2780         fatal (errmsg);
2781     }
2782
2783   int_handler  = (void (*) (int)) signal (SIGINT,  SIG_IGN);
2784 #ifdef SIGQUIT
2785   quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2786 #endif
2787
2788   inf = pex_read_output (pex, 0);
2789   if (inf == NULL)
2790     fatal_perror ("can't open ldd output");
2791
2792   if (debug)
2793     notice ("\nldd output with constructors/destructors.\n");
2794
2795   /* Read each line of ldd output.  */
2796   while (fgets (buf, sizeof buf, inf) != (char *) 0)
2797     {
2798       int ch2;
2799       char *name, *end, *p = buf;
2800
2801       /* Extract names of libraries and add to list.  */
2802       PARSE_LDD_OUTPUT (p);
2803       if (p == 0)
2804         continue;
2805
2806       name = p;
2807       if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2808         fatal ("dynamic dependency %s not found", buf);
2809
2810       /* Find the end of the symbol name.  */
2811       for (end = p;
2812            (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2813            end++)
2814         continue;
2815       *end = '\0';
2816
2817       if (access (name, R_OK) == 0)
2818         add_to_list (&libraries, name);
2819       else
2820         fatal ("unable to open dynamic dependency '%s'", buf);
2821
2822       if (debug)
2823         fprintf (stderr, "\t%s\n", buf);
2824     }
2825   if (debug)
2826     fprintf (stderr, "\n");
2827
2828   do_wait (ldd_file_name, pex);
2829
2830   signal (SIGINT,  int_handler);
2831 #ifdef SIGQUIT
2832   signal (SIGQUIT, quit_handler);
2833 #endif
2834
2835   /* Now iterate through the library list adding their symbols to
2836      the list.  */
2837   for (list = libraries.first; list; list = list->next)
2838     scan_prog_file (list->name, PASS_LIB);
2839 }
2840
2841 #endif /* LDD_SUFFIX */
2842
2843 #endif /* OBJECT_FORMAT_NONE */
2844
2845 \f
2846 /*
2847  * COFF specific stuff.
2848  */
2849
2850 #ifdef OBJECT_FORMAT_COFF
2851
2852 #if defined (EXTENDED_COFF)
2853
2854 #   define GCC_SYMBOLS(X)       (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2855 #   define GCC_SYMENT           SYMR
2856 #   define GCC_OK_SYMBOL(X)     ((X).st == stProc || (X).st == stGlobal)
2857 #   define GCC_SYMINC(X)        (1)
2858 #   define GCC_SYMZERO(X)       (SYMHEADER(X).isymMax)
2859 #   define GCC_CHECK_HDR(X)     (PSYMTAB(X) != 0)
2860
2861 #else
2862
2863 #   define GCC_SYMBOLS(X)       (HEADER(ldptr).f_nsyms)
2864 #   define GCC_SYMENT           SYMENT
2865 #   if defined (C_WEAKEXT)
2866 #     define GCC_OK_SYMBOL(X) \
2867        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2868         ((X).n_scnum > N_UNDEF) && \
2869         (aix64_flag \
2870          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2871              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2872 #     define GCC_UNDEF_SYMBOL(X) \
2873        (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2874         ((X).n_scnum == N_UNDEF))
2875 #   else
2876 #     define GCC_OK_SYMBOL(X) \
2877        (((X).n_sclass == C_EXT) && \
2878         ((X).n_scnum > N_UNDEF) && \
2879         (aix64_flag \
2880          || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2881              || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2882 #     define GCC_UNDEF_SYMBOL(X) \
2883        (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2884 #   endif
2885 #   define GCC_SYMINC(X)        ((X).n_numaux+1)
2886 #   define GCC_SYMZERO(X)       0
2887
2888 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2889 #if TARGET_AIX_VERSION >= 51
2890 #   define GCC_CHECK_HDR(X) \
2891      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2892       || (HEADER (X).f_magic == 0767 && aix64_flag))
2893 #else
2894 #   define GCC_CHECK_HDR(X) \
2895      ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2896       || (HEADER (X).f_magic == 0757 && aix64_flag))
2897 #endif
2898
2899 #endif
2900
2901 #ifdef COLLECT_EXPORT_LIST
2902 /* Array of standard AIX libraries which should not
2903    be scanned for ctors/dtors.  */
2904 static const char *const aix_std_libs[] = {
2905   "/unix",
2906   "/lib/libc.a",
2907   "/lib/libm.a",
2908   "/lib/libc_r.a",
2909   "/lib/libm_r.a",
2910   "/usr/lib/libc.a",
2911   "/usr/lib/libm.a",
2912   "/usr/lib/libc_r.a",
2913   "/usr/lib/libm_r.a",
2914   "/usr/lib/threads/libc.a",
2915   "/usr/ccs/lib/libc.a",
2916   "/usr/ccs/lib/libm.a",
2917   "/usr/ccs/lib/libc_r.a",
2918   "/usr/ccs/lib/libm_r.a",
2919   NULL
2920 };
2921
2922 /* This function checks the filename and returns 1
2923    if this name matches the location of a standard AIX library.  */
2924 static int ignore_library (const char *);
2925 static int
2926 ignore_library (const char *name)
2927 {
2928   const char *const *p;
2929   size_t length;
2930
2931   if (target_system_root[0] != '\0')
2932     {
2933       length = strlen (target_system_root);
2934       if (strncmp (name, target_system_root, length) != 0)
2935         return 0;
2936       name += length;
2937     }
2938   for (p = &aix_std_libs[0]; *p != NULL; ++p)
2939     if (strcmp (name, *p) == 0)
2940       return 1;
2941   return 0;
2942 }
2943 #endif /* COLLECT_EXPORT_LIST */
2944
2945 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2946 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2947 #endif
2948
2949 /* COFF version to scan the name list of the loaded program for
2950    the symbols g++ uses for static constructors and destructors.  */
2951
2952 static void
2953 scan_prog_file (const char *prog_name, scanpass which_pass,
2954                 scanfilter filter)
2955 {
2956   LDFILE *ldptr = NULL;
2957   int sym_index, sym_count;
2958   int is_shared = 0;
2959
2960   if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2961     return;
2962
2963 #ifdef COLLECT_EXPORT_LIST
2964   /* We do not need scanning for some standard C libraries.  */
2965   if (which_pass == PASS_FIRST && ignore_library (prog_name))
2966     return;
2967
2968   /* On AIX we have a loop, because there is not much difference
2969      between an object and an archive. This trick allows us to
2970      eliminate scan_libraries() function.  */
2971   do
2972     {
2973 #endif
2974       /* Some platforms (e.g. OSF4) declare ldopen as taking a
2975          non-const char * filename parameter, even though it will not
2976          modify that string.  So we must cast away const-ness here,
2977          using CONST_CAST to prevent complaints from -Wcast-qual.  */
2978       if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
2979         {
2980           if (! MY_ISCOFF (HEADER (ldptr).f_magic))
2981             fatal ("%s: not a COFF file", prog_name);
2982
2983           if (GCC_CHECK_HDR (ldptr))
2984             {
2985               sym_count = GCC_SYMBOLS (ldptr);
2986               sym_index = GCC_SYMZERO (ldptr);
2987
2988 #ifdef COLLECT_EXPORT_LIST
2989               /* Is current archive member a shared object?  */
2990               is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2991 #endif
2992
2993               while (sym_index < sym_count)
2994                 {
2995                   GCC_SYMENT symbol;
2996
2997                   if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2998                     break;
2999                   sym_index += GCC_SYMINC (symbol);
3000
3001                   if (GCC_OK_SYMBOL (symbol))
3002                     {
3003                       char *name;
3004
3005                       if ((name = ldgetname (ldptr, &symbol)) == NULL)
3006                         continue;               /* Should never happen.  */
3007
3008 #ifdef XCOFF_DEBUGGING_INFO
3009                       /* All AIX function names have a duplicate entry
3010                          beginning with a dot.  */
3011                       if (*name == '.')
3012                         ++name;
3013 #endif
3014
3015                       switch (is_ctor_dtor (name))
3016                         {
3017                         case SYM_CTOR:
3018                           if (! (filter & SCAN_CTOR))
3019                             break;
3020                           if (! is_shared)
3021                             add_to_list (&constructors, name);
3022 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3023                           if (which_pass == PASS_OBJ)
3024                             add_to_list (&exports, name);
3025 #endif
3026                           break;
3027
3028                         case SYM_DTOR:
3029                           if (! (filter & SCAN_DTOR))
3030                             break;
3031                           if (! is_shared)
3032                             add_to_list (&destructors, name);
3033 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3034                           if (which_pass == PASS_OBJ)
3035                             add_to_list (&exports, name);
3036 #endif
3037                           break;
3038
3039 #ifdef COLLECT_EXPORT_LIST
3040                         case SYM_INIT:
3041                           if (! (filter & SCAN_INIT))
3042                             break;
3043 #ifndef LD_INIT_SWITCH
3044                           if (is_shared)
3045                             add_to_list (&constructors, name);
3046 #endif
3047                           break;
3048
3049                         case SYM_FINI:
3050                           if (! (filter & SCAN_FINI))
3051                             break;
3052 #ifndef LD_INIT_SWITCH
3053                           if (is_shared)
3054                             add_to_list (&destructors, name);
3055 #endif
3056                           break;
3057 #endif
3058
3059                         case SYM_DWEH:
3060                           if (! (filter & SCAN_DWEH))
3061                             break;
3062                           if (! is_shared)
3063                             add_to_list (&frame_tables, 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                         default:        /* not a constructor or destructor */
3071 #ifdef COLLECT_EXPORT_LIST
3072                           /* Explicitly export all global symbols when
3073                              building a shared object on AIX, but do not
3074                              re-export symbols from another shared object
3075                              and do not export symbols if the user
3076                              provides an explicit export list.  */
3077                           if (shared_obj && !is_shared
3078                               && which_pass == PASS_OBJ && !export_flag)
3079                             add_to_list (&exports, name);
3080 #endif
3081                           continue;
3082                         }
3083
3084                       if (debug)
3085 #if !defined(EXTENDED_COFF)
3086                         fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3087                                  symbol.n_scnum, symbol.n_sclass,
3088                                  (symbol.n_type ? "0" : ""), symbol.n_type,
3089                                  name);
3090 #else
3091                         fprintf (stderr,
3092                                  "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3093                                  symbol.iss, (long) symbol.value, symbol.index, name);
3094 #endif
3095                     }
3096                 }
3097             }
3098 #ifdef COLLECT_EXPORT_LIST
3099           else
3100             {
3101               /* If archive contains both 32-bit and 64-bit objects,
3102                  we want to skip objects in other mode so mismatch normal.  */
3103               if (debug)
3104                 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3105                          prog_name, HEADER (ldptr).f_magic, aix64_flag);
3106             }
3107 #endif
3108         }
3109       else
3110         {
3111           fatal ("%s: cannot open as COFF file", prog_name);
3112         }
3113 #ifdef COLLECT_EXPORT_LIST
3114       /* On AIX loop continues while there are more members in archive.  */
3115     }
3116   while (ldclose (ldptr) == FAILURE);
3117 #else
3118   /* Otherwise we simply close ldptr.  */
3119   (void) ldclose(ldptr);
3120 #endif
3121 }
3122 #endif /* OBJECT_FORMAT_COFF */
3123
3124 #ifdef COLLECT_EXPORT_LIST
3125 /* Given a library name without "lib" prefix, this function
3126    returns a full library name including a path.  */
3127 static char *
3128 resolve_lib_name (const char *name)
3129 {
3130   char *lib_buf;
3131   int i, j, l = 0;
3132   /* Library extensions for AIX dynamic linking.  */
3133   const char * const libexts[2] = {"a", "so"};
3134
3135   for (i = 0; libpaths[i]; i++)
3136     if (libpaths[i]->max_len > l)
3137       l = libpaths[i]->max_len;
3138
3139   lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3140
3141   for (i = 0; libpaths[i]; i++)
3142     {
3143       struct prefix_list *list = libpaths[i]->plist;
3144       for (; list; list = list->next)
3145         {
3146           /* The following lines are needed because path_prefix list
3147              may contain directories both with trailing '/' and
3148              without it.  */
3149           const char *p = "";
3150           if (list->prefix[strlen(list->prefix)-1] != '/')
3151             p = "/";
3152           for (j = 0; j < 2; j++)
3153             {
3154               sprintf (lib_buf, "%s%slib%s.%s",
3155                        list->prefix, p, name,
3156                        libexts[(j + aixrtl_flag) % 2]);
3157               if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3158               if (file_exists (lib_buf))
3159                 {
3160                   if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3161                   return (lib_buf);
3162                 }
3163             }
3164         }
3165     }
3166   if (debug)
3167     fprintf (stderr, "not found\n");
3168   else
3169     fatal ("library lib%s not found", name);
3170   return (NULL);
3171 }
3172 #endif /* COLLECT_EXPORT_LIST */