2010-06-27 Richard Guenther <rguenther@suse.de>
[official-gcc.git] / gcc / collect2.c
blobf5498aa5e469630bb9d4e07fce70cbb85b3e2edc
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"
33 #include <signal.h>
34 #if ! defined( SIGCHLD ) && defined( SIGCLD )
35 # define SIGCHLD SIGCLD
36 #endif
38 /* TARGET_64BIT may be defined to use driver specific functionality. */
39 #undef TARGET_64BIT
40 #define TARGET_64BIT TARGET_64BIT_DEFAULT
42 #ifndef LIBRARY_PATH_ENV
43 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
44 #endif
46 #define COLLECT
48 #include "collect2.h"
49 #include "collect2-aix.h"
50 #include "demangle.h"
51 #include "obstack.h"
52 #include "intl.h"
53 #include "version.h"
55 /* On certain systems, we have code that works by scanning the object file
56 directly. But this code uses system-specific header files and library
57 functions, so turn it off in a cross-compiler. Likewise, the names of
58 the utilities are not correct for a cross-compiler; we have to hope that
59 cross-versions are in the proper directories. */
61 #ifdef CROSS_DIRECTORY_STRUCTURE
62 #ifndef CROSS_AIX_SUPPORT
63 #undef OBJECT_FORMAT_COFF
64 #endif
65 #undef MD_EXEC_PREFIX
66 #undef REAL_LD_FILE_NAME
67 #undef REAL_NM_FILE_NAME
68 #undef REAL_STRIP_FILE_NAME
69 #endif
71 /* If we cannot use a special method, use the ordinary one:
72 run nm to find what symbols are present.
73 In a cross-compiler, this means you need a cross nm,
74 but that is not quite as unpleasant as special headers. */
76 #if !defined (OBJECT_FORMAT_COFF)
77 #define OBJECT_FORMAT_NONE
78 #endif
80 #ifdef OBJECT_FORMAT_COFF
82 #ifndef CROSS_DIRECTORY_STRUCTURE
83 #include <a.out.h>
84 #include <ar.h>
86 #ifdef UMAX
87 #include <sgs.h>
88 #endif
90 /* Many versions of ldfcn.h define these. */
91 #ifdef FREAD
92 #undef FREAD
93 #undef FWRITE
94 #endif
96 #include <ldfcn.h>
97 #endif
99 /* Some systems have an ISCOFF macro, but others do not. In some cases
100 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
101 that either do not have an ISCOFF macro in /usr/include or for those
102 where it is wrong. */
104 #ifndef MY_ISCOFF
105 #define MY_ISCOFF(X) ISCOFF (X)
106 #endif
108 #endif /* OBJECT_FORMAT_COFF */
110 #ifdef OBJECT_FORMAT_NONE
112 /* Default flags to pass to nm. */
113 #ifndef NM_FLAGS
114 #define NM_FLAGS "-n"
115 #endif
117 #endif /* OBJECT_FORMAT_NONE */
119 /* Some systems use __main in a way incompatible with its use in gcc, in these
120 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
121 give the same symbol without quotes for an alternative entry point. */
122 #ifndef NAME__MAIN
123 #define NAME__MAIN "__main"
124 #endif
126 /* This must match tree.h. */
127 #define DEFAULT_INIT_PRIORITY 65535
129 #ifndef COLLECT_SHARED_INIT_FUNC
130 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
131 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
132 #endif
133 #ifndef COLLECT_SHARED_FINI_FUNC
134 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
135 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
136 #endif
138 #ifdef LDD_SUFFIX
139 #define SCAN_LIBRARIES
140 #endif
142 #ifndef SHLIB_SUFFIX
143 #define SHLIB_SUFFIX ".so"
144 #endif
146 #ifdef USE_COLLECT2
147 int do_collecting = 1;
148 #else
149 int do_collecting = 0;
150 #endif
152 /* Cook up an always defined indication of whether we proceed the
153 "EXPORT_LIST" way. */
155 #ifdef COLLECT_EXPORT_LIST
156 #define DO_COLLECT_EXPORT_LIST 1
157 #else
158 #define DO_COLLECT_EXPORT_LIST 0
159 #endif
161 /* Nonzero if we should suppress the automatic demangling of identifiers
162 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
163 int no_demangle;
165 /* Linked lists of constructor and destructor names. */
167 struct id
169 struct id *next;
170 int sequence;
171 char name[1];
174 struct head
176 struct id *first;
177 struct id *last;
178 int number;
181 int vflag; /* true if -v */
182 static int rflag; /* true if -r */
183 static int strip_flag; /* true if -s */
184 static const char *demangle_flag;
185 #ifdef COLLECT_EXPORT_LIST
186 static int export_flag; /* true if -bE */
187 static int aix64_flag; /* true if -b64 */
188 static int aixrtl_flag; /* true if -brtl */
189 #endif
191 enum lto_mode_d {
192 LTO_MODE_NONE, /* Not doing LTO. */
193 LTO_MODE_LTO, /* Normal LTO. */
194 LTO_MODE_WHOPR /* WHOPR. */
197 /* Current LTO mode. */
198 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
200 int debug; /* true if -debug */
202 static int shared_obj; /* true if -shared */
204 static const char *c_file; /* <xxx>.c for constructor/destructor list. */
205 static const char *o_file; /* <xxx>.o for constructor/destructor list. */
206 #ifdef COLLECT_EXPORT_LIST
207 static const char *export_file; /* <xxx>.x for AIX export list. */
208 #endif
209 static char **lto_o_files; /* Output files for LTO. */
210 const char *ldout; /* File for ld stdout. */
211 const char *lderrout; /* File for ld stderr. */
212 static const char *output_file; /* Output file for ld. */
213 static const char *nm_file_name; /* pathname of nm */
214 #ifdef LDD_SUFFIX
215 static const char *ldd_file_name; /* pathname of ldd (or equivalent) */
216 #endif
217 static const char *strip_file_name; /* pathname of strip */
218 const char *c_file_name; /* pathname of gcc */
219 static char *initname, *fininame; /* names of init and fini funcs */
221 static struct head constructors; /* list of constructors found */
222 static struct head destructors; /* list of destructors found */
223 #ifdef COLLECT_EXPORT_LIST
224 static struct head exports; /* list of exported symbols */
225 #endif
226 static struct head frame_tables; /* list of frame unwind info tables */
228 static bool at_file_supplied; /* Whether to use @file arguments */
229 static char *response_file; /* Name of any current response file */
231 struct obstack temporary_obstack;
232 char * temporary_firstobj;
234 /* A string that must be prepended to a target OS path in order to find
235 it on the host system. */
236 #ifdef TARGET_SYSTEM_ROOT
237 static const char *target_system_root = TARGET_SYSTEM_ROOT;
238 #else
239 static const char *target_system_root = "";
240 #endif
242 /* Structure to hold all the directories in which to search for files to
243 execute. */
245 struct prefix_list
247 const char *prefix; /* String to prepend to the path. */
248 struct prefix_list *next; /* Next in linked list. */
251 struct path_prefix
253 struct prefix_list *plist; /* List of prefixes to try */
254 int max_len; /* Max length of a prefix in PLIST */
255 const char *name; /* Name of this list (used in config stuff) */
258 #ifdef COLLECT_EXPORT_LIST
259 /* Lists to keep libraries to be scanned for global constructors/destructors. */
260 static struct head libs; /* list of libraries */
261 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
262 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
263 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
264 &libpath_lib_dirs, NULL};
265 #endif
267 /* List of names of object files containing LTO information.
268 These are a subset of the object file names appearing on the
269 command line, and must be identical, in the sense of pointer
270 equality, with the names passed to maybe_run_lto_and_relink(). */
272 struct lto_object
274 const char *name; /* Name of object file. */
275 struct lto_object *next; /* Next in linked list. */
278 struct lto_object_list
280 struct lto_object *first; /* First list element. */
281 struct lto_object *last; /* Last list element. */
284 static struct lto_object_list lto_objects;
286 /* Special kinds of symbols that a name may denote. */
288 typedef enum {
289 SYM_REGULAR = 0, /* nothing special */
291 SYM_CTOR = 1, /* constructor */
292 SYM_DTOR = 2, /* destructor */
293 SYM_INIT = 3, /* shared object routine that calls all the ctors */
294 SYM_FINI = 4, /* shared object routine that calls all the dtors */
295 SYM_DWEH = 5 /* DWARF exception handling table */
296 } symkind;
298 static symkind is_ctor_dtor (const char *);
300 static void handler (int);
301 static char *find_a_file (struct path_prefix *, const char *);
302 static void add_prefix (struct path_prefix *, const char *);
303 static void prefix_from_env (const char *, struct path_prefix *);
304 static void prefix_from_string (const char *, struct path_prefix *);
305 static void do_wait (const char *, struct pex_obj *);
306 static void fork_execute (const char *, char **);
307 static void maybe_unlink (const char *);
308 static void maybe_unlink_list (char **);
309 static void add_to_list (struct head *, const char *);
310 static int extract_init_priority (const char *);
311 static void sort_ids (struct head *);
312 static void write_list (FILE *, const char *, struct id *);
313 #ifdef COLLECT_EXPORT_LIST
314 static void dump_list (FILE *, const char *, struct id *);
315 #endif
316 #if 0
317 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
318 #endif
319 static void write_list_with_asm (FILE *, const char *, struct id *);
320 static void write_c_file (FILE *, const char *);
321 static void write_c_file_stat (FILE *, const char *);
322 #ifndef LD_INIT_SWITCH
323 static void write_c_file_glob (FILE *, const char *);
324 #endif
325 #ifdef SCAN_LIBRARIES
326 static void scan_libraries (const char *);
327 #endif
328 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
329 static int is_in_args (const char *, const char **, const char **);
330 #endif
331 #ifdef COLLECT_EXPORT_LIST
332 #if 0
333 static int is_in_list (const char *, struct id *);
334 #endif
335 static void write_aix_file (FILE *, struct id *);
336 static char *resolve_lib_name (const char *);
337 #endif
338 static char *extract_string (const char **);
340 /* Enumerations describing which pass this is for scanning the
341 program file ... */
343 typedef enum {
344 PASS_FIRST, /* without constructors */
345 PASS_OBJ, /* individual objects */
346 PASS_LIB, /* looking for shared libraries */
347 PASS_SECOND, /* with constructors linked in */
348 PASS_LTOINFO /* looking for objects with LTO info */
349 } scanpass;
351 /* ... and which kinds of symbols are to be considered. */
353 enum scanfilter_masks {
354 SCAN_NOTHING = 0,
356 SCAN_CTOR = 1 << SYM_CTOR,
357 SCAN_DTOR = 1 << SYM_DTOR,
358 SCAN_INIT = 1 << SYM_INIT,
359 SCAN_FINI = 1 << SYM_FINI,
360 SCAN_DWEH = 1 << SYM_DWEH,
361 SCAN_ALL = ~0
364 /* This type is used for parameters and variables which hold
365 combinations of the flags in enum scanfilter_masks. */
366 typedef int scanfilter;
368 /* Scan the name list of the loaded program for the symbols g++ uses for
369 static constructors and destructors.
371 The SCANPASS argument tells which collect processing pass this is for and
372 the SCANFILTER argument tells which kinds of symbols to consider in this
373 pass. Symbols of a special kind not in the filter mask are considered as
374 regular ones.
376 The constructor table begins at __CTOR_LIST__ and contains a count of the
377 number of pointers (or -1 if the constructors are built in a separate
378 section by the linker), followed by the pointers to the constructor
379 functions, terminated with a null pointer. The destructor table has the
380 same format, and begins at __DTOR_LIST__. */
382 static void scan_prog_file (const char *, scanpass, scanfilter);
385 /* Delete tempfiles and exit function. */
387 void
388 collect_exit (int status)
390 if (c_file != 0 && c_file[0])
391 maybe_unlink (c_file);
393 if (o_file != 0 && o_file[0])
394 maybe_unlink (o_file);
396 #ifdef COLLECT_EXPORT_LIST
397 if (export_file != 0 && export_file[0])
398 maybe_unlink (export_file);
399 #endif
401 if (lto_o_files)
402 maybe_unlink_list (lto_o_files);
404 if (ldout != 0 && ldout[0])
406 dump_file (ldout, stdout);
407 maybe_unlink (ldout);
410 if (lderrout != 0 && lderrout[0])
412 dump_file (lderrout, stderr);
413 maybe_unlink (lderrout);
416 if (status != 0 && output_file != 0 && output_file[0])
417 maybe_unlink (output_file);
419 if (response_file)
420 maybe_unlink (response_file);
422 exit (status);
426 /* Notify user of a non-error. */
427 void
428 notice (const char *cmsgid, ...)
430 va_list ap;
432 va_start (ap, cmsgid);
433 vfprintf (stderr, _(cmsgid), ap);
434 va_end (ap);
437 /* Notify user of a non-error, without translating the format string. */
438 void
439 notice_translated (const char *cmsgid, ...)
441 va_list ap;
443 va_start (ap, cmsgid);
444 vfprintf (stderr, cmsgid, ap);
445 va_end (ap);
448 /* Die when sys call fails. */
450 void
451 fatal_perror (const char * cmsgid, ...)
453 int e = errno;
454 va_list ap;
456 va_start (ap, cmsgid);
457 fprintf (stderr, "collect2: ");
458 vfprintf (stderr, _(cmsgid), ap);
459 fprintf (stderr, ": %s\n", xstrerror (e));
460 va_end (ap);
462 collect_exit (FATAL_EXIT_CODE);
465 /* Just die. */
467 void
468 fatal (const char * cmsgid, ...)
470 va_list ap;
472 va_start (ap, cmsgid);
473 fprintf (stderr, "collect2: ");
474 vfprintf (stderr, _(cmsgid), ap);
475 fprintf (stderr, "\n");
476 va_end (ap);
478 collect_exit (FATAL_EXIT_CODE);
481 /* Write error message. */
483 void
484 error (const char * gmsgid, ...)
486 va_list ap;
488 va_start (ap, gmsgid);
489 fprintf (stderr, "collect2: ");
490 vfprintf (stderr, _(gmsgid), ap);
491 fprintf (stderr, "\n");
492 va_end(ap);
495 /* In case obstack is linked in, and abort is defined to fancy_abort,
496 provide a default entry. */
498 void
499 fancy_abort (const char *file, int line, const char *func)
501 fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
504 static void
505 handler (int signo)
507 if (c_file != 0 && c_file[0])
508 maybe_unlink (c_file);
510 if (o_file != 0 && o_file[0])
511 maybe_unlink (o_file);
513 if (ldout != 0 && ldout[0])
514 maybe_unlink (ldout);
516 if (lderrout != 0 && lderrout[0])
517 maybe_unlink (lderrout);
519 #ifdef COLLECT_EXPORT_LIST
520 if (export_file != 0 && export_file[0])
521 maybe_unlink (export_file);
522 #endif
524 if (lto_o_files)
525 maybe_unlink_list (lto_o_files);
527 if (response_file)
528 maybe_unlink (response_file);
530 signal (signo, SIG_DFL);
531 raise (signo);
536 file_exists (const char *name)
538 return access (name, R_OK) == 0;
541 /* Parse a reasonable subset of shell quoting syntax. */
543 static char *
544 extract_string (const char **pp)
546 const char *p = *pp;
547 int backquote = 0;
548 int inside = 0;
550 for (;;)
552 char c = *p;
553 if (c == '\0')
554 break;
555 ++p;
556 if (backquote)
557 obstack_1grow (&temporary_obstack, c);
558 else if (! inside && c == ' ')
559 break;
560 else if (! inside && c == '\\')
561 backquote = 1;
562 else if (c == '\'')
563 inside = !inside;
564 else
565 obstack_1grow (&temporary_obstack, c);
568 obstack_1grow (&temporary_obstack, '\0');
569 *pp = p;
570 return XOBFINISH (&temporary_obstack, char *);
573 void
574 dump_file (const char *name, FILE *to)
576 FILE *stream = fopen (name, "r");
578 if (stream == 0)
579 return;
580 while (1)
582 int c;
583 while (c = getc (stream),
584 c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
585 obstack_1grow (&temporary_obstack, c);
586 if (obstack_object_size (&temporary_obstack) > 0)
588 const char *word, *p;
589 char *result;
590 obstack_1grow (&temporary_obstack, '\0');
591 word = XOBFINISH (&temporary_obstack, const char *);
593 if (*word == '.')
594 ++word, putc ('.', to);
595 p = word;
596 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
597 p += strlen (USER_LABEL_PREFIX);
599 #ifdef HAVE_LD_DEMANGLE
600 result = 0;
601 #else
602 if (no_demangle)
603 result = 0;
604 else
605 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
606 #endif
608 if (result)
610 int diff;
611 fputs (result, to);
613 diff = strlen (word) - strlen (result);
614 while (diff > 0 && c == ' ')
615 --diff, putc (' ', to);
616 if (diff < 0 && c == ' ')
618 while (diff < 0 && c == ' ')
619 ++diff, c = getc (stream);
620 if (!ISSPACE (c))
622 /* Make sure we output at least one space, or
623 the demangled symbol name will run into
624 whatever text follows. */
625 putc (' ', to);
629 free (result);
631 else
632 fputs (word, to);
634 fflush (to);
635 obstack_free (&temporary_obstack, temporary_firstobj);
637 if (c == EOF)
638 break;
639 putc (c, to);
641 fclose (stream);
644 /* Return the kind of symbol denoted by name S. */
646 static symkind
647 is_ctor_dtor (const char *s)
649 struct names { const char *const name; const int len; symkind ret;
650 const int two_underscores; };
652 const struct names *p;
653 int ch;
654 const char *orig_s = s;
656 static const struct names special[] = {
657 #ifndef NO_DOLLAR_IN_LABEL
658 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
659 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
660 #else
661 #ifndef NO_DOT_IN_LABEL
662 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
663 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
664 #endif /* NO_DOT_IN_LABEL */
665 #endif /* NO_DOLLAR_IN_LABEL */
666 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
667 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
668 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
669 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
670 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
671 { NULL, 0, SYM_REGULAR, 0 }
674 while ((ch = *s) == '_')
675 ++s;
677 if (s == orig_s)
678 return SYM_REGULAR;
680 for (p = &special[0]; p->len > 0; p++)
682 if (ch == p->name[0]
683 && (!p->two_underscores || ((s - orig_s) >= 2))
684 && strncmp(s, p->name, p->len) == 0)
686 return p->ret;
689 return SYM_REGULAR;
692 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
693 and one from the PATH variable. */
695 static struct path_prefix cpath, path;
697 #ifdef CROSS_DIRECTORY_STRUCTURE
698 /* This is the name of the target machine. We use it to form the name
699 of the files to execute. */
701 static const char *const target_machine = TARGET_MACHINE;
702 #endif
704 /* Search for NAME using prefix list PPREFIX. We only look for executable
705 files.
707 Return 0 if not found, otherwise return its name, allocated with malloc. */
709 static char *
710 find_a_file (struct path_prefix *pprefix, const char *name)
712 char *temp;
713 struct prefix_list *pl;
714 int len = pprefix->max_len + strlen (name) + 1;
716 if (debug)
717 fprintf (stderr, "Looking for '%s'\n", name);
719 #ifdef HOST_EXECUTABLE_SUFFIX
720 len += strlen (HOST_EXECUTABLE_SUFFIX);
721 #endif
723 temp = XNEWVEC (char, len);
725 /* Determine the filename to execute (special case for absolute paths). */
727 if (IS_ABSOLUTE_PATH (name))
729 if (access (name, X_OK) == 0)
731 strcpy (temp, name);
733 if (debug)
734 fprintf (stderr, " - found: absolute path\n");
736 return temp;
739 #ifdef HOST_EXECUTABLE_SUFFIX
740 /* Some systems have a suffix for executable files.
741 So try appending that. */
742 strcpy (temp, name);
743 strcat (temp, HOST_EXECUTABLE_SUFFIX);
745 if (access (temp, X_OK) == 0)
746 return temp;
747 #endif
749 if (debug)
750 fprintf (stderr, " - failed to locate using absolute path\n");
752 else
753 for (pl = pprefix->plist; pl; pl = pl->next)
755 struct stat st;
757 strcpy (temp, pl->prefix);
758 strcat (temp, name);
760 if (stat (temp, &st) >= 0
761 && ! S_ISDIR (st.st_mode)
762 && access (temp, X_OK) == 0)
763 return temp;
765 #ifdef HOST_EXECUTABLE_SUFFIX
766 /* Some systems have a suffix for executable files.
767 So try appending that. */
768 strcat (temp, HOST_EXECUTABLE_SUFFIX);
770 if (stat (temp, &st) >= 0
771 && ! S_ISDIR (st.st_mode)
772 && access (temp, X_OK) == 0)
773 return temp;
774 #endif
777 if (debug && pprefix->plist == NULL)
778 fprintf (stderr, " - failed: no entries in prefix list\n");
780 free (temp);
781 return 0;
784 /* Add an entry for PREFIX to prefix list PPREFIX. */
786 static void
787 add_prefix (struct path_prefix *pprefix, const char *prefix)
789 struct prefix_list *pl, **prev;
790 int len;
792 if (pprefix->plist)
794 for (pl = pprefix->plist; pl->next; pl = pl->next)
796 prev = &pl->next;
798 else
799 prev = &pprefix->plist;
801 /* Keep track of the longest prefix. */
803 len = strlen (prefix);
804 if (len > pprefix->max_len)
805 pprefix->max_len = len;
807 pl = XNEW (struct prefix_list);
808 pl->prefix = xstrdup (prefix);
810 if (*prev)
811 pl->next = *prev;
812 else
813 pl->next = (struct prefix_list *) 0;
814 *prev = pl;
817 /* Take the value of the environment variable ENV, break it into a path, and
818 add of the entries to PPREFIX. */
820 static void
821 prefix_from_env (const char *env, struct path_prefix *pprefix)
823 const char *p;
824 GET_ENVIRONMENT (p, env);
826 if (p)
827 prefix_from_string (p, pprefix);
830 static void
831 prefix_from_string (const char *p, struct path_prefix *pprefix)
833 const char *startp, *endp;
834 char *nstore = XNEWVEC (char, strlen (p) + 3);
836 if (debug)
837 fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR);
839 startp = endp = p;
840 while (1)
842 if (*endp == PATH_SEPARATOR || *endp == 0)
844 strncpy (nstore, startp, endp-startp);
845 if (endp == startp)
847 strcpy (nstore, "./");
849 else if (! IS_DIR_SEPARATOR (endp[-1]))
851 nstore[endp-startp] = DIR_SEPARATOR;
852 nstore[endp-startp+1] = 0;
854 else
855 nstore[endp-startp] = 0;
857 if (debug)
858 fprintf (stderr, " - add prefix: %s\n", nstore);
860 add_prefix (pprefix, nstore);
861 if (*endp == 0)
862 break;
863 endp = startp = endp + 1;
865 else
866 endp++;
868 free (nstore);
871 #ifdef OBJECT_FORMAT_NONE
873 /* Add an entry for the object file NAME to object file list LIST.
874 New entries are added at the end of the list. The original pointer
875 value of NAME is preserved, i.e., no string copy is performed. */
877 static void
878 add_lto_object (struct lto_object_list *list, const char *name)
880 struct lto_object *n = XNEW (struct lto_object);
881 n->name = name;
882 n->next = NULL;
884 if (list->last)
885 list->last->next = n;
886 else
887 list->first = n;
889 list->last = n;
891 #endif /* OBJECT_FORMAT_NONE */
894 /* Perform a link-time recompilation and relink if any of the object
895 files contain LTO info. The linker command line LTO_LD_ARGV
896 represents the linker command that would produce a final executable
897 without the use of LTO. OBJECT_LST is a vector of object file names
898 appearing in LTO_LD_ARGV that are to be considerd for link-time
899 recompilation, where OBJECT is a pointer to the last valid element.
900 (This awkward convention avoids an impedance mismatch with the
901 usage of similarly-named variables in main().) The elements of
902 OBJECT_LST must be identical, i.e., pointer equal, to the
903 corresponding arguments in LTO_LD_ARGV.
905 Upon entry, at least one linker run has been performed without the
906 use of any LTO info that might be present. Any recompilations
907 necessary for template instantiations have been performed, and
908 initializer/finalizer tables have been created if needed and
909 included in the linker command line LTO_LD_ARGV. If any of the
910 object files contain LTO info, we run the LTO back end on all such
911 files, and perform the final link with the LTO back end output
912 substituted for the LTO-optimized files. In some cases, a final
913 link with all link-time generated code has already been performed,
914 so there is no need to relink if no LTO info is found. In other
915 cases, our caller has not produced the final executable, and is
916 relying on us to perform the required link whether LTO info is
917 present or not. In that case, the FORCE argument should be true.
918 Note that the linker command line argument LTO_LD_ARGV passed into
919 this function may be modified in place. */
921 static void
922 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
923 const char **object, bool force)
925 const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
927 int num_lto_c_args = 1; /* Allow space for the terminating NULL. */
929 while (object_file < object)
931 /* If file contains LTO info, add it to the list of LTO objects. */
932 scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
934 /* Increment the argument count by the number of object file arguments
935 we will add. An upper bound suffices, so just count all of the
936 object files regardless of whether they contain LTO info. */
937 num_lto_c_args++;
940 if (lto_objects.first)
942 const char *opts;
943 char **lto_c_argv;
944 const char **lto_c_ptr;
945 const char *cp;
946 const char **p, **q, **r;
947 const char **lto_o_ptr;
948 struct lto_object *list;
949 char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
950 struct pex_obj *pex;
951 const char *prog = "lto-wrapper";
953 if (!lto_wrapper)
954 fatal ("COLLECT_LTO_WRAPPER must be set.");
956 /* There is at least one object file containing LTO info,
957 so we need to run the LTO back end and relink. */
959 /* Get compiler options passed down from the parent `gcc' command.
960 These must be passed to the LTO back end. */
961 opts = getenv ("COLLECT_GCC_OPTIONS");
963 /* Increment the argument count by the number of inherited options.
964 Some arguments may be filtered out later. Again, an upper bound
965 suffices. */
967 cp = opts;
969 while (cp && *cp)
971 extract_string (&cp);
972 num_lto_c_args++;
974 obstack_free (&temporary_obstack, temporary_firstobj);
976 if (debug)
977 num_lto_c_args++;
979 /* Increment the argument count by the number of initial
980 arguments added below. */
981 num_lto_c_args += 9;
983 lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
984 lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
986 *lto_c_ptr++ = lto_wrapper;
987 *lto_c_ptr++ = c_file_name;
989 cp = opts;
991 while (cp && *cp)
993 const char *s = extract_string (&cp);
995 /* Pass the option or argument to the wrapper. */
996 *lto_c_ptr++ = xstrdup (s);
998 obstack_free (&temporary_obstack, temporary_firstobj);
1000 if (debug)
1001 *lto_c_ptr++ = xstrdup ("-debug");
1003 /* Add LTO objects to the wrapper command line. */
1004 for (list = lto_objects.first; list; list = list->next)
1005 *lto_c_ptr++ = list->name;
1007 *lto_c_ptr = NULL;
1009 /* Save intermediate WPA files in lto1 if debug. */
1010 if (debug)
1011 putenv (xstrdup ("WPA_SAVE_LTRANS=1"));
1013 /* Run the LTO back end. */
1014 pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
1016 int c;
1017 FILE *stream;
1018 size_t i, num_files;
1019 char *start, *end;
1021 stream = pex_read_output (pex, 0);
1022 gcc_assert (stream);
1024 num_files = 0;
1025 while ((c = getc (stream)) != EOF)
1027 obstack_1grow (&temporary_obstack, c);
1028 if (c == '\n')
1029 ++num_files;
1032 lto_o_files = XNEWVEC (char *, num_files + 1);
1033 lto_o_files[num_files] = NULL;
1034 start = XOBFINISH (&temporary_obstack, char *);
1035 for (i = 0; i < num_files; ++i)
1037 end = start;
1038 while (*end != '\n')
1039 ++end;
1040 *end = '\0';
1042 lto_o_files[i] = xstrdup (start);
1044 start = end + 1;
1047 obstack_free (&temporary_obstack, temporary_firstobj);
1049 do_wait (prog, pex);
1050 pex = NULL;
1052 /* After running the LTO back end, we will relink, substituting
1053 the LTO output for the object files that we submitted to the
1054 LTO. Here, we modify the linker command line for the relink. */
1055 p = CONST_CAST2 (const char **, char **, lto_ld_argv);
1056 lto_o_ptr = CONST_CAST2 (const char **, char **, lto_o_files);
1058 while (*p != NULL)
1060 for (list = lto_objects.first; list; list = list->next)
1062 if (*p == list->name) /* Note test for pointer equality! */
1064 /* Excise argument from linker command line. */
1065 if (*lto_o_ptr)
1067 /* Replace first argument with LTO output file. */
1068 *p++ = *lto_o_ptr++;
1070 else
1072 /* Move following arguments one position earlier,
1073 overwriting the current argument. */
1074 q = p;
1075 r = p + 1;
1076 while (*r != NULL)
1077 *q++ = *r++;
1078 *q = NULL;
1081 /* No need to continue searching the LTO object list. */
1082 break;
1086 /* If we didn't find a match, move on to the next argument.
1087 Otherwise, P has been set to the correct argument position
1088 at which to continue. */
1089 if (!list) ++p;
1092 /* The code above assumes we will never have more lto output files than
1093 input files. Otherwise, we need to resize lto_ld_argv. Check this
1094 assumption. */
1095 if (*lto_o_ptr)
1096 fatal ("too many lto output files");
1098 /* Run the linker again, this time replacing the object files
1099 optimized by the LTO with the temporary file generated by the LTO. */
1100 fork_execute ("ld", lto_ld_argv);
1102 maybe_unlink_list (lto_o_files);
1104 else if (force)
1106 /* Our caller is relying on us to do the link
1107 even though there is no LTO back end work to be done. */
1108 fork_execute ("ld", lto_ld_argv);
1112 /* Main program. */
1115 main (int argc, char **argv)
1117 static const char *const ld_suffix = "ld";
1118 static const char *const plugin_ld_suffix = PLUGIN_LD;
1119 static const char *const real_ld_suffix = "real-ld";
1120 static const char *const collect_ld_suffix = "collect-ld";
1121 static const char *const nm_suffix = "nm";
1122 static const char *const gnm_suffix = "gnm";
1123 #ifdef LDD_SUFFIX
1124 static const char *const ldd_suffix = LDD_SUFFIX;
1125 #endif
1126 static const char *const strip_suffix = "strip";
1127 static const char *const gstrip_suffix = "gstrip";
1129 #ifdef CROSS_DIRECTORY_STRUCTURE
1130 /* If we look for a program in the compiler directories, we just use
1131 the short name, since these directories are already system-specific.
1132 But it we look for a program in the system directories, we need to
1133 qualify the program name with the target machine. */
1135 const char *const full_ld_suffix =
1136 concat(target_machine, "-", ld_suffix, NULL);
1137 const char *const full_plugin_ld_suffix =
1138 concat(target_machine, "-", plugin_ld_suffix, NULL);
1139 const char *const full_nm_suffix =
1140 concat (target_machine, "-", nm_suffix, NULL);
1141 const char *const full_gnm_suffix =
1142 concat (target_machine, "-", gnm_suffix, NULL);
1143 #ifdef LDD_SUFFIX
1144 const char *const full_ldd_suffix =
1145 concat (target_machine, "-", ldd_suffix, NULL);
1146 #endif
1147 const char *const full_strip_suffix =
1148 concat (target_machine, "-", strip_suffix, NULL);
1149 const char *const full_gstrip_suffix =
1150 concat (target_machine, "-", gstrip_suffix, NULL);
1151 #else
1152 const char *const full_ld_suffix = ld_suffix;
1153 const char *const full_plugin_ld_suffix = plugin_ld_suffix;
1154 const char *const full_nm_suffix = nm_suffix;
1155 const char *const full_gnm_suffix = gnm_suffix;
1156 #ifdef LDD_SUFFIX
1157 const char *const full_ldd_suffix = ldd_suffix;
1158 #endif
1159 const char *const full_strip_suffix = strip_suffix;
1160 const char *const full_gstrip_suffix = gstrip_suffix;
1161 #endif /* CROSS_DIRECTORY_STRUCTURE */
1163 const char *arg;
1164 FILE *outf;
1165 #ifdef COLLECT_EXPORT_LIST
1166 FILE *exportf;
1167 #endif
1168 const char *ld_file_name;
1169 const char *p;
1170 char **c_argv;
1171 const char **c_ptr;
1172 char **ld1_argv;
1173 const char **ld1;
1174 bool use_plugin = false;
1176 /* The kinds of symbols we will have to consider when scanning the
1177 outcome of a first pass link. This is ALL to start with, then might
1178 be adjusted before getting to the first pass link per se, typically on
1179 AIX where we perform an early scan of objects and libraries to fetch
1180 the list of global ctors/dtors and make sure they are not garbage
1181 collected. */
1182 scanfilter ld1_filter = SCAN_ALL;
1184 char **ld2_argv;
1185 const char **ld2;
1186 char **object_lst;
1187 const char **object;
1188 int first_file;
1189 int num_c_args;
1190 char **old_argv;
1192 bool use_verbose = false;
1194 old_argv = argv;
1195 expandargv (&argc, &argv);
1196 if (argv != old_argv)
1197 at_file_supplied = 1;
1199 num_c_args = argc + 9;
1201 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
1203 /* Suppress demangling by the real linker, which may be broken. */
1204 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1206 #if defined (COLLECT2_HOST_INITIALIZATION)
1207 /* Perform system dependent initialization, if necessary. */
1208 COLLECT2_HOST_INITIALIZATION;
1209 #endif
1211 #ifdef SIGCHLD
1212 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1213 receive the signal. A different setting is inheritable */
1214 signal (SIGCHLD, SIG_DFL);
1215 #endif
1217 /* Unlock the stdio streams. */
1218 unlock_std_streams ();
1220 gcc_init_libintl ();
1222 /* Do not invoke xcalloc before this point, since locale needs to be
1223 set first, in case a diagnostic is issued. */
1225 ld1_argv = XCNEWVEC (char *, argc + 4);
1226 ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
1227 ld2_argv = XCNEWVEC (char *, argc + 11);
1228 ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
1229 object_lst = XCNEWVEC (char *, argc);
1230 object = CONST_CAST2 (const char **, char **, object_lst);
1232 #ifdef DEBUG
1233 debug = 1;
1234 #endif
1236 /* Parse command line early for instances of -debug. This allows
1237 the debug flag to be set before functions like find_a_file()
1238 are called. We also look for the -flto or -fwhopr flag to know
1239 what LTO mode we are in. */
1241 int i;
1243 for (i = 1; argv[i] != NULL; i ++)
1245 if (! strcmp (argv[i], "-debug"))
1246 debug = 1;
1247 else if (! strcmp (argv[i], "-flto") && ! use_plugin)
1249 use_verbose = true;
1250 lto_mode = LTO_MODE_LTO;
1252 else if (! strcmp (argv[i], "-fwhopr") && ! use_plugin)
1254 use_verbose = true;
1255 lto_mode = LTO_MODE_WHOPR;
1257 else if (! strcmp (argv[i], "-plugin"))
1259 use_plugin = true;
1260 use_verbose = true;
1261 lto_mode = LTO_MODE_NONE;
1263 #ifdef COLLECT_EXPORT_LIST
1264 /* since -brtl, -bexport, -b64 are not position dependent
1265 also check for them here */
1266 if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1268 arg = argv[i];
1269 /* We want to disable automatic exports on AIX when user
1270 explicitly puts an export list in command line */
1271 if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1272 export_flag = 1;
1273 else if (arg[2] == '6' && arg[3] == '4')
1274 aix64_flag = 1;
1275 else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1276 aixrtl_flag = 1;
1278 #endif
1280 vflag = debug;
1283 #ifndef DEFAULT_A_OUT_NAME
1284 output_file = "a.out";
1285 #else
1286 output_file = DEFAULT_A_OUT_NAME;
1287 #endif
1289 obstack_begin (&temporary_obstack, 0);
1290 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1292 #ifndef HAVE_LD_DEMANGLE
1293 current_demangling_style = auto_demangling;
1294 #endif
1295 p = getenv ("COLLECT_GCC_OPTIONS");
1296 while (p && *p)
1298 const char *q = extract_string (&p);
1299 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1300 num_c_args++;
1302 obstack_free (&temporary_obstack, temporary_firstobj);
1304 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1305 -fno-exceptions -w -fno-whole-program */
1306 num_c_args += 6;
1308 c_argv = XCNEWVEC (char *, num_c_args);
1309 c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1311 if (argc < 2)
1312 fatal ("no arguments");
1314 #ifdef SIGQUIT
1315 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1316 signal (SIGQUIT, handler);
1317 #endif
1318 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1319 signal (SIGINT, handler);
1320 #ifdef SIGALRM
1321 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1322 signal (SIGALRM, handler);
1323 #endif
1324 #ifdef SIGHUP
1325 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1326 signal (SIGHUP, handler);
1327 #endif
1328 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1329 signal (SIGSEGV, handler);
1330 #ifdef SIGBUS
1331 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1332 signal (SIGBUS, handler);
1333 #endif
1335 /* Extract COMPILER_PATH and PATH into our prefix list. */
1336 prefix_from_env ("COMPILER_PATH", &cpath);
1337 prefix_from_env ("PATH", &path);
1339 /* Try to discover a valid linker/nm/strip to use. */
1341 /* Maybe we know the right file to use (if not cross). */
1342 ld_file_name = 0;
1343 #ifdef DEFAULT_LINKER
1344 if (access (DEFAULT_LINKER, X_OK) == 0)
1345 ld_file_name = DEFAULT_LINKER;
1346 if (ld_file_name == 0)
1347 #endif
1348 #ifdef REAL_LD_FILE_NAME
1349 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1350 if (ld_file_name == 0)
1351 #endif
1352 /* Search the (target-specific) compiler dirs for ld'. */
1353 ld_file_name = find_a_file (&cpath, real_ld_suffix);
1354 /* Likewise for `collect-ld'. */
1355 if (ld_file_name == 0)
1356 ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1357 /* Search the compiler directories for `ld'. We have protection against
1358 recursive calls in find_a_file. */
1359 if (ld_file_name == 0)
1360 ld_file_name = find_a_file (&cpath,
1361 use_plugin
1362 ? plugin_ld_suffix
1363 : ld_suffix);
1364 /* Search the ordinary system bin directories
1365 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1366 if (ld_file_name == 0)
1367 ld_file_name = find_a_file (&path,
1368 use_plugin
1369 ? full_plugin_ld_suffix
1370 : full_ld_suffix);
1372 #ifdef REAL_NM_FILE_NAME
1373 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1374 if (nm_file_name == 0)
1375 #endif
1376 nm_file_name = find_a_file (&cpath, gnm_suffix);
1377 if (nm_file_name == 0)
1378 nm_file_name = find_a_file (&path, full_gnm_suffix);
1379 if (nm_file_name == 0)
1380 nm_file_name = find_a_file (&cpath, nm_suffix);
1381 if (nm_file_name == 0)
1382 nm_file_name = find_a_file (&path, full_nm_suffix);
1384 #ifdef LDD_SUFFIX
1385 ldd_file_name = find_a_file (&cpath, ldd_suffix);
1386 if (ldd_file_name == 0)
1387 ldd_file_name = find_a_file (&path, full_ldd_suffix);
1388 #endif
1390 #ifdef REAL_STRIP_FILE_NAME
1391 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1392 if (strip_file_name == 0)
1393 #endif
1394 strip_file_name = find_a_file (&cpath, gstrip_suffix);
1395 if (strip_file_name == 0)
1396 strip_file_name = find_a_file (&path, full_gstrip_suffix);
1397 if (strip_file_name == 0)
1398 strip_file_name = find_a_file (&cpath, strip_suffix);
1399 if (strip_file_name == 0)
1400 strip_file_name = find_a_file (&path, full_strip_suffix);
1402 /* Determine the full path name of the C compiler to use. */
1403 c_file_name = getenv ("COLLECT_GCC");
1404 if (c_file_name == 0)
1406 #ifdef CROSS_DIRECTORY_STRUCTURE
1407 c_file_name = concat (target_machine, "-gcc", NULL);
1408 #else
1409 c_file_name = "gcc";
1410 #endif
1413 p = find_a_file (&cpath, c_file_name);
1415 /* Here it should be safe to use the system search path since we should have
1416 already qualified the name of the compiler when it is needed. */
1417 if (p == 0)
1418 p = find_a_file (&path, c_file_name);
1420 if (p)
1421 c_file_name = p;
1423 *ld1++ = *ld2++ = ld_file_name;
1425 /* Make temp file names. */
1426 c_file = make_temp_file (".c");
1427 o_file = make_temp_file (".o");
1428 #ifdef COLLECT_EXPORT_LIST
1429 export_file = make_temp_file (".x");
1430 #endif
1431 ldout = make_temp_file (".ld");
1432 lderrout = make_temp_file (".le");
1433 *c_ptr++ = c_file_name;
1434 *c_ptr++ = "-x";
1435 *c_ptr++ = "c";
1436 *c_ptr++ = "-c";
1437 *c_ptr++ = "-o";
1438 *c_ptr++ = o_file;
1440 #ifdef COLLECT_EXPORT_LIST
1441 /* Generate a list of directories from LIBPATH. */
1442 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1443 /* Add to this list also two standard directories where
1444 AIX loader always searches for libraries. */
1445 add_prefix (&libpath_lib_dirs, "/lib");
1446 add_prefix (&libpath_lib_dirs, "/usr/lib");
1447 #endif
1449 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1451 AIX support needs to know if -shared has been specified before
1452 parsing commandline arguments. */
1454 p = getenv ("COLLECT_GCC_OPTIONS");
1455 while (p && *p)
1457 const char *q = extract_string (&p);
1458 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1459 *c_ptr++ = xstrdup (q);
1460 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1461 *c_ptr++ = xstrdup (q);
1462 if (strcmp (q, "-shared") == 0)
1463 shared_obj = 1;
1464 if (*q == '-' && q[1] == 'B')
1466 *c_ptr++ = xstrdup (q);
1467 if (q[2] == 0)
1469 q = extract_string (&p);
1470 *c_ptr++ = xstrdup (q);
1473 if (use_verbose && *q == '-' && q[1] == 'v' && q[2] == 0)
1475 /* Turn on trace in collect2 if needed. */
1476 vflag = 1;
1479 obstack_free (&temporary_obstack, temporary_firstobj);
1480 *c_ptr++ = "-fno-profile-arcs";
1481 *c_ptr++ = "-fno-test-coverage";
1482 *c_ptr++ = "-fno-branch-probabilities";
1483 *c_ptr++ = "-fno-exceptions";
1484 *c_ptr++ = "-w";
1485 *c_ptr++ = "-fno-whole-program";
1487 /* !!! When GCC calls collect2,
1488 it does not know whether it is calling collect2 or ld.
1489 So collect2 cannot meaningfully understand any options
1490 except those ld understands.
1491 If you propose to make GCC pass some other option,
1492 just imagine what will happen if ld is really ld!!! */
1494 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1495 /* After the first file, put in the c++ rt0. */
1497 first_file = 1;
1498 #ifdef HAVE_LD_DEMANGLE
1499 if (!demangle_flag && !no_demangle)
1500 demangle_flag = "--demangle";
1501 if (demangle_flag)
1502 *ld1++ = *ld2++ = demangle_flag;
1503 #endif
1504 while ((arg = *++argv) != (char *) 0)
1506 *ld1++ = *ld2++ = arg;
1508 if (arg[0] == '-')
1510 switch (arg[1])
1512 case 'd':
1513 if (!strcmp (arg, "-debug"))
1515 /* Already parsed. */
1516 ld1--;
1517 ld2--;
1519 if (!strcmp (arg, "-dynamic-linker") && argv[1])
1521 ++argv;
1522 *ld1++ = *ld2++ = *argv;
1524 break;
1526 case 'f':
1527 if (strcmp (arg, "-flto") == 0 || strcmp (arg, "-fwhopr") == 0)
1529 #ifdef ENABLE_LTO
1530 /* Do not pass LTO flag to the linker. */
1531 ld1--;
1532 ld2--;
1533 #else
1534 error ("LTO support has not been enabled in this "
1535 "configuration");
1536 #endif
1538 break;
1540 case 'l':
1541 if (first_file)
1543 /* place o_file BEFORE this argument! */
1544 first_file = 0;
1545 ld2--;
1546 *ld2++ = o_file;
1547 *ld2++ = arg;
1549 #ifdef COLLECT_EXPORT_LIST
1551 /* Resolving full library name. */
1552 const char *s = resolve_lib_name (arg+2);
1554 /* Saving a full library name. */
1555 add_to_list (&libs, s);
1557 #endif
1558 break;
1560 #ifdef COLLECT_EXPORT_LIST
1561 /* Saving directories where to search for libraries. */
1562 case 'L':
1563 add_prefix (&cmdline_lib_dirs, arg+2);
1564 break;
1565 #else
1566 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1567 case 'L':
1568 if (is_in_args (arg,
1569 CONST_CAST2 (const char **, char **, ld1_argv),
1570 ld1 - 1))
1571 --ld1;
1572 break;
1573 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1574 #endif
1576 case 'o':
1577 if (arg[2] == '\0')
1578 output_file = *ld1++ = *ld2++ = *++argv;
1579 else if (1
1580 #ifdef SWITCHES_NEED_SPACES
1581 && ! strchr (SWITCHES_NEED_SPACES, arg[1])
1582 #endif
1585 output_file = &arg[2];
1586 break;
1588 case 'r':
1589 if (arg[2] == '\0')
1590 rflag = 1;
1591 break;
1593 case 's':
1594 if (arg[2] == '\0' && do_collecting)
1596 /* We must strip after the nm run, otherwise C++ linking
1597 will not work. Thus we strip in the second ld run, or
1598 else with strip if there is no second ld run. */
1599 strip_flag = 1;
1600 ld1--;
1602 break;
1604 case 'v':
1605 if (arg[2] == '\0')
1606 vflag = 1;
1607 break;
1609 case '-':
1610 if (strcmp (arg, "--no-demangle") == 0)
1612 demangle_flag = arg;
1613 no_demangle = 1;
1614 ld1--;
1615 ld2--;
1617 else if (strncmp (arg, "--demangle", 10) == 0)
1619 demangle_flag = arg;
1620 no_demangle = 0;
1621 #ifndef HAVE_LD_DEMANGLE
1622 if (arg[10] == '=')
1624 enum demangling_styles style
1625 = cplus_demangle_name_to_style (arg+11);
1626 if (style == unknown_demangling)
1627 error ("unknown demangling style '%s'", arg+11);
1628 else
1629 current_demangling_style = style;
1631 #endif
1632 ld1--;
1633 ld2--;
1635 else if (strncmp (arg, "--sysroot=", 10) == 0)
1636 target_system_root = arg + 10;
1637 break;
1640 else if ((p = strrchr (arg, '.')) != (char *) 0
1641 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1642 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1643 || strcmp (p, ".obj") == 0))
1645 if (first_file)
1647 first_file = 0;
1648 if (p[1] == 'o')
1649 *ld2++ = o_file;
1650 else
1652 /* place o_file BEFORE this argument! */
1653 ld2--;
1654 *ld2++ = o_file;
1655 *ld2++ = arg;
1658 if (p[1] == 'o' || p[1] == 'l')
1659 *object++ = arg;
1660 #ifdef COLLECT_EXPORT_LIST
1661 /* libraries can be specified directly, i.e. without -l flag. */
1662 else
1664 /* Saving a full library name. */
1665 add_to_list (&libs, arg);
1667 #endif
1671 #ifdef COLLECT_EXPORT_LIST
1672 /* This is added only for debugging purposes. */
1673 if (debug)
1675 fprintf (stderr, "List of libraries:\n");
1676 dump_list (stderr, "\t", libs.first);
1679 /* The AIX linker will discard static constructors in object files if
1680 nothing else in the file is referenced, so look at them first. Unless
1681 we are building a shared object, ignore the eh frame tables, as we
1682 would otherwise reference them all, hence drag all the corresponding
1683 objects even if nothing else is referenced. */
1685 const char **export_object_lst
1686 = CONST_CAST2 (const char **, char **, object_lst);
1688 struct id *list = libs.first;
1690 /* Compute the filter to use from the current one, do scan, then adjust
1691 the "current" filter to remove what we just included here. This will
1692 control whether we need a first pass link later on or not, and what
1693 will remain to be scanned there. */
1695 scanfilter this_filter = ld1_filter;
1696 #if HAVE_AS_REF
1697 if (!shared_obj)
1698 this_filter &= ~SCAN_DWEH;
1699 #endif
1701 while (export_object_lst < object)
1702 scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1704 for (; list; list = list->next)
1705 scan_prog_file (list->name, PASS_FIRST, this_filter);
1707 ld1_filter = ld1_filter & ~this_filter;
1710 if (exports.first)
1712 char *buf = concat ("-bE:", export_file, NULL);
1714 *ld1++ = buf;
1715 *ld2++ = buf;
1717 exportf = fopen (export_file, "w");
1718 if (exportf == (FILE *) 0)
1719 fatal_perror ("fopen %s", export_file);
1720 write_aix_file (exportf, exports.first);
1721 if (fclose (exportf))
1722 fatal_perror ("fclose %s", export_file);
1724 #endif
1726 *c_ptr++ = c_file;
1727 *c_ptr = *ld1 = *object = (char *) 0;
1729 if (vflag)
1731 notice ("collect2 version %s", version_string);
1732 #ifdef TARGET_VERSION
1733 TARGET_VERSION;
1734 #endif
1735 fprintf (stderr, "\n");
1738 if (debug)
1740 const char *ptr;
1741 fprintf (stderr, "ld_file_name = %s\n",
1742 (ld_file_name ? ld_file_name : "not found"));
1743 fprintf (stderr, "c_file_name = %s\n",
1744 (c_file_name ? c_file_name : "not found"));
1745 fprintf (stderr, "nm_file_name = %s\n",
1746 (nm_file_name ? nm_file_name : "not found"));
1747 #ifdef LDD_SUFFIX
1748 fprintf (stderr, "ldd_file_name = %s\n",
1749 (ldd_file_name ? ldd_file_name : "not found"));
1750 #endif
1751 fprintf (stderr, "strip_file_name = %s\n",
1752 (strip_file_name ? strip_file_name : "not found"));
1753 fprintf (stderr, "c_file = %s\n",
1754 (c_file ? c_file : "not found"));
1755 fprintf (stderr, "o_file = %s\n",
1756 (o_file ? o_file : "not found"));
1758 ptr = getenv ("COLLECT_GCC_OPTIONS");
1759 if (ptr)
1760 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1762 ptr = getenv ("COLLECT_GCC");
1763 if (ptr)
1764 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1766 ptr = getenv ("COMPILER_PATH");
1767 if (ptr)
1768 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1770 ptr = getenv (LIBRARY_PATH_ENV);
1771 if (ptr)
1772 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1774 fprintf (stderr, "\n");
1777 /* Load the program, searching all libraries and attempting to provide
1778 undefined symbols from repository information.
1780 If -r or they will be run via some other method, do not build the
1781 constructor or destructor list, just return now. */
1783 bool early_exit
1784 = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1786 /* Perform the first pass link now, if we're about to exit or if we need
1787 to scan for things we haven't collected yet before pursuing further.
1789 On AIX, the latter typically includes nothing for shared objects or
1790 frame tables for an executable, out of what the required early scan on
1791 objects and libraries has performed above. In the !shared_obj case, we
1792 expect the relevant tables to be dragged together with their associated
1793 functions from precise cross reference insertions by the compiler. */
1795 if (early_exit || ld1_filter != SCAN_NOTHING)
1796 do_tlink (ld1_argv, object_lst);
1798 if (early_exit)
1800 #ifdef COLLECT_EXPORT_LIST
1801 /* Make sure we delete the export file we may have created. */
1802 if (export_file != 0 && export_file[0])
1803 maybe_unlink (export_file);
1804 #endif
1805 if (lto_mode != LTO_MODE_NONE)
1806 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1808 maybe_unlink (c_file);
1809 maybe_unlink (o_file);
1810 return 0;
1814 /* Unless we have done it all already, examine the namelist and search for
1815 static constructors and destructors to call. Write the constructor and
1816 destructor tables to a .s file and reload. */
1818 if (ld1_filter != SCAN_NOTHING)
1819 scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1821 #ifdef SCAN_LIBRARIES
1822 scan_libraries (output_file);
1823 #endif
1825 if (debug)
1827 notice_translated (ngettext ("%d constructor found\n",
1828 "%d constructors found\n",
1829 constructors.number),
1830 constructors.number);
1831 notice_translated (ngettext ("%d destructor found\n",
1832 "%d destructors found\n",
1833 destructors.number),
1834 destructors.number);
1835 notice_translated (ngettext("%d frame table found\n",
1836 "%d frame tables found\n",
1837 frame_tables.number),
1838 frame_tables.number);
1841 /* If the scan exposed nothing of special interest, there's no need to
1842 generate the glue code and relink so return now. */
1844 if (constructors.number == 0 && destructors.number == 0
1845 && frame_tables.number == 0
1846 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1847 /* If we will be running these functions ourselves, we want to emit
1848 stubs into the shared library so that we do not have to relink
1849 dependent programs when we add static objects. */
1850 && ! shared_obj
1851 #endif
1854 /* Do tlink without additional code generation now if we didn't
1855 do it earlier for scanning purposes. */
1856 if (ld1_filter == SCAN_NOTHING)
1857 do_tlink (ld1_argv, object_lst);
1859 if (lto_mode)
1860 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1862 /* Strip now if it was requested on the command line. */
1863 if (strip_flag)
1865 char **real_strip_argv = XCNEWVEC (char *, 3);
1866 const char ** strip_argv = CONST_CAST2 (const char **, char **,
1867 real_strip_argv);
1869 strip_argv[0] = strip_file_name;
1870 strip_argv[1] = output_file;
1871 strip_argv[2] = (char *) 0;
1872 fork_execute ("strip", real_strip_argv);
1875 #ifdef COLLECT_EXPORT_LIST
1876 maybe_unlink (export_file);
1877 #endif
1878 maybe_unlink (c_file);
1879 maybe_unlink (o_file);
1880 return 0;
1883 /* Sort ctor and dtor lists by priority. */
1884 sort_ids (&constructors);
1885 sort_ids (&destructors);
1887 maybe_unlink(output_file);
1888 outf = fopen (c_file, "w");
1889 if (outf == (FILE *) 0)
1890 fatal_perror ("fopen %s", c_file);
1892 write_c_file (outf, c_file);
1894 if (fclose (outf))
1895 fatal_perror ("fclose %s", c_file);
1897 /* Tell the linker that we have initializer and finalizer functions. */
1898 #ifdef LD_INIT_SWITCH
1899 #ifdef COLLECT_EXPORT_LIST
1900 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1901 #else
1902 *ld2++ = LD_INIT_SWITCH;
1903 *ld2++ = initname;
1904 *ld2++ = LD_FINI_SWITCH;
1905 *ld2++ = fininame;
1906 #endif
1907 #endif
1909 #ifdef COLLECT_EXPORT_LIST
1910 if (shared_obj)
1912 /* If we did not add export flag to link arguments before, add it to
1913 second link phase now. No new exports should have been added. */
1914 if (! exports.first)
1915 *ld2++ = concat ("-bE:", export_file, NULL);
1917 #ifndef LD_INIT_SWITCH
1918 add_to_list (&exports, initname);
1919 add_to_list (&exports, fininame);
1920 add_to_list (&exports, "_GLOBAL__DI");
1921 add_to_list (&exports, "_GLOBAL__DD");
1922 #endif
1923 exportf = fopen (export_file, "w");
1924 if (exportf == (FILE *) 0)
1925 fatal_perror ("fopen %s", export_file);
1926 write_aix_file (exportf, exports.first);
1927 if (fclose (exportf))
1928 fatal_perror ("fclose %s", export_file);
1930 #endif
1932 /* End of arguments to second link phase. */
1933 *ld2 = (char*) 0;
1935 if (debug)
1937 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1938 output_file, c_file);
1939 write_c_file (stderr, "stderr");
1940 fprintf (stderr, "========== end of c_file\n\n");
1941 #ifdef COLLECT_EXPORT_LIST
1942 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1943 write_aix_file (stderr, exports.first);
1944 fprintf (stderr, "========== end of export_file\n\n");
1945 #endif
1948 /* Assemble the constructor and destructor tables.
1949 Link the tables in with the rest of the program. */
1951 fork_execute ("gcc", c_argv);
1952 #ifdef COLLECT_EXPORT_LIST
1953 /* On AIX we must call tlink because of possible templates resolution. */
1954 do_tlink (ld2_argv, object_lst);
1956 if (lto_mode)
1957 maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1958 #else
1959 /* Otherwise, simply call ld because tlink is already done. */
1960 if (lto_mode)
1961 maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1962 else
1963 fork_execute ("ld", ld2_argv);
1965 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1966 constructors/destructors in shared libraries. */
1967 scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1968 #endif
1970 maybe_unlink (c_file);
1971 maybe_unlink (o_file);
1973 #ifdef COLLECT_EXPORT_LIST
1974 maybe_unlink (export_file);
1975 #endif
1977 return 0;
1981 /* Wait for a process to finish, and exit if a nonzero status is found. */
1984 collect_wait (const char *prog, struct pex_obj *pex)
1986 int status;
1988 if (!pex_get_status (pex, 1, &status))
1989 fatal_perror ("can't get program status");
1990 pex_free (pex);
1992 if (status)
1994 if (WIFSIGNALED (status))
1996 int sig = WTERMSIG (status);
1997 error ("%s terminated with signal %d [%s]%s",
1998 prog, sig, strsignal(sig),
1999 WCOREDUMP(status) ? ", core dumped" : "");
2000 collect_exit (FATAL_EXIT_CODE);
2003 if (WIFEXITED (status))
2004 return WEXITSTATUS (status);
2006 return 0;
2009 static void
2010 do_wait (const char *prog, struct pex_obj *pex)
2012 int ret = collect_wait (prog, pex);
2013 if (ret != 0)
2015 error ("%s returned %d exit status", prog, ret);
2016 collect_exit (ret);
2019 if (response_file)
2021 unlink (response_file);
2022 response_file = NULL;
2027 /* Execute a program, and wait for the reply. */
2029 struct pex_obj *
2030 collect_execute (const char *prog, char **argv, const char *outname,
2031 const char *errname, int flags)
2033 struct pex_obj *pex;
2034 const char *errmsg;
2035 int err;
2036 char *response_arg = NULL;
2037 char *response_argv[3] ATTRIBUTE_UNUSED;
2039 if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
2041 /* If using @file arguments, create a temporary file and put the
2042 contents of argv into it. Then change argv to an array corresponding
2043 to a single argument @FILE, where FILE is the temporary filename. */
2045 char **current_argv = argv + 1;
2046 char *argv0 = argv[0];
2047 int status;
2048 FILE *f;
2050 /* Note: we assume argv contains at least one element; this is
2051 checked above. */
2053 response_file = make_temp_file ("");
2055 f = fopen (response_file, "w");
2057 if (f == NULL)
2058 fatal ("could not open response file %s", response_file);
2060 status = writeargv (current_argv, f);
2062 if (status)
2063 fatal ("could not write to response file %s", response_file);
2065 status = fclose (f);
2067 if (EOF == status)
2068 fatal ("could not close response file %s", response_file);
2070 response_arg = concat ("@", response_file, NULL);
2071 response_argv[0] = argv0;
2072 response_argv[1] = response_arg;
2073 response_argv[2] = NULL;
2075 argv = response_argv;
2078 if (vflag || debug)
2080 char **p_argv;
2081 const char *str;
2083 if (argv[0])
2084 fprintf (stderr, "%s", argv[0]);
2085 else
2086 notice ("[cannot find %s]", prog);
2088 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
2089 fprintf (stderr, " %s", str);
2091 fprintf (stderr, "\n");
2094 fflush (stdout);
2095 fflush (stderr);
2097 /* If we cannot find a program we need, complain error. Do this here
2098 since we might not end up needing something that we could not find. */
2100 if (argv[0] == 0)
2101 fatal ("cannot find '%s'", prog);
2103 pex = pex_init (0, "collect2", NULL);
2104 if (pex == NULL)
2105 fatal_perror ("pex_init failed");
2107 errmsg = pex_run (pex, flags, argv[0], argv, outname,
2108 errname, &err);
2109 if (errmsg != NULL)
2111 if (err != 0)
2113 errno = err;
2114 fatal_perror (errmsg);
2116 else
2117 fatal (errmsg);
2120 if (response_arg)
2121 free (response_arg);
2123 return pex;
2126 static void
2127 fork_execute (const char *prog, char **argv)
2129 struct pex_obj *pex;
2131 pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
2132 do_wait (prog, pex);
2135 /* Unlink a file unless we are debugging. */
2137 static void
2138 maybe_unlink (const char *file)
2140 if (!debug)
2141 unlink_if_ordinary (file);
2142 else
2143 notice ("[Leaving %s]\n", file);
2146 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
2148 static void
2149 maybe_unlink_list (char **file_list)
2151 char **tmp = file_list;
2153 while (*tmp)
2154 maybe_unlink (*(tmp++));
2158 static long sequence_number = 0;
2160 /* Add a name to a linked list. */
2162 static void
2163 add_to_list (struct head *head_ptr, const char *name)
2165 struct id *newid
2166 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
2167 struct id *p;
2168 strcpy (newid->name, name);
2170 if (head_ptr->first)
2171 head_ptr->last->next = newid;
2172 else
2173 head_ptr->first = newid;
2175 /* Check for duplicate symbols. */
2176 for (p = head_ptr->first;
2177 strcmp (name, p->name) != 0;
2178 p = p->next)
2180 if (p != newid)
2182 head_ptr->last->next = 0;
2183 free (newid);
2184 return;
2187 newid->sequence = ++sequence_number;
2188 head_ptr->last = newid;
2189 head_ptr->number++;
2192 /* Grab the init priority number from an init function name that
2193 looks like "_GLOBAL_.I.12345.foo". */
2195 static int
2196 extract_init_priority (const char *name)
2198 int pos = 0, pri;
2200 while (name[pos] == '_')
2201 ++pos;
2202 pos += 10; /* strlen ("GLOBAL__X_") */
2204 /* Extract init_p number from ctor/dtor name. */
2205 pri = atoi (name + pos);
2206 return pri ? pri : DEFAULT_INIT_PRIORITY;
2209 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2210 ctors will be run from right to left, dtors from left to right. */
2212 static void
2213 sort_ids (struct head *head_ptr)
2215 /* id holds the current element to insert. id_next holds the next
2216 element to insert. id_ptr iterates through the already sorted elements
2217 looking for the place to insert id. */
2218 struct id *id, *id_next, **id_ptr;
2220 id = head_ptr->first;
2222 /* We don't have any sorted elements yet. */
2223 head_ptr->first = NULL;
2225 for (; id; id = id_next)
2227 id_next = id->next;
2228 id->sequence = extract_init_priority (id->name);
2230 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2231 if (*id_ptr == NULL
2232 /* If the sequence numbers are the same, we put the id from the
2233 file later on the command line later in the list. */
2234 || id->sequence > (*id_ptr)->sequence
2235 /* Hack: do lexical compare, too.
2236 || (id->sequence == (*id_ptr)->sequence
2237 && strcmp (id->name, (*id_ptr)->name) > 0) */
2240 id->next = *id_ptr;
2241 *id_ptr = id;
2242 break;
2246 /* Now set the sequence numbers properly so write_c_file works. */
2247 for (id = head_ptr->first; id; id = id->next)
2248 id->sequence = ++sequence_number;
2251 /* Write: `prefix', the names on list LIST, `suffix'. */
2253 static void
2254 write_list (FILE *stream, const char *prefix, struct id *list)
2256 while (list)
2258 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2259 list = list->next;
2263 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2264 /* Given a STRING, return nonzero if it occurs in the list in range
2265 [ARGS_BEGIN,ARGS_END). */
2267 static int
2268 is_in_args (const char *string, const char **args_begin,
2269 const char **args_end)
2271 const char **args_pointer;
2272 for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
2273 if (strcmp (string, *args_pointer) == 0)
2274 return 1;
2275 return 0;
2277 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2279 #ifdef COLLECT_EXPORT_LIST
2280 /* This function is really used only on AIX, but may be useful. */
2281 #if 0
2282 static int
2283 is_in_list (const char *prefix, struct id *list)
2285 while (list)
2287 if (!strcmp (prefix, list->name)) return 1;
2288 list = list->next;
2290 return 0;
2292 #endif
2293 #endif /* COLLECT_EXPORT_LIST */
2295 /* Added for debugging purpose. */
2296 #ifdef COLLECT_EXPORT_LIST
2297 static void
2298 dump_list (FILE *stream, const char *prefix, struct id *list)
2300 while (list)
2302 fprintf (stream, "%s%s,\n", prefix, list->name);
2303 list = list->next;
2306 #endif
2308 #if 0
2309 static void
2310 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2312 while (list)
2314 fprintf (stream, "%s%s,\n", prefix, list->prefix);
2315 list = list->next;
2318 #endif
2320 static void
2321 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2323 while (list)
2325 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2326 prefix, list->sequence, list->name);
2327 list = list->next;
2331 /* Write out the constructor and destructor tables statically (for a shared
2332 object), along with the functions to execute them. */
2334 static void
2335 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2337 const char *p, *q;
2338 char *prefix, *r;
2339 int frames = (frame_tables.number > 0);
2341 /* Figure out name of output_file, stripping off .so version. */
2342 p = strrchr (output_file, '/');
2343 if (p == 0)
2344 p = output_file;
2345 else
2346 p++;
2347 q = p;
2348 while (q)
2350 q = strchr (q,'.');
2351 if (q == 0)
2353 q = p + strlen (p);
2354 break;
2356 else
2358 if (strncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2360 q += strlen (SHLIB_SUFFIX);
2361 break;
2363 else
2364 q++;
2367 /* q points to null at end of the string (or . of the .so version) */
2368 prefix = XNEWVEC (char, q - p + 1);
2369 strncpy (prefix, p, q - p);
2370 prefix[q - p] = 0;
2371 for (r = prefix; *r; r++)
2372 if (!ISALNUM ((unsigned char)*r))
2373 *r = '_';
2374 if (debug)
2375 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2376 output_file, prefix);
2378 initname = concat ("_GLOBAL__FI_", prefix, NULL);
2379 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2381 free (prefix);
2383 /* Write the tables as C code. */
2385 fprintf (stream, "static int count;\n");
2386 fprintf (stream, "typedef void entry_pt();\n");
2387 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2389 if (frames)
2391 write_list_with_asm (stream, "extern void *", frame_tables.first);
2393 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2394 write_list (stream, "\t\t&", frame_tables.first);
2395 fprintf (stream, "\t0\n};\n");
2397 /* This must match what's in frame.h. */
2398 fprintf (stream, "struct object {\n");
2399 fprintf (stream, " void *pc_begin;\n");
2400 fprintf (stream, " void *pc_end;\n");
2401 fprintf (stream, " void *fde_begin;\n");
2402 fprintf (stream, " void *fde_array;\n");
2403 fprintf (stream, " __SIZE_TYPE__ count;\n");
2404 fprintf (stream, " struct object *next;\n");
2405 fprintf (stream, "};\n");
2407 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2408 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2410 fprintf (stream, "static void reg_frame () {\n");
2411 fprintf (stream, "\tstatic struct object ob;\n");
2412 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2413 fprintf (stream, "\t}\n");
2415 fprintf (stream, "static void dereg_frame () {\n");
2416 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2417 fprintf (stream, "\t}\n");
2420 fprintf (stream, "void %s() {\n", initname);
2421 if (constructors.number > 0 || frames)
2423 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2424 write_list (stream, "\t\t", constructors.first);
2425 if (frames)
2426 fprintf (stream, "\treg_frame,\n");
2427 fprintf (stream, "\t};\n");
2428 fprintf (stream, "\tentry_pt **p;\n");
2429 fprintf (stream, "\tif (count++ != 0) return;\n");
2430 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2431 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2433 else
2434 fprintf (stream, "\t++count;\n");
2435 fprintf (stream, "}\n");
2436 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2437 fprintf (stream, "void %s() {\n", fininame);
2438 if (destructors.number > 0 || frames)
2440 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2441 write_list (stream, "\t\t", destructors.first);
2442 if (frames)
2443 fprintf (stream, "\tdereg_frame,\n");
2444 fprintf (stream, "\t};\n");
2445 fprintf (stream, "\tentry_pt **p;\n");
2446 fprintf (stream, "\tif (--count != 0) return;\n");
2447 fprintf (stream, "\tp = dtors;\n");
2448 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2449 destructors.number + frames);
2451 fprintf (stream, "}\n");
2453 if (shared_obj)
2455 COLLECT_SHARED_INIT_FUNC(stream, initname);
2456 COLLECT_SHARED_FINI_FUNC(stream, fininame);
2460 /* Write the constructor/destructor tables. */
2462 #ifndef LD_INIT_SWITCH
2463 static void
2464 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2466 /* Write the tables as C code. */
2468 int frames = (frame_tables.number > 0);
2470 fprintf (stream, "typedef void entry_pt();\n\n");
2472 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2474 if (frames)
2476 write_list_with_asm (stream, "extern void *", frame_tables.first);
2478 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2479 write_list (stream, "\t\t&", frame_tables.first);
2480 fprintf (stream, "\t0\n};\n");
2482 /* This must match what's in frame.h. */
2483 fprintf (stream, "struct object {\n");
2484 fprintf (stream, " void *pc_begin;\n");
2485 fprintf (stream, " void *pc_end;\n");
2486 fprintf (stream, " void *fde_begin;\n");
2487 fprintf (stream, " void *fde_array;\n");
2488 fprintf (stream, " __SIZE_TYPE__ count;\n");
2489 fprintf (stream, " struct object *next;\n");
2490 fprintf (stream, "};\n");
2492 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2493 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2495 fprintf (stream, "static void reg_frame () {\n");
2496 fprintf (stream, "\tstatic struct object ob;\n");
2497 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2498 fprintf (stream, "\t}\n");
2500 fprintf (stream, "static void dereg_frame () {\n");
2501 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2502 fprintf (stream, "\t}\n");
2505 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2506 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2507 write_list (stream, "\t", constructors.first);
2508 if (frames)
2509 fprintf (stream, "\treg_frame,\n");
2510 fprintf (stream, "\t0\n};\n\n");
2512 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2514 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2515 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2516 write_list (stream, "\t", destructors.first);
2517 if (frames)
2518 fprintf (stream, "\tdereg_frame,\n");
2519 fprintf (stream, "\t0\n};\n\n");
2521 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2522 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2524 #endif /* ! LD_INIT_SWITCH */
2526 static void
2527 write_c_file (FILE *stream, const char *name)
2529 #ifndef LD_INIT_SWITCH
2530 if (! shared_obj)
2531 write_c_file_glob (stream, name);
2532 else
2533 #endif
2534 write_c_file_stat (stream, name);
2537 #ifdef COLLECT_EXPORT_LIST
2538 static void
2539 write_aix_file (FILE *stream, struct id *list)
2541 for (; list; list = list->next)
2543 fputs (list->name, stream);
2544 putc ('\n', stream);
2547 #endif
2549 #ifdef OBJECT_FORMAT_NONE
2551 /* Check to make sure the file is an LTO object file. */
2553 static bool
2554 maybe_lto_object_file (const char *prog_name)
2556 FILE *f;
2557 unsigned char buf[4];
2558 int i;
2560 static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2561 static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2562 static unsigned char machomagic[4][4] = {
2563 { 0xcf, 0xfa, 0xed, 0xfe },
2564 { 0xce, 0xfa, 0xed, 0xfe },
2565 { 0xfe, 0xed, 0xfa, 0xcf },
2566 { 0xfe, 0xed, 0xfa, 0xce }
2569 f = fopen (prog_name, "rb");
2570 if (f == NULL)
2571 return false;
2572 if (fread (buf, sizeof (buf), 1, f) != 1)
2573 buf[0] = 0;
2574 fclose (f);
2576 if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2577 || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0)
2578 return true;
2579 for (i = 0; i < 4; i++)
2580 if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2581 return true;
2583 return false;
2586 /* Generic version to scan the name list of the loaded program for
2587 the symbols g++ uses for static constructors and destructors. */
2589 static void
2590 scan_prog_file (const char *prog_name, scanpass which_pass,
2591 scanfilter filter)
2593 void (*int_handler) (int);
2594 #ifdef SIGQUIT
2595 void (*quit_handler) (int);
2596 #endif
2597 char *real_nm_argv[4];
2598 const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2599 int argc = 0;
2600 struct pex_obj *pex;
2601 const char *errmsg;
2602 int err;
2603 char *p, buf[1024];
2604 FILE *inf;
2605 int found_lto = 0;
2607 if (which_pass == PASS_SECOND)
2608 return;
2610 /* LTO objects must be in a known format. This check prevents
2611 us from accepting an archive containing LTO objects, which
2612 gcc cannnot currently handle. */
2613 if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2614 return;
2616 /* If we do not have an `nm', complain. */
2617 if (nm_file_name == 0)
2618 fatal ("cannot find 'nm'");
2620 nm_argv[argc++] = nm_file_name;
2621 if (NM_FLAGS[0] != '\0')
2622 nm_argv[argc++] = NM_FLAGS;
2624 nm_argv[argc++] = prog_name;
2625 nm_argv[argc++] = (char *) 0;
2627 /* Trace if needed. */
2628 if (vflag)
2630 const char **p_argv;
2631 const char *str;
2633 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2634 fprintf (stderr, " %s", str);
2636 fprintf (stderr, "\n");
2639 fflush (stdout);
2640 fflush (stderr);
2642 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2643 if (pex == NULL)
2644 fatal_perror ("pex_init failed");
2646 errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2647 &err);
2648 if (errmsg != NULL)
2650 if (err != 0)
2652 errno = err;
2653 fatal_perror (errmsg);
2655 else
2656 fatal (errmsg);
2659 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2660 #ifdef SIGQUIT
2661 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2662 #endif
2664 inf = pex_read_output (pex, 0);
2665 if (inf == NULL)
2666 fatal_perror ("can't open nm output");
2668 if (debug)
2670 if (which_pass == PASS_LTOINFO)
2671 fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2672 else
2673 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2676 /* Read each line of nm output. */
2677 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2679 int ch, ch2;
2680 char *name, *end;
2682 if (debug)
2683 fprintf (stderr, "\t%s\n", buf);
2685 if (which_pass == PASS_LTOINFO)
2687 if (found_lto)
2688 continue;
2690 /* Look for the LTO info marker symbol, and add filename to
2691 the LTO objects list if found. */
2692 for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2693 if (ch == ' ' && p[1] == '_' && p[2] == '_'
2694 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2695 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2697 add_lto_object (&lto_objects, prog_name);
2699 /* We need to read all the input, so we can't just
2700 return here. But we can avoid useless work. */
2701 found_lto = 1;
2703 break;
2706 continue;
2709 /* If it contains a constructor or destructor name, add the name
2710 to the appropriate list unless this is a kind of symbol we're
2711 not supposed to even consider. */
2713 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2714 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2715 break;
2717 if (ch != '_')
2718 continue;
2720 name = p;
2721 /* Find the end of the symbol name.
2722 Do not include `|', because Encore nm can tack that on the end. */
2723 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2724 end++)
2725 continue;
2728 *end = '\0';
2729 switch (is_ctor_dtor (name))
2731 case SYM_CTOR:
2732 if (! (filter & SCAN_CTOR))
2733 break;
2734 if (which_pass != PASS_LIB)
2735 add_to_list (&constructors, name);
2736 break;
2738 case SYM_DTOR:
2739 if (! (filter & SCAN_DTOR))
2740 break;
2741 if (which_pass != PASS_LIB)
2742 add_to_list (&destructors, name);
2743 break;
2745 case SYM_INIT:
2746 if (! (filter & SCAN_INIT))
2747 break;
2748 if (which_pass != PASS_LIB)
2749 fatal ("init function found in object %s", prog_name);
2750 #ifndef LD_INIT_SWITCH
2751 add_to_list (&constructors, name);
2752 #endif
2753 break;
2755 case SYM_FINI:
2756 if (! (filter & SCAN_FINI))
2757 break;
2758 if (which_pass != PASS_LIB)
2759 fatal ("fini function found in object %s", prog_name);
2760 #ifndef LD_FINI_SWITCH
2761 add_to_list (&destructors, name);
2762 #endif
2763 break;
2765 case SYM_DWEH:
2766 if (! (filter & SCAN_DWEH))
2767 break;
2768 if (which_pass != PASS_LIB)
2769 add_to_list (&frame_tables, name);
2770 break;
2772 default: /* not a constructor or destructor */
2773 continue;
2777 if (debug)
2778 fprintf (stderr, "\n");
2780 do_wait (nm_file_name, pex);
2782 signal (SIGINT, int_handler);
2783 #ifdef SIGQUIT
2784 signal (SIGQUIT, quit_handler);
2785 #endif
2788 #ifdef LDD_SUFFIX
2790 /* Use the List Dynamic Dependencies program to find shared libraries that
2791 the output file depends upon and their initialization/finalization
2792 routines, if any. */
2794 static void
2795 scan_libraries (const char *prog_name)
2797 static struct head libraries; /* list of shared libraries found */
2798 struct id *list;
2799 void (*int_handler) (int);
2800 #ifdef SIGQUIT
2801 void (*quit_handler) (int);
2802 #endif
2803 char *real_ldd_argv[4];
2804 const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2805 int argc = 0;
2806 struct pex_obj *pex;
2807 const char *errmsg;
2808 int err;
2809 char buf[1024];
2810 FILE *inf;
2812 /* If we do not have an `ldd', complain. */
2813 if (ldd_file_name == 0)
2815 error ("cannot find 'ldd'");
2816 return;
2819 ldd_argv[argc++] = ldd_file_name;
2820 ldd_argv[argc++] = prog_name;
2821 ldd_argv[argc++] = (char *) 0;
2823 /* Trace if needed. */
2824 if (vflag)
2826 const char **p_argv;
2827 const char *str;
2829 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2830 fprintf (stderr, " %s", str);
2832 fprintf (stderr, "\n");
2835 fflush (stdout);
2836 fflush (stderr);
2838 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2839 if (pex == NULL)
2840 fatal_perror ("pex_init failed");
2842 errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2843 if (errmsg != NULL)
2845 if (err != 0)
2847 errno = err;
2848 fatal_perror (errmsg);
2850 else
2851 fatal (errmsg);
2854 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2855 #ifdef SIGQUIT
2856 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2857 #endif
2859 inf = pex_read_output (pex, 0);
2860 if (inf == NULL)
2861 fatal_perror ("can't open ldd output");
2863 if (debug)
2864 notice ("\nldd output with constructors/destructors.\n");
2866 /* Read each line of ldd output. */
2867 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2869 int ch2;
2870 char *name, *end, *p = buf;
2872 /* Extract names of libraries and add to list. */
2873 PARSE_LDD_OUTPUT (p);
2874 if (p == 0)
2875 continue;
2877 name = p;
2878 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2879 fatal ("dynamic dependency %s not found", buf);
2881 /* Find the end of the symbol name. */
2882 for (end = p;
2883 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2884 end++)
2885 continue;
2886 *end = '\0';
2888 if (access (name, R_OK) == 0)
2889 add_to_list (&libraries, name);
2890 else
2891 fatal ("unable to open dynamic dependency '%s'", buf);
2893 if (debug)
2894 fprintf (stderr, "\t%s\n", buf);
2896 if (debug)
2897 fprintf (stderr, "\n");
2899 do_wait (ldd_file_name, pex);
2901 signal (SIGINT, int_handler);
2902 #ifdef SIGQUIT
2903 signal (SIGQUIT, quit_handler);
2904 #endif
2906 /* Now iterate through the library list adding their symbols to
2907 the list. */
2908 for (list = libraries.first; list; list = list->next)
2909 scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2912 #endif /* LDD_SUFFIX */
2914 #endif /* OBJECT_FORMAT_NONE */
2918 * COFF specific stuff.
2921 #ifdef OBJECT_FORMAT_COFF
2923 #if defined (EXTENDED_COFF)
2925 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2926 # define GCC_SYMENT SYMR
2927 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2928 # define GCC_SYMINC(X) (1)
2929 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2930 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2932 #else
2934 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2935 # define GCC_SYMENT SYMENT
2936 # if defined (C_WEAKEXT)
2937 # define GCC_OK_SYMBOL(X) \
2938 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2939 ((X).n_scnum > N_UNDEF) && \
2940 (aix64_flag \
2941 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2942 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2943 # define GCC_UNDEF_SYMBOL(X) \
2944 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2945 ((X).n_scnum == N_UNDEF))
2946 # else
2947 # define GCC_OK_SYMBOL(X) \
2948 (((X).n_sclass == C_EXT) && \
2949 ((X).n_scnum > N_UNDEF) && \
2950 (aix64_flag \
2951 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2952 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2953 # define GCC_UNDEF_SYMBOL(X) \
2954 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2955 # endif
2956 # define GCC_SYMINC(X) ((X).n_numaux+1)
2957 # define GCC_SYMZERO(X) 0
2959 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2960 #if TARGET_AIX_VERSION >= 51
2961 # define GCC_CHECK_HDR(X) \
2962 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2963 || (HEADER (X).f_magic == 0767 && aix64_flag))
2964 #else
2965 # define GCC_CHECK_HDR(X) \
2966 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2967 || (HEADER (X).f_magic == 0757 && aix64_flag))
2968 #endif
2970 #endif
2972 #ifdef COLLECT_EXPORT_LIST
2973 /* Array of standard AIX libraries which should not
2974 be scanned for ctors/dtors. */
2975 static const char *const aix_std_libs[] = {
2976 "/unix",
2977 "/lib/libc.a",
2978 "/lib/libm.a",
2979 "/lib/libc_r.a",
2980 "/lib/libm_r.a",
2981 "/usr/lib/libc.a",
2982 "/usr/lib/libm.a",
2983 "/usr/lib/libc_r.a",
2984 "/usr/lib/libm_r.a",
2985 "/usr/lib/threads/libc.a",
2986 "/usr/ccs/lib/libc.a",
2987 "/usr/ccs/lib/libm.a",
2988 "/usr/ccs/lib/libc_r.a",
2989 "/usr/ccs/lib/libm_r.a",
2990 NULL
2993 /* This function checks the filename and returns 1
2994 if this name matches the location of a standard AIX library. */
2995 static int ignore_library (const char *);
2996 static int
2997 ignore_library (const char *name)
2999 const char *const *p;
3000 size_t length;
3002 if (target_system_root[0] != '\0')
3004 length = strlen (target_system_root);
3005 if (strncmp (name, target_system_root, length) != 0)
3006 return 0;
3007 name += length;
3009 for (p = &aix_std_libs[0]; *p != NULL; ++p)
3010 if (strcmp (name, *p) == 0)
3011 return 1;
3012 return 0;
3014 #endif /* COLLECT_EXPORT_LIST */
3016 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
3017 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
3018 #endif
3020 /* COFF version to scan the name list of the loaded program for
3021 the symbols g++ uses for static constructors and destructors. */
3023 static void
3024 scan_prog_file (const char *prog_name, scanpass which_pass,
3025 scanfilter filter)
3027 LDFILE *ldptr = NULL;
3028 int sym_index, sym_count;
3029 int is_shared = 0;
3031 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
3032 return;
3034 #ifdef COLLECT_EXPORT_LIST
3035 /* We do not need scanning for some standard C libraries. */
3036 if (which_pass == PASS_FIRST && ignore_library (prog_name))
3037 return;
3039 /* On AIX we have a loop, because there is not much difference
3040 between an object and an archive. This trick allows us to
3041 eliminate scan_libraries() function. */
3044 #endif
3045 /* Some platforms (e.g. OSF4) declare ldopen as taking a
3046 non-const char * filename parameter, even though it will not
3047 modify that string. So we must cast away const-ness here,
3048 using CONST_CAST to prevent complaints from -Wcast-qual. */
3049 if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
3051 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
3052 fatal ("%s: not a COFF file", prog_name);
3054 if (GCC_CHECK_HDR (ldptr))
3056 sym_count = GCC_SYMBOLS (ldptr);
3057 sym_index = GCC_SYMZERO (ldptr);
3059 #ifdef COLLECT_EXPORT_LIST
3060 /* Is current archive member a shared object? */
3061 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
3062 #endif
3064 while (sym_index < sym_count)
3066 GCC_SYMENT symbol;
3068 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
3069 break;
3070 sym_index += GCC_SYMINC (symbol);
3072 if (GCC_OK_SYMBOL (symbol))
3074 char *name;
3076 if ((name = ldgetname (ldptr, &symbol)) == NULL)
3077 continue; /* Should never happen. */
3079 #ifdef XCOFF_DEBUGGING_INFO
3080 /* All AIX function names have a duplicate entry
3081 beginning with a dot. */
3082 if (*name == '.')
3083 ++name;
3084 #endif
3086 switch (is_ctor_dtor (name))
3088 case SYM_CTOR:
3089 if (! (filter & SCAN_CTOR))
3090 break;
3091 if (! is_shared)
3092 add_to_list (&constructors, name);
3093 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3094 if (which_pass == PASS_OBJ)
3095 add_to_list (&exports, name);
3096 #endif
3097 break;
3099 case SYM_DTOR:
3100 if (! (filter & SCAN_DTOR))
3101 break;
3102 if (! is_shared)
3103 add_to_list (&destructors, name);
3104 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3105 if (which_pass == PASS_OBJ)
3106 add_to_list (&exports, name);
3107 #endif
3108 break;
3110 #ifdef COLLECT_EXPORT_LIST
3111 case SYM_INIT:
3112 if (! (filter & SCAN_INIT))
3113 break;
3114 #ifndef LD_INIT_SWITCH
3115 if (is_shared)
3116 add_to_list (&constructors, name);
3117 #endif
3118 break;
3120 case SYM_FINI:
3121 if (! (filter & SCAN_FINI))
3122 break;
3123 #ifndef LD_INIT_SWITCH
3124 if (is_shared)
3125 add_to_list (&destructors, name);
3126 #endif
3127 break;
3128 #endif
3130 case SYM_DWEH:
3131 if (! (filter & SCAN_DWEH))
3132 break;
3133 if (! is_shared)
3134 add_to_list (&frame_tables, name);
3135 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3136 if (which_pass == PASS_OBJ)
3137 add_to_list (&exports, name);
3138 #endif
3139 break;
3141 default: /* not a constructor or destructor */
3142 #ifdef COLLECT_EXPORT_LIST
3143 /* Explicitly export all global symbols when
3144 building a shared object on AIX, but do not
3145 re-export symbols from another shared object
3146 and do not export symbols if the user
3147 provides an explicit export list. */
3148 if (shared_obj && !is_shared
3149 && which_pass == PASS_OBJ && !export_flag)
3150 add_to_list (&exports, name);
3151 #endif
3152 continue;
3155 if (debug)
3156 #if !defined(EXTENDED_COFF)
3157 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
3158 symbol.n_scnum, symbol.n_sclass,
3159 (symbol.n_type ? "0" : ""), symbol.n_type,
3160 name);
3161 #else
3162 fprintf (stderr,
3163 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3164 symbol.iss, (long) symbol.value, symbol.index, name);
3165 #endif
3169 #ifdef COLLECT_EXPORT_LIST
3170 else
3172 /* If archive contains both 32-bit and 64-bit objects,
3173 we want to skip objects in other mode so mismatch normal. */
3174 if (debug)
3175 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
3176 prog_name, HEADER (ldptr).f_magic, aix64_flag);
3178 #endif
3180 else
3182 fatal ("%s: cannot open as COFF file", prog_name);
3184 #ifdef COLLECT_EXPORT_LIST
3185 /* On AIX loop continues while there are more members in archive. */
3187 while (ldclose (ldptr) == FAILURE);
3188 #else
3189 /* Otherwise we simply close ldptr. */
3190 (void) ldclose(ldptr);
3191 #endif
3193 #endif /* OBJECT_FORMAT_COFF */
3195 #ifdef COLLECT_EXPORT_LIST
3196 /* Given a library name without "lib" prefix, this function
3197 returns a full library name including a path. */
3198 static char *
3199 resolve_lib_name (const char *name)
3201 char *lib_buf;
3202 int i, j, l = 0;
3203 /* Library extensions for AIX dynamic linking. */
3204 const char * const libexts[2] = {"a", "so"};
3206 for (i = 0; libpaths[i]; i++)
3207 if (libpaths[i]->max_len > l)
3208 l = libpaths[i]->max_len;
3210 lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3212 for (i = 0; libpaths[i]; i++)
3214 struct prefix_list *list = libpaths[i]->plist;
3215 for (; list; list = list->next)
3217 /* The following lines are needed because path_prefix list
3218 may contain directories both with trailing '/' and
3219 without it. */
3220 const char *p = "";
3221 if (list->prefix[strlen(list->prefix)-1] != '/')
3222 p = "/";
3223 for (j = 0; j < 2; j++)
3225 sprintf (lib_buf, "%s%slib%s.%s",
3226 list->prefix, p, name,
3227 libexts[(j + aixrtl_flag) % 2]);
3228 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3229 if (file_exists (lib_buf))
3231 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3232 return (lib_buf);
3237 if (debug)
3238 fprintf (stderr, "not found\n");
3239 else
3240 fatal ("library lib%s not found", name);
3241 return (NULL);
3243 #endif /* COLLECT_EXPORT_LIST */