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