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
10This file is part of GCC.
11
12GCC is free software; you can redistribute it and/or modify it under
13the terms of the GNU General Public License as published by the Free
14Software Foundation; either version 3, or (at your option) any later
15version.
16
17GCC is distributed in the hope that it will be useful, but WITHOUT ANY
18WARRANTY; without even the implied warranty of MERCHANTABILITY or
19FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20for more details.
21
22You should have received a copy of the GNU General Public License
23along 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
147int do_collecting = 1;
148#else
149int 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.  */
163int no_demangle;
164
165/* Linked lists of constructor and destructor names.  */
166
167struct id
168{
169  struct id *next;
170  int sequence;
171  char name[1];
172};
173
174struct head
175{
176  struct id *first;
177  struct id *last;
178  int number;
179};
180
181int vflag;				/* true if -v */
182static int rflag;			/* true if -r */
183static int strip_flag;			/* true if -s */
184static const char *demangle_flag;
185#ifdef COLLECT_EXPORT_LIST
186static int export_flag;                 /* true if -bE */
187static int aix64_flag;			/* true if -b64 */
188static int aixrtl_flag;			/* true if -brtl */
189#endif
190
191enum 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.  */
198static enum lto_mode_d lto_mode = LTO_MODE_NONE;
199
200int debug;				/* true if -debug */
201
202static int shared_obj;			/* true if -shared */
203
204static const char *c_file;		/* <xxx>.c for constructor/destructor list.  */
205static const char *o_file;		/* <xxx>.o for constructor/destructor list.  */
206#ifdef COLLECT_EXPORT_LIST
207static const char *export_file;		/* <xxx>.x for AIX export list.  */
208#endif
209static char **lto_o_files;		/* Output files for LTO.  */
210const char *ldout;			/* File for ld stdout.  */
211const char *lderrout;			/* File for ld stderr.  */
212static const char *output_file;		/* Output file for ld.  */
213static const char *nm_file_name;	/* pathname of nm */
214#ifdef LDD_SUFFIX
215static const char *ldd_file_name;	/* pathname of ldd (or equivalent) */
216#endif
217static const char *strip_file_name;		/* pathname of strip */
218const char *c_file_name;		/* pathname of gcc */
219static char *initname, *fininame;	/* names of init and fini funcs */
220
221static struct head constructors;	/* list of constructors found */
222static struct head destructors;		/* list of destructors found */
223#ifdef COLLECT_EXPORT_LIST
224static struct head exports;		/* list of exported symbols */
225#endif
226static struct head frame_tables;	/* list of frame unwind info tables */
227
228static bool at_file_supplied;		/* Whether to use @file arguments */
229static char *response_file;		/* Name of any current response file */
230
231struct obstack temporary_obstack;
232char * 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
237static const char *target_system_root = TARGET_SYSTEM_ROOT;
238#else
239static 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
245struct prefix_list
246{
247  const char *prefix;         /* String to prepend to the path.  */
248  struct prefix_list *next;   /* Next in linked list.  */
249};
250
251struct 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.  */
260static struct head libs;                    /* list of libraries */
261static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
262static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
263static 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
272struct lto_object
273{
274  const char *name;		/* Name of object file.  */
275  struct lto_object *next;	/* Next in linked list.  */
276};
277
278struct lto_object_list
279{
280  struct lto_object *first;	/* First list element.  */
281  struct lto_object *last;	/* Last list element.  */
282};
283
284static struct lto_object_list lto_objects;
285
286/* Special kinds of symbols that a name may denote.  */
287
288typedef 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
298static symkind is_ctor_dtor (const char *);
299
300static void handler (int);
301static char *find_a_file (struct path_prefix *, const char *);
302static void add_prefix (struct path_prefix *, const char *);
303static void prefix_from_env (const char *, struct path_prefix *);
304static void prefix_from_string (const char *, struct path_prefix *);
305static void do_wait (const char *, struct pex_obj *);
306static void fork_execute (const char *, char **);
307static void maybe_unlink (const char *);
308static void maybe_unlink_list (char **);
309static void add_to_list (struct head *, const char *);
310static int extract_init_priority (const char *);
311static void sort_ids (struct head *);
312static void write_list (FILE *, const char *, struct id *);
313#ifdef COLLECT_EXPORT_LIST
314static void dump_list (FILE *, const char *, struct id *);
315#endif
316#if 0
317static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
318#endif
319static void write_list_with_asm (FILE *, const char *, struct id *);
320static void write_c_file (FILE *, const char *);
321static void write_c_file_stat (FILE *, const char *);
322#ifndef LD_INIT_SWITCH
323static void write_c_file_glob (FILE *, const char *);
324#endif
325#ifdef SCAN_LIBRARIES
326static void scan_libraries (const char *);
327#endif
328#if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
329static int is_in_args (const char *, const char **, const char **);
330#endif
331#ifdef COLLECT_EXPORT_LIST
332#if 0
333static int is_in_list (const char *, struct id *);
334#endif
335static void write_aix_file (FILE *, struct id *);
336static char *resolve_lib_name (const char *);
337#endif
338static char *extract_string (const char **);
339
340/* Enumerations describing which pass this is for scanning the
341   program file ...  */
342
343typedef 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
353enum 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.  */
366typedef 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
382static void scan_prog_file (const char *, scanpass, scanfilter);
383
384
385/* Delete tempfiles and exit function.  */
386
387void
388collect_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.  */
427void
428notice (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.  */
438void
439notice_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
450void
451fatal_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
467void
468fatal (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
483void
484error (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
498void
499fancy_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
504static void
505handler (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
535int
536file_exists (const char *name)
537{
538  return access (name, R_OK) == 0;
539}
540
541/* Parse a reasonable subset of shell quoting syntax.  */
542
543static char *
544extract_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
573void
574dump_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
646static symkind
647is_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
695static 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
701static 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
709static char *
710find_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
786static void
787add_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
820static void
821prefix_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
830static void
831prefix_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
877static void
878add_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
921static void
922maybe_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
1114int
1115main (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
1983int
1984collect_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
2009static void
2010do_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
2029struct pex_obj *
2030collect_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
2126static void
2127fork_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
2137static void
2138maybe_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
2148static void
2149maybe_unlink_list (char **file_list)
2150{
2151  char **tmp = file_list;
2152
2153  while (*tmp)
2154    maybe_unlink (*(tmp++));
2155}
2156
2157
2158static long sequence_number = 0;
2159
2160/* Add a name to a linked list.  */
2161
2162static void
2163add_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
2195static int
2196extract_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
2212static void
2213sort_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
2253static void
2254write_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
2267static int
2268is_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
2282static int
2283is_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
2297static void
2298dump_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
2309static void
2310dump_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
2320static void
2321write_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
2334static void
2335write_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
2463static void
2464write_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
2526static void
2527write_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
2538static void
2539write_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
2553static bool
2554maybe_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
2589static void
2590scan_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
2794static void
2795scan_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.  */
2975static 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.  */
2995static int ignore_library (const char *);
2996static int
2997ignore_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
3017extern 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
3023static void
3024scan_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.  */
3198static char *
3199resolve_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