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