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