re PR bootstrap/46810 (sparc64-linux bootstrap fails with "C++ preprocessor "/lib...
[official-gcc.git] / gcc / collect2.c
blob0b470271e4ae5f13ab917e862578007701d0dacc
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).
10 This file is part of GCC.
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.
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.
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/>. */
27 /* Build tables of static constructors and destructors and run ld. */
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
34 /* TARGET_64BIT may be defined to use driver specific functionality. */
35 #undef TARGET_64BIT
36 #define TARGET_64BIT TARGET_64BIT_DEFAULT
38 #ifndef LIBRARY_PATH_ENV
39 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
40 #endif
42 #define COLLECT
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"
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. */
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
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. */
72 #if !defined (OBJECT_FORMAT_COFF)
73 #define OBJECT_FORMAT_NONE
74 #endif
76 #ifdef OBJECT_FORMAT_COFF
78 #ifndef CROSS_DIRECTORY_STRUCTURE
79 #include <a.out.h>
80 #include <ar.h>
82 #ifdef UMAX
83 #include <sgs.h>
84 #endif
86 /* Many versions of ldfcn.h define these. */
87 #ifdef FREAD
88 #undef FREAD
89 #undef FWRITE
90 #endif
92 #include <ldfcn.h>
93 #endif
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. */
100 #ifndef MY_ISCOFF
101 #define MY_ISCOFF(X) ISCOFF (X)
102 #endif
104 #endif /* OBJECT_FORMAT_COFF */
106 #ifdef OBJECT_FORMAT_NONE
108 /* Default flags to pass to nm. */
109 #ifndef NM_FLAGS
110 #define NM_FLAGS "-n"
111 #endif
113 #endif /* OBJECT_FORMAT_NONE */
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
122 /* This must match tree.h. */
123 #define DEFAULT_INIT_PRIORITY 65535
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
134 #ifdef LDD_SUFFIX
135 #define SCAN_LIBRARIES
136 #endif
138 #ifndef SHLIB_SUFFIX
139 #define SHLIB_SUFFIX ".so"
140 #endif
142 #ifdef USE_COLLECT2
143 int do_collecting = 1;
144 #else
145 int do_collecting = 0;
146 #endif
148 /* Cook up an always defined indication of whether we proceed the
149 "EXPORT_LIST" way. */
151 #ifdef COLLECT_EXPORT_LIST
152 #define DO_COLLECT_EXPORT_LIST 1
153 #else
154 #define DO_COLLECT_EXPORT_LIST 0
155 #endif
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;
161 /* Linked lists of constructor and destructor names. */
163 struct id
165 struct id *next;
166 int sequence;
167 char name[1];
170 struct head
172 struct id *first;
173 struct id *last;
174 int number;
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
187 enum lto_mode_d {
188 LTO_MODE_NONE, /* Not doing LTO. */
189 LTO_MODE_LTO, /* Normal LTO. */
190 LTO_MODE_WHOPR /* WHOPR. */
193 /* Current LTO mode. */
194 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
196 bool debug; /* true if -debug */
197 bool helpflag; /* true if --help */
199 static int shared_obj; /* true if -shared */
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 */
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 */
225 static bool at_file_supplied; /* Whether to use @file arguments */
226 static char *response_file; /* Name of any current response file */
228 struct obstack temporary_obstack;
229 char * temporary_firstobj;
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
239 /* Structure to hold all the directories in which to search for files to
240 execute. */
242 struct prefix_list
244 const char *prefix; /* String to prepend to the path. */
245 struct prefix_list *next; /* Next in linked list. */
248 struct path_prefix
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) */
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
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(). */
269 struct lto_object
271 const char *name; /* Name of object file. */
272 struct lto_object *next; /* Next in linked list. */
275 struct lto_object_list
277 struct lto_object *first; /* First list element. */
278 struct lto_object *last; /* Last list element. */
281 static struct lto_object_list lto_objects;
283 /* Special kinds of symbols that a name may denote. */
285 typedef enum {
286 SYM_REGULAR = 0, /* nothing special */
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;
295 static symkind is_ctor_dtor (const char *);
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 **);
337 /* Enumerations describing which pass this is for scanning the
338 program file ... */
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;
348 /* ... and which kinds of symbols are to be considered. */
350 enum scanfilter_masks {
351 SCAN_NOTHING = 0,
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
361 /* This type is used for parameters and variables which hold
362 combinations of the flags in enum scanfilter_masks. */
363 typedef int scanfilter;
365 /* Scan the name list of the loaded program for the symbols g++ uses for
366 static constructors and destructors.
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.
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__. */
379 static void scan_prog_file (const char *, scanpass, scanfilter);
382 /* Delete tempfiles and exit function. */
384 void
385 collect_exit (int status)
387 if (c_file != 0 && c_file[0])
388 maybe_unlink (c_file);
390 if (o_file != 0 && o_file[0])
391 maybe_unlink (o_file);
393 #ifdef COLLECT_EXPORT_LIST
394 if (export_file != 0 && export_file[0])
395 maybe_unlink (export_file);
396 #endif
398 if (lto_o_files)
399 maybe_unlink_list (lto_o_files);
401 if (ldout != 0 && ldout[0])
403 dump_file (ldout, stdout);
404 maybe_unlink (ldout);
407 if (lderrout != 0 && lderrout[0])
409 dump_file (lderrout, stderr);
410 maybe_unlink (lderrout);
413 if (status != 0 && output_file != 0 && output_file[0])
414 maybe_unlink (output_file);
416 if (response_file)
417 maybe_unlink (response_file);
419 exit (status);
423 /* Notify user of a non-error. */
424 void
425 notice (const char *cmsgid, ...)
427 va_list ap;
429 va_start (ap, cmsgid);
430 vfprintf (stderr, _(cmsgid), ap);
431 va_end (ap);
434 /* Notify user of a non-error, without translating the format string. */
435 void
436 notice_translated (const char *cmsgid, ...)
438 va_list ap;
440 va_start (ap, cmsgid);
441 vfprintf (stderr, cmsgid, ap);
442 va_end (ap);
445 /* Die when sys call fails. */
447 void
448 fatal_perror (const char * cmsgid, ...)
450 int e = errno;
451 va_list ap;
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);
459 collect_exit (FATAL_EXIT_CODE);
462 /* Just die. */
464 void
465 fatal (const char * cmsgid, ...)
467 va_list ap;
469 va_start (ap, cmsgid);
470 fprintf (stderr, "collect2: ");
471 vfprintf (stderr, _(cmsgid), ap);
472 fprintf (stderr, "\n");
473 va_end (ap);
475 collect_exit (FATAL_EXIT_CODE);
478 /* Write error message. */
480 void
481 error (const char * gmsgid, ...)
483 va_list ap;
485 va_start (ap, gmsgid);
486 fprintf (stderr, "collect2: ");
487 vfprintf (stderr, _(gmsgid), ap);
488 fprintf (stderr, "\n");
489 va_end(ap);
492 /* In case obstack is linked in, and abort is defined to fancy_abort,
493 provide a default entry. */
495 void
496 fancy_abort (const char *file, int line, const char *func)
498 fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
501 static void
502 handler (int signo)
504 if (c_file != 0 && c_file[0])
505 maybe_unlink (c_file);
507 if (o_file != 0 && o_file[0])
508 maybe_unlink (o_file);
510 if (ldout != 0 && ldout[0])
511 maybe_unlink (ldout);
513 if (lderrout != 0 && lderrout[0])
514 maybe_unlink (lderrout);
516 #ifdef COLLECT_EXPORT_LIST
517 if (export_file != 0 && export_file[0])
518 maybe_unlink (export_file);
519 #endif
521 if (lto_o_files)
522 maybe_unlink_list (lto_o_files);
524 if (response_file)
525 maybe_unlink (response_file);
527 signal (signo, SIG_DFL);
528 raise (signo);
533 file_exists (const char *name)
535 return access (name, R_OK) == 0;
538 /* Parse a reasonable subset of shell quoting syntax. */
540 static char *
541 extract_string (const char **pp)
543 const char *p = *pp;
544 int backquote = 0;
545 int inside = 0;
547 for (;;)
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);
565 obstack_1grow (&temporary_obstack, '\0');
566 *pp = p;
567 return XOBFINISH (&temporary_obstack, char *);
570 void
571 dump_file (const char *name, FILE *to)
573 FILE *stream = fopen (name, "r");
575 if (stream == 0)
576 return;
577 while (1)
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)
585 const char *word, *p;
586 char *result;
587 obstack_1grow (&temporary_obstack, '\0');
588 word = XOBFINISH (&temporary_obstack, const char *);
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);
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
605 if (result)
607 int diff;
608 fputs (result, to);
610 diff = strlen (word) - strlen (result);
611 while (diff > 0 && c == ' ')
612 --diff, putc (' ', to);
613 if (diff < 0 && c == ' ')
615 while (diff < 0 && c == ' ')
616 ++diff, c = getc (stream);
617 if (!ISSPACE (c))
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);
626 free (result);
628 else
629 fputs (word, to);
631 fflush (to);
632 obstack_free (&temporary_obstack, temporary_firstobj);
634 if (c == EOF)
635 break;
636 putc (c, to);
638 fclose (stream);
641 /* Return the kind of symbol denoted by name S. */
643 static symkind
644 is_ctor_dtor (const char *s)
646 struct names { const char *const name; const int len; symkind ret;
647 const int two_underscores; };
649 const struct names *p;
650 int ch;
651 const char *orig_s = s;
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 }
671 while ((ch = *s) == '_')
672 ++s;
674 if (s == orig_s)
675 return SYM_REGULAR;
677 for (p = &special[0]; p->len > 0; p++)
679 if (ch == p->name[0]
680 && (!p->two_underscores || ((s - orig_s) >= 2))
681 && strncmp(s, p->name, p->len) == 0)
683 return p->ret;
686 return SYM_REGULAR;
689 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
690 and one from the PATH variable. */
692 static struct path_prefix cpath, path;
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. */
698 static const char *const target_machine = TARGET_MACHINE;
699 #endif
701 /* Search for NAME using prefix list PPREFIX. We only look for executable
702 files.
704 Return 0 if not found, otherwise return its name, allocated with malloc. */
706 static char *
707 find_a_file (struct path_prefix *pprefix, const char *name)
709 char *temp;
710 struct prefix_list *pl;
711 int len = pprefix->max_len + strlen (name) + 1;
713 if (debug)
714 fprintf (stderr, "Looking for '%s'\n", name);
716 #ifdef HOST_EXECUTABLE_SUFFIX
717 len += strlen (HOST_EXECUTABLE_SUFFIX);
718 #endif
720 temp = XNEWVEC (char, len);
722 /* Determine the filename to execute (special case for absolute paths). */
724 if (IS_ABSOLUTE_PATH (name))
726 if (access (name, X_OK) == 0)
728 strcpy (temp, name);
730 if (debug)
731 fprintf (stderr, " - found: absolute path\n");
733 return temp;
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);
742 if (access (temp, X_OK) == 0)
743 return temp;
744 #endif
746 if (debug)
747 fprintf (stderr, " - failed to locate using absolute path\n");
749 else
750 for (pl = pprefix->plist; pl; pl = pl->next)
752 struct stat st;
754 strcpy (temp, pl->prefix);
755 strcat (temp, name);
757 if (stat (temp, &st) >= 0
758 && ! S_ISDIR (st.st_mode)
759 && access (temp, X_OK) == 0)
760 return temp;
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);
767 if (stat (temp, &st) >= 0
768 && ! S_ISDIR (st.st_mode)
769 && access (temp, X_OK) == 0)
770 return temp;
771 #endif
774 if (debug && pprefix->plist == NULL)
775 fprintf (stderr, " - failed: no entries in prefix list\n");
777 free (temp);
778 return 0;
781 /* Add an entry for PREFIX to prefix list PPREFIX. */
783 static void
784 add_prefix (struct path_prefix *pprefix, const char *prefix)
786 struct prefix_list *pl, **prev;
787 int len;
789 if (pprefix->plist)
791 for (pl = pprefix->plist; pl->next; pl = pl->next)
793 prev = &pl->next;
795 else
796 prev = &pprefix->plist;
798 /* Keep track of the longest prefix. */
800 len = strlen (prefix);
801 if (len > pprefix->max_len)
802 pprefix->max_len = len;
804 pl = XNEW (struct prefix_list);
805 pl->prefix = xstrdup (prefix);
807 if (*prev)
808 pl->next = *prev;
809 else
810 pl->next = (struct prefix_list *) 0;
811 *prev = pl;
814 /* Take the value of the environment variable ENV, break it into a path, and
815 add of the entries to PPREFIX. */
817 static void
818 prefix_from_env (const char *env, struct path_prefix *pprefix)
820 const char *p;
821 p = getenv (env);
823 if (p)
824 prefix_from_string (p, pprefix);
827 static void
828 prefix_from_string (const char *p, struct path_prefix *pprefix)
830 const char *startp, *endp;
831 char *nstore = XNEWVEC (char, strlen (p) + 3);
833 if (debug)
834 fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR);
836 startp = endp = p;
837 while (1)
839 if (*endp == PATH_SEPARATOR || *endp == 0)
841 strncpy (nstore, startp, endp-startp);
842 if (endp == startp)
844 strcpy (nstore, "./");
846 else if (! IS_DIR_SEPARATOR (endp[-1]))
848 nstore[endp-startp] = DIR_SEPARATOR;
849 nstore[endp-startp+1] = 0;
851 else
852 nstore[endp-startp] = 0;
854 if (debug)
855 fprintf (stderr, " - add prefix: %s\n", nstore);
857 add_prefix (pprefix, nstore);
858 if (*endp == 0)
859 break;
860 endp = startp = endp + 1;
862 else
863 endp++;
865 free (nstore);
868 #ifdef OBJECT_FORMAT_NONE
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. */
874 static void
875 add_lto_object (struct lto_object_list *list, const char *name)
877 struct lto_object *n = XNEW (struct lto_object);
878 n->name = name;
879 n->next = NULL;
881 if (list->last)
882 list->last->next = n;
883 else
884 list->first = n;
886 list->last = n;
888 #endif /* OBJECT_FORMAT_NONE */
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.
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. */
918 static void
919 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
920 const char **object, bool force)
922 const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
924 int num_lto_c_args = 1; /* Allow space for the terminating NULL. */
926 while (object_file < object)
928 /* If file contains LTO info, add it to the list of LTO objects. */
929 scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
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++;
937 if (lto_objects.first)
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;
952 if (!lto_wrapper)
953 fatal ("COLLECT_LTO_WRAPPER must be set");
955 num_lto_c_args++;
957 /* There is at least one object file containing LTO info,
958 so we need to run the LTO back end and relink.
960 To do so we build updated ld arguments with first
961 LTO object replaced by all partitions and other LTO
962 objects removed. */
964 lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
965 lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
967 *lto_c_ptr++ = lto_wrapper;
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;
973 *lto_c_ptr = NULL;
975 /* Run the LTO back end. */
976 pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
978 int c;
979 FILE *stream;
980 size_t i;
981 char *start, *end;
983 stream = pex_read_output (pex, 0);
984 gcc_assert (stream);
986 num_files = 0;
987 while ((c = getc (stream)) != EOF)
989 obstack_1grow (&temporary_obstack, c);
990 if (c == '\n')
991 ++num_files;
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)
999 end = start;
1000 while (*end != '\n')
1001 ++end;
1002 *end = '\0';
1004 lto_o_files[i] = xstrdup (start);
1006 start = end + 1;
1009 obstack_free (&temporary_obstack, temporary_firstobj);
1011 do_wait (prog, pex);
1012 pex = NULL;
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++)
1018 out_lto_ld_argv = XCNEWVEC(char *, num_files + lto_ld_argv_size + 1);
1019 out_lto_ld_argv_size = 0;
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. */
1025 /* Copy all arguments until we find first LTO file. */
1026 p = lto_ld_argv;
1027 while (*p != NULL)
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++;
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++;
1042 /* ... and copy the rest. */
1043 while (*p != NULL)
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++;
1052 out_lto_ld_argv[out_lto_ld_argv_size++] = 0;
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);
1059 maybe_unlink_list (lto_o_files);
1061 else if (force)
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);
1069 /* Main program. */
1072 main (int argc, char **argv)
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";
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. */
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 */
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;
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;
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;
1149 old_argv = argv;
1150 expandargv (&argc, &argv);
1151 if (argv != old_argv)
1152 at_file_supplied = 1;
1154 num_c_args = argc + 9;
1156 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
1158 /* Suppress demangling by the real linker, which may be broken. */
1159 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1161 #if defined (COLLECT2_HOST_INITIALIZATION)
1162 /* Perform system dependent initialization, if necessary. */
1163 COLLECT2_HOST_INITIALIZATION;
1164 #endif
1166 #ifdef SIGCHLD
1167 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1168 receive the signal. A different setting is inheritable */
1169 signal (SIGCHLD, SIG_DFL);
1170 #endif
1172 /* Unlock the stdio streams. */
1173 unlock_std_streams ();
1175 gcc_init_libintl ();
1177 /* Do not invoke xcalloc before this point, since locale needs to be
1178 set first, in case a diagnostic is issued. */
1180 ld1_argv = XCNEWVEC (char *, argc + 4);
1181 ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
1182 ld2_argv = XCNEWVEC (char *, argc + 11);
1183 ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
1184 object_lst = XCNEWVEC (char *, argc);
1185 object = CONST_CAST2 (const char **, char **, object_lst);
1187 #ifdef DEBUG
1188 debug = 1;
1189 #endif
1191 /* Parse command line early for instances of -debug. This allows
1192 the debug flag to be set before functions like find_a_file()
1193 are called. We also look for the -flto or -flto-partition=none flag to know
1194 what LTO mode we are in. */
1196 int i;
1197 bool no_partition = false;
1199 for (i = 1; argv[i] != NULL; i ++)
1201 if (! strcmp (argv[i], "-debug"))
1202 debug = true;
1203 else if (! strcmp (argv[i], "-flto-partition=none"))
1204 no_partition = true;
1205 else if ((! strncmp (argv[i], "-flto=", 6)
1206 || ! strcmp (argv[i], "-flto")) && ! use_plugin)
1207 lto_mode = LTO_MODE_WHOPR;
1208 else if (! strcmp (argv[i], "-plugin"))
1210 use_plugin = true;
1211 lto_mode = LTO_MODE_NONE;
1213 #ifdef COLLECT_EXPORT_LIST
1214 /* since -brtl, -bexport, -b64 are not position dependent
1215 also check for them here */
1216 if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1218 arg = argv[i];
1219 /* We want to disable automatic exports on AIX when user
1220 explicitly puts an export list in command line */
1221 if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1222 export_flag = 1;
1223 else if (arg[2] == '6' && arg[3] == '4')
1224 aix64_flag = 1;
1225 else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1226 aixrtl_flag = 1;
1228 #endif
1230 vflag = debug;
1231 if (no_partition)
1232 lto_mode = LTO_MODE_LTO;
1235 #ifndef DEFAULT_A_OUT_NAME
1236 output_file = "a.out";
1237 #else
1238 output_file = DEFAULT_A_OUT_NAME;
1239 #endif
1241 obstack_begin (&temporary_obstack, 0);
1242 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1244 #ifndef HAVE_LD_DEMANGLE
1245 current_demangling_style = auto_demangling;
1246 #endif
1247 p = getenv ("COLLECT_GCC_OPTIONS");
1248 while (p && *p)
1250 const char *q = extract_string (&p);
1251 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1252 num_c_args++;
1254 obstack_free (&temporary_obstack, temporary_firstobj);
1256 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1257 -fno-exceptions -w -fno-whole-program */
1258 num_c_args += 6;
1260 c_argv = XCNEWVEC (char *, num_c_args);
1261 c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1263 if (argc < 2)
1264 fatal ("no arguments");
1266 #ifdef SIGQUIT
1267 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1268 signal (SIGQUIT, handler);
1269 #endif
1270 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1271 signal (SIGINT, handler);
1272 #ifdef SIGALRM
1273 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1274 signal (SIGALRM, handler);
1275 #endif
1276 #ifdef SIGHUP
1277 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1278 signal (SIGHUP, handler);
1279 #endif
1280 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1281 signal (SIGSEGV, handler);
1282 #ifdef SIGBUS
1283 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1284 signal (SIGBUS, handler);
1285 #endif
1287 /* Extract COMPILER_PATH and PATH into our prefix list. */
1288 prefix_from_env ("COMPILER_PATH", &cpath);
1289 prefix_from_env ("PATH", &path);
1291 /* Try to discover a valid linker/nm/strip to use. */
1293 /* Maybe we know the right file to use (if not cross). */
1294 ld_file_name = 0;
1295 #ifdef DEFAULT_LINKER
1296 if (access (DEFAULT_LINKER, X_OK) == 0)
1297 ld_file_name = DEFAULT_LINKER;
1298 if (ld_file_name == 0)
1299 #endif
1300 #ifdef REAL_LD_FILE_NAME
1301 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1302 if (ld_file_name == 0)
1303 #endif
1304 /* Search the (target-specific) compiler dirs for ld'. */
1305 ld_file_name = find_a_file (&cpath, real_ld_suffix);
1306 /* Likewise for `collect-ld'. */
1307 if (ld_file_name == 0)
1308 ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1309 /* Search the compiler directories for `ld'. We have protection against
1310 recursive calls in find_a_file. */
1311 if (ld_file_name == 0)
1312 ld_file_name = find_a_file (&cpath,
1313 use_plugin
1314 ? plugin_ld_suffix
1315 : ld_suffix);
1316 /* Search the ordinary system bin directories
1317 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1318 if (ld_file_name == 0)
1319 ld_file_name = find_a_file (&path,
1320 use_plugin
1321 ? full_plugin_ld_suffix
1322 : full_ld_suffix);
1324 #ifdef REAL_NM_FILE_NAME
1325 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1326 if (nm_file_name == 0)
1327 #endif
1328 nm_file_name = find_a_file (&cpath, gnm_suffix);
1329 if (nm_file_name == 0)
1330 nm_file_name = find_a_file (&path, full_gnm_suffix);
1331 if (nm_file_name == 0)
1332 nm_file_name = find_a_file (&cpath, nm_suffix);
1333 if (nm_file_name == 0)
1334 nm_file_name = find_a_file (&path, full_nm_suffix);
1336 #ifdef LDD_SUFFIX
1337 ldd_file_name = find_a_file (&cpath, ldd_suffix);
1338 if (ldd_file_name == 0)
1339 ldd_file_name = find_a_file (&path, full_ldd_suffix);
1340 #endif
1342 #ifdef REAL_STRIP_FILE_NAME
1343 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1344 if (strip_file_name == 0)
1345 #endif
1346 strip_file_name = find_a_file (&cpath, gstrip_suffix);
1347 if (strip_file_name == 0)
1348 strip_file_name = find_a_file (&path, full_gstrip_suffix);
1349 if (strip_file_name == 0)
1350 strip_file_name = find_a_file (&cpath, strip_suffix);
1351 if (strip_file_name == 0)
1352 strip_file_name = find_a_file (&path, full_strip_suffix);
1354 /* Determine the full path name of the C compiler to use. */
1355 c_file_name = getenv ("COLLECT_GCC");
1356 if (c_file_name == 0)
1358 #ifdef CROSS_DIRECTORY_STRUCTURE
1359 c_file_name = concat (target_machine, "-gcc", NULL);
1360 #else
1361 c_file_name = "gcc";
1362 #endif
1365 p = find_a_file (&cpath, c_file_name);
1367 /* Here it should be safe to use the system search path since we should have
1368 already qualified the name of the compiler when it is needed. */
1369 if (p == 0)
1370 p = find_a_file (&path, c_file_name);
1372 if (p)
1373 c_file_name = p;
1375 *ld1++ = *ld2++ = ld_file_name;
1377 /* Make temp file names. */
1378 c_file = make_temp_file (".c");
1379 o_file = make_temp_file (".o");
1380 #ifdef COLLECT_EXPORT_LIST
1381 export_file = make_temp_file (".x");
1382 #endif
1383 ldout = make_temp_file (".ld");
1384 lderrout = make_temp_file (".le");
1385 *c_ptr++ = c_file_name;
1386 *c_ptr++ = "-x";
1387 *c_ptr++ = "c";
1388 *c_ptr++ = "-c";
1389 *c_ptr++ = "-o";
1390 *c_ptr++ = o_file;
1392 #ifdef COLLECT_EXPORT_LIST
1393 /* Generate a list of directories from LIBPATH. */
1394 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1395 /* Add to this list also two standard directories where
1396 AIX loader always searches for libraries. */
1397 add_prefix (&libpath_lib_dirs, "/lib");
1398 add_prefix (&libpath_lib_dirs, "/usr/lib");
1399 #endif
1401 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1403 AIX support needs to know if -shared has been specified before
1404 parsing commandline arguments. */
1406 p = getenv ("COLLECT_GCC_OPTIONS");
1407 while (p && *p)
1409 const char *q = extract_string (&p);
1410 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1411 *c_ptr++ = xstrdup (q);
1412 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1413 *c_ptr++ = xstrdup (q);
1414 if (strcmp (q, "-shared") == 0)
1415 shared_obj = 1;
1416 if (*q == '-' && q[1] == 'B')
1418 *c_ptr++ = xstrdup (q);
1419 if (q[2] == 0)
1421 q = extract_string (&p);
1422 *c_ptr++ = xstrdup (q);
1426 obstack_free (&temporary_obstack, temporary_firstobj);
1427 *c_ptr++ = "-fno-profile-arcs";
1428 *c_ptr++ = "-fno-test-coverage";
1429 *c_ptr++ = "-fno-branch-probabilities";
1430 *c_ptr++ = "-fno-exceptions";
1431 *c_ptr++ = "-w";
1432 *c_ptr++ = "-fno-whole-program";
1434 /* !!! When GCC calls collect2,
1435 it does not know whether it is calling collect2 or ld.
1436 So collect2 cannot meaningfully understand any options
1437 except those ld understands.
1438 If you propose to make GCC pass some other option,
1439 just imagine what will happen if ld is really ld!!! */
1441 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1442 /* After the first file, put in the c++ rt0. */
1444 first_file = 1;
1445 #ifdef HAVE_LD_DEMANGLE
1446 if (!demangle_flag && !no_demangle)
1447 demangle_flag = "--demangle";
1448 if (demangle_flag)
1449 *ld1++ = *ld2++ = demangle_flag;
1450 #endif
1451 while ((arg = *++argv) != (char *) 0)
1453 *ld1++ = *ld2++ = arg;
1455 if (arg[0] == '-')
1457 switch (arg[1])
1459 case 'd':
1460 if (!strcmp (arg, "-debug"))
1462 /* Already parsed. */
1463 ld1--;
1464 ld2--;
1466 if (!strcmp (arg, "-dynamic-linker") && argv[1])
1468 ++argv;
1469 *ld1++ = *ld2++ = *argv;
1471 break;
1473 case 'f':
1474 if (strncmp (arg, "-flto", 5) == 0)
1476 #ifdef ENABLE_LTO
1477 /* Do not pass LTO flag to the linker. */
1478 ld1--;
1479 ld2--;
1480 #else
1481 error ("LTO support has not been enabled in this "
1482 "configuration");
1483 #endif
1485 break;
1487 case 'l':
1488 if (first_file)
1490 /* place o_file BEFORE this argument! */
1491 first_file = 0;
1492 ld2--;
1493 *ld2++ = o_file;
1494 *ld2++ = arg;
1496 #ifdef COLLECT_EXPORT_LIST
1498 /* Resolving full library name. */
1499 const char *s = resolve_lib_name (arg+2);
1501 /* Saving a full library name. */
1502 add_to_list (&libs, s);
1504 #endif
1505 break;
1507 #ifdef COLLECT_EXPORT_LIST
1508 /* Saving directories where to search for libraries. */
1509 case 'L':
1510 add_prefix (&cmdline_lib_dirs, arg+2);
1511 break;
1512 #else
1513 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1514 case 'L':
1515 if (is_in_args (arg,
1516 CONST_CAST2 (const char **, char **, ld1_argv),
1517 ld1 - 1))
1518 --ld1;
1519 break;
1520 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1521 #endif
1523 case 'o':
1524 if (arg[2] == '\0')
1525 output_file = *ld1++ = *ld2++ = *++argv;
1526 else
1527 output_file = &arg[2];
1528 break;
1530 case 'r':
1531 if (arg[2] == '\0')
1532 rflag = 1;
1533 break;
1535 case 's':
1536 if (arg[2] == '\0' && do_collecting)
1538 /* We must strip after the nm run, otherwise C++ linking
1539 will not work. Thus we strip in the second ld run, or
1540 else with strip if there is no second ld run. */
1541 strip_flag = 1;
1542 ld1--;
1544 break;
1546 case 'v':
1547 if (arg[2] == '\0')
1548 vflag = true;
1549 break;
1551 case '-':
1552 if (strcmp (arg, "--no-demangle") == 0)
1554 demangle_flag = arg;
1555 no_demangle = 1;
1556 ld1--;
1557 ld2--;
1559 else if (strncmp (arg, "--demangle", 10) == 0)
1561 demangle_flag = arg;
1562 no_demangle = 0;
1563 #ifndef HAVE_LD_DEMANGLE
1564 if (arg[10] == '=')
1566 enum demangling_styles style
1567 = cplus_demangle_name_to_style (arg+11);
1568 if (style == unknown_demangling)
1569 error ("unknown demangling style '%s'", arg+11);
1570 else
1571 current_demangling_style = style;
1573 #endif
1574 ld1--;
1575 ld2--;
1577 else if (strncmp (arg, "--sysroot=", 10) == 0)
1578 target_system_root = arg + 10;
1579 else if (strcmp (arg, "--version") == 0)
1580 vflag = true;
1581 else if (strcmp (arg, "--help") == 0)
1582 helpflag = true;
1583 break;
1586 else if ((p = strrchr (arg, '.')) != (char *) 0
1587 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1588 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1589 || strcmp (p, ".obj") == 0))
1591 if (first_file)
1593 first_file = 0;
1594 if (p[1] == 'o')
1595 *ld2++ = o_file;
1596 else
1598 /* place o_file BEFORE this argument! */
1599 ld2--;
1600 *ld2++ = o_file;
1601 *ld2++ = arg;
1604 if (p[1] == 'o' || p[1] == 'l')
1605 *object++ = arg;
1606 #ifdef COLLECT_EXPORT_LIST
1607 /* libraries can be specified directly, i.e. without -l flag. */
1608 else
1610 /* Saving a full library name. */
1611 add_to_list (&libs, arg);
1613 #endif
1617 #ifdef COLLECT_EXPORT_LIST
1618 /* This is added only for debugging purposes. */
1619 if (debug)
1621 fprintf (stderr, "List of libraries:\n");
1622 dump_list (stderr, "\t", libs.first);
1625 /* The AIX linker will discard static constructors in object files if
1626 nothing else in the file is referenced, so look at them first. Unless
1627 we are building a shared object, ignore the eh frame tables, as we
1628 would otherwise reference them all, hence drag all the corresponding
1629 objects even if nothing else is referenced. */
1631 const char **export_object_lst
1632 = CONST_CAST2 (const char **, char **, object_lst);
1634 struct id *list = libs.first;
1636 /* Compute the filter to use from the current one, do scan, then adjust
1637 the "current" filter to remove what we just included here. This will
1638 control whether we need a first pass link later on or not, and what
1639 will remain to be scanned there. */
1641 scanfilter this_filter = ld1_filter;
1642 #if HAVE_AS_REF
1643 if (!shared_obj)
1644 this_filter &= ~SCAN_DWEH;
1645 #endif
1647 while (export_object_lst < object)
1648 scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1650 for (; list; list = list->next)
1651 scan_prog_file (list->name, PASS_FIRST, this_filter);
1653 ld1_filter = ld1_filter & ~this_filter;
1656 if (exports.first)
1658 char *buf = concat ("-bE:", export_file, NULL);
1660 *ld1++ = buf;
1661 *ld2++ = buf;
1663 exportf = fopen (export_file, "w");
1664 if (exportf == (FILE *) 0)
1665 fatal_perror ("fopen %s", export_file);
1666 write_aix_file (exportf, exports.first);
1667 if (fclose (exportf))
1668 fatal_perror ("fclose %s", export_file);
1670 #endif
1672 *c_ptr++ = c_file;
1673 *c_ptr = *ld1 = *object = (char *) 0;
1675 if (vflag)
1677 notice ("collect2 version %s", version_string);
1678 #ifdef TARGET_VERSION
1679 TARGET_VERSION;
1680 #endif
1681 fprintf (stderr, "\n");
1684 if (helpflag)
1686 printf ("Usage: collect2 [options]\n");
1687 printf (" Wrap linker and generate constructor code if needed.\n");
1688 printf (" Options:\n");
1689 printf (" -debug Enable debug output\n");
1690 printf (" --help Display this information\n");
1691 printf (" -v, --version Display this program's version number\n");
1692 printf ("\n");
1693 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1694 printf ("Report bugs: %s\n", bug_report_url);
1695 printf ("\n");
1698 if (debug)
1700 const char *ptr;
1701 fprintf (stderr, "ld_file_name = %s\n",
1702 (ld_file_name ? ld_file_name : "not found"));
1703 fprintf (stderr, "c_file_name = %s\n",
1704 (c_file_name ? c_file_name : "not found"));
1705 fprintf (stderr, "nm_file_name = %s\n",
1706 (nm_file_name ? nm_file_name : "not found"));
1707 #ifdef LDD_SUFFIX
1708 fprintf (stderr, "ldd_file_name = %s\n",
1709 (ldd_file_name ? ldd_file_name : "not found"));
1710 #endif
1711 fprintf (stderr, "strip_file_name = %s\n",
1712 (strip_file_name ? strip_file_name : "not found"));
1713 fprintf (stderr, "c_file = %s\n",
1714 (c_file ? c_file : "not found"));
1715 fprintf (stderr, "o_file = %s\n",
1716 (o_file ? o_file : "not found"));
1718 ptr = getenv ("COLLECT_GCC_OPTIONS");
1719 if (ptr)
1720 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1722 ptr = getenv ("COLLECT_GCC");
1723 if (ptr)
1724 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1726 ptr = getenv ("COMPILER_PATH");
1727 if (ptr)
1728 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1730 ptr = getenv (LIBRARY_PATH_ENV);
1731 if (ptr)
1732 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1734 fprintf (stderr, "\n");
1737 /* Load the program, searching all libraries and attempting to provide
1738 undefined symbols from repository information.
1740 If -r or they will be run via some other method, do not build the
1741 constructor or destructor list, just return now. */
1743 bool early_exit
1744 = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1746 /* Perform the first pass link now, if we're about to exit or if we need
1747 to scan for things we haven't collected yet before pursuing further.
1749 On AIX, the latter typically includes nothing for shared objects or
1750 frame tables for an executable, out of what the required early scan on
1751 objects and libraries has performed above. In the !shared_obj case, we
1752 expect the relevant tables to be dragged together with their associated
1753 functions from precise cross reference insertions by the compiler. */
1755 if (early_exit || ld1_filter != SCAN_NOTHING)
1756 do_tlink (ld1_argv, object_lst);
1758 if (early_exit)
1760 #ifdef COLLECT_EXPORT_LIST
1761 /* Make sure we delete the export file we may have created. */
1762 if (export_file != 0 && export_file[0])
1763 maybe_unlink (export_file);
1764 #endif
1765 if (lto_mode != LTO_MODE_NONE)
1766 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1768 maybe_unlink (c_file);
1769 maybe_unlink (o_file);
1770 return 0;
1774 /* Unless we have done it all already, examine the namelist and search for
1775 static constructors and destructors to call. Write the constructor and
1776 destructor tables to a .s file and reload. */
1778 if (ld1_filter != SCAN_NOTHING)
1779 scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1781 #ifdef SCAN_LIBRARIES
1782 scan_libraries (output_file);
1783 #endif
1785 if (debug)
1787 notice_translated (ngettext ("%d constructor found\n",
1788 "%d constructors found\n",
1789 constructors.number),
1790 constructors.number);
1791 notice_translated (ngettext ("%d destructor found\n",
1792 "%d destructors found\n",
1793 destructors.number),
1794 destructors.number);
1795 notice_translated (ngettext("%d frame table found\n",
1796 "%d frame tables found\n",
1797 frame_tables.number),
1798 frame_tables.number);
1801 /* If the scan exposed nothing of special interest, there's no need to
1802 generate the glue code and relink so return now. */
1804 if (constructors.number == 0 && destructors.number == 0
1805 && frame_tables.number == 0
1806 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1807 /* If we will be running these functions ourselves, we want to emit
1808 stubs into the shared library so that we do not have to relink
1809 dependent programs when we add static objects. */
1810 && ! shared_obj
1811 #endif
1814 /* Do tlink without additional code generation now if we didn't
1815 do it earlier for scanning purposes. */
1816 if (ld1_filter == SCAN_NOTHING)
1817 do_tlink (ld1_argv, object_lst);
1819 if (lto_mode)
1820 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1822 /* Strip now if it was requested on the command line. */
1823 if (strip_flag)
1825 char **real_strip_argv = XCNEWVEC (char *, 3);
1826 const char ** strip_argv = CONST_CAST2 (const char **, char **,
1827 real_strip_argv);
1829 strip_argv[0] = strip_file_name;
1830 strip_argv[1] = output_file;
1831 strip_argv[2] = (char *) 0;
1832 fork_execute ("strip", real_strip_argv);
1835 #ifdef COLLECT_EXPORT_LIST
1836 maybe_unlink (export_file);
1837 #endif
1838 maybe_unlink (c_file);
1839 maybe_unlink (o_file);
1840 return 0;
1843 /* Sort ctor and dtor lists by priority. */
1844 sort_ids (&constructors);
1845 sort_ids (&destructors);
1847 maybe_unlink(output_file);
1848 outf = fopen (c_file, "w");
1849 if (outf == (FILE *) 0)
1850 fatal_perror ("fopen %s", c_file);
1852 write_c_file (outf, c_file);
1854 if (fclose (outf))
1855 fatal_perror ("fclose %s", c_file);
1857 /* Tell the linker that we have initializer and finalizer functions. */
1858 #ifdef LD_INIT_SWITCH
1859 #ifdef COLLECT_EXPORT_LIST
1860 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1861 #else
1862 *ld2++ = LD_INIT_SWITCH;
1863 *ld2++ = initname;
1864 *ld2++ = LD_FINI_SWITCH;
1865 *ld2++ = fininame;
1866 #endif
1867 #endif
1869 #ifdef COLLECT_EXPORT_LIST
1870 if (shared_obj)
1872 /* If we did not add export flag to link arguments before, add it to
1873 second link phase now. No new exports should have been added. */
1874 if (! exports.first)
1875 *ld2++ = concat ("-bE:", export_file, NULL);
1877 #ifndef LD_INIT_SWITCH
1878 add_to_list (&exports, initname);
1879 add_to_list (&exports, fininame);
1880 add_to_list (&exports, "_GLOBAL__DI");
1881 add_to_list (&exports, "_GLOBAL__DD");
1882 #endif
1883 exportf = fopen (export_file, "w");
1884 if (exportf == (FILE *) 0)
1885 fatal_perror ("fopen %s", export_file);
1886 write_aix_file (exportf, exports.first);
1887 if (fclose (exportf))
1888 fatal_perror ("fclose %s", export_file);
1890 #endif
1892 /* End of arguments to second link phase. */
1893 *ld2 = (char*) 0;
1895 if (debug)
1897 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1898 output_file, c_file);
1899 write_c_file (stderr, "stderr");
1900 fprintf (stderr, "========== end of c_file\n\n");
1901 #ifdef COLLECT_EXPORT_LIST
1902 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1903 write_aix_file (stderr, exports.first);
1904 fprintf (stderr, "========== end of export_file\n\n");
1905 #endif
1908 /* Assemble the constructor and destructor tables.
1909 Link the tables in with the rest of the program. */
1911 fork_execute ("gcc", c_argv);
1912 #ifdef COLLECT_EXPORT_LIST
1913 /* On AIX we must call tlink because of possible templates resolution. */
1914 do_tlink (ld2_argv, object_lst);
1916 if (lto_mode)
1917 maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1918 #else
1919 /* Otherwise, simply call ld because tlink is already done. */
1920 if (lto_mode)
1921 maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1922 else
1923 fork_execute ("ld", ld2_argv);
1925 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1926 constructors/destructors in shared libraries. */
1927 scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1928 #endif
1930 maybe_unlink (c_file);
1931 maybe_unlink (o_file);
1933 #ifdef COLLECT_EXPORT_LIST
1934 maybe_unlink (export_file);
1935 #endif
1937 return 0;
1941 /* Wait for a process to finish, and exit if a nonzero status is found. */
1944 collect_wait (const char *prog, struct pex_obj *pex)
1946 int status;
1948 if (!pex_get_status (pex, 1, &status))
1949 fatal_perror ("can't get program status");
1950 pex_free (pex);
1952 if (status)
1954 if (WIFSIGNALED (status))
1956 int sig = WTERMSIG (status);
1957 error ("%s terminated with signal %d [%s]%s",
1958 prog, sig, strsignal(sig),
1959 WCOREDUMP(status) ? ", core dumped" : "");
1960 collect_exit (FATAL_EXIT_CODE);
1963 if (WIFEXITED (status))
1964 return WEXITSTATUS (status);
1966 return 0;
1969 static void
1970 do_wait (const char *prog, struct pex_obj *pex)
1972 int ret = collect_wait (prog, pex);
1973 if (ret != 0)
1975 error ("%s returned %d exit status", prog, ret);
1976 collect_exit (ret);
1979 if (response_file)
1981 unlink (response_file);
1982 response_file = NULL;
1987 /* Execute a program, and wait for the reply. */
1989 struct pex_obj *
1990 collect_execute (const char *prog, char **argv, const char *outname,
1991 const char *errname, int flags)
1993 struct pex_obj *pex;
1994 const char *errmsg;
1995 int err;
1996 char *response_arg = NULL;
1997 char *response_argv[3] ATTRIBUTE_UNUSED;
1999 if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
2001 /* If using @file arguments, create a temporary file and put the
2002 contents of argv into it. Then change argv to an array corresponding
2003 to a single argument @FILE, where FILE is the temporary filename. */
2005 char **current_argv = argv + 1;
2006 char *argv0 = argv[0];
2007 int status;
2008 FILE *f;
2010 /* Note: we assume argv contains at least one element; this is
2011 checked above. */
2013 response_file = make_temp_file ("");
2015 f = fopen (response_file, "w");
2017 if (f == NULL)
2018 fatal ("could not open response file %s", response_file);
2020 status = writeargv (current_argv, f);
2022 if (status)
2023 fatal ("could not write to response file %s", response_file);
2025 status = fclose (f);
2027 if (EOF == status)
2028 fatal ("could not close response file %s", response_file);
2030 response_arg = concat ("@", response_file, NULL);
2031 response_argv[0] = argv0;
2032 response_argv[1] = response_arg;
2033 response_argv[2] = NULL;
2035 argv = response_argv;
2038 if (vflag || debug)
2040 char **p_argv;
2041 const char *str;
2043 if (argv[0])
2044 fprintf (stderr, "%s", argv[0]);
2045 else
2046 notice ("[cannot find %s]", prog);
2048 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
2049 fprintf (stderr, " %s", str);
2051 fprintf (stderr, "\n");
2054 fflush (stdout);
2055 fflush (stderr);
2057 /* If we cannot find a program we need, complain error. Do this here
2058 since we might not end up needing something that we could not find. */
2060 if (argv[0] == 0)
2061 fatal ("cannot find '%s'", prog);
2063 pex = pex_init (0, "collect2", NULL);
2064 if (pex == NULL)
2065 fatal_perror ("pex_init failed");
2067 errmsg = pex_run (pex, flags, argv[0], argv, outname,
2068 errname, &err);
2069 if (errmsg != NULL)
2071 if (err != 0)
2073 errno = err;
2074 fatal_perror (errmsg);
2076 else
2077 fatal (errmsg);
2080 if (response_arg)
2081 free (response_arg);
2083 return pex;
2086 static void
2087 fork_execute (const char *prog, char **argv)
2089 struct pex_obj *pex;
2091 pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2092 do_wait (prog, pex);
2095 /* Unlink a file unless we are debugging. */
2097 static void
2098 maybe_unlink (const char *file)
2100 if (!debug)
2101 unlink_if_ordinary (file);
2102 else
2103 notice ("[Leaving %s]\n", file);
2106 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
2108 static void
2109 maybe_unlink_list (char **file_list)
2111 char **tmp = file_list;
2113 while (*tmp)
2114 maybe_unlink (*(tmp++));
2118 static long sequence_number = 0;
2120 /* Add a name to a linked list. */
2122 static void
2123 add_to_list (struct head *head_ptr, const char *name)
2125 struct id *newid
2126 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2127 struct id *p;
2128 strcpy (newid->name, name);
2130 if (head_ptr->first)
2131 head_ptr->last->next = newid;
2132 else
2133 head_ptr->first = newid;
2135 /* Check for duplicate symbols. */
2136 for (p = head_ptr->first;
2137 strcmp (name, p->name) != 0;
2138 p = p->next)
2140 if (p != newid)
2142 head_ptr->last->next = 0;
2143 free (newid);
2144 return;
2147 newid->sequence = ++sequence_number;
2148 head_ptr->last = newid;
2149 head_ptr->number++;
2152 /* Grab the init priority number from an init function name that
2153 looks like "_GLOBAL_.I.12345.foo". */
2155 static int
2156 extract_init_priority (const char *name)
2158 int pos = 0, pri;
2160 while (name[pos] == '_')
2161 ++pos;
2162 pos += 10; /* strlen ("GLOBAL__X_") */
2164 /* Extract init_p number from ctor/dtor name. */
2165 pri = atoi (name + pos);
2166 return pri ? pri : DEFAULT_INIT_PRIORITY;
2169 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2170 ctors will be run from right to left, dtors from left to right. */
2172 static void
2173 sort_ids (struct head *head_ptr)
2175 /* id holds the current element to insert. id_next holds the next
2176 element to insert. id_ptr iterates through the already sorted elements
2177 looking for the place to insert id. */
2178 struct id *id, *id_next, **id_ptr;
2180 id = head_ptr->first;
2182 /* We don't have any sorted elements yet. */
2183 head_ptr->first = NULL;
2185 for (; id; id = id_next)
2187 id_next = id->next;
2188 id->sequence = extract_init_priority (id->name);
2190 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2191 if (*id_ptr == NULL
2192 /* If the sequence numbers are the same, we put the id from the
2193 file later on the command line later in the list. */
2194 || id->sequence > (*id_ptr)->sequence
2195 /* Hack: do lexical compare, too.
2196 || (id->sequence == (*id_ptr)->sequence
2197 && strcmp (id->name, (*id_ptr)->name) > 0) */
2200 id->next = *id_ptr;
2201 *id_ptr = id;
2202 break;
2206 /* Now set the sequence numbers properly so write_c_file works. */
2207 for (id = head_ptr->first; id; id = id->next)
2208 id->sequence = ++sequence_number;
2211 /* Write: `prefix', the names on list LIST, `suffix'. */
2213 static void
2214 write_list (FILE *stream, const char *prefix, struct id *list)
2216 while (list)
2218 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2219 list = list->next;
2223 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2224 /* Given a STRING, return nonzero if it occurs in the list in range
2225 [ARGS_BEGIN,ARGS_END). */
2227 static int
2228 is_in_args (const char *string, const char **args_begin,
2229 const char **args_end)
2231 const char **args_pointer;
2232 for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2233 if (strcmp (string, *args_pointer) == 0)
2234 return 1;
2235 return 0;
2237 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2239 #ifdef COLLECT_EXPORT_LIST
2240 /* This function is really used only on AIX, but may be useful. */
2241 #if 0
2242 static int
2243 is_in_list (const char *prefix, struct id *list)
2245 while (list)
2247 if (!strcmp (prefix, list->name)) return 1;
2248 list = list->next;
2250 return 0;
2252 #endif
2253 #endif /* COLLECT_EXPORT_LIST */
2255 /* Added for debugging purpose. */
2256 #ifdef COLLECT_EXPORT_LIST
2257 static void
2258 dump_list (FILE *stream, const char *prefix, struct id *list)
2260 while (list)
2262 fprintf (stream, "%s%s,\n", prefix, list->name);
2263 list = list->next;
2266 #endif
2268 #if 0
2269 static void
2270 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2272 while (list)
2274 fprintf (stream, "%s%s,\n", prefix, list->prefix);
2275 list = list->next;
2278 #endif
2280 static void
2281 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2283 while (list)
2285 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2286 prefix, list->sequence, list->name);
2287 list = list->next;
2291 /* Write out the constructor and destructor tables statically (for a shared
2292 object), along with the functions to execute them. */
2294 static void
2295 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2297 const char *p, *q;
2298 char *prefix, *r;
2299 int frames = (frame_tables.number > 0);
2301 /* Figure out name of output_file, stripping off .so version. */
2302 p = strrchr (output_file, '/');
2303 if (p == 0)
2304 p = output_file;
2305 else
2306 p++;
2307 q = p;
2308 while (q)
2310 q = strchr (q,'.');
2311 if (q == 0)
2313 q = p + strlen (p);
2314 break;
2316 else
2318 if (strncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2320 q += strlen (SHLIB_SUFFIX);
2321 break;
2323 else
2324 q++;
2327 /* q points to null at end of the string (or . of the .so version) */
2328 prefix = XNEWVEC (char, q - p + 1);
2329 strncpy (prefix, p, q - p);
2330 prefix[q - p] = 0;
2331 for (r = prefix; *r; r++)
2332 if (!ISALNUM ((unsigned char)*r))
2333 *r = '_';
2334 if (debug)
2335 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2336 output_file, prefix);
2338 initname = concat ("_GLOBAL__FI_", prefix, NULL);
2339 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2341 free (prefix);
2343 /* Write the tables as C code. */
2345 fprintf (stream, "static int count;\n");
2346 fprintf (stream, "typedef void entry_pt();\n");
2347 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2349 if (frames)
2351 write_list_with_asm (stream, "extern void *", frame_tables.first);
2353 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2354 write_list (stream, "\t\t&", frame_tables.first);
2355 fprintf (stream, "\t0\n};\n");
2357 /* This must match what's in frame.h. */
2358 fprintf (stream, "struct object {\n");
2359 fprintf (stream, " void *pc_begin;\n");
2360 fprintf (stream, " void *pc_end;\n");
2361 fprintf (stream, " void *fde_begin;\n");
2362 fprintf (stream, " void *fde_array;\n");
2363 fprintf (stream, " __SIZE_TYPE__ count;\n");
2364 fprintf (stream, " struct object *next;\n");
2365 fprintf (stream, "};\n");
2367 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2368 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2370 fprintf (stream, "static void reg_frame () {\n");
2371 fprintf (stream, "\tstatic struct object ob;\n");
2372 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2373 fprintf (stream, "\t}\n");
2375 fprintf (stream, "static void dereg_frame () {\n");
2376 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2377 fprintf (stream, "\t}\n");
2380 fprintf (stream, "void %s() {\n", initname);
2381 if (constructors.number > 0 || frames)
2383 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2384 write_list (stream, "\t\t", constructors.first);
2385 if (frames)
2386 fprintf (stream, "\treg_frame,\n");
2387 fprintf (stream, "\t};\n");
2388 fprintf (stream, "\tentry_pt **p;\n");
2389 fprintf (stream, "\tif (count++ != 0) return;\n");
2390 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2391 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2393 else
2394 fprintf (stream, "\t++count;\n");
2395 fprintf (stream, "}\n");
2396 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2397 fprintf (stream, "void %s() {\n", fininame);
2398 if (destructors.number > 0 || frames)
2400 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2401 write_list (stream, "\t\t", destructors.first);
2402 if (frames)
2403 fprintf (stream, "\tdereg_frame,\n");
2404 fprintf (stream, "\t};\n");
2405 fprintf (stream, "\tentry_pt **p;\n");
2406 fprintf (stream, "\tif (--count != 0) return;\n");
2407 fprintf (stream, "\tp = dtors;\n");
2408 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2409 destructors.number + frames);
2411 fprintf (stream, "}\n");
2413 if (shared_obj)
2415 COLLECT_SHARED_INIT_FUNC(stream, initname);
2416 COLLECT_SHARED_FINI_FUNC(stream, fininame);
2420 /* Write the constructor/destructor tables. */
2422 #ifndef LD_INIT_SWITCH
2423 static void
2424 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2426 /* Write the tables as C code. */
2428 int frames = (frame_tables.number > 0);
2430 fprintf (stream, "typedef void entry_pt();\n\n");
2432 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2434 if (frames)
2436 write_list_with_asm (stream, "extern void *", frame_tables.first);
2438 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2439 write_list (stream, "\t\t&", frame_tables.first);
2440 fprintf (stream, "\t0\n};\n");
2442 /* This must match what's in frame.h. */
2443 fprintf (stream, "struct object {\n");
2444 fprintf (stream, " void *pc_begin;\n");
2445 fprintf (stream, " void *pc_end;\n");
2446 fprintf (stream, " void *fde_begin;\n");
2447 fprintf (stream, " void *fde_array;\n");
2448 fprintf (stream, " __SIZE_TYPE__ count;\n");
2449 fprintf (stream, " struct object *next;\n");
2450 fprintf (stream, "};\n");
2452 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2453 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2455 fprintf (stream, "static void reg_frame () {\n");
2456 fprintf (stream, "\tstatic struct object ob;\n");
2457 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2458 fprintf (stream, "\t}\n");
2460 fprintf (stream, "static void dereg_frame () {\n");
2461 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2462 fprintf (stream, "\t}\n");
2465 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2466 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2467 write_list (stream, "\t", constructors.first);
2468 if (frames)
2469 fprintf (stream, "\treg_frame,\n");
2470 fprintf (stream, "\t0\n};\n\n");
2472 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2474 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2475 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2476 write_list (stream, "\t", destructors.first);
2477 if (frames)
2478 fprintf (stream, "\tdereg_frame,\n");
2479 fprintf (stream, "\t0\n};\n\n");
2481 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2482 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2484 #endif /* ! LD_INIT_SWITCH */
2486 static void
2487 write_c_file (FILE *stream, const char *name)
2489 #ifndef LD_INIT_SWITCH
2490 if (! shared_obj)
2491 write_c_file_glob (stream, name);
2492 else
2493 #endif
2494 write_c_file_stat (stream, name);
2497 #ifdef COLLECT_EXPORT_LIST
2498 static void
2499 write_aix_file (FILE *stream, struct id *list)
2501 for (; list; list = list->next)
2503 fputs (list->name, stream);
2504 putc ('\n', stream);
2507 #endif
2509 #ifdef OBJECT_FORMAT_NONE
2511 /* Check to make sure the file is an LTO object file. */
2513 static bool
2514 maybe_lto_object_file (const char *prog_name)
2516 FILE *f;
2517 unsigned char buf[4];
2518 int i;
2520 static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2521 static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2522 static unsigned char coffmagic_x64[2] = { 0x64, 0x86 };
2523 static unsigned char machomagic[4][4] = {
2524 { 0xcf, 0xfa, 0xed, 0xfe },
2525 { 0xce, 0xfa, 0xed, 0xfe },
2526 { 0xfe, 0xed, 0xfa, 0xcf },
2527 { 0xfe, 0xed, 0xfa, 0xce }
2530 f = fopen (prog_name, "rb");
2531 if (f == NULL)
2532 return false;
2533 if (fread (buf, sizeof (buf), 1, f) != 1)
2534 buf[0] = 0;
2535 fclose (f);
2537 if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2538 || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0
2539 || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0)
2540 return true;
2541 for (i = 0; i < 4; i++)
2542 if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2543 return true;
2545 return false;
2548 /* Generic version to scan the name list of the loaded program for
2549 the symbols g++ uses for static constructors and destructors. */
2551 static void
2552 scan_prog_file (const char *prog_name, scanpass which_pass,
2553 scanfilter filter)
2555 void (*int_handler) (int);
2556 #ifdef SIGQUIT
2557 void (*quit_handler) (int);
2558 #endif
2559 char *real_nm_argv[4];
2560 const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2561 int argc = 0;
2562 struct pex_obj *pex;
2563 const char *errmsg;
2564 int err;
2565 char *p, buf[1024];
2566 FILE *inf;
2567 int found_lto = 0;
2569 if (which_pass == PASS_SECOND)
2570 return;
2572 /* LTO objects must be in a known format. This check prevents
2573 us from accepting an archive containing LTO objects, which
2574 gcc cannnot currently handle. */
2575 if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2576 return;
2578 /* If we do not have an `nm', complain. */
2579 if (nm_file_name == 0)
2580 fatal ("cannot find 'nm'");
2582 nm_argv[argc++] = nm_file_name;
2583 if (NM_FLAGS[0] != '\0')
2584 nm_argv[argc++] = NM_FLAGS;
2586 nm_argv[argc++] = prog_name;
2587 nm_argv[argc++] = (char *) 0;
2589 /* Trace if needed. */
2590 if (vflag)
2592 const char **p_argv;
2593 const char *str;
2595 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2596 fprintf (stderr, " %s", str);
2598 fprintf (stderr, "\n");
2601 fflush (stdout);
2602 fflush (stderr);
2604 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2605 if (pex == NULL)
2606 fatal_perror ("pex_init failed");
2608 errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2609 &err);
2610 if (errmsg != NULL)
2612 if (err != 0)
2614 errno = err;
2615 fatal_perror (errmsg);
2617 else
2618 fatal (errmsg);
2621 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2622 #ifdef SIGQUIT
2623 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2624 #endif
2626 inf = pex_read_output (pex, 0);
2627 if (inf == NULL)
2628 fatal_perror ("can't open nm output");
2630 if (debug)
2632 if (which_pass == PASS_LTOINFO)
2633 fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2634 else
2635 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2638 /* Read each line of nm output. */
2639 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2641 int ch, ch2;
2642 char *name, *end;
2644 if (debug)
2645 fprintf (stderr, "\t%s\n", buf);
2647 if (which_pass == PASS_LTOINFO)
2649 if (found_lto)
2650 continue;
2652 /* Look for the LTO info marker symbol, and add filename to
2653 the LTO objects list if found. */
2654 for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2655 if (ch == ' ' && p[1] == '_' && p[2] == '_'
2656 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2657 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2659 add_lto_object (&lto_objects, prog_name);
2661 /* We need to read all the input, so we can't just
2662 return here. But we can avoid useless work. */
2663 found_lto = 1;
2665 break;
2668 continue;
2671 /* If it contains a constructor or destructor name, add the name
2672 to the appropriate list unless this is a kind of symbol we're
2673 not supposed to even consider. */
2675 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2676 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2677 break;
2679 if (ch != '_')
2680 continue;
2682 name = p;
2683 /* Find the end of the symbol name.
2684 Do not include `|', because Encore nm can tack that on the end. */
2685 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2686 end++)
2687 continue;
2690 *end = '\0';
2691 switch (is_ctor_dtor (name))
2693 case SYM_CTOR:
2694 if (! (filter & SCAN_CTOR))
2695 break;
2696 if (which_pass != PASS_LIB)
2697 add_to_list (&constructors, name);
2698 break;
2700 case SYM_DTOR:
2701 if (! (filter & SCAN_DTOR))
2702 break;
2703 if (which_pass != PASS_LIB)
2704 add_to_list (&destructors, name);
2705 break;
2707 case SYM_INIT:
2708 if (! (filter & SCAN_INIT))
2709 break;
2710 if (which_pass != PASS_LIB)
2711 fatal ("init function found in object %s", prog_name);
2712 #ifndef LD_INIT_SWITCH
2713 add_to_list (&constructors, name);
2714 #endif
2715 break;
2717 case SYM_FINI:
2718 if (! (filter & SCAN_FINI))
2719 break;
2720 if (which_pass != PASS_LIB)
2721 fatal ("fini function found in object %s", prog_name);
2722 #ifndef LD_FINI_SWITCH
2723 add_to_list (&destructors, name);
2724 #endif
2725 break;
2727 case SYM_DWEH:
2728 if (! (filter & SCAN_DWEH))
2729 break;
2730 if (which_pass != PASS_LIB)
2731 add_to_list (&frame_tables, name);
2732 break;
2734 default: /* not a constructor or destructor */
2735 continue;
2739 if (debug)
2740 fprintf (stderr, "\n");
2742 do_wait (nm_file_name, pex);
2744 signal (SIGINT, int_handler);
2745 #ifdef SIGQUIT
2746 signal (SIGQUIT, quit_handler);
2747 #endif
2750 #ifdef LDD_SUFFIX
2752 /* Use the List Dynamic Dependencies program to find shared libraries that
2753 the output file depends upon and their initialization/finalization
2754 routines, if any. */
2756 static void
2757 scan_libraries (const char *prog_name)
2759 static struct head libraries; /* list of shared libraries found */
2760 struct id *list;
2761 void (*int_handler) (int);
2762 #ifdef SIGQUIT
2763 void (*quit_handler) (int);
2764 #endif
2765 char *real_ldd_argv[4];
2766 const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2767 int argc = 0;
2768 struct pex_obj *pex;
2769 const char *errmsg;
2770 int err;
2771 char buf[1024];
2772 FILE *inf;
2774 /* If we do not have an `ldd', complain. */
2775 if (ldd_file_name == 0)
2777 error ("cannot find 'ldd'");
2778 return;
2781 ldd_argv[argc++] = ldd_file_name;
2782 ldd_argv[argc++] = prog_name;
2783 ldd_argv[argc++] = (char *) 0;
2785 /* Trace if needed. */
2786 if (vflag)
2788 const char **p_argv;
2789 const char *str;
2791 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2792 fprintf (stderr, " %s", str);
2794 fprintf (stderr, "\n");
2797 fflush (stdout);
2798 fflush (stderr);
2800 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2801 if (pex == NULL)
2802 fatal_perror ("pex_init failed");
2804 errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2805 if (errmsg != NULL)
2807 if (err != 0)
2809 errno = err;
2810 fatal_perror (errmsg);
2812 else
2813 fatal (errmsg);
2816 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2817 #ifdef SIGQUIT
2818 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2819 #endif
2821 inf = pex_read_output (pex, 0);
2822 if (inf == NULL)
2823 fatal_perror ("can't open ldd output");
2825 if (debug)
2826 notice ("\nldd output with constructors/destructors.\n");
2828 /* Read each line of ldd output. */
2829 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2831 int ch2;
2832 char *name, *end, *p = buf;
2834 /* Extract names of libraries and add to list. */
2835 PARSE_LDD_OUTPUT (p);
2836 if (p == 0)
2837 continue;
2839 name = p;
2840 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2841 fatal ("dynamic dependency %s not found", buf);
2843 /* Find the end of the symbol name. */
2844 for (end = p;
2845 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2846 end++)
2847 continue;
2848 *end = '\0';
2850 if (access (name, R_OK) == 0)
2851 add_to_list (&libraries, name);
2852 else
2853 fatal ("unable to open dynamic dependency '%s'", buf);
2855 if (debug)
2856 fprintf (stderr, "\t%s\n", buf);
2858 if (debug)
2859 fprintf (stderr, "\n");
2861 do_wait (ldd_file_name, pex);
2863 signal (SIGINT, int_handler);
2864 #ifdef SIGQUIT
2865 signal (SIGQUIT, quit_handler);
2866 #endif
2868 /* Now iterate through the library list adding their symbols to
2869 the list. */
2870 for (list = libraries.first; list; list = list->next)
2871 scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2874 #endif /* LDD_SUFFIX */
2876 #endif /* OBJECT_FORMAT_NONE */
2880 * COFF specific stuff.
2883 #ifdef OBJECT_FORMAT_COFF
2885 #if defined (EXTENDED_COFF)
2887 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2888 # define GCC_SYMENT SYMR
2889 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2890 # define GCC_SYMINC(X) (1)
2891 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2892 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2894 #else
2896 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2897 # define GCC_SYMENT SYMENT
2898 # if defined (C_WEAKEXT)
2899 # define GCC_OK_SYMBOL(X) \
2900 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2901 ((X).n_scnum > N_UNDEF) && \
2902 (aix64_flag \
2903 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2904 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2905 # define GCC_UNDEF_SYMBOL(X) \
2906 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2907 ((X).n_scnum == N_UNDEF))
2908 # else
2909 # define GCC_OK_SYMBOL(X) \
2910 (((X).n_sclass == C_EXT) && \
2911 ((X).n_scnum > N_UNDEF) && \
2912 (aix64_flag \
2913 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2914 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2915 # define GCC_UNDEF_SYMBOL(X) \
2916 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2917 # endif
2918 # define GCC_SYMINC(X) ((X).n_numaux+1)
2919 # define GCC_SYMZERO(X) 0
2921 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2922 #if TARGET_AIX_VERSION >= 51
2923 # define GCC_CHECK_HDR(X) \
2924 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2925 || (HEADER (X).f_magic == 0767 && aix64_flag))
2926 #else
2927 # define GCC_CHECK_HDR(X) \
2928 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2929 || (HEADER (X).f_magic == 0757 && aix64_flag))
2930 #endif
2932 #endif
2934 #ifdef COLLECT_EXPORT_LIST
2935 /* Array of standard AIX libraries which should not
2936 be scanned for ctors/dtors. */
2937 static const char *const aix_std_libs[] = {
2938 "/unix",
2939 "/lib/libc.a",
2940 "/lib/libm.a",
2941 "/lib/libc_r.a",
2942 "/lib/libm_r.a",
2943 "/usr/lib/libc.a",
2944 "/usr/lib/libm.a",
2945 "/usr/lib/libc_r.a",
2946 "/usr/lib/libm_r.a",
2947 "/usr/lib/threads/libc.a",
2948 "/usr/ccs/lib/libc.a",
2949 "/usr/ccs/lib/libm.a",
2950 "/usr/ccs/lib/libc_r.a",
2951 "/usr/ccs/lib/libm_r.a",
2952 NULL
2955 /* This function checks the filename and returns 1
2956 if this name matches the location of a standard AIX library. */
2957 static int ignore_library (const char *);
2958 static int
2959 ignore_library (const char *name)
2961 const char *const *p;
2962 size_t length;
2964 if (target_system_root[0] != '\0')
2966 length = strlen (target_system_root);
2967 if (strncmp (name, target_system_root, length) != 0)
2968 return 0;
2969 name += length;
2971 for (p = &aix_std_libs[0]; *p != NULL; ++p)
2972 if (strcmp (name, *p) == 0)
2973 return 1;
2974 return 0;
2976 #endif /* COLLECT_EXPORT_LIST */
2978 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2979 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2980 #endif
2982 /* COFF version to scan the name list of the loaded program for
2983 the symbols g++ uses for static constructors and destructors. */
2985 static void
2986 scan_prog_file (const char *prog_name, scanpass which_pass,
2987 scanfilter filter)
2989 LDFILE *ldptr = NULL;
2990 int sym_index, sym_count;
2991 int is_shared = 0;
2993 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2994 return;
2996 #ifdef COLLECT_EXPORT_LIST
2997 /* We do not need scanning for some standard C libraries. */
2998 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2999 return;
3001 /* On AIX we have a loop, because there is not much difference
3002 between an object and an archive. This trick allows us to
3003 eliminate scan_libraries() function. */
3006 #endif
3007 /* Some platforms (e.g. OSF4) declare ldopen as taking a
3008 non-const char * filename parameter, even though it will not
3009 modify that string. So we must cast away const-ness here,
3010 using CONST_CAST to prevent complaints from -Wcast-qual. */
3011 if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
3013 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
3014 fatal ("%s: not a COFF file", prog_name);
3016 if (GCC_CHECK_HDR (ldptr))
3018 sym_count = GCC_SYMBOLS (ldptr);
3019 sym_index = GCC_SYMZERO (ldptr);
3021 #ifdef COLLECT_EXPORT_LIST
3022 /* Is current archive member a shared object? */
3023 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
3024 #endif
3026 while (sym_index < sym_count)
3028 GCC_SYMENT symbol;
3030 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
3031 break;
3032 sym_index += GCC_SYMINC (symbol);
3034 if (GCC_OK_SYMBOL (symbol))
3036 char *name;
3038 if ((name = ldgetname (ldptr, &symbol)) == NULL)
3039 continue; /* Should never happen. */
3041 #ifdef XCOFF_DEBUGGING_INFO
3042 /* All AIX function names have a duplicate entry
3043 beginning with a dot. */
3044 if (*name == '.')
3045 ++name;
3046 #endif
3048 switch (is_ctor_dtor (name))
3050 case SYM_CTOR:
3051 if (! (filter & SCAN_CTOR))
3052 break;
3053 if (! is_shared)
3054 add_to_list (&constructors, name);
3055 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3056 if (which_pass == PASS_OBJ)
3057 add_to_list (&exports, name);
3058 #endif
3059 break;
3061 case SYM_DTOR:
3062 if (! (filter & SCAN_DTOR))
3063 break;
3064 if (! is_shared)
3065 add_to_list (&destructors, 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;
3072 #ifdef COLLECT_EXPORT_LIST
3073 case SYM_INIT:
3074 if (! (filter & SCAN_INIT))
3075 break;
3076 #ifndef LD_INIT_SWITCH
3077 if (is_shared)
3078 add_to_list (&constructors, name);
3079 #endif
3080 break;
3082 case SYM_FINI:
3083 if (! (filter & SCAN_FINI))
3084 break;
3085 #ifndef LD_INIT_SWITCH
3086 if (is_shared)
3087 add_to_list (&destructors, name);
3088 #endif
3089 break;
3090 #endif
3092 case SYM_DWEH:
3093 if (! (filter & SCAN_DWEH))
3094 break;
3095 if (! is_shared)
3096 add_to_list (&frame_tables, name);
3097 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3098 if (which_pass == PASS_OBJ)
3099 add_to_list (&exports, name);
3100 #endif
3101 break;
3103 default: /* not a constructor or destructor */
3104 #ifdef COLLECT_EXPORT_LIST
3105 /* Explicitly export all global symbols when
3106 building a shared object on AIX, but do not
3107 re-export symbols from another shared object
3108 and do not export symbols if the user
3109 provides an explicit export list. */
3110 if (shared_obj && !is_shared
3111 && which_pass == PASS_OBJ && !export_flag)
3112 add_to_list (&exports, name);
3113 #endif
3114 continue;
3117 if (debug)
3118 #if !defined(EXTENDED_COFF)
3119 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3120 symbol.n_scnum, symbol.n_sclass,
3121 (symbol.n_type ? "0" : ""), symbol.n_type,
3122 name);
3123 #else
3124 fprintf (stderr,
3125 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3126 symbol.iss, (long) symbol.value, symbol.index, name);
3127 #endif
3131 #ifdef COLLECT_EXPORT_LIST
3132 else
3134 /* If archive contains both 32-bit and 64-bit objects,
3135 we want to skip objects in other mode so mismatch normal. */
3136 if (debug)
3137 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3138 prog_name, HEADER (ldptr).f_magic, aix64_flag);
3140 #endif
3142 else
3144 fatal ("%s: cannot open as COFF file", prog_name);
3146 #ifdef COLLECT_EXPORT_LIST
3147 /* On AIX loop continues while there are more members in archive. */
3149 while (ldclose (ldptr) == FAILURE);
3150 #else
3151 /* Otherwise we simply close ldptr. */
3152 (void) ldclose(ldptr);
3153 #endif
3155 #endif /* OBJECT_FORMAT_COFF */
3157 #ifdef COLLECT_EXPORT_LIST
3158 /* Given a library name without "lib" prefix, this function
3159 returns a full library name including a path. */
3160 static char *
3161 resolve_lib_name (const char *name)
3163 char *lib_buf;
3164 int i, j, l = 0;
3165 /* Library extensions for AIX dynamic linking. */
3166 const char * const libexts[2] = {"a", "so"};
3168 for (i = 0; libpaths[i]; i++)
3169 if (libpaths[i]->max_len > l)
3170 l = libpaths[i]->max_len;
3172 lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3174 for (i = 0; libpaths[i]; i++)
3176 struct prefix_list *list = libpaths[i]->plist;
3177 for (; list; list = list->next)
3179 /* The following lines are needed because path_prefix list
3180 may contain directories both with trailing '/' and
3181 without it. */
3182 const char *p = "";
3183 if (list->prefix[strlen(list->prefix)-1] != '/')
3184 p = "/";
3185 for (j = 0; j < 2; j++)
3187 sprintf (lib_buf, "%s%slib%s.%s",
3188 list->prefix, p, name,
3189 libexts[(j + aixrtl_flag) % 2]);
3190 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3191 if (file_exists (lib_buf))
3193 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3194 return (lib_buf);
3199 if (debug)
3200 fprintf (stderr, "not found\n");
3201 else
3202 fatal ("library lib%s not found", name);
3203 return (NULL);
3205 #endif /* COLLECT_EXPORT_LIST */