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