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