OSDN Git Service

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