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