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