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