Implement -mmemcpy-strategy= and -mmemset-strategy= options
[official-gcc.git] / gcc / collect2.c
blob43b9defafd81f7f2f0beb18fc9ab668250fb0aac
1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992-2013 Free Software Foundation, Inc.
4 Contributed by Chris Smith (csmith@convex.com).
5 Heavily modified by Michael Meissner (meissner@cygnus.com),
6 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
25 /* Build tables of static constructors and destructors and run ld. */
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "filenames.h"
32 #include "file-find.h"
34 /* TARGET_64BIT may be defined to use driver specific functionality. */
35 #undef TARGET_64BIT
36 #define TARGET_64BIT TARGET_64BIT_DEFAULT
38 #ifndef LIBRARY_PATH_ENV
39 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
40 #endif
42 #define COLLECT
44 #include "collect2.h"
45 #include "collect2-aix.h"
46 #include "diagnostic.h"
47 #include "demangle.h"
48 #include "obstack.h"
49 #include "intl.h"
50 #include "version.h"
52 /* On certain systems, we have code that works by scanning the object file
53 directly. But this code uses system-specific header files and library
54 functions, so turn it off in a cross-compiler. Likewise, the names of
55 the utilities are not correct for a cross-compiler; we have to hope that
56 cross-versions are in the proper directories. */
58 #ifdef CROSS_DIRECTORY_STRUCTURE
59 #ifndef CROSS_AIX_SUPPORT
60 #undef OBJECT_FORMAT_COFF
61 #endif
62 #undef MD_EXEC_PREFIX
63 #undef REAL_LD_FILE_NAME
64 #undef REAL_NM_FILE_NAME
65 #undef REAL_STRIP_FILE_NAME
66 #endif
68 /* If we cannot use a special method, use the ordinary one:
69 run nm to find what symbols are present.
70 In a cross-compiler, this means you need a cross nm,
71 but that is not quite as unpleasant as special headers. */
73 #if !defined (OBJECT_FORMAT_COFF)
74 #define OBJECT_FORMAT_NONE
75 #endif
77 #ifdef OBJECT_FORMAT_COFF
79 #ifndef CROSS_DIRECTORY_STRUCTURE
80 #include <a.out.h>
81 #include <ar.h>
83 #ifdef UMAX
84 #include <sgs.h>
85 #endif
87 /* Many versions of ldfcn.h define these. */
88 #ifdef FREAD
89 #undef FREAD
90 #undef FWRITE
91 #endif
93 #include <ldfcn.h>
94 #endif
96 /* Some systems have an ISCOFF macro, but others do not. In some cases
97 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
98 that either do not have an ISCOFF macro in /usr/include or for those
99 where it is wrong. */
101 #ifndef MY_ISCOFF
102 #define MY_ISCOFF(X) ISCOFF (X)
103 #endif
105 #endif /* OBJECT_FORMAT_COFF */
107 #ifdef OBJECT_FORMAT_NONE
109 /* Default flags to pass to nm. */
110 #ifndef NM_FLAGS
111 #define NM_FLAGS "-n"
112 #endif
114 #endif /* OBJECT_FORMAT_NONE */
116 /* Some systems use __main in a way incompatible with its use in gcc, in these
117 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
118 give the same symbol without quotes for an alternative entry point. */
119 #ifndef NAME__MAIN
120 #define NAME__MAIN "__main"
121 #endif
123 /* This must match tree.h. */
124 #define DEFAULT_INIT_PRIORITY 65535
126 #ifndef COLLECT_SHARED_INIT_FUNC
127 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
128 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
129 #endif
130 #ifndef COLLECT_SHARED_FINI_FUNC
131 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
132 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
133 #endif
135 #ifdef LDD_SUFFIX
136 #define SCAN_LIBRARIES
137 #endif
139 #ifndef SHLIB_SUFFIX
140 #define SHLIB_SUFFIX ".so"
141 #endif
143 #ifdef USE_COLLECT2
144 int do_collecting = 1;
145 #else
146 int do_collecting = 0;
147 #endif
149 /* Cook up an always defined indication of whether we proceed the
150 "EXPORT_LIST" way. */
152 #ifdef COLLECT_EXPORT_LIST
153 #define DO_COLLECT_EXPORT_LIST 1
154 #else
155 #define DO_COLLECT_EXPORT_LIST 0
156 #endif
158 /* Nonzero if we should suppress the automatic demangling of identifiers
159 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
160 int no_demangle;
162 /* Linked lists of constructor and destructor names. */
164 struct id
166 struct id *next;
167 int sequence;
168 char name[1];
171 struct head
173 struct id *first;
174 struct id *last;
175 int number;
178 bool vflag; /* true if -v or --version */
179 static int rflag; /* true if -r */
180 static int strip_flag; /* true if -s */
181 #ifdef COLLECT_EXPORT_LIST
182 static int export_flag; /* true if -bE */
183 static int aix64_flag; /* true if -b64 */
184 static int aixrtl_flag; /* true if -brtl */
185 #endif
187 enum lto_mode_d {
188 LTO_MODE_NONE, /* Not doing LTO. */
189 LTO_MODE_LTO, /* Normal LTO. */
190 LTO_MODE_WHOPR /* WHOPR. */
193 /* Current LTO mode. */
194 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
196 bool debug; /* true if -debug */
197 bool helpflag; /* true if --help */
199 static int shared_obj; /* true if -shared */
201 static const char *c_file; /* <xxx>.c for constructor/destructor list. */
202 static const char *o_file; /* <xxx>.o for constructor/destructor list. */
203 #ifdef COLLECT_EXPORT_LIST
204 static const char *export_file; /* <xxx>.x for AIX export list. */
205 #endif
206 static char **lto_o_files; /* Output files for LTO. */
207 const char *ldout; /* File for ld stdout. */
208 const char *lderrout; /* File for ld stderr. */
209 static const char *output_file; /* Output file for ld. */
210 static const char *nm_file_name; /* pathname of nm */
211 #ifdef LDD_SUFFIX
212 static const char *ldd_file_name; /* pathname of ldd (or equivalent) */
213 #endif
214 static const char *strip_file_name; /* pathname of strip */
215 const char *c_file_name; /* pathname of gcc */
216 static char *initname, *fininame; /* names of init and fini funcs */
218 static struct head constructors; /* list of constructors found */
219 static struct head destructors; /* list of destructors found */
220 #ifdef COLLECT_EXPORT_LIST
221 static struct head exports; /* list of exported symbols */
222 #endif
223 static struct head frame_tables; /* list of frame unwind info tables */
225 static bool at_file_supplied; /* Whether to use @file arguments */
226 static char *response_file; /* Name of any current response file */
228 struct obstack temporary_obstack;
229 char * temporary_firstobj;
231 /* A string that must be prepended to a target OS path in order to find
232 it on the host system. */
233 #ifdef TARGET_SYSTEM_ROOT
234 static const char *target_system_root = TARGET_SYSTEM_ROOT;
235 #else
236 static const char *target_system_root = "";
237 #endif
239 /* Whether we may unlink the output file, which should be set as soon as we
240 know we have successfully produced it. This is typically useful to prevent
241 blindly attempting to unlink a read-only output that the target linker
242 would leave untouched. */
243 bool may_unlink_output_file = false;
245 #ifdef COLLECT_EXPORT_LIST
246 /* Lists to keep libraries to be scanned for global constructors/destructors. */
247 static struct head libs; /* list of libraries */
248 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
249 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
250 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
251 &libpath_lib_dirs, NULL};
252 #endif
254 /* List of names of object files containing LTO information.
255 These are a subset of the object file names appearing on the
256 command line, and must be identical, in the sense of pointer
257 equality, with the names passed to maybe_run_lto_and_relink(). */
259 struct lto_object
261 const char *name; /* Name of object file. */
262 struct lto_object *next; /* Next in linked list. */
265 struct lto_object_list
267 struct lto_object *first; /* First list element. */
268 struct lto_object *last; /* Last list element. */
271 static struct lto_object_list lto_objects;
273 /* Special kinds of symbols that a name may denote. */
275 typedef enum {
276 SYM_REGULAR = 0, /* nothing special */
278 SYM_CTOR = 1, /* constructor */
279 SYM_DTOR = 2, /* destructor */
280 SYM_INIT = 3, /* shared object routine that calls all the ctors */
281 SYM_FINI = 4, /* shared object routine that calls all the dtors */
282 SYM_DWEH = 5 /* DWARF exception handling table */
283 } symkind;
285 static symkind is_ctor_dtor (const char *);
287 static void handler (int);
288 static void do_wait (const char *, struct pex_obj *);
289 static void fork_execute (const char *, char **);
290 static void maybe_unlink (const char *);
291 static void maybe_unlink_list (char **);
292 static void add_to_list (struct head *, const char *);
293 static int extract_init_priority (const char *);
294 static void sort_ids (struct head *);
295 static void write_list (FILE *, const char *, struct id *);
296 #ifdef COLLECT_EXPORT_LIST
297 static void dump_list (FILE *, const char *, struct id *);
298 #endif
299 #if 0
300 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
301 #endif
302 static void write_list_with_asm (FILE *, const char *, struct id *);
303 static void write_c_file (FILE *, const char *);
304 static void write_c_file_stat (FILE *, const char *);
305 #ifndef LD_INIT_SWITCH
306 static void write_c_file_glob (FILE *, const char *);
307 #endif
308 #ifdef SCAN_LIBRARIES
309 static void scan_libraries (const char *);
310 #endif
311 #ifdef COLLECT_EXPORT_LIST
312 #if 0
313 static int is_in_list (const char *, struct id *);
314 #endif
315 static void write_aix_file (FILE *, struct id *);
316 static char *resolve_lib_name (const char *);
317 #endif
318 static char *extract_string (const char **);
319 static void post_ld_pass (bool);
320 static void process_args (int *argcp, char **argv);
322 /* Enumerations describing which pass this is for scanning the
323 program file ... */
325 typedef enum {
326 PASS_FIRST, /* without constructors */
327 PASS_OBJ, /* individual objects */
328 PASS_LIB, /* looking for shared libraries */
329 PASS_SECOND, /* with constructors linked in */
330 PASS_LTOINFO /* looking for objects with LTO info */
331 } scanpass;
333 /* ... and which kinds of symbols are to be considered. */
335 enum scanfilter_masks {
336 SCAN_NOTHING = 0,
338 SCAN_CTOR = 1 << SYM_CTOR,
339 SCAN_DTOR = 1 << SYM_DTOR,
340 SCAN_INIT = 1 << SYM_INIT,
341 SCAN_FINI = 1 << SYM_FINI,
342 SCAN_DWEH = 1 << SYM_DWEH,
343 SCAN_ALL = ~0
346 /* This type is used for parameters and variables which hold
347 combinations of the flags in enum scanfilter_masks. */
348 typedef int scanfilter;
350 /* Scan the name list of the loaded program for the symbols g++ uses for
351 static constructors and destructors.
353 The SCANPASS argument tells which collect processing pass this is for and
354 the SCANFILTER argument tells which kinds of symbols to consider in this
355 pass. Symbols of a special kind not in the filter mask are considered as
356 regular ones.
358 The constructor table begins at __CTOR_LIST__ and contains a count of the
359 number of pointers (or -1 if the constructors are built in a separate
360 section by the linker), followed by the pointers to the constructor
361 functions, terminated with a null pointer. The destructor table has the
362 same format, and begins at __DTOR_LIST__. */
364 static void scan_prog_file (const char *, scanpass, scanfilter);
367 /* Delete tempfiles and exit function. */
369 static void
370 collect_atexit (void)
372 if (c_file != 0 && c_file[0])
373 maybe_unlink (c_file);
375 if (o_file != 0 && o_file[0])
376 maybe_unlink (o_file);
378 #ifdef COLLECT_EXPORT_LIST
379 if (export_file != 0 && export_file[0])
380 maybe_unlink (export_file);
381 #endif
383 if (lto_o_files)
384 maybe_unlink_list (lto_o_files);
386 if (ldout != 0 && ldout[0])
388 dump_ld_file (ldout, stdout);
389 maybe_unlink (ldout);
392 if (lderrout != 0 && lderrout[0])
394 dump_ld_file (lderrout, stderr);
395 maybe_unlink (lderrout);
398 if (response_file)
399 maybe_unlink (response_file);
403 /* Notify user of a non-error. */
404 void
405 notice (const char *cmsgid, ...)
407 va_list ap;
409 va_start (ap, cmsgid);
410 vfprintf (stderr, _(cmsgid), ap);
411 va_end (ap);
414 /* Notify user of a non-error, without translating the format string. */
415 void
416 notice_translated (const char *cmsgid, ...)
418 va_list ap;
420 va_start (ap, cmsgid);
421 vfprintf (stderr, cmsgid, ap);
422 va_end (ap);
425 static void
426 handler (int signo)
428 if (c_file != 0 && c_file[0])
429 maybe_unlink (c_file);
431 if (o_file != 0 && o_file[0])
432 maybe_unlink (o_file);
434 if (ldout != 0 && ldout[0])
435 maybe_unlink (ldout);
437 if (lderrout != 0 && lderrout[0])
438 maybe_unlink (lderrout);
440 #ifdef COLLECT_EXPORT_LIST
441 if (export_file != 0 && export_file[0])
442 maybe_unlink (export_file);
443 #endif
445 if (lto_o_files)
446 maybe_unlink_list (lto_o_files);
448 if (response_file)
449 maybe_unlink (response_file);
451 signal (signo, SIG_DFL);
452 raise (signo);
457 file_exists (const char *name)
459 return access (name, R_OK) == 0;
462 /* Parse a reasonable subset of shell quoting syntax. */
464 static char *
465 extract_string (const char **pp)
467 const char *p = *pp;
468 int backquote = 0;
469 int inside = 0;
471 for (;;)
473 char c = *p;
474 if (c == '\0')
475 break;
476 ++p;
477 if (backquote)
478 obstack_1grow (&temporary_obstack, c);
479 else if (! inside && c == ' ')
480 break;
481 else if (! inside && c == '\\')
482 backquote = 1;
483 else if (c == '\'')
484 inside = !inside;
485 else
486 obstack_1grow (&temporary_obstack, c);
489 obstack_1grow (&temporary_obstack, '\0');
490 *pp = p;
491 return XOBFINISH (&temporary_obstack, char *);
494 void
495 dump_ld_file (const char *name, FILE *to)
497 FILE *stream = fopen (name, "r");
499 if (stream == 0)
500 return;
501 while (1)
503 int c;
504 while (c = getc (stream),
505 c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
506 obstack_1grow (&temporary_obstack, c);
507 if (obstack_object_size (&temporary_obstack) > 0)
509 const char *word, *p;
510 char *result;
511 obstack_1grow (&temporary_obstack, '\0');
512 word = XOBFINISH (&temporary_obstack, const char *);
514 if (*word == '.')
515 ++word, putc ('.', to);
516 p = word;
517 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
518 p += strlen (USER_LABEL_PREFIX);
520 #ifdef HAVE_LD_DEMANGLE
521 result = 0;
522 #else
523 if (no_demangle)
524 result = 0;
525 else
526 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
527 #endif
529 if (result)
531 int diff;
532 fputs (result, to);
534 diff = strlen (word) - strlen (result);
535 while (diff > 0 && c == ' ')
536 --diff, putc (' ', to);
537 if (diff < 0 && c == ' ')
539 while (diff < 0 && c == ' ')
540 ++diff, c = getc (stream);
541 if (!ISSPACE (c))
543 /* Make sure we output at least one space, or
544 the demangled symbol name will run into
545 whatever text follows. */
546 putc (' ', to);
550 free (result);
552 else
553 fputs (word, to);
555 fflush (to);
556 obstack_free (&temporary_obstack, temporary_firstobj);
558 if (c == EOF)
559 break;
560 putc (c, to);
562 fclose (stream);
565 /* Return the kind of symbol denoted by name S. */
567 static symkind
568 is_ctor_dtor (const char *s)
570 struct names { const char *const name; const int len; symkind ret;
571 const int two_underscores; };
573 const struct names *p;
574 int ch;
575 const char *orig_s = s;
577 static const struct names special[] = {
578 #ifndef NO_DOLLAR_IN_LABEL
579 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
580 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
581 #else
582 #ifndef NO_DOT_IN_LABEL
583 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
584 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
585 #endif /* NO_DOT_IN_LABEL */
586 #endif /* NO_DOLLAR_IN_LABEL */
587 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
588 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
589 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
590 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
591 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
592 { NULL, 0, SYM_REGULAR, 0 }
595 while ((ch = *s) == '_')
596 ++s;
598 if (s == orig_s)
599 return SYM_REGULAR;
601 for (p = &special[0]; p->len > 0; p++)
603 if (ch == p->name[0]
604 && (!p->two_underscores || ((s - orig_s) >= 2))
605 && strncmp(s, p->name, p->len) == 0)
607 return p->ret;
610 return SYM_REGULAR;
613 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
614 and one from the PATH variable. */
616 static struct path_prefix cpath, path;
618 #ifdef CROSS_DIRECTORY_STRUCTURE
619 /* This is the name of the target machine. We use it to form the name
620 of the files to execute. */
622 static const char *const target_machine = TARGET_MACHINE;
623 #endif
625 /* Search for NAME using prefix list PPREFIX. We only look for executable
626 files.
628 Return 0 if not found, otherwise return its name, allocated with malloc. */
630 #ifdef OBJECT_FORMAT_NONE
632 /* Add an entry for the object file NAME to object file list LIST.
633 New entries are added at the end of the list. The original pointer
634 value of NAME is preserved, i.e., no string copy is performed. */
636 static void
637 add_lto_object (struct lto_object_list *list, const char *name)
639 struct lto_object *n = XNEW (struct lto_object);
640 n->name = name;
641 n->next = NULL;
643 if (list->last)
644 list->last->next = n;
645 else
646 list->first = n;
648 list->last = n;
650 #endif /* OBJECT_FORMAT_NONE */
653 /* Perform a link-time recompilation and relink if any of the object
654 files contain LTO info. The linker command line LTO_LD_ARGV
655 represents the linker command that would produce a final executable
656 without the use of LTO. OBJECT_LST is a vector of object file names
657 appearing in LTO_LD_ARGV that are to be considered for link-time
658 recompilation, where OBJECT is a pointer to the last valid element.
659 (This awkward convention avoids an impedance mismatch with the
660 usage of similarly-named variables in main().) The elements of
661 OBJECT_LST must be identical, i.e., pointer equal, to the
662 corresponding arguments in LTO_LD_ARGV.
664 Upon entry, at least one linker run has been performed without the
665 use of any LTO info that might be present. Any recompilations
666 necessary for template instantiations have been performed, and
667 initializer/finalizer tables have been created if needed and
668 included in the linker command line LTO_LD_ARGV. If any of the
669 object files contain LTO info, we run the LTO back end on all such
670 files, and perform the final link with the LTO back end output
671 substituted for the LTO-optimized files. In some cases, a final
672 link with all link-time generated code has already been performed,
673 so there is no need to relink if no LTO info is found. In other
674 cases, our caller has not produced the final executable, and is
675 relying on us to perform the required link whether LTO info is
676 present or not. In that case, the FORCE argument should be true.
677 Note that the linker command line argument LTO_LD_ARGV passed into
678 this function may be modified in place. */
680 static void
681 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
682 const char **object, bool force)
684 const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
686 int num_lto_c_args = 1; /* Allow space for the terminating NULL. */
688 while (object_file < object)
690 /* If file contains LTO info, add it to the list of LTO objects. */
691 scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
693 /* Increment the argument count by the number of object file arguments
694 we will add. An upper bound suffices, so just count all of the
695 object files regardless of whether they contain LTO info. */
696 num_lto_c_args++;
699 if (lto_objects.first)
701 char **lto_c_argv;
702 const char **lto_c_ptr;
703 char **p;
704 char **lto_o_ptr;
705 struct lto_object *list;
706 char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
707 struct pex_obj *pex;
708 const char *prog = "lto-wrapper";
709 int lto_ld_argv_size = 0;
710 char **out_lto_ld_argv;
711 int out_lto_ld_argv_size;
712 size_t num_files;
714 if (!lto_wrapper)
715 fatal_error ("COLLECT_LTO_WRAPPER must be set");
717 num_lto_c_args++;
719 /* There is at least one object file containing LTO info,
720 so we need to run the LTO back end and relink.
722 To do so we build updated ld arguments with first
723 LTO object replaced by all partitions and other LTO
724 objects removed. */
726 lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
727 lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
729 *lto_c_ptr++ = lto_wrapper;
731 /* Add LTO objects to the wrapper command line. */
732 for (list = lto_objects.first; list; list = list->next)
733 *lto_c_ptr++ = list->name;
735 *lto_c_ptr = NULL;
737 /* Run the LTO back end. */
738 pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
740 int c;
741 FILE *stream;
742 size_t i;
743 char *start, *end;
745 stream = pex_read_output (pex, 0);
746 gcc_assert (stream);
748 num_files = 0;
749 while ((c = getc (stream)) != EOF)
751 obstack_1grow (&temporary_obstack, c);
752 if (c == '\n')
753 ++num_files;
756 lto_o_files = XNEWVEC (char *, num_files + 1);
757 lto_o_files[num_files] = NULL;
758 start = XOBFINISH (&temporary_obstack, char *);
759 for (i = 0; i < num_files; ++i)
761 end = start;
762 while (*end != '\n')
763 ++end;
764 *end = '\0';
766 lto_o_files[i] = xstrdup (start);
768 start = end + 1;
771 obstack_free (&temporary_obstack, temporary_firstobj);
773 do_wait (prog, pex);
774 pex = NULL;
776 /* Compute memory needed for new LD arguments. At most number of original arguemtns
777 plus number of partitions. */
778 for (lto_ld_argv_size = 0; lto_ld_argv[lto_ld_argv_size]; lto_ld_argv_size++)
780 out_lto_ld_argv = XCNEWVEC(char *, num_files + lto_ld_argv_size + 1);
781 out_lto_ld_argv_size = 0;
783 /* After running the LTO back end, we will relink, substituting
784 the LTO output for the object files that we submitted to the
785 LTO. Here, we modify the linker command line for the relink. */
787 /* Copy all arguments until we find first LTO file. */
788 p = lto_ld_argv;
789 while (*p != NULL)
791 for (list = lto_objects.first; list; list = list->next)
792 if (*p == list->name) /* Note test for pointer equality! */
793 break;
794 if (list)
795 break;
796 out_lto_ld_argv[out_lto_ld_argv_size++] = *p++;
799 /* Now insert all LTO partitions. */
800 lto_o_ptr = lto_o_files;
801 while (*lto_o_ptr)
802 out_lto_ld_argv[out_lto_ld_argv_size++] = *lto_o_ptr++;
804 /* ... and copy the rest. */
805 while (*p != NULL)
807 for (list = lto_objects.first; list; list = list->next)
808 if (*p == list->name) /* Note test for pointer equality! */
809 break;
810 if (!list)
811 out_lto_ld_argv[out_lto_ld_argv_size++] = *p;
812 p++;
814 out_lto_ld_argv[out_lto_ld_argv_size++] = 0;
816 /* Run the linker again, this time replacing the object files
817 optimized by the LTO with the temporary file generated by the LTO. */
818 fork_execute ("ld", out_lto_ld_argv);
819 post_ld_pass (true);
820 free (lto_ld_argv);
822 maybe_unlink_list (lto_o_files);
824 else if (force)
826 /* Our caller is relying on us to do the link
827 even though there is no LTO back end work to be done. */
828 fork_execute ("ld", lto_ld_argv);
829 post_ld_pass (false);
833 /* Main program. */
836 main (int argc, char **argv)
838 enum linker_select
840 USE_DEFAULT_LD,
841 USE_PLUGIN_LD,
842 USE_GOLD_LD,
843 USE_BFD_LD,
844 USE_LD_MAX
845 } selected_linker = USE_DEFAULT_LD;
846 static const char *const ld_suffixes[USE_LD_MAX] =
848 "ld",
849 PLUGIN_LD_SUFFIX,
850 "ld.gold",
851 "ld.bfd"
853 static const char *const real_ld_suffix = "real-ld";
854 static const char *const collect_ld_suffix = "collect-ld";
855 static const char *const nm_suffix = "nm";
856 static const char *const gnm_suffix = "gnm";
857 #ifdef LDD_SUFFIX
858 static const char *const ldd_suffix = LDD_SUFFIX;
859 #endif
860 static const char *const strip_suffix = "strip";
861 static const char *const gstrip_suffix = "gstrip";
863 const char *full_ld_suffixes[USE_LD_MAX];
864 #ifdef CROSS_DIRECTORY_STRUCTURE
865 /* If we look for a program in the compiler directories, we just use
866 the short name, since these directories are already system-specific.
867 But it we look for a program in the system directories, we need to
868 qualify the program name with the target machine. */
870 const char *const full_nm_suffix =
871 concat (target_machine, "-", nm_suffix, NULL);
872 const char *const full_gnm_suffix =
873 concat (target_machine, "-", gnm_suffix, NULL);
874 #ifdef LDD_SUFFIX
875 const char *const full_ldd_suffix =
876 concat (target_machine, "-", ldd_suffix, NULL);
877 #endif
878 const char *const full_strip_suffix =
879 concat (target_machine, "-", strip_suffix, NULL);
880 const char *const full_gstrip_suffix =
881 concat (target_machine, "-", gstrip_suffix, NULL);
882 #else
883 #ifdef LDD_SUFFIX
884 const char *const full_ldd_suffix = ldd_suffix;
885 #endif
886 const char *const full_nm_suffix = nm_suffix;
887 const char *const full_gnm_suffix = gnm_suffix;
888 const char *const full_strip_suffix = strip_suffix;
889 const char *const full_gstrip_suffix = gstrip_suffix;
890 #endif /* CROSS_DIRECTORY_STRUCTURE */
892 const char *arg;
893 FILE *outf;
894 #ifdef COLLECT_EXPORT_LIST
895 FILE *exportf;
896 #endif
897 const char *ld_file_name;
898 const char *p;
899 char **c_argv;
900 const char **c_ptr;
901 char **ld1_argv;
902 const char **ld1;
903 bool use_plugin = false;
904 bool use_collect_ld = false;
906 /* The kinds of symbols we will have to consider when scanning the
907 outcome of a first pass link. This is ALL to start with, then might
908 be adjusted before getting to the first pass link per se, typically on
909 AIX where we perform an early scan of objects and libraries to fetch
910 the list of global ctors/dtors and make sure they are not garbage
911 collected. */
912 scanfilter ld1_filter = SCAN_ALL;
914 char **ld2_argv;
915 const char **ld2;
916 char **object_lst;
917 const char **object;
918 #ifdef TARGET_AIX_VERSION
919 int object_nbr = argc;
920 #endif
921 int first_file;
922 int num_c_args;
923 char **old_argv;
924 int i;
926 for (i = 0; i < USE_LD_MAX; i++)
927 full_ld_suffixes[i]
928 #ifdef CROSS_DIRECTORY_STRUCTURE
929 = concat (target_machine, "-", ld_suffixes[i], NULL);
930 #else
931 = ld_suffixes[i];
932 #endif
934 p = argv[0] + strlen (argv[0]);
935 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
936 --p;
937 progname = p;
939 xmalloc_set_program_name (progname);
941 old_argv = argv;
942 expandargv (&argc, &argv);
943 if (argv != old_argv)
944 at_file_supplied = 1;
946 process_args (&argc, argv);
948 num_c_args = argc + 9;
950 #ifndef HAVE_LD_DEMANGLE
951 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
953 /* Suppress demangling by the real linker, which may be broken. */
954 putenv (xstrdup ("COLLECT_NO_DEMANGLE=1"));
955 #endif
957 #if defined (COLLECT2_HOST_INITIALIZATION)
958 /* Perform system dependent initialization, if necessary. */
959 COLLECT2_HOST_INITIALIZATION;
960 #endif
962 #ifdef SIGCHLD
963 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
964 receive the signal. A different setting is inheritable */
965 signal (SIGCHLD, SIG_DFL);
966 #endif
968 if (atexit (collect_atexit) != 0)
969 fatal_error ("atexit failed");
971 /* Unlock the stdio streams. */
972 unlock_std_streams ();
974 gcc_init_libintl ();
976 diagnostic_initialize (global_dc, 0);
978 /* Do not invoke xcalloc before this point, since locale needs to be
979 set first, in case a diagnostic is issued. */
981 ld1_argv = XCNEWVEC (char *, argc + 4);
982 ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
983 ld2_argv = XCNEWVEC (char *, argc + 11);
984 ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
985 object_lst = XCNEWVEC (char *, argc);
986 object = CONST_CAST2 (const char **, char **, object_lst);
988 #ifdef DEBUG
989 debug = 1;
990 #endif
992 /* Parse command line early for instances of -debug. This allows
993 the debug flag to be set before functions like find_a_file()
994 are called. We also look for the -flto or -flto-partition=none flag to know
995 what LTO mode we are in. */
997 bool no_partition = false;
999 for (i = 1; argv[i] != NULL; i ++)
1001 if (! strcmp (argv[i], "-debug"))
1002 debug = true;
1003 else if (! strcmp (argv[i], "-flto-partition=none"))
1004 no_partition = true;
1005 else if ((! strncmp (argv[i], "-flto=", 6)
1006 || ! strcmp (argv[i], "-flto")) && ! use_plugin)
1007 lto_mode = LTO_MODE_WHOPR;
1008 else if (!strncmp (argv[i], "-fno-lto", 8))
1009 lto_mode = LTO_MODE_NONE;
1010 else if (! strcmp (argv[i], "-plugin"))
1012 use_plugin = true;
1013 lto_mode = LTO_MODE_NONE;
1014 if (selected_linker == USE_DEFAULT_LD)
1015 selected_linker = USE_PLUGIN_LD;
1017 else if (strcmp (argv[i], "-fuse-ld=bfd") == 0)
1018 selected_linker = USE_BFD_LD;
1019 else if (strcmp (argv[i], "-fuse-ld=gold") == 0)
1020 selected_linker = USE_GOLD_LD;
1022 #ifdef COLLECT_EXPORT_LIST
1023 /* These flags are position independent, although their order
1024 is important - subsequent flags override earlier ones. */
1025 else if (strcmp (argv[i], "-b64") == 0)
1026 aix64_flag = 1;
1027 /* -bexport:filename always needs the :filename */
1028 else if (strncmp (argv[i], "-bE:", 4) == 0
1029 || strncmp (argv[i], "-bexport:", 9) == 0)
1030 export_flag = 1;
1031 else if (strcmp (argv[i], "-brtl") == 0
1032 || strcmp (argv[i], "-bsvr4") == 0
1033 || strcmp (argv[i], "-G") == 0)
1034 aixrtl_flag = 1;
1035 else if (strcmp (argv[i], "-bnortl") == 0)
1036 aixrtl_flag = 0;
1037 #endif
1039 vflag = debug;
1040 find_file_set_debug (debug);
1041 if (no_partition && lto_mode == LTO_MODE_WHOPR)
1042 lto_mode = LTO_MODE_LTO;
1045 #ifndef DEFAULT_A_OUT_NAME
1046 output_file = "a.out";
1047 #else
1048 output_file = DEFAULT_A_OUT_NAME;
1049 #endif
1051 obstack_begin (&temporary_obstack, 0);
1052 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1054 #ifndef HAVE_LD_DEMANGLE
1055 current_demangling_style = auto_demangling;
1056 #endif
1057 p = getenv ("COLLECT_GCC_OPTIONS");
1058 while (p && *p)
1060 const char *q = extract_string (&p);
1061 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1062 num_c_args++;
1064 obstack_free (&temporary_obstack, temporary_firstobj);
1066 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1067 -fno-exceptions -w -fno-whole-program */
1068 num_c_args += 6;
1070 c_argv = XCNEWVEC (char *, num_c_args);
1071 c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1073 if (argc < 2)
1074 fatal_error ("no arguments");
1076 #ifdef SIGQUIT
1077 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1078 signal (SIGQUIT, handler);
1079 #endif
1080 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1081 signal (SIGINT, handler);
1082 #ifdef SIGALRM
1083 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1084 signal (SIGALRM, handler);
1085 #endif
1086 #ifdef SIGHUP
1087 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1088 signal (SIGHUP, handler);
1089 #endif
1090 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1091 signal (SIGSEGV, handler);
1092 #ifdef SIGBUS
1093 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1094 signal (SIGBUS, handler);
1095 #endif
1097 /* Extract COMPILER_PATH and PATH into our prefix list. */
1098 prefix_from_env ("COMPILER_PATH", &cpath);
1099 prefix_from_env ("PATH", &path);
1101 /* Try to discover a valid linker/nm/strip to use. */
1103 /* Maybe we know the right file to use (if not cross). */
1104 ld_file_name = 0;
1105 #ifdef DEFAULT_LINKER
1106 if (access (DEFAULT_LINKER, X_OK) == 0)
1107 ld_file_name = DEFAULT_LINKER;
1108 if (ld_file_name == 0)
1109 #endif
1110 #ifdef REAL_LD_FILE_NAME
1111 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME, X_OK);
1112 if (ld_file_name == 0)
1113 #endif
1114 /* Search the (target-specific) compiler dirs for ld'. */
1115 ld_file_name = find_a_file (&cpath, real_ld_suffix, X_OK);
1116 /* Likewise for `collect-ld'. */
1117 if (ld_file_name == 0)
1119 ld_file_name = find_a_file (&cpath, collect_ld_suffix, X_OK);
1120 use_collect_ld = ld_file_name != 0;
1122 /* Search the compiler directories for `ld'. We have protection against
1123 recursive calls in find_a_file. */
1124 if (ld_file_name == 0)
1125 ld_file_name = find_a_file (&cpath, ld_suffixes[selected_linker], X_OK);
1126 /* Search the ordinary system bin directories
1127 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1128 if (ld_file_name == 0)
1129 ld_file_name = find_a_file (&path, full_ld_suffixes[selected_linker], X_OK);
1131 #ifdef REAL_NM_FILE_NAME
1132 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME, X_OK);
1133 if (nm_file_name == 0)
1134 #endif
1135 nm_file_name = find_a_file (&cpath, gnm_suffix, X_OK);
1136 if (nm_file_name == 0)
1137 nm_file_name = find_a_file (&path, full_gnm_suffix, X_OK);
1138 if (nm_file_name == 0)
1139 nm_file_name = find_a_file (&cpath, nm_suffix, X_OK);
1140 if (nm_file_name == 0)
1141 nm_file_name = find_a_file (&path, full_nm_suffix, X_OK);
1143 #ifdef LDD_SUFFIX
1144 ldd_file_name = find_a_file (&cpath, ldd_suffix, X_OK);
1145 if (ldd_file_name == 0)
1146 ldd_file_name = find_a_file (&path, full_ldd_suffix, X_OK);
1147 #endif
1149 #ifdef REAL_STRIP_FILE_NAME
1150 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME, X_OK);
1151 if (strip_file_name == 0)
1152 #endif
1153 strip_file_name = find_a_file (&cpath, gstrip_suffix, X_OK);
1154 if (strip_file_name == 0)
1155 strip_file_name = find_a_file (&path, full_gstrip_suffix, X_OK);
1156 if (strip_file_name == 0)
1157 strip_file_name = find_a_file (&cpath, strip_suffix, X_OK);
1158 if (strip_file_name == 0)
1159 strip_file_name = find_a_file (&path, full_strip_suffix, X_OK);
1161 /* Determine the full path name of the C compiler to use. */
1162 c_file_name = getenv ("COLLECT_GCC");
1163 if (c_file_name == 0)
1165 #ifdef CROSS_DIRECTORY_STRUCTURE
1166 c_file_name = concat (target_machine, "-gcc", NULL);
1167 #else
1168 c_file_name = "gcc";
1169 #endif
1172 p = find_a_file (&cpath, c_file_name, X_OK);
1174 /* Here it should be safe to use the system search path since we should have
1175 already qualified the name of the compiler when it is needed. */
1176 if (p == 0)
1177 p = find_a_file (&path, c_file_name, X_OK);
1179 if (p)
1180 c_file_name = p;
1182 *ld1++ = *ld2++ = ld_file_name;
1184 /* Make temp file names. */
1185 c_file = make_temp_file (".c");
1186 o_file = make_temp_file (".o");
1187 #ifdef COLLECT_EXPORT_LIST
1188 export_file = make_temp_file (".x");
1189 #endif
1190 if (!debug)
1192 ldout = make_temp_file (".ld");
1193 lderrout = make_temp_file (".le");
1195 *c_ptr++ = c_file_name;
1196 *c_ptr++ = "-x";
1197 *c_ptr++ = "c";
1198 *c_ptr++ = "-c";
1199 *c_ptr++ = "-o";
1200 *c_ptr++ = o_file;
1202 #ifdef COLLECT_EXPORT_LIST
1203 /* Generate a list of directories from LIBPATH. */
1204 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1205 /* Add to this list also two standard directories where
1206 AIX loader always searches for libraries. */
1207 add_prefix (&libpath_lib_dirs, "/lib");
1208 add_prefix (&libpath_lib_dirs, "/usr/lib");
1209 #endif
1211 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1213 AIX support needs to know if -shared has been specified before
1214 parsing commandline arguments. */
1216 p = getenv ("COLLECT_GCC_OPTIONS");
1217 while (p && *p)
1219 const char *q = extract_string (&p);
1220 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1221 *c_ptr++ = xstrdup (q);
1222 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1223 *c_ptr++ = xstrdup (q);
1224 if (strcmp (q, "-shared") == 0)
1225 shared_obj = 1;
1226 if (*q == '-' && q[1] == 'B')
1228 *c_ptr++ = xstrdup (q);
1229 if (q[2] == 0)
1231 q = extract_string (&p);
1232 *c_ptr++ = xstrdup (q);
1236 obstack_free (&temporary_obstack, temporary_firstobj);
1237 *c_ptr++ = "-fno-profile-arcs";
1238 *c_ptr++ = "-fno-test-coverage";
1239 *c_ptr++ = "-fno-branch-probabilities";
1240 *c_ptr++ = "-fno-exceptions";
1241 *c_ptr++ = "-w";
1242 *c_ptr++ = "-fno-whole-program";
1244 /* !!! When GCC calls collect2,
1245 it does not know whether it is calling collect2 or ld.
1246 So collect2 cannot meaningfully understand any options
1247 except those ld understands.
1248 If you propose to make GCC pass some other option,
1249 just imagine what will happen if ld is really ld!!! */
1251 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1252 /* After the first file, put in the c++ rt0. */
1254 first_file = 1;
1255 while ((arg = *++argv) != (char *) 0)
1257 *ld1++ = *ld2++ = arg;
1259 if (arg[0] == '-')
1261 switch (arg[1])
1263 case 'd':
1264 if (!strcmp (arg, "-debug"))
1266 /* Already parsed. */
1267 ld1--;
1268 ld2--;
1270 if (!strcmp (arg, "-dynamic-linker") && argv[1])
1272 ++argv;
1273 *ld1++ = *ld2++ = *argv;
1275 break;
1277 case 'f':
1278 if (strncmp (arg, "-flto", 5) == 0)
1280 #ifdef ENABLE_LTO
1281 /* Do not pass LTO flag to the linker. */
1282 ld1--;
1283 ld2--;
1284 #else
1285 error ("LTO support has not been enabled in this "
1286 "configuration");
1287 #endif
1289 else if (!use_collect_ld
1290 && strncmp (arg, "-fuse-ld=", 9) == 0)
1292 /* Do not pass -fuse-ld={bfd|gold} to the linker. */
1293 ld1--;
1294 ld2--;
1296 #ifdef TARGET_AIX_VERSION
1297 else
1299 /* File containing a list of input files to process. */
1301 FILE *stream;
1302 char buf[MAXPATHLEN + 2];
1303 /* Number of additionnal object files. */
1304 int add_nbr = 0;
1305 /* Maximum of additionnal object files before vector
1306 expansion. */
1307 int add_max = 0;
1308 const char *list_filename = arg + 2;
1310 /* Accept -fFILENAME and -f FILENAME. */
1311 if (*list_filename == '\0' && argv[1])
1313 ++argv;
1314 list_filename = *argv;
1315 *ld1++ = *ld2++ = *argv;
1318 stream = fopen (list_filename, "r");
1319 if (stream == NULL)
1320 fatal_error ("can't open %s: %m", list_filename);
1322 while (fgets (buf, sizeof buf, stream) != NULL)
1324 /* Remove end of line. */
1325 int len = strlen (buf);
1326 if (len >= 1 && buf[len - 1] =='\n')
1327 buf[len - 1] = '\0';
1329 /* Put on object vector.
1330 Note: we only expanse vector here, so we must keep
1331 extra space for remaining arguments. */
1332 if (add_nbr >= add_max)
1334 int pos =
1335 object - CONST_CAST2 (const char **, char **,
1336 object_lst);
1337 add_max = (add_max == 0) ? 16 : add_max * 2;
1338 object_lst = XRESIZEVEC (char *, object_lst,
1339 object_nbr + add_max);
1340 object = CONST_CAST2 (const char **, char **,
1341 object_lst) + pos;
1342 object_nbr += add_max;
1344 *object++ = xstrdup (buf);
1345 add_nbr++;
1347 fclose (stream);
1349 #endif
1350 break;
1352 case 'l':
1353 if (first_file)
1355 /* place o_file BEFORE this argument! */
1356 first_file = 0;
1357 ld2--;
1358 *ld2++ = o_file;
1359 *ld2++ = arg;
1361 #ifdef COLLECT_EXPORT_LIST
1363 /* Resolving full library name. */
1364 const char *s = resolve_lib_name (arg+2);
1366 /* Saving a full library name. */
1367 add_to_list (&libs, s);
1369 #endif
1370 break;
1372 #ifdef COLLECT_EXPORT_LIST
1373 /* Saving directories where to search for libraries. */
1374 case 'L':
1375 add_prefix (&cmdline_lib_dirs, arg+2);
1376 break;
1377 #endif
1379 case 'o':
1380 if (arg[2] == '\0')
1381 output_file = *ld1++ = *ld2++ = *++argv;
1382 else
1383 output_file = &arg[2];
1384 break;
1386 case 'r':
1387 if (arg[2] == '\0')
1388 rflag = 1;
1389 break;
1391 case 's':
1392 if (arg[2] == '\0' && do_collecting)
1394 /* We must strip after the nm run, otherwise C++ linking
1395 will not work. Thus we strip in the second ld run, or
1396 else with strip if there is no second ld run. */
1397 strip_flag = 1;
1398 ld1--;
1400 break;
1402 case 'v':
1403 if (arg[2] == '\0')
1404 vflag = true;
1405 break;
1407 case '-':
1408 if (strcmp (arg, "--no-demangle") == 0)
1410 #ifndef HAVE_LD_DEMANGLE
1411 no_demangle = 1;
1412 ld1--;
1413 ld2--;
1414 #endif
1416 else if (strncmp (arg, "--demangle", 10) == 0)
1418 #ifndef HAVE_LD_DEMANGLE
1419 no_demangle = 0;
1420 if (arg[10] == '=')
1422 enum demangling_styles style
1423 = cplus_demangle_name_to_style (arg+11);
1424 if (style == unknown_demangling)
1425 error ("unknown demangling style '%s'", arg+11);
1426 else
1427 current_demangling_style = style;
1429 ld1--;
1430 ld2--;
1431 #endif
1433 else if (strncmp (arg, "--sysroot=", 10) == 0)
1434 target_system_root = arg + 10;
1435 else if (strcmp (arg, "--version") == 0)
1436 vflag = true;
1437 else if (strcmp (arg, "--help") == 0)
1438 helpflag = true;
1439 break;
1442 else if ((p = strrchr (arg, '.')) != (char *) 0
1443 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1444 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1445 || strcmp (p, ".obj") == 0))
1447 if (first_file)
1449 first_file = 0;
1450 if (p[1] == 'o')
1451 *ld2++ = o_file;
1452 else
1454 /* place o_file BEFORE this argument! */
1455 ld2--;
1456 *ld2++ = o_file;
1457 *ld2++ = arg;
1460 if (p[1] == 'o' || p[1] == 'l')
1461 *object++ = arg;
1462 #ifdef COLLECT_EXPORT_LIST
1463 /* libraries can be specified directly, i.e. without -l flag. */
1464 else
1466 /* Saving a full library name. */
1467 add_to_list (&libs, arg);
1469 #endif
1473 #ifdef COLLECT_EXPORT_LIST
1474 /* This is added only for debugging purposes. */
1475 if (debug)
1477 fprintf (stderr, "List of libraries:\n");
1478 dump_list (stderr, "\t", libs.first);
1481 /* The AIX linker will discard static constructors in object files if
1482 nothing else in the file is referenced, so look at them first. Unless
1483 we are building a shared object, ignore the eh frame tables, as we
1484 would otherwise reference them all, hence drag all the corresponding
1485 objects even if nothing else is referenced. */
1487 const char **export_object_lst
1488 = CONST_CAST2 (const char **, char **, object_lst);
1490 struct id *list = libs.first;
1492 /* Compute the filter to use from the current one, do scan, then adjust
1493 the "current" filter to remove what we just included here. This will
1494 control whether we need a first pass link later on or not, and what
1495 will remain to be scanned there. */
1497 scanfilter this_filter = ld1_filter;
1498 #if HAVE_AS_REF
1499 if (!shared_obj)
1500 this_filter &= ~SCAN_DWEH;
1501 #endif
1503 while (export_object_lst < object)
1504 scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1506 for (; list; list = list->next)
1507 scan_prog_file (list->name, PASS_FIRST, this_filter);
1509 ld1_filter = ld1_filter & ~this_filter;
1512 if (exports.first)
1514 char *buf = concat ("-bE:", export_file, NULL);
1516 *ld1++ = buf;
1517 *ld2++ = buf;
1519 exportf = fopen (export_file, "w");
1520 if (exportf == (FILE *) 0)
1521 fatal_error ("fopen %s: %m", export_file);
1522 write_aix_file (exportf, exports.first);
1523 if (fclose (exportf))
1524 fatal_error ("fclose %s: %m", export_file);
1526 #endif
1528 *c_ptr++ = c_file;
1529 *c_ptr = *ld1 = *object = (char *) 0;
1531 if (vflag)
1532 notice ("collect2 version %s\n", version_string);
1534 if (helpflag)
1536 printf ("Usage: collect2 [options]\n");
1537 printf (" Wrap linker and generate constructor code if needed.\n");
1538 printf (" Options:\n");
1539 printf (" -debug Enable debug output\n");
1540 printf (" --help Display this information\n");
1541 printf (" -v, --version Display this program's version number\n");
1542 printf ("\n");
1543 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1544 printf ("Report bugs: %s\n", bug_report_url);
1545 printf ("\n");
1548 if (debug)
1550 const char *ptr;
1551 fprintf (stderr, "ld_file_name = %s\n",
1552 (ld_file_name ? ld_file_name : "not found"));
1553 fprintf (stderr, "c_file_name = %s\n",
1554 (c_file_name ? c_file_name : "not found"));
1555 fprintf (stderr, "nm_file_name = %s\n",
1556 (nm_file_name ? nm_file_name : "not found"));
1557 #ifdef LDD_SUFFIX
1558 fprintf (stderr, "ldd_file_name = %s\n",
1559 (ldd_file_name ? ldd_file_name : "not found"));
1560 #endif
1561 fprintf (stderr, "strip_file_name = %s\n",
1562 (strip_file_name ? strip_file_name : "not found"));
1563 fprintf (stderr, "c_file = %s\n",
1564 (c_file ? c_file : "not found"));
1565 fprintf (stderr, "o_file = %s\n",
1566 (o_file ? o_file : "not found"));
1568 ptr = getenv ("COLLECT_GCC_OPTIONS");
1569 if (ptr)
1570 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1572 ptr = getenv ("COLLECT_GCC");
1573 if (ptr)
1574 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1576 ptr = getenv ("COMPILER_PATH");
1577 if (ptr)
1578 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1580 ptr = getenv (LIBRARY_PATH_ENV);
1581 if (ptr)
1582 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1584 fprintf (stderr, "\n");
1587 /* Load the program, searching all libraries and attempting to provide
1588 undefined symbols from repository information.
1590 If -r or they will be run via some other method, do not build the
1591 constructor or destructor list, just return now. */
1593 bool early_exit
1594 = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1596 /* Perform the first pass link now, if we're about to exit or if we need
1597 to scan for things we haven't collected yet before pursuing further.
1599 On AIX, the latter typically includes nothing for shared objects or
1600 frame tables for an executable, out of what the required early scan on
1601 objects and libraries has performed above. In the !shared_obj case, we
1602 expect the relevant tables to be dragged together with their associated
1603 functions from precise cross reference insertions by the compiler. */
1605 if (early_exit || ld1_filter != SCAN_NOTHING)
1606 do_tlink (ld1_argv, object_lst);
1608 if (early_exit)
1610 #ifdef COLLECT_EXPORT_LIST
1611 /* Make sure we delete the export file we may have created. */
1612 if (export_file != 0 && export_file[0])
1613 maybe_unlink (export_file);
1614 #endif
1615 if (lto_mode != LTO_MODE_NONE)
1616 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1617 else
1618 post_ld_pass (false);
1620 maybe_unlink (c_file);
1621 maybe_unlink (o_file);
1622 return 0;
1626 /* Unless we have done it all already, examine the namelist and search for
1627 static constructors and destructors to call. Write the constructor and
1628 destructor tables to a .s file and reload. */
1630 if (ld1_filter != SCAN_NOTHING)
1631 scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1633 #ifdef SCAN_LIBRARIES
1634 scan_libraries (output_file);
1635 #endif
1637 if (debug)
1639 notice_translated (ngettext ("%d constructor found\n",
1640 "%d constructors found\n",
1641 constructors.number),
1642 constructors.number);
1643 notice_translated (ngettext ("%d destructor found\n",
1644 "%d destructors found\n",
1645 destructors.number),
1646 destructors.number);
1647 notice_translated (ngettext("%d frame table found\n",
1648 "%d frame tables found\n",
1649 frame_tables.number),
1650 frame_tables.number);
1653 /* If the scan exposed nothing of special interest, there's no need to
1654 generate the glue code and relink so return now. */
1656 if (constructors.number == 0 && destructors.number == 0
1657 && frame_tables.number == 0
1658 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1659 /* If we will be running these functions ourselves, we want to emit
1660 stubs into the shared library so that we do not have to relink
1661 dependent programs when we add static objects. */
1662 && ! shared_obj
1663 #endif
1666 /* Do tlink without additional code generation now if we didn't
1667 do it earlier for scanning purposes. */
1668 if (ld1_filter == SCAN_NOTHING)
1669 do_tlink (ld1_argv, object_lst);
1671 if (lto_mode)
1672 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1674 /* Strip now if it was requested on the command line. */
1675 if (strip_flag)
1677 char **real_strip_argv = XCNEWVEC (char *, 3);
1678 const char ** strip_argv = CONST_CAST2 (const char **, char **,
1679 real_strip_argv);
1681 strip_argv[0] = strip_file_name;
1682 strip_argv[1] = output_file;
1683 strip_argv[2] = (char *) 0;
1684 fork_execute ("strip", real_strip_argv);
1687 #ifdef COLLECT_EXPORT_LIST
1688 maybe_unlink (export_file);
1689 #endif
1690 post_ld_pass (false);
1692 maybe_unlink (c_file);
1693 maybe_unlink (o_file);
1694 return 0;
1697 /* Sort ctor and dtor lists by priority. */
1698 sort_ids (&constructors);
1699 sort_ids (&destructors);
1701 maybe_unlink(output_file);
1702 outf = fopen (c_file, "w");
1703 if (outf == (FILE *) 0)
1704 fatal_error ("fopen %s: %m", c_file);
1706 write_c_file (outf, c_file);
1708 if (fclose (outf))
1709 fatal_error ("fclose %s: %m", c_file);
1711 /* Tell the linker that we have initializer and finalizer functions. */
1712 #ifdef LD_INIT_SWITCH
1713 #ifdef COLLECT_EXPORT_LIST
1714 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1715 #else
1716 *ld2++ = LD_INIT_SWITCH;
1717 *ld2++ = initname;
1718 *ld2++ = LD_FINI_SWITCH;
1719 *ld2++ = fininame;
1720 #endif
1721 #endif
1723 #ifdef COLLECT_EXPORT_LIST
1724 if (shared_obj)
1726 /* If we did not add export flag to link arguments before, add it to
1727 second link phase now. No new exports should have been added. */
1728 if (! exports.first)
1729 *ld2++ = concat ("-bE:", export_file, NULL);
1731 #ifndef LD_INIT_SWITCH
1732 add_to_list (&exports, initname);
1733 add_to_list (&exports, fininame);
1734 add_to_list (&exports, "_GLOBAL__DI");
1735 add_to_list (&exports, "_GLOBAL__DD");
1736 #endif
1737 exportf = fopen (export_file, "w");
1738 if (exportf == (FILE *) 0)
1739 fatal_error ("fopen %s: %m", export_file);
1740 write_aix_file (exportf, exports.first);
1741 if (fclose (exportf))
1742 fatal_error ("fclose %s: %m", export_file);
1744 #endif
1746 /* End of arguments to second link phase. */
1747 *ld2 = (char*) 0;
1749 if (debug)
1751 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1752 output_file, c_file);
1753 write_c_file (stderr, "stderr");
1754 fprintf (stderr, "========== end of c_file\n\n");
1755 #ifdef COLLECT_EXPORT_LIST
1756 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1757 write_aix_file (stderr, exports.first);
1758 fprintf (stderr, "========== end of export_file\n\n");
1759 #endif
1762 /* Assemble the constructor and destructor tables.
1763 Link the tables in with the rest of the program. */
1765 fork_execute ("gcc", c_argv);
1766 #ifdef COLLECT_EXPORT_LIST
1767 /* On AIX we must call tlink because of possible templates resolution. */
1768 do_tlink (ld2_argv, object_lst);
1770 if (lto_mode)
1771 maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1772 #else
1773 /* Otherwise, simply call ld because tlink is already done. */
1774 if (lto_mode)
1775 maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1776 else
1778 fork_execute ("ld", ld2_argv);
1779 post_ld_pass (false);
1782 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1783 constructors/destructors in shared libraries. */
1784 scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1785 #endif
1787 maybe_unlink (c_file);
1788 maybe_unlink (o_file);
1790 #ifdef COLLECT_EXPORT_LIST
1791 maybe_unlink (export_file);
1792 #endif
1794 return 0;
1798 /* Wait for a process to finish, and exit if a nonzero status is found. */
1801 collect_wait (const char *prog, struct pex_obj *pex)
1803 int status;
1805 if (!pex_get_status (pex, 1, &status))
1806 fatal_error ("can't get program status: %m");
1807 pex_free (pex);
1809 if (status)
1811 if (WIFSIGNALED (status))
1813 int sig = WTERMSIG (status);
1814 error ("%s terminated with signal %d [%s]%s",
1815 prog, sig, strsignal(sig),
1816 WCOREDUMP(status) ? ", core dumped" : "");
1817 exit (FATAL_EXIT_CODE);
1820 if (WIFEXITED (status))
1821 return WEXITSTATUS (status);
1823 return 0;
1826 static void
1827 do_wait (const char *prog, struct pex_obj *pex)
1829 int ret = collect_wait (prog, pex);
1830 if (ret != 0)
1832 error ("%s returned %d exit status", prog, ret);
1833 exit (ret);
1836 if (response_file)
1838 unlink (response_file);
1839 response_file = NULL;
1844 /* Execute a program, and wait for the reply. */
1846 struct pex_obj *
1847 collect_execute (const char *prog, char **argv, const char *outname,
1848 const char *errname, int flags)
1850 struct pex_obj *pex;
1851 const char *errmsg;
1852 int err;
1853 char *response_arg = NULL;
1854 char *response_argv[3] ATTRIBUTE_UNUSED;
1856 if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
1858 /* If using @file arguments, create a temporary file and put the
1859 contents of argv into it. Then change argv to an array corresponding
1860 to a single argument @FILE, where FILE is the temporary filename. */
1862 char **current_argv = argv + 1;
1863 char *argv0 = argv[0];
1864 int status;
1865 FILE *f;
1867 /* Note: we assume argv contains at least one element; this is
1868 checked above. */
1870 response_file = make_temp_file ("");
1872 f = fopen (response_file, "w");
1874 if (f == NULL)
1875 fatal_error ("could not open response file %s", response_file);
1877 status = writeargv (current_argv, f);
1879 if (status)
1880 fatal_error ("could not write to response file %s", response_file);
1882 status = fclose (f);
1884 if (EOF == status)
1885 fatal_error ("could not close response file %s", response_file);
1887 response_arg = concat ("@", response_file, NULL);
1888 response_argv[0] = argv0;
1889 response_argv[1] = response_arg;
1890 response_argv[2] = NULL;
1892 argv = response_argv;
1895 if (vflag || debug)
1897 char **p_argv;
1898 const char *str;
1900 if (argv[0])
1901 fprintf (stderr, "%s", argv[0]);
1902 else
1903 notice ("[cannot find %s]", prog);
1905 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
1906 fprintf (stderr, " %s", str);
1908 fprintf (stderr, "\n");
1911 fflush (stdout);
1912 fflush (stderr);
1914 /* If we cannot find a program we need, complain error. Do this here
1915 since we might not end up needing something that we could not find. */
1917 if (argv[0] == 0)
1918 fatal_error ("cannot find '%s'", prog);
1920 pex = pex_init (0, "collect2", NULL);
1921 if (pex == NULL)
1922 fatal_error ("pex_init failed: %m");
1924 errmsg = pex_run (pex, flags, argv[0], argv, outname,
1925 errname, &err);
1926 if (errmsg != NULL)
1928 if (err != 0)
1930 errno = err;
1931 fatal_error ("%s: %m", _(errmsg));
1933 else
1934 fatal_error (errmsg);
1937 free (response_arg);
1939 return pex;
1942 static void
1943 fork_execute (const char *prog, char **argv)
1945 struct pex_obj *pex;
1947 pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
1948 do_wait (prog, pex);
1951 /* Unlink FILE unless we are debugging or this is the output_file
1952 and we may not unlink it. */
1954 static void
1955 maybe_unlink (const char *file)
1957 if (debug)
1959 notice ("[Leaving %s]\n", file);
1960 return;
1963 if (file == output_file && !may_unlink_output_file)
1964 return;
1966 unlink_if_ordinary (file);
1969 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
1971 static void
1972 maybe_unlink_list (char **file_list)
1974 char **tmp = file_list;
1976 while (*tmp)
1977 maybe_unlink (*(tmp++));
1981 static long sequence_number = 0;
1983 /* Add a name to a linked list. */
1985 static void
1986 add_to_list (struct head *head_ptr, const char *name)
1988 struct id *newid
1989 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
1990 struct id *p;
1991 strcpy (newid->name, name);
1993 if (head_ptr->first)
1994 head_ptr->last->next = newid;
1995 else
1996 head_ptr->first = newid;
1998 /* Check for duplicate symbols. */
1999 for (p = head_ptr->first;
2000 strcmp (name, p->name) != 0;
2001 p = p->next)
2003 if (p != newid)
2005 head_ptr->last->next = 0;
2006 free (newid);
2007 return;
2010 newid->sequence = ++sequence_number;
2011 head_ptr->last = newid;
2012 head_ptr->number++;
2015 /* Grab the init priority number from an init function name that
2016 looks like "_GLOBAL_.I.12345.foo". */
2018 static int
2019 extract_init_priority (const char *name)
2021 int pos = 0, pri;
2023 while (name[pos] == '_')
2024 ++pos;
2025 pos += 10; /* strlen ("GLOBAL__X_") */
2027 /* Extract init_p number from ctor/dtor name. */
2028 pri = atoi (name + pos);
2029 return pri ? pri : DEFAULT_INIT_PRIORITY;
2032 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2033 ctors will be run from right to left, dtors from left to right. */
2035 static void
2036 sort_ids (struct head *head_ptr)
2038 /* id holds the current element to insert. id_next holds the next
2039 element to insert. id_ptr iterates through the already sorted elements
2040 looking for the place to insert id. */
2041 struct id *id, *id_next, **id_ptr;
2043 id = head_ptr->first;
2045 /* We don't have any sorted elements yet. */
2046 head_ptr->first = NULL;
2048 for (; id; id = id_next)
2050 id_next = id->next;
2051 id->sequence = extract_init_priority (id->name);
2053 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2054 if (*id_ptr == NULL
2055 /* If the sequence numbers are the same, we put the id from the
2056 file later on the command line later in the list. */
2057 || id->sequence > (*id_ptr)->sequence
2058 /* Hack: do lexical compare, too.
2059 || (id->sequence == (*id_ptr)->sequence
2060 && strcmp (id->name, (*id_ptr)->name) > 0) */
2063 id->next = *id_ptr;
2064 *id_ptr = id;
2065 break;
2069 /* Now set the sequence numbers properly so write_c_file works. */
2070 for (id = head_ptr->first; id; id = id->next)
2071 id->sequence = ++sequence_number;
2074 /* Write: `prefix', the names on list LIST, `suffix'. */
2076 static void
2077 write_list (FILE *stream, const char *prefix, struct id *list)
2079 while (list)
2081 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2082 list = list->next;
2086 #ifdef COLLECT_EXPORT_LIST
2087 /* This function is really used only on AIX, but may be useful. */
2088 #if 0
2089 static int
2090 is_in_list (const char *prefix, struct id *list)
2092 while (list)
2094 if (!strcmp (prefix, list->name)) return 1;
2095 list = list->next;
2097 return 0;
2099 #endif
2100 #endif /* COLLECT_EXPORT_LIST */
2102 /* Added for debugging purpose. */
2103 #ifdef COLLECT_EXPORT_LIST
2104 static void
2105 dump_list (FILE *stream, const char *prefix, struct id *list)
2107 while (list)
2109 fprintf (stream, "%s%s,\n", prefix, list->name);
2110 list = list->next;
2113 #endif
2115 #if 0
2116 static void
2117 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2119 while (list)
2121 fprintf (stream, "%s%s,\n", prefix, list->prefix);
2122 list = list->next;
2125 #endif
2127 static void
2128 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2130 while (list)
2132 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2133 prefix, list->sequence, list->name);
2134 list = list->next;
2138 /* Write out the constructor and destructor tables statically (for a shared
2139 object), along with the functions to execute them. */
2141 static void
2142 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2144 const char *p, *q;
2145 char *prefix, *r;
2146 int frames = (frame_tables.number > 0);
2148 /* Figure out name of output_file, stripping off .so version. */
2149 q = p = lbasename (output_file);
2151 while (q)
2153 q = strchr (q,'.');
2154 if (q == 0)
2156 q = p + strlen (p);
2157 break;
2159 else
2161 if (filename_ncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2163 q += strlen (SHLIB_SUFFIX);
2164 break;
2166 else
2167 q++;
2170 /* q points to null at end of the string (or . of the .so version) */
2171 prefix = XNEWVEC (char, q - p + 1);
2172 strncpy (prefix, p, q - p);
2173 prefix[q - p] = 0;
2174 for (r = prefix; *r; r++)
2175 if (!ISALNUM ((unsigned char)*r))
2176 *r = '_';
2177 if (debug)
2178 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2179 output_file, prefix);
2181 initname = concat ("_GLOBAL__FI_", prefix, NULL);
2182 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2184 free (prefix);
2186 /* Write the tables as C code. */
2188 fprintf (stream, "static int count;\n");
2189 fprintf (stream, "typedef void entry_pt();\n");
2190 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2192 if (frames)
2194 write_list_with_asm (stream, "extern void *", frame_tables.first);
2196 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2197 write_list (stream, "\t\t&", frame_tables.first);
2198 fprintf (stream, "\t0\n};\n");
2200 /* This must match what's in frame.h. */
2201 fprintf (stream, "struct object {\n");
2202 fprintf (stream, " void *pc_begin;\n");
2203 fprintf (stream, " void *pc_end;\n");
2204 fprintf (stream, " void *fde_begin;\n");
2205 fprintf (stream, " void *fde_array;\n");
2206 fprintf (stream, " __SIZE_TYPE__ count;\n");
2207 fprintf (stream, " struct object *next;\n");
2208 fprintf (stream, "};\n");
2210 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2211 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2213 fprintf (stream, "static void reg_frame () {\n");
2214 fprintf (stream, "\tstatic struct object ob;\n");
2215 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2216 fprintf (stream, "\t}\n");
2218 fprintf (stream, "static void dereg_frame () {\n");
2219 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2220 fprintf (stream, "\t}\n");
2223 fprintf (stream, "void %s() {\n", initname);
2224 if (constructors.number > 0 || frames)
2226 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2227 write_list (stream, "\t\t", constructors.first);
2228 if (frames)
2229 fprintf (stream, "\treg_frame,\n");
2230 fprintf (stream, "\t};\n");
2231 fprintf (stream, "\tentry_pt **p;\n");
2232 fprintf (stream, "\tif (count++ != 0) return;\n");
2233 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2234 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2236 else
2237 fprintf (stream, "\t++count;\n");
2238 fprintf (stream, "}\n");
2239 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2240 fprintf (stream, "void %s() {\n", fininame);
2241 if (destructors.number > 0 || frames)
2243 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2244 write_list (stream, "\t\t", destructors.first);
2245 if (frames)
2246 fprintf (stream, "\tdereg_frame,\n");
2247 fprintf (stream, "\t};\n");
2248 fprintf (stream, "\tentry_pt **p;\n");
2249 fprintf (stream, "\tif (--count != 0) return;\n");
2250 fprintf (stream, "\tp = dtors;\n");
2251 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2252 destructors.number + frames);
2254 fprintf (stream, "}\n");
2256 if (shared_obj)
2258 COLLECT_SHARED_INIT_FUNC(stream, initname);
2259 COLLECT_SHARED_FINI_FUNC(stream, fininame);
2263 /* Write the constructor/destructor tables. */
2265 #ifndef LD_INIT_SWITCH
2266 static void
2267 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2269 /* Write the tables as C code. */
2271 int frames = (frame_tables.number > 0);
2273 fprintf (stream, "typedef void entry_pt();\n\n");
2275 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2277 if (frames)
2279 write_list_with_asm (stream, "extern void *", frame_tables.first);
2281 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2282 write_list (stream, "\t\t&", frame_tables.first);
2283 fprintf (stream, "\t0\n};\n");
2285 /* This must match what's in frame.h. */
2286 fprintf (stream, "struct object {\n");
2287 fprintf (stream, " void *pc_begin;\n");
2288 fprintf (stream, " void *pc_end;\n");
2289 fprintf (stream, " void *fde_begin;\n");
2290 fprintf (stream, " void *fde_array;\n");
2291 fprintf (stream, " __SIZE_TYPE__ count;\n");
2292 fprintf (stream, " struct object *next;\n");
2293 fprintf (stream, "};\n");
2295 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2296 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2298 fprintf (stream, "static void reg_frame () {\n");
2299 fprintf (stream, "\tstatic struct object ob;\n");
2300 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2301 fprintf (stream, "\t}\n");
2303 fprintf (stream, "static void dereg_frame () {\n");
2304 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2305 fprintf (stream, "\t}\n");
2308 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2309 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2310 write_list (stream, "\t", constructors.first);
2311 if (frames)
2312 fprintf (stream, "\treg_frame,\n");
2313 fprintf (stream, "\t0\n};\n\n");
2315 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2317 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2318 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2319 write_list (stream, "\t", destructors.first);
2320 if (frames)
2321 fprintf (stream, "\tdereg_frame,\n");
2322 fprintf (stream, "\t0\n};\n\n");
2324 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2325 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2327 #endif /* ! LD_INIT_SWITCH */
2329 static void
2330 write_c_file (FILE *stream, const char *name)
2332 #ifndef LD_INIT_SWITCH
2333 if (! shared_obj)
2334 write_c_file_glob (stream, name);
2335 else
2336 #endif
2337 write_c_file_stat (stream, name);
2340 #ifdef COLLECT_EXPORT_LIST
2341 static void
2342 write_aix_file (FILE *stream, struct id *list)
2344 for (; list; list = list->next)
2346 fputs (list->name, stream);
2347 putc ('\n', stream);
2350 #endif
2352 #ifdef OBJECT_FORMAT_NONE
2354 /* Check to make sure the file is an LTO object file. */
2356 static bool
2357 maybe_lto_object_file (const char *prog_name)
2359 FILE *f;
2360 unsigned char buf[4];
2361 int i;
2363 static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2364 static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2365 static unsigned char coffmagic_x64[2] = { 0x64, 0x86 };
2366 static unsigned char machomagic[4][4] = {
2367 { 0xcf, 0xfa, 0xed, 0xfe },
2368 { 0xce, 0xfa, 0xed, 0xfe },
2369 { 0xfe, 0xed, 0xfa, 0xcf },
2370 { 0xfe, 0xed, 0xfa, 0xce }
2373 f = fopen (prog_name, "rb");
2374 if (f == NULL)
2375 return false;
2376 if (fread (buf, sizeof (buf), 1, f) != 1)
2377 buf[0] = 0;
2378 fclose (f);
2380 if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2381 || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0
2382 || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0)
2383 return true;
2384 for (i = 0; i < 4; i++)
2385 if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2386 return true;
2388 return false;
2391 /* Generic version to scan the name list of the loaded program for
2392 the symbols g++ uses for static constructors and destructors. */
2394 static void
2395 scan_prog_file (const char *prog_name, scanpass which_pass,
2396 scanfilter filter)
2398 void (*int_handler) (int);
2399 #ifdef SIGQUIT
2400 void (*quit_handler) (int);
2401 #endif
2402 char *real_nm_argv[4];
2403 const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2404 int argc = 0;
2405 struct pex_obj *pex;
2406 const char *errmsg;
2407 int err;
2408 char *p, buf[1024];
2409 FILE *inf;
2410 int found_lto = 0;
2412 if (which_pass == PASS_SECOND)
2413 return;
2415 /* LTO objects must be in a known format. This check prevents
2416 us from accepting an archive containing LTO objects, which
2417 gcc cannot currently handle. */
2418 if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2419 return;
2421 /* If we do not have an `nm', complain. */
2422 if (nm_file_name == 0)
2423 fatal_error ("cannot find 'nm'");
2425 nm_argv[argc++] = nm_file_name;
2426 if (NM_FLAGS[0] != '\0')
2427 nm_argv[argc++] = NM_FLAGS;
2429 nm_argv[argc++] = prog_name;
2430 nm_argv[argc++] = (char *) 0;
2432 /* Trace if needed. */
2433 if (vflag)
2435 const char **p_argv;
2436 const char *str;
2438 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2439 fprintf (stderr, " %s", str);
2441 fprintf (stderr, "\n");
2444 fflush (stdout);
2445 fflush (stderr);
2447 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2448 if (pex == NULL)
2449 fatal_error ("pex_init failed: %m");
2451 errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2452 &err);
2453 if (errmsg != NULL)
2455 if (err != 0)
2457 errno = err;
2458 fatal_error ("%s: %m", _(errmsg));
2460 else
2461 fatal_error (errmsg);
2464 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2465 #ifdef SIGQUIT
2466 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2467 #endif
2469 inf = pex_read_output (pex, 0);
2470 if (inf == NULL)
2471 fatal_error ("can't open nm output: %m");
2473 if (debug)
2475 if (which_pass == PASS_LTOINFO)
2476 fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2477 else
2478 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2481 /* Read each line of nm output. */
2482 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2484 int ch, ch2;
2485 char *name, *end;
2487 if (debug)
2488 fprintf (stderr, "\t%s\n", buf);
2490 if (which_pass == PASS_LTOINFO)
2492 if (found_lto)
2493 continue;
2495 /* Look for the LTO info marker symbol, and add filename to
2496 the LTO objects list if found. */
2497 for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2498 if (ch == ' ' && p[1] == '_' && p[2] == '_'
2499 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2500 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2502 add_lto_object (&lto_objects, prog_name);
2504 /* We need to read all the input, so we can't just
2505 return here. But we can avoid useless work. */
2506 found_lto = 1;
2508 break;
2511 continue;
2514 /* If it contains a constructor or destructor name, add the name
2515 to the appropriate list unless this is a kind of symbol we're
2516 not supposed to even consider. */
2518 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2519 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2520 break;
2522 if (ch != '_')
2523 continue;
2525 name = p;
2526 /* Find the end of the symbol name.
2527 Do not include `|', because Encore nm can tack that on the end. */
2528 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2529 end++)
2530 continue;
2533 *end = '\0';
2534 switch (is_ctor_dtor (name))
2536 case SYM_CTOR:
2537 if (! (filter & SCAN_CTOR))
2538 break;
2539 if (which_pass != PASS_LIB)
2540 add_to_list (&constructors, name);
2541 break;
2543 case SYM_DTOR:
2544 if (! (filter & SCAN_DTOR))
2545 break;
2546 if (which_pass != PASS_LIB)
2547 add_to_list (&destructors, name);
2548 break;
2550 case SYM_INIT:
2551 if (! (filter & SCAN_INIT))
2552 break;
2553 if (which_pass != PASS_LIB)
2554 fatal_error ("init function found in object %s", prog_name);
2555 #ifndef LD_INIT_SWITCH
2556 add_to_list (&constructors, name);
2557 #endif
2558 break;
2560 case SYM_FINI:
2561 if (! (filter & SCAN_FINI))
2562 break;
2563 if (which_pass != PASS_LIB)
2564 fatal_error ("fini function found in object %s", prog_name);
2565 #ifndef LD_FINI_SWITCH
2566 add_to_list (&destructors, name);
2567 #endif
2568 break;
2570 case SYM_DWEH:
2571 if (! (filter & SCAN_DWEH))
2572 break;
2573 if (which_pass != PASS_LIB)
2574 add_to_list (&frame_tables, name);
2575 break;
2577 default: /* not a constructor or destructor */
2578 continue;
2582 if (debug)
2583 fprintf (stderr, "\n");
2585 do_wait (nm_file_name, pex);
2587 signal (SIGINT, int_handler);
2588 #ifdef SIGQUIT
2589 signal (SIGQUIT, quit_handler);
2590 #endif
2593 #ifdef LDD_SUFFIX
2595 /* Use the List Dynamic Dependencies program to find shared libraries that
2596 the output file depends upon and their initialization/finalization
2597 routines, if any. */
2599 static void
2600 scan_libraries (const char *prog_name)
2602 static struct head libraries; /* list of shared libraries found */
2603 struct id *list;
2604 void (*int_handler) (int);
2605 #ifdef SIGQUIT
2606 void (*quit_handler) (int);
2607 #endif
2608 char *real_ldd_argv[4];
2609 const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2610 int argc = 0;
2611 struct pex_obj *pex;
2612 const char *errmsg;
2613 int err;
2614 char buf[1024];
2615 FILE *inf;
2617 /* If we do not have an `ldd', complain. */
2618 if (ldd_file_name == 0)
2620 error ("cannot find 'ldd'");
2621 return;
2624 ldd_argv[argc++] = ldd_file_name;
2625 ldd_argv[argc++] = prog_name;
2626 ldd_argv[argc++] = (char *) 0;
2628 /* Trace if needed. */
2629 if (vflag)
2631 const char **p_argv;
2632 const char *str;
2634 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2635 fprintf (stderr, " %s", str);
2637 fprintf (stderr, "\n");
2640 fflush (stdout);
2641 fflush (stderr);
2643 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2644 if (pex == NULL)
2645 fatal_error ("pex_init failed: %m");
2647 errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2648 if (errmsg != NULL)
2650 if (err != 0)
2652 errno = err;
2653 fatal_error ("%s: %m", _(errmsg));
2655 else
2656 fatal_error (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_error ("can't open ldd output: %m");
2668 if (debug)
2669 notice ("\nldd output with constructors/destructors.\n");
2671 /* Read each line of ldd output. */
2672 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2674 int ch2;
2675 char *name, *end, *p = buf;
2677 /* Extract names of libraries and add to list. */
2678 PARSE_LDD_OUTPUT (p);
2679 if (p == 0)
2680 continue;
2682 name = p;
2683 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2684 fatal_error ("dynamic dependency %s not found", buf);
2686 /* Find the end of the symbol name. */
2687 for (end = p;
2688 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2689 end++)
2690 continue;
2691 *end = '\0';
2693 if (access (name, R_OK) == 0)
2694 add_to_list (&libraries, name);
2695 else
2696 fatal_error ("unable to open dynamic dependency '%s'", buf);
2698 if (debug)
2699 fprintf (stderr, "\t%s\n", buf);
2701 if (debug)
2702 fprintf (stderr, "\n");
2704 do_wait (ldd_file_name, pex);
2706 signal (SIGINT, int_handler);
2707 #ifdef SIGQUIT
2708 signal (SIGQUIT, quit_handler);
2709 #endif
2711 /* Now iterate through the library list adding their symbols to
2712 the list. */
2713 for (list = libraries.first; list; list = list->next)
2714 scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2717 #endif /* LDD_SUFFIX */
2719 #endif /* OBJECT_FORMAT_NONE */
2723 * COFF specific stuff.
2726 #ifdef OBJECT_FORMAT_COFF
2728 #if defined (EXTENDED_COFF)
2730 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2731 # define GCC_SYMENT SYMR
2732 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2733 # define GCC_SYMINC(X) (1)
2734 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2735 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2737 #else
2739 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2740 # define GCC_SYMENT SYMENT
2741 # if defined (C_WEAKEXT)
2742 # define GCC_OK_SYMBOL(X) \
2743 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2744 ((X).n_scnum > N_UNDEF) && \
2745 (aix64_flag \
2746 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2747 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2748 # define GCC_UNDEF_SYMBOL(X) \
2749 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2750 ((X).n_scnum == N_UNDEF))
2751 # else
2752 # define GCC_OK_SYMBOL(X) \
2753 (((X).n_sclass == C_EXT) && \
2754 ((X).n_scnum > N_UNDEF) && \
2755 (aix64_flag \
2756 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2757 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2758 # define GCC_UNDEF_SYMBOL(X) \
2759 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2760 # endif
2761 # define GCC_SYMINC(X) ((X).n_numaux+1)
2762 # define GCC_SYMZERO(X) 0
2764 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2765 #if TARGET_AIX_VERSION >= 51
2766 # define GCC_CHECK_HDR(X) \
2767 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2768 || (HEADER (X).f_magic == 0767 && aix64_flag)) \
2769 && !(HEADER (X).f_flags & F_LOADONLY))
2770 #else
2771 # define GCC_CHECK_HDR(X) \
2772 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2773 || (HEADER (X).f_magic == 0757 && aix64_flag)) \
2774 && !(HEADER (X).f_flags & F_LOADONLY))
2775 #endif
2777 #endif
2779 #ifdef COLLECT_EXPORT_LIST
2780 /* Array of standard AIX libraries which should not
2781 be scanned for ctors/dtors. */
2782 static const char *const aix_std_libs[] = {
2783 "/unix",
2784 "/lib/libc.a",
2785 "/lib/libm.a",
2786 "/lib/libc_r.a",
2787 "/lib/libm_r.a",
2788 "/usr/lib/libc.a",
2789 "/usr/lib/libm.a",
2790 "/usr/lib/libc_r.a",
2791 "/usr/lib/libm_r.a",
2792 "/usr/lib/threads/libc.a",
2793 "/usr/ccs/lib/libc.a",
2794 "/usr/ccs/lib/libm.a",
2795 "/usr/ccs/lib/libc_r.a",
2796 "/usr/ccs/lib/libm_r.a",
2797 NULL
2800 /* This function checks the filename and returns 1
2801 if this name matches the location of a standard AIX library. */
2802 static int ignore_library (const char *);
2803 static int
2804 ignore_library (const char *name)
2806 const char *const *p;
2807 size_t length;
2809 if (target_system_root[0] != '\0')
2811 length = strlen (target_system_root);
2812 if (strncmp (name, target_system_root, length) != 0)
2813 return 0;
2814 name += length;
2816 for (p = &aix_std_libs[0]; *p != NULL; ++p)
2817 if (strcmp (name, *p) == 0)
2818 return 1;
2819 return 0;
2821 #endif /* COLLECT_EXPORT_LIST */
2823 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2824 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2825 #endif
2827 /* COFF version to scan the name list of the loaded program for
2828 the symbols g++ uses for static constructors and destructors. */
2830 static void
2831 scan_prog_file (const char *prog_name, scanpass which_pass,
2832 scanfilter filter)
2834 LDFILE *ldptr = NULL;
2835 int sym_index, sym_count;
2836 int is_shared = 0;
2838 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2839 return;
2841 #ifdef COLLECT_EXPORT_LIST
2842 /* We do not need scanning for some standard C libraries. */
2843 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2844 return;
2846 /* On AIX we have a loop, because there is not much difference
2847 between an object and an archive. This trick allows us to
2848 eliminate scan_libraries() function. */
2851 #endif
2852 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2853 non-const char * filename parameter, even though it will not
2854 modify that string. So we must cast away const-ness here,
2855 using CONST_CAST to prevent complaints from -Wcast-qual. */
2856 if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
2858 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
2859 fatal_error ("%s: not a COFF file", prog_name);
2861 if (GCC_CHECK_HDR (ldptr))
2863 sym_count = GCC_SYMBOLS (ldptr);
2864 sym_index = GCC_SYMZERO (ldptr);
2866 #ifdef COLLECT_EXPORT_LIST
2867 /* Is current archive member a shared object? */
2868 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2869 #endif
2871 while (sym_index < sym_count)
2873 GCC_SYMENT symbol;
2875 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2876 break;
2877 sym_index += GCC_SYMINC (symbol);
2879 if (GCC_OK_SYMBOL (symbol))
2881 char *name;
2883 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2884 continue; /* Should never happen. */
2886 #ifdef XCOFF_DEBUGGING_INFO
2887 /* All AIX function names have a duplicate entry
2888 beginning with a dot. */
2889 if (*name == '.')
2890 ++name;
2891 #endif
2893 switch (is_ctor_dtor (name))
2895 case SYM_CTOR:
2896 if (! (filter & SCAN_CTOR))
2897 break;
2898 if (! is_shared)
2899 add_to_list (&constructors, name);
2900 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2901 if (which_pass == PASS_OBJ)
2902 add_to_list (&exports, name);
2903 #endif
2904 break;
2906 case SYM_DTOR:
2907 if (! (filter & SCAN_DTOR))
2908 break;
2909 if (! is_shared)
2910 add_to_list (&destructors, name);
2911 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2912 if (which_pass == PASS_OBJ)
2913 add_to_list (&exports, name);
2914 #endif
2915 break;
2917 #ifdef COLLECT_EXPORT_LIST
2918 case SYM_INIT:
2919 if (! (filter & SCAN_INIT))
2920 break;
2921 #ifndef LD_INIT_SWITCH
2922 if (is_shared)
2923 add_to_list (&constructors, name);
2924 #endif
2925 break;
2927 case SYM_FINI:
2928 if (! (filter & SCAN_FINI))
2929 break;
2930 #ifndef LD_INIT_SWITCH
2931 if (is_shared)
2932 add_to_list (&destructors, name);
2933 #endif
2934 break;
2935 #endif
2937 case SYM_DWEH:
2938 if (! (filter & SCAN_DWEH))
2939 break;
2940 if (! is_shared)
2941 add_to_list (&frame_tables, name);
2942 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2943 if (which_pass == PASS_OBJ)
2944 add_to_list (&exports, name);
2945 #endif
2946 break;
2948 default: /* not a constructor or destructor */
2949 #ifdef COLLECT_EXPORT_LIST
2950 /* Explicitly export all global symbols when
2951 building a shared object on AIX, but do not
2952 re-export symbols from another shared object
2953 and do not export symbols if the user
2954 provides an explicit export list. */
2955 if (shared_obj && !is_shared
2956 && which_pass == PASS_OBJ && !export_flag)
2957 add_to_list (&exports, name);
2958 #endif
2959 continue;
2962 if (debug)
2963 #if !defined(EXTENDED_COFF)
2964 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
2965 symbol.n_scnum, symbol.n_sclass,
2966 (symbol.n_type ? "0" : ""), symbol.n_type,
2967 name);
2968 #else
2969 fprintf (stderr,
2970 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
2971 symbol.iss, (long) symbol.value, symbol.index, name);
2972 #endif
2976 #ifdef COLLECT_EXPORT_LIST
2977 else
2979 /* If archive contains both 32-bit and 64-bit objects,
2980 we want to skip objects in other mode so mismatch normal. */
2981 if (debug)
2982 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
2983 prog_name, HEADER (ldptr).f_magic, aix64_flag);
2985 #endif
2987 else
2989 fatal_error ("%s: cannot open as COFF file", prog_name);
2991 #ifdef COLLECT_EXPORT_LIST
2992 /* On AIX loop continues while there are more members in archive. */
2994 while (ldclose (ldptr) == FAILURE);
2995 #else
2996 /* Otherwise we simply close ldptr. */
2997 (void) ldclose(ldptr);
2998 #endif
3000 #endif /* OBJECT_FORMAT_COFF */
3002 #ifdef COLLECT_EXPORT_LIST
3003 /* Given a library name without "lib" prefix, this function
3004 returns a full library name including a path. */
3005 static char *
3006 resolve_lib_name (const char *name)
3008 char *lib_buf;
3009 int i, j, l = 0;
3010 /* Library extensions for AIX dynamic linking. */
3011 const char * const libexts[2] = {"a", "so"};
3013 for (i = 0; libpaths[i]; i++)
3014 if (libpaths[i]->max_len > l)
3015 l = libpaths[i]->max_len;
3017 lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3019 for (i = 0; libpaths[i]; i++)
3021 struct prefix_list *list = libpaths[i]->plist;
3022 for (; list; list = list->next)
3024 /* The following lines are needed because path_prefix list
3025 may contain directories both with trailing DIR_SEPARATOR and
3026 without it. */
3027 const char *p = "";
3028 if (!IS_DIR_SEPARATOR (list->prefix[strlen(list->prefix)-1]))
3029 p = "/";
3030 for (j = 0; j < 2; j++)
3032 sprintf (lib_buf, "%s%slib%s.%s",
3033 list->prefix, p, name,
3034 libexts[(j + aixrtl_flag) % 2]);
3035 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3036 if (file_exists (lib_buf))
3038 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3039 return (lib_buf);
3044 if (debug)
3045 fprintf (stderr, "not found\n");
3046 else
3047 fatal_error ("library lib%s not found", name);
3048 return (NULL);
3050 #endif /* COLLECT_EXPORT_LIST */
3052 #ifdef COLLECT_RUN_DSYMUTIL
3053 static int flag_dsym = false;
3054 static int flag_idsym = false;
3056 static void
3057 process_args (int *argcp, char **argv) {
3058 int i, j;
3059 int argc = *argcp;
3060 for (i=0; i<argc; ++i)
3062 if (strcmp (argv[i], "-dsym") == 0)
3064 flag_dsym = true;
3065 /* Remove the flag, as we handle all processing for it. */
3066 j = i;
3068 argv[j] = argv[j+1];
3069 while (++j < argc);
3070 --i;
3071 argc = --(*argcp);
3073 else if (strcmp (argv[i], "-idsym") == 0)
3075 flag_idsym = true;
3076 /* Remove the flag, as we handle all processing for it. */
3077 j = i;
3079 argv[j] = argv[j+1];
3080 while (++j < argc);
3081 --i;
3082 argc = --(*argcp);
3087 static void
3088 do_dsymutil (const char *output_file) {
3089 const char *dsymutil = DSYMUTIL + 1;
3090 struct pex_obj *pex;
3091 char **real_argv = XCNEWVEC (char *, 3);
3092 const char ** argv = CONST_CAST2 (const char **, char **,
3093 real_argv);
3095 argv[0] = dsymutil;
3096 argv[1] = output_file;
3097 argv[2] = (char *) 0;
3099 pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
3100 do_wait (dsymutil, pex);
3103 static void
3104 post_ld_pass (bool temp_file) {
3105 if (!(temp_file && flag_idsym) && !flag_dsym)
3106 return;
3108 do_dsymutil (output_file);
3110 #else
3111 static void
3112 process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { }
3113 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { }
3114 #endif