match_asm_constraints: Use copy_rtx where needed (PR88001)
[official-gcc.git] / gcc / collect2.c
blob6463ff7b6454e995da44ed3d3692bf6c4d70469c
1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992-2018 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 "collect-utils.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 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 static int aixlazy_flag; /* true if -blazy */
186 #endif
188 enum lto_mode_d {
189 LTO_MODE_NONE, /* Not doing LTO. */
190 LTO_MODE_LTO, /* Normal LTO. */
191 LTO_MODE_WHOPR /* WHOPR. */
194 /* Current LTO mode. */
195 #ifdef ENABLE_LTO
196 static enum lto_mode_d lto_mode = LTO_MODE_WHOPR;
197 #else
198 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
199 #endif
201 bool helpflag; /* true if --help */
203 static int shared_obj; /* true if -shared */
204 static int static_obj; /* true if -static */
206 static const char *c_file; /* <xxx>.c for constructor/destructor list. */
207 static const char *o_file; /* <xxx>.o for constructor/destructor list. */
208 #ifdef COLLECT_EXPORT_LIST
209 static const char *export_file; /* <xxx>.x for AIX export list. */
210 #endif
211 static char **lto_o_files; /* Output files for LTO. */
212 const char *ldout; /* File for ld stdout. */
213 const char *lderrout; /* File for ld stderr. */
214 static const char *output_file; /* Output file for ld. */
215 static const char *nm_file_name; /* pathname of nm */
216 #ifdef LDD_SUFFIX
217 static const char *ldd_file_name; /* pathname of ldd (or equivalent) */
218 #endif
219 static const char *strip_file_name; /* pathname of strip */
220 const char *c_file_name; /* pathname of gcc */
221 static char *initname, *fininame; /* names of init and fini funcs */
224 #ifdef TARGET_AIX_VERSION
225 static char *aix_shared_initname;
226 static char *aix_shared_fininame; /* init/fini names as per the scheme
227 described in config/rs6000/aix.h */
228 #endif
230 static struct head constructors; /* list of constructors found */
231 static struct head destructors; /* list of destructors found */
232 #ifdef COLLECT_EXPORT_LIST
233 static struct head exports; /* list of exported symbols */
234 #endif
235 static struct head frame_tables; /* list of frame unwind info tables */
237 bool at_file_supplied; /* Whether to use @file arguments */
239 struct obstack temporary_obstack;
240 char * temporary_firstobj;
242 /* A string that must be prepended to a target OS path in order to find
243 it on the host system. */
244 #ifdef TARGET_SYSTEM_ROOT
245 static const char *target_system_root = TARGET_SYSTEM_ROOT;
246 #else
247 static const char *target_system_root = "";
248 #endif
250 /* Whether we may unlink the output file, which should be set as soon as we
251 know we have successfully produced it. This is typically useful to prevent
252 blindly attempting to unlink a read-only output that the target linker
253 would leave untouched. */
254 bool may_unlink_output_file = false;
256 #ifdef COLLECT_EXPORT_LIST
257 /* Lists to keep libraries to be scanned for global constructors/destructors. */
258 static struct head libs; /* list of libraries */
259 static struct head static_libs; /* list of statically linked 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 enum symkind {
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 SYM_AIXI = 6,
296 SYM_AIXD = 7
299 const char tool_name[] = "collect2";
301 static symkind is_ctor_dtor (const char *);
303 static void handler (int);
304 static void maybe_unlink_list (char **);
305 static void add_to_list (struct head *, const char *);
306 static int extract_init_priority (const char *);
307 static void sort_ids (struct head *);
308 static void write_list (FILE *, const char *, struct id *);
309 #ifdef COLLECT_EXPORT_LIST
310 static void dump_list (FILE *, const char *, struct id *);
311 #endif
312 #if 0
313 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
314 #endif
315 static void write_list_with_asm (FILE *, const char *, struct id *);
316 static void write_c_file (FILE *, const char *);
317 static void write_c_file_stat (FILE *, const char *);
318 #ifndef LD_INIT_SWITCH
319 static void write_c_file_glob (FILE *, const char *);
320 #endif
321 #ifdef SCAN_LIBRARIES
322 static void scan_libraries (const char *);
323 #endif
324 #ifdef COLLECT_EXPORT_LIST
325 static int is_in_list (const char *, struct id *);
326 static void write_aix_file (FILE *, struct id *);
327 static char *resolve_lib_name (const char *);
328 #endif
329 static char *extract_string (const char **);
330 static void post_ld_pass (bool);
331 static void process_args (int *argcp, char **argv);
333 /* Enumerations describing which pass this is for scanning the
334 program file ... */
336 enum scanpass {
337 PASS_FIRST, /* without constructors */
338 PASS_OBJ, /* individual objects */
339 PASS_LIB, /* looking for shared libraries */
340 PASS_SECOND, /* with constructors linked in */
341 PASS_LTOINFO /* looking for objects with LTO info */
344 /* ... and which kinds of symbols are to be considered. */
346 enum scanfilter_masks {
347 SCAN_NOTHING = 0,
349 SCAN_CTOR = 1 << SYM_CTOR,
350 SCAN_DTOR = 1 << SYM_DTOR,
351 SCAN_INIT = 1 << SYM_INIT,
352 SCAN_FINI = 1 << SYM_FINI,
353 SCAN_DWEH = 1 << SYM_DWEH,
354 SCAN_AIXI = 1 << SYM_AIXI,
355 SCAN_AIXD = 1 << SYM_AIXD,
356 SCAN_ALL = ~0
359 /* This type is used for parameters and variables which hold
360 combinations of the flags in enum scanfilter_masks. */
361 typedef int scanfilter;
363 /* Scan the name list of the loaded program for the symbols g++ uses for
364 static constructors and destructors.
366 The SCANPASS argument tells which collect processing pass this is for and
367 the SCANFILTER argument tells which kinds of symbols to consider in this
368 pass. Symbols of a special kind not in the filter mask are considered as
369 regular ones.
371 The constructor table begins at __CTOR_LIST__ and contains a count of the
372 number of pointers (or -1 if the constructors are built in a separate
373 section by the linker), followed by the pointers to the constructor
374 functions, terminated with a null pointer. The destructor table has the
375 same format, and begins at __DTOR_LIST__. */
377 static void scan_prog_file (const char *, scanpass, scanfilter);
380 /* Delete tempfiles and exit function. */
382 void
383 tool_cleanup (bool from_signal)
385 if (c_file != 0 && c_file[0])
386 maybe_unlink (c_file);
388 if (o_file != 0 && o_file[0])
389 maybe_unlink (o_file);
391 #ifdef COLLECT_EXPORT_LIST
392 if (export_file != 0 && export_file[0])
393 maybe_unlink (export_file);
394 #endif
396 if (lto_o_files)
397 maybe_unlink_list (lto_o_files);
399 if (ldout != 0 && ldout[0])
401 if (!from_signal)
402 dump_ld_file (ldout, stdout);
403 maybe_unlink (ldout);
406 if (lderrout != 0 && lderrout[0])
408 if (!from_signal)
409 dump_ld_file (lderrout, stderr);
410 maybe_unlink (lderrout);
414 static void
415 collect_atexit (void)
417 tool_cleanup (false);
420 static void
421 handler (int signo)
423 tool_cleanup (true);
425 signal (signo, SIG_DFL);
426 raise (signo);
428 /* Notify user of a non-error, without translating the format string. */
429 void
430 notice_translated (const char *cmsgid, ...)
432 va_list ap;
434 va_start (ap, cmsgid);
435 vfprintf (stderr, cmsgid, ap);
436 va_end (ap);
440 file_exists (const char *name)
442 return access (name, R_OK) == 0;
445 /* Parse a reasonable subset of shell quoting syntax. */
447 static char *
448 extract_string (const char **pp)
450 const char *p = *pp;
451 int backquote = 0;
452 int inside = 0;
454 for (;;)
456 char c = *p;
457 if (c == '\0')
458 break;
459 ++p;
460 if (backquote)
461 obstack_1grow (&temporary_obstack, c);
462 else if (! inside && c == ' ')
463 break;
464 else if (! inside && c == '\\')
465 backquote = 1;
466 else if (c == '\'')
467 inside = !inside;
468 else
469 obstack_1grow (&temporary_obstack, c);
472 obstack_1grow (&temporary_obstack, '\0');
473 *pp = p;
474 return XOBFINISH (&temporary_obstack, char *);
477 void
478 dump_ld_file (const char *name, FILE *to)
480 FILE *stream = fopen (name, "r");
482 if (stream == 0)
483 return;
484 while (1)
486 int c;
487 while (c = getc (stream),
488 c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
489 obstack_1grow (&temporary_obstack, c);
490 if (obstack_object_size (&temporary_obstack) > 0)
492 const char *word, *p;
493 char *result;
494 obstack_1grow (&temporary_obstack, '\0');
495 word = XOBFINISH (&temporary_obstack, const char *);
497 if (*word == '.')
498 ++word, putc ('.', to);
499 p = word;
500 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
501 p += strlen (USER_LABEL_PREFIX);
503 #ifdef HAVE_LD_DEMANGLE
504 result = 0;
505 #else
506 if (no_demangle)
507 result = 0;
508 else
509 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
510 #endif
512 if (result)
514 int diff;
515 fputs (result, to);
517 diff = strlen (word) - strlen (result);
518 while (diff > 0 && c == ' ')
519 --diff, putc (' ', to);
520 if (diff < 0 && c == ' ')
522 while (diff < 0 && c == ' ')
523 ++diff, c = getc (stream);
524 if (!ISSPACE (c))
526 /* Make sure we output at least one space, or
527 the demangled symbol name will run into
528 whatever text follows. */
529 putc (' ', to);
533 free (result);
535 else
536 fputs (word, to);
538 fflush (to);
539 obstack_free (&temporary_obstack, temporary_firstobj);
541 if (c == EOF)
542 break;
543 putc (c, to);
545 fclose (stream);
548 /* Return the kind of symbol denoted by name S. */
550 static symkind
551 is_ctor_dtor (const char *s)
553 struct names { const char *const name; const int len; symkind ret;
554 const int two_underscores; };
556 const struct names *p;
557 int ch;
558 const char *orig_s = s;
560 static const struct names special[] = {
561 #ifndef NO_DOLLAR_IN_LABEL
562 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
563 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
564 #else
565 #ifndef NO_DOT_IN_LABEL
566 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
567 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
568 #endif /* NO_DOT_IN_LABEL */
569 #endif /* NO_DOLLAR_IN_LABEL */
570 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
571 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
572 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
573 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
574 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
575 #ifdef TARGET_AIX_VERSION
576 { "GLOBAL__AIXI_", sizeof ("GLOBAL__AIXI_")-1, SYM_AIXI, 0 },
577 { "GLOBAL__AIXD_", sizeof ("GLOBAL__AIXD_")-1, SYM_AIXD, 0 },
578 #endif
579 { NULL, 0, SYM_REGULAR, 0 }
582 while ((ch = *s) == '_')
583 ++s;
585 if (s == orig_s)
586 return SYM_REGULAR;
588 for (p = &special[0]; p->len > 0; p++)
590 if (ch == p->name[0]
591 && (!p->two_underscores || ((s - orig_s) >= 2))
592 && strncmp (s, p->name, p->len) == 0)
594 return p->ret;
597 return SYM_REGULAR;
600 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
601 and one from the PATH variable. */
603 static struct path_prefix cpath, path;
605 #ifdef CROSS_DIRECTORY_STRUCTURE
606 /* This is the name of the target machine. We use it to form the name
607 of the files to execute. */
609 static const char *const target_machine = TARGET_MACHINE;
610 #endif
612 /* Search for NAME using prefix list PPREFIX. We only look for executable
613 files.
615 Return 0 if not found, otherwise return its name, allocated with malloc. */
617 #if defined (OBJECT_FORMAT_NONE) || defined (OBJECT_FORMAT_COFF)
619 /* Add an entry for the object file NAME to object file list LIST.
620 New entries are added at the end of the list. The original pointer
621 value of NAME is preserved, i.e., no string copy is performed. */
623 static void
624 add_lto_object (struct lto_object_list *list, const char *name)
626 struct lto_object *n = XNEW (struct lto_object);
627 n->name = name;
628 n->next = NULL;
630 if (list->last)
631 list->last->next = n;
632 else
633 list->first = n;
635 list->last = n;
637 #endif
640 /* Perform a link-time recompilation and relink if any of the object
641 files contain LTO info. The linker command line LTO_LD_ARGV
642 represents the linker command that would produce a final executable
643 without the use of LTO. OBJECT_LST is a vector of object file names
644 appearing in LTO_LD_ARGV that are to be considered for link-time
645 recompilation, where OBJECT is a pointer to the last valid element.
646 (This awkward convention avoids an impedance mismatch with the
647 usage of similarly-named variables in main().) The elements of
648 OBJECT_LST must be identical, i.e., pointer equal, to the
649 corresponding arguments in LTO_LD_ARGV.
651 Upon entry, at least one linker run has been performed without the
652 use of any LTO info that might be present. Any recompilations
653 necessary for template instantiations have been performed, and
654 initializer/finalizer tables have been created if needed and
655 included in the linker command line LTO_LD_ARGV. If any of the
656 object files contain LTO info, we run the LTO back end on all such
657 files, and perform the final link with the LTO back end output
658 substituted for the LTO-optimized files. In some cases, a final
659 link with all link-time generated code has already been performed,
660 so there is no need to relink if no LTO info is found. In other
661 cases, our caller has not produced the final executable, and is
662 relying on us to perform the required link whether LTO info is
663 present or not. In that case, the FORCE argument should be true.
664 Note that the linker command line argument LTO_LD_ARGV passed into
665 this function may be modified in place. */
667 static void
668 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
669 const char **object, bool force)
671 const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
673 int num_lto_c_args = 1; /* Allow space for the terminating NULL. */
675 while (object_file < object)
677 /* If file contains LTO info, add it to the list of LTO objects. */
678 scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
680 /* Increment the argument count by the number of object file arguments
681 we will add. An upper bound suffices, so just count all of the
682 object files regardless of whether they contain LTO info. */
683 num_lto_c_args++;
686 if (lto_objects.first)
688 char **lto_c_argv;
689 const char **lto_c_ptr;
690 char **p;
691 char **lto_o_ptr;
692 struct lto_object *list;
693 char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
694 struct pex_obj *pex;
695 const char *prog = "lto-wrapper";
696 int lto_ld_argv_size = 0;
697 char **out_lto_ld_argv;
698 int out_lto_ld_argv_size;
699 size_t num_files;
701 if (!lto_wrapper)
702 fatal_error (input_location, "COLLECT_LTO_WRAPPER must be set");
704 num_lto_c_args++;
706 /* There is at least one object file containing LTO info,
707 so we need to run the LTO back end and relink.
709 To do so we build updated ld arguments with first
710 LTO object replaced by all partitions and other LTO
711 objects removed. */
713 lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
714 lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
716 *lto_c_ptr++ = lto_wrapper;
718 /* Add LTO objects to the wrapper command line. */
719 for (list = lto_objects.first; list; list = list->next)
720 *lto_c_ptr++ = list->name;
722 *lto_c_ptr = NULL;
724 /* Run the LTO back end. */
725 pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH,
726 at_file_supplied);
728 int c;
729 FILE *stream;
730 size_t i;
731 char *start, *end;
733 stream = pex_read_output (pex, 0);
734 gcc_assert (stream);
736 num_files = 0;
737 while ((c = getc (stream)) != EOF)
739 obstack_1grow (&temporary_obstack, c);
740 if (c == '\n')
741 ++num_files;
744 lto_o_files = XNEWVEC (char *, num_files + 1);
745 lto_o_files[num_files] = NULL;
746 start = XOBFINISH (&temporary_obstack, char *);
747 for (i = 0; i < num_files; ++i)
749 end = start;
750 while (*end != '\n')
751 ++end;
752 *end = '\0';
754 lto_o_files[i] = xstrdup (start);
756 start = end + 1;
759 obstack_free (&temporary_obstack, temporary_firstobj);
761 do_wait (prog, pex);
762 pex = NULL;
764 /* Compute memory needed for new LD arguments. At most number of original arguments
765 plus number of partitions. */
766 for (lto_ld_argv_size = 0; lto_ld_argv[lto_ld_argv_size]; lto_ld_argv_size++)
768 out_lto_ld_argv = XCNEWVEC (char *, num_files + lto_ld_argv_size + 1);
769 out_lto_ld_argv_size = 0;
771 /* After running the LTO back end, we will relink, substituting
772 the LTO output for the object files that we submitted to the
773 LTO. Here, we modify the linker command line for the relink. */
775 /* Copy all arguments until we find first LTO file. */
776 p = lto_ld_argv;
777 while (*p != NULL)
779 for (list = lto_objects.first; list; list = list->next)
780 if (*p == list->name) /* Note test for pointer equality! */
781 break;
782 if (list)
783 break;
784 out_lto_ld_argv[out_lto_ld_argv_size++] = *p++;
787 /* Now insert all LTO partitions. */
788 lto_o_ptr = lto_o_files;
789 while (*lto_o_ptr)
790 out_lto_ld_argv[out_lto_ld_argv_size++] = *lto_o_ptr++;
792 /* ... and copy the rest. */
793 while (*p != NULL)
795 for (list = lto_objects.first; list; list = list->next)
796 if (*p == list->name) /* Note test for pointer equality! */
797 break;
798 if (!list)
799 out_lto_ld_argv[out_lto_ld_argv_size++] = *p;
800 p++;
802 out_lto_ld_argv[out_lto_ld_argv_size++] = 0;
804 /* Run the linker again, this time replacing the object files
805 optimized by the LTO with the temporary file generated by the LTO. */
806 fork_execute ("ld", out_lto_ld_argv, HAVE_GNU_LD && at_file_supplied);
807 post_ld_pass (true);
808 free (lto_ld_argv);
810 maybe_unlink_list (lto_o_files);
812 else if (force)
814 /* Our caller is relying on us to do the link
815 even though there is no LTO back end work to be done. */
816 fork_execute ("ld", lto_ld_argv, HAVE_GNU_LD && at_file_supplied);
817 post_ld_pass (false);
819 else
820 post_ld_pass (true);
823 /* Main program. */
826 main (int argc, char **argv)
828 enum linker_select
830 USE_DEFAULT_LD,
831 USE_PLUGIN_LD,
832 USE_GOLD_LD,
833 USE_BFD_LD,
834 USE_LLD_LD,
835 USE_LD_MAX
836 } selected_linker = USE_DEFAULT_LD;
837 static const char *const ld_suffixes[USE_LD_MAX] =
839 "ld",
840 PLUGIN_LD_SUFFIX,
841 "ld.gold",
842 "ld.bfd",
843 "ld.lld"
845 static const char *const real_ld_suffix = "real-ld";
846 static const char *const collect_ld_suffix = "collect-ld";
847 static const char *const nm_suffix = "nm";
848 static const char *const gnm_suffix = "gnm";
849 #ifdef LDD_SUFFIX
850 static const char *const ldd_suffix = LDD_SUFFIX;
851 #endif
852 static const char *const strip_suffix = "strip";
853 static const char *const gstrip_suffix = "gstrip";
855 const char *full_ld_suffixes[USE_LD_MAX];
856 #ifdef CROSS_DIRECTORY_STRUCTURE
857 /* If we look for a program in the compiler directories, we just use
858 the short name, since these directories are already system-specific.
859 But it we look for a program in the system directories, we need to
860 qualify the program name with the target machine. */
862 const char *const full_nm_suffix =
863 concat (target_machine, "-", nm_suffix, NULL);
864 const char *const full_gnm_suffix =
865 concat (target_machine, "-", gnm_suffix, NULL);
866 #ifdef LDD_SUFFIX
867 const char *const full_ldd_suffix =
868 concat (target_machine, "-", ldd_suffix, NULL);
869 #endif
870 const char *const full_strip_suffix =
871 concat (target_machine, "-", strip_suffix, NULL);
872 const char *const full_gstrip_suffix =
873 concat (target_machine, "-", gstrip_suffix, NULL);
874 #else
875 #ifdef LDD_SUFFIX
876 const char *const full_ldd_suffix = ldd_suffix;
877 #endif
878 const char *const full_nm_suffix = nm_suffix;
879 const char *const full_gnm_suffix = gnm_suffix;
880 const char *const full_strip_suffix = strip_suffix;
881 const char *const full_gstrip_suffix = gstrip_suffix;
882 #endif /* CROSS_DIRECTORY_STRUCTURE */
884 const char *arg;
885 FILE *outf;
886 #ifdef COLLECT_EXPORT_LIST
887 FILE *exportf;
888 #endif
889 const char *ld_file_name;
890 const char *p;
891 char **c_argv;
892 const char **c_ptr;
893 char **ld1_argv;
894 const char **ld1;
895 bool use_plugin = false;
896 bool use_collect_ld = false;
898 /* The kinds of symbols we will have to consider when scanning the
899 outcome of a first pass link. This is ALL to start with, then might
900 be adjusted before getting to the first pass link per se, typically on
901 AIX where we perform an early scan of objects and libraries to fetch
902 the list of global ctors/dtors and make sure they are not garbage
903 collected. */
904 scanfilter ld1_filter = SCAN_ALL;
906 char **ld2_argv;
907 const char **ld2;
908 char **object_lst;
909 const char **object;
910 #ifdef TARGET_AIX_VERSION
911 int object_nbr = argc;
912 #endif
913 int first_file;
914 int num_c_args;
915 char **old_argv;
916 #ifdef COLLECT_EXPORT_LIST
917 bool is_static = false;
918 #endif
919 int i;
921 for (i = 0; i < USE_LD_MAX; i++)
922 full_ld_suffixes[i]
923 #ifdef CROSS_DIRECTORY_STRUCTURE
924 = concat (target_machine, "-", ld_suffixes[i], NULL);
925 #else
926 = ld_suffixes[i];
927 #endif
929 p = argv[0] + strlen (argv[0]);
930 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
931 --p;
932 progname = p;
934 xmalloc_set_program_name (progname);
936 old_argv = argv;
937 expandargv (&argc, &argv);
938 if (argv != old_argv)
939 at_file_supplied = 1;
941 process_args (&argc, argv);
943 num_c_args = argc + 9;
945 #ifndef HAVE_LD_DEMANGLE
946 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
948 /* Suppress demangling by the real linker, which may be broken. */
949 putenv (xstrdup ("COLLECT_NO_DEMANGLE=1"));
950 #endif
952 #if defined (COLLECT2_HOST_INITIALIZATION)
953 /* Perform system dependent initialization, if necessary. */
954 COLLECT2_HOST_INITIALIZATION;
955 #endif
957 #ifdef SIGCHLD
958 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
959 receive the signal. A different setting is inheritable */
960 signal (SIGCHLD, SIG_DFL);
961 #endif
963 /* Unlock the stdio streams. */
964 unlock_std_streams ();
966 gcc_init_libintl ();
968 diagnostic_initialize (global_dc, 0);
970 if (atexit (collect_atexit) != 0)
971 fatal_error (input_location, "atexit failed");
973 /* Do not invoke xcalloc before this point, since locale needs to be
974 set first, in case a diagnostic is issued. */
976 ld1_argv = XCNEWVEC (char *, argc + 4);
977 ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
978 ld2_argv = XCNEWVEC (char *, argc + 11);
979 ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
980 object_lst = XCNEWVEC (char *, argc);
981 object = CONST_CAST2 (const char **, char **, object_lst);
983 #ifdef DEBUG
984 debug = 1;
985 #endif
987 /* Parse command line early for instances of -debug. This allows
988 the debug flag to be set before functions like find_a_file()
989 are called. We also look for the -flto or -flto-partition=none flag to know
990 what LTO mode we are in. */
992 bool no_partition = false;
994 for (i = 1; argv[i] != NULL; i ++)
996 if (! strcmp (argv[i], "-debug"))
997 debug = true;
998 else if (! strcmp (argv[i], "-flto-partition=none"))
999 no_partition = true;
1000 else if (!strncmp (argv[i], "-fno-lto", 8))
1001 lto_mode = LTO_MODE_NONE;
1002 else if (! strcmp (argv[i], "-plugin"))
1004 use_plugin = true;
1005 if (selected_linker == USE_DEFAULT_LD)
1006 selected_linker = USE_PLUGIN_LD;
1008 else if (strcmp (argv[i], "-fuse-ld=bfd") == 0)
1009 selected_linker = USE_BFD_LD;
1010 else if (strcmp (argv[i], "-fuse-ld=gold") == 0)
1011 selected_linker = USE_GOLD_LD;
1012 else if (strcmp (argv[i], "-fuse-ld=lld") == 0)
1013 selected_linker = USE_LLD_LD;
1015 #ifdef COLLECT_EXPORT_LIST
1016 /* These flags are position independent, although their order
1017 is important - subsequent flags override earlier ones. */
1018 else if (strcmp (argv[i], "-b64") == 0)
1019 aix64_flag = 1;
1020 /* -bexport:filename always needs the :filename */
1021 else if (strncmp (argv[i], "-bE:", 4) == 0
1022 || strncmp (argv[i], "-bexport:", 9) == 0)
1023 export_flag = 1;
1024 else if (strcmp (argv[i], "-brtl") == 0
1025 || strcmp (argv[i], "-bsvr4") == 0
1026 || strcmp (argv[i], "-G") == 0)
1027 aixrtl_flag = 1;
1028 else if (strcmp (argv[i], "-bnortl") == 0)
1029 aixrtl_flag = 0;
1030 else if (strcmp (argv[i], "-blazy") == 0)
1031 aixlazy_flag = 1;
1032 #endif
1034 verbose = debug;
1035 find_file_set_debug (debug);
1036 if (use_plugin)
1037 lto_mode = LTO_MODE_NONE;
1038 if (no_partition && lto_mode == LTO_MODE_WHOPR)
1039 lto_mode = LTO_MODE_LTO;
1042 #ifndef DEFAULT_A_OUT_NAME
1043 output_file = "a.out";
1044 #else
1045 output_file = DEFAULT_A_OUT_NAME;
1046 #endif
1048 obstack_begin (&temporary_obstack, 0);
1049 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1051 #ifndef HAVE_LD_DEMANGLE
1052 current_demangling_style = auto_demangling;
1053 #endif
1054 p = getenv ("COLLECT_GCC_OPTIONS");
1055 while (p && *p)
1057 const char *q = extract_string (&p);
1058 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1059 num_c_args++;
1061 obstack_free (&temporary_obstack, temporary_firstobj);
1063 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1064 -fno-exceptions -w -fno-whole-program */
1065 num_c_args += 6;
1067 c_argv = XCNEWVEC (char *, num_c_args);
1068 c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1070 if (argc < 2)
1071 fatal_error (input_location, "no arguments");
1073 #ifdef SIGQUIT
1074 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1075 signal (SIGQUIT, handler);
1076 #endif
1077 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1078 signal (SIGINT, handler);
1079 #ifdef SIGALRM
1080 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1081 signal (SIGALRM, handler);
1082 #endif
1083 #ifdef SIGHUP
1084 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1085 signal (SIGHUP, handler);
1086 #endif
1087 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1088 signal (SIGSEGV, handler);
1089 #ifdef SIGBUS
1090 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1091 signal (SIGBUS, handler);
1092 #endif
1094 /* Extract COMPILER_PATH and PATH into our prefix list. */
1095 prefix_from_env ("COMPILER_PATH", &cpath);
1096 prefix_from_env ("PATH", &path);
1098 /* Try to discover a valid linker/nm/strip to use. */
1100 /* Maybe we know the right file to use (if not cross). */
1101 ld_file_name = 0;
1102 #ifdef DEFAULT_LINKER
1103 if (selected_linker == USE_BFD_LD || selected_linker == USE_GOLD_LD ||
1104 selected_linker == USE_LLD_LD)
1106 char *linker_name;
1107 # ifdef HOST_EXECUTABLE_SUFFIX
1108 int len = (sizeof (DEFAULT_LINKER)
1109 - sizeof (HOST_EXECUTABLE_SUFFIX));
1110 linker_name = NULL;
1111 if (len > 0)
1113 char *default_linker = xstrdup (DEFAULT_LINKER);
1114 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
1115 HOST_EXECUTABLE_SUFFIX. */
1116 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
1118 default_linker[len] = '\0';
1119 linker_name = concat (default_linker,
1120 &ld_suffixes[selected_linker][2],
1121 HOST_EXECUTABLE_SUFFIX, NULL);
1124 if (linker_name == NULL)
1125 # endif
1126 linker_name = concat (DEFAULT_LINKER,
1127 &ld_suffixes[selected_linker][2],
1128 NULL);
1129 if (access (linker_name, X_OK) == 0)
1130 ld_file_name = linker_name;
1132 if (ld_file_name == 0 && access (DEFAULT_LINKER, X_OK) == 0)
1133 ld_file_name = DEFAULT_LINKER;
1134 if (ld_file_name == 0)
1135 #endif
1136 #ifdef REAL_LD_FILE_NAME
1137 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME, X_OK);
1138 if (ld_file_name == 0)
1139 #endif
1140 /* Search the (target-specific) compiler dirs for ld'. */
1141 ld_file_name = find_a_file (&cpath, real_ld_suffix, X_OK);
1142 /* Likewise for `collect-ld'. */
1143 if (ld_file_name == 0)
1145 ld_file_name = find_a_file (&cpath, collect_ld_suffix, X_OK);
1146 use_collect_ld = ld_file_name != 0;
1148 /* Search the compiler directories for `ld'. We have protection against
1149 recursive calls in find_a_file. */
1150 if (ld_file_name == 0)
1151 ld_file_name = find_a_file (&cpath, ld_suffixes[selected_linker], X_OK);
1152 /* Search the ordinary system bin directories
1153 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1154 if (ld_file_name == 0)
1155 ld_file_name = find_a_file (&path, full_ld_suffixes[selected_linker], X_OK);
1157 #ifdef REAL_NM_FILE_NAME
1158 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME, X_OK);
1159 if (nm_file_name == 0)
1160 #endif
1161 nm_file_name = find_a_file (&cpath, gnm_suffix, X_OK);
1162 if (nm_file_name == 0)
1163 nm_file_name = find_a_file (&path, full_gnm_suffix, X_OK);
1164 if (nm_file_name == 0)
1165 nm_file_name = find_a_file (&cpath, nm_suffix, X_OK);
1166 if (nm_file_name == 0)
1167 nm_file_name = find_a_file (&path, full_nm_suffix, X_OK);
1169 #ifdef LDD_SUFFIX
1170 ldd_file_name = find_a_file (&cpath, ldd_suffix, X_OK);
1171 if (ldd_file_name == 0)
1172 ldd_file_name = find_a_file (&path, full_ldd_suffix, X_OK);
1173 #endif
1175 #ifdef REAL_STRIP_FILE_NAME
1176 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME, X_OK);
1177 if (strip_file_name == 0)
1178 #endif
1179 strip_file_name = find_a_file (&cpath, gstrip_suffix, X_OK);
1180 if (strip_file_name == 0)
1181 strip_file_name = find_a_file (&path, full_gstrip_suffix, X_OK);
1182 if (strip_file_name == 0)
1183 strip_file_name = find_a_file (&cpath, strip_suffix, X_OK);
1184 if (strip_file_name == 0)
1185 strip_file_name = find_a_file (&path, full_strip_suffix, X_OK);
1187 /* Determine the full path name of the C compiler to use. */
1188 c_file_name = getenv ("COLLECT_GCC");
1189 if (c_file_name == 0)
1191 #ifdef CROSS_DIRECTORY_STRUCTURE
1192 c_file_name = concat (target_machine, "-gcc", NULL);
1193 #else
1194 c_file_name = "gcc";
1195 #endif
1198 p = find_a_file (&cpath, c_file_name, X_OK);
1200 /* Here it should be safe to use the system search path since we should have
1201 already qualified the name of the compiler when it is needed. */
1202 if (p == 0)
1203 p = find_a_file (&path, c_file_name, X_OK);
1205 if (p)
1206 c_file_name = p;
1208 *ld1++ = *ld2++ = ld_file_name;
1210 /* Make temp file names. */
1211 c_file = make_temp_file (".c");
1212 o_file = make_temp_file (".o");
1213 #ifdef COLLECT_EXPORT_LIST
1214 export_file = make_temp_file (".x");
1215 #endif
1216 if (!debug)
1218 ldout = make_temp_file (".ld");
1219 lderrout = make_temp_file (".le");
1221 *c_ptr++ = c_file_name;
1222 *c_ptr++ = "-x";
1223 *c_ptr++ = "c";
1224 *c_ptr++ = "-c";
1225 *c_ptr++ = "-o";
1226 *c_ptr++ = o_file;
1228 #ifdef COLLECT_EXPORT_LIST
1229 /* Generate a list of directories from LIBPATH. */
1230 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1231 /* Add to this list also two standard directories where
1232 AIX loader always searches for libraries. */
1233 add_prefix (&libpath_lib_dirs, "/lib");
1234 add_prefix (&libpath_lib_dirs, "/usr/lib");
1235 #endif
1237 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1239 AIX support needs to know if -shared has been specified before
1240 parsing commandline arguments. */
1242 p = getenv ("COLLECT_GCC_OPTIONS");
1243 while (p && *p)
1245 const char *q = extract_string (&p);
1246 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1247 *c_ptr++ = xstrdup (q);
1248 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1249 *c_ptr++ = xstrdup (q);
1250 if (strcmp (q, "-shared") == 0)
1251 shared_obj = 1;
1252 if (strcmp (q, "-static") == 0)
1253 static_obj = 1;
1254 if (*q == '-' && q[1] == 'B')
1256 *c_ptr++ = xstrdup (q);
1257 if (q[2] == 0)
1259 q = extract_string (&p);
1260 *c_ptr++ = xstrdup (q);
1264 obstack_free (&temporary_obstack, temporary_firstobj);
1265 *c_ptr++ = "-fno-profile-arcs";
1266 *c_ptr++ = "-fno-test-coverage";
1267 *c_ptr++ = "-fno-branch-probabilities";
1268 *c_ptr++ = "-fno-exceptions";
1269 *c_ptr++ = "-w";
1270 *c_ptr++ = "-fno-whole-program";
1272 /* !!! When GCC calls collect2,
1273 it does not know whether it is calling collect2 or ld.
1274 So collect2 cannot meaningfully understand any options
1275 except those ld understands.
1276 If you propose to make GCC pass some other option,
1277 just imagine what will happen if ld is really ld!!! */
1279 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1280 /* After the first file, put in the c++ rt0. */
1282 #ifdef COLLECT_EXPORT_LIST
1283 is_static = static_obj;
1284 #endif
1285 first_file = 1;
1286 while ((arg = *++argv) != (char *) 0)
1288 *ld1++ = *ld2++ = arg;
1290 if (arg[0] == '-')
1292 switch (arg[1])
1294 case 'd':
1295 if (!strcmp (arg, "-debug"))
1297 /* Already parsed. */
1298 ld1--;
1299 ld2--;
1301 if (!strcmp (arg, "-dynamic-linker") && argv[1])
1303 ++argv;
1304 *ld1++ = *ld2++ = *argv;
1306 break;
1308 case 'f':
1309 if (strncmp (arg, "-flto", 5) == 0)
1311 #ifdef ENABLE_LTO
1312 /* Do not pass LTO flag to the linker. */
1313 ld1--;
1314 ld2--;
1315 #else
1316 error ("LTO support has not been enabled in this "
1317 "configuration");
1318 #endif
1320 else if (!use_collect_ld
1321 && strncmp (arg, "-fuse-ld=", 9) == 0)
1323 /* Do not pass -fuse-ld={bfd|gold|lld} to the linker. */
1324 ld1--;
1325 ld2--;
1327 else if (strncmp (arg, "-fno-lto", 8) == 0)
1329 /* Do not pass -fno-lto to the linker. */
1330 ld1--;
1331 ld2--;
1333 #ifdef TARGET_AIX_VERSION
1334 else
1336 /* File containing a list of input files to process. */
1338 FILE *stream;
1339 char buf[MAXPATHLEN + 2];
1340 /* Number of additionnal object files. */
1341 int add_nbr = 0;
1342 /* Maximum of additionnal object files before vector
1343 expansion. */
1344 int add_max = 0;
1345 const char *list_filename = arg + 2;
1347 /* Accept -fFILENAME and -f FILENAME. */
1348 if (*list_filename == '\0' && argv[1])
1350 ++argv;
1351 list_filename = *argv;
1352 *ld1++ = *ld2++ = *argv;
1355 stream = fopen (list_filename, "r");
1356 if (stream == NULL)
1357 fatal_error (input_location, "can't open %s: %m",
1358 list_filename);
1360 while (fgets (buf, sizeof buf, stream) != NULL)
1362 /* Remove end of line. */
1363 int len = strlen (buf);
1364 if (len >= 1 && buf[len - 1] =='\n')
1365 buf[len - 1] = '\0';
1367 /* Put on object vector.
1368 Note: we only expanse vector here, so we must keep
1369 extra space for remaining arguments. */
1370 if (add_nbr >= add_max)
1372 int pos =
1373 object - CONST_CAST2 (const char **, char **,
1374 object_lst);
1375 add_max = (add_max == 0) ? 16 : add_max * 2;
1376 object_lst = XRESIZEVEC (char *, object_lst,
1377 object_nbr + add_max);
1378 object = CONST_CAST2 (const char **, char **,
1379 object_lst) + pos;
1380 object_nbr += add_max;
1382 *object++ = xstrdup (buf);
1383 add_nbr++;
1385 fclose (stream);
1387 #endif
1388 break;
1390 #ifdef COLLECT_EXPORT_LIST
1391 case 'b':
1392 if (!strcmp (arg, "-bstatic"))
1394 is_static = true;
1396 else if (!strcmp (arg, "-bdynamic") || !strcmp (arg, "-bshared"))
1398 is_static = false;
1400 break;
1401 #endif
1402 case 'l':
1403 if (first_file)
1405 /* place o_file BEFORE this argument! */
1406 first_file = 0;
1407 ld2--;
1408 *ld2++ = o_file;
1409 *ld2++ = arg;
1411 #ifdef COLLECT_EXPORT_LIST
1413 /* Resolving full library name. */
1414 const char *s = resolve_lib_name (arg+2);
1416 /* Saving a full library name. */
1417 add_to_list (&libs, s);
1418 if (is_static)
1419 add_to_list (&static_libs, s);
1421 #endif
1422 break;
1424 #ifdef COLLECT_EXPORT_LIST
1425 /* Saving directories where to search for libraries. */
1426 case 'L':
1427 add_prefix (&cmdline_lib_dirs, arg+2);
1428 break;
1429 #endif
1431 case 'o':
1432 if (arg[2] == '\0')
1433 output_file = *ld1++ = *ld2++ = *++argv;
1434 else
1435 output_file = &arg[2];
1436 break;
1438 case 'r':
1439 if (arg[2] == '\0')
1440 rflag = 1;
1441 break;
1443 case 's':
1444 if (arg[2] == '\0' && do_collecting)
1446 /* We must strip after the nm run, otherwise C++ linking
1447 will not work. Thus we strip in the second ld run, or
1448 else with strip if there is no second ld run. */
1449 strip_flag = 1;
1450 ld1--;
1452 break;
1454 case 'v':
1455 if (arg[2] == '\0')
1456 verbose = true;
1457 break;
1459 case '-':
1460 if (strcmp (arg, "--no-demangle") == 0)
1462 #ifndef HAVE_LD_DEMANGLE
1463 no_demangle = 1;
1464 ld1--;
1465 ld2--;
1466 #endif
1468 else if (strncmp (arg, "--demangle", 10) == 0)
1470 #ifndef HAVE_LD_DEMANGLE
1471 no_demangle = 0;
1472 if (arg[10] == '=')
1474 enum demangling_styles style
1475 = cplus_demangle_name_to_style (arg+11);
1476 if (style == unknown_demangling)
1477 error ("unknown demangling style '%s'", arg+11);
1478 else
1479 current_demangling_style = style;
1481 ld1--;
1482 ld2--;
1483 #endif
1485 else if (strncmp (arg, "--sysroot=", 10) == 0)
1486 target_system_root = arg + 10;
1487 else if (strcmp (arg, "--version") == 0)
1488 verbose = true;
1489 else if (strcmp (arg, "--help") == 0)
1490 helpflag = true;
1491 break;
1494 else if ((p = strrchr (arg, '.')) != (char *) 0
1495 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1496 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1497 || strcmp (p, ".obj") == 0))
1499 if (first_file)
1501 first_file = 0;
1502 if (p[1] == 'o')
1503 *ld2++ = o_file;
1504 else
1506 /* place o_file BEFORE this argument! */
1507 ld2--;
1508 *ld2++ = o_file;
1509 *ld2++ = arg;
1512 if (p[1] == 'o' || p[1] == 'l')
1513 *object++ = arg;
1514 #ifdef COLLECT_EXPORT_LIST
1515 /* libraries can be specified directly, i.e. without -l flag. */
1516 else
1518 /* Saving a full library name. */
1519 add_to_list (&libs, arg);
1520 if (is_static)
1521 add_to_list (&static_libs, arg);
1523 #endif
1527 #ifdef COLLECT_EXPORT_LIST
1528 /* This is added only for debugging purposes. */
1529 if (debug)
1531 fprintf (stderr, "List of libraries:\n");
1532 dump_list (stderr, "\t", libs.first);
1533 fprintf (stderr, "List of statically linked libraries:\n");
1534 dump_list (stderr, "\t", static_libs.first);
1537 /* The AIX linker will discard static constructors in object files if
1538 nothing else in the file is referenced, so look at them first. Unless
1539 we are building a shared object, ignore the eh frame tables, as we
1540 would otherwise reference them all, hence drag all the corresponding
1541 objects even if nothing else is referenced. */
1543 const char **export_object_lst
1544 = CONST_CAST2 (const char **, char **, object_lst);
1546 struct id *list = libs.first;
1548 /* Compute the filter to use from the current one, do scan, then adjust
1549 the "current" filter to remove what we just included here. This will
1550 control whether we need a first pass link later on or not, and what
1551 will remain to be scanned there. */
1553 scanfilter this_filter = ld1_filter;
1554 #if HAVE_AS_REF
1555 if (!shared_obj)
1556 this_filter &= ~SCAN_DWEH;
1557 #endif
1559 /* Scan object files. */
1560 while (export_object_lst < object)
1561 scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1563 /* Scan libraries. */
1564 for (; list; list = list->next)
1565 scan_prog_file (list->name, PASS_FIRST, this_filter);
1567 ld1_filter = ld1_filter & ~this_filter;
1570 if (exports.first)
1572 char *buf = concat ("-bE:", export_file, NULL);
1574 *ld1++ = buf;
1575 *ld2++ = buf;
1577 exportf = fopen (export_file, "w");
1578 if (exportf == (FILE *) 0)
1579 fatal_error (input_location, "fopen %s: %m", export_file);
1580 write_aix_file (exportf, exports.first);
1581 if (fclose (exportf))
1582 fatal_error (input_location, "fclose %s: %m", export_file);
1584 #endif
1586 *c_ptr++ = c_file;
1587 *c_ptr = *ld1 = *object = (char *) 0;
1589 if (verbose)
1590 notice ("collect2 version %s\n", version_string);
1592 if (helpflag)
1594 printf ("Usage: collect2 [options]\n");
1595 printf (" Wrap linker and generate constructor code if needed.\n");
1596 printf (" Options:\n");
1597 printf (" -debug Enable debug output\n");
1598 printf (" --help Display this information\n");
1599 printf (" -v, --version Display this program's version number\n");
1600 printf ("\n");
1601 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1602 printf ("Report bugs: %s\n", bug_report_url);
1603 printf ("\n");
1606 if (debug)
1608 const char *ptr;
1609 fprintf (stderr, "ld_file_name = %s\n",
1610 (ld_file_name ? ld_file_name : "not found"));
1611 fprintf (stderr, "c_file_name = %s\n",
1612 (c_file_name ? c_file_name : "not found"));
1613 fprintf (stderr, "nm_file_name = %s\n",
1614 (nm_file_name ? nm_file_name : "not found"));
1615 #ifdef LDD_SUFFIX
1616 fprintf (stderr, "ldd_file_name = %s\n",
1617 (ldd_file_name ? ldd_file_name : "not found"));
1618 #endif
1619 fprintf (stderr, "strip_file_name = %s\n",
1620 (strip_file_name ? strip_file_name : "not found"));
1621 fprintf (stderr, "c_file = %s\n",
1622 (c_file ? c_file : "not found"));
1623 fprintf (stderr, "o_file = %s\n",
1624 (o_file ? o_file : "not found"));
1626 ptr = getenv ("COLLECT_GCC_OPTIONS");
1627 if (ptr)
1628 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1630 ptr = getenv ("COLLECT_GCC");
1631 if (ptr)
1632 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1634 ptr = getenv ("COMPILER_PATH");
1635 if (ptr)
1636 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1638 ptr = getenv (LIBRARY_PATH_ENV);
1639 if (ptr)
1640 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1642 fprintf (stderr, "\n");
1645 /* Load the program, searching all libraries and attempting to provide
1646 undefined symbols from repository information.
1648 If -r or they will be run via some other method, do not build the
1649 constructor or destructor list, just return now. */
1651 bool early_exit
1652 = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1654 /* Perform the first pass link now, if we're about to exit or if we need
1655 to scan for things we haven't collected yet before pursuing further.
1657 On AIX, the latter typically includes nothing for shared objects or
1658 frame tables for an executable, out of what the required early scan on
1659 objects and libraries has performed above. In the !shared_obj case, we
1660 expect the relevant tables to be dragged together with their associated
1661 functions from precise cross reference insertions by the compiler. */
1663 if (early_exit || ld1_filter != SCAN_NOTHING)
1664 do_tlink (ld1_argv, object_lst);
1666 if (early_exit)
1668 #ifdef COLLECT_EXPORT_LIST
1669 /* Make sure we delete the export file we may have created. */
1670 if (export_file != 0 && export_file[0])
1671 maybe_unlink (export_file);
1672 #endif
1673 if (lto_mode != LTO_MODE_NONE)
1674 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1675 else
1676 post_ld_pass (false);
1678 maybe_unlink (c_file);
1679 maybe_unlink (o_file);
1680 return 0;
1684 /* Unless we have done it all already, examine the namelist and search for
1685 static constructors and destructors to call. Write the constructor and
1686 destructor tables to a .s file and reload. */
1688 if (ld1_filter != SCAN_NOTHING)
1689 scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1691 #ifdef SCAN_LIBRARIES
1692 scan_libraries (output_file);
1693 #endif
1695 if (debug)
1697 notice_translated (ngettext ("%d constructor found\n",
1698 "%d constructors found\n",
1699 constructors.number),
1700 constructors.number);
1701 notice_translated (ngettext ("%d destructor found\n",
1702 "%d destructors found\n",
1703 destructors.number),
1704 destructors.number);
1705 notice_translated (ngettext ("%d frame table found\n",
1706 "%d frame tables found\n",
1707 frame_tables.number),
1708 frame_tables.number);
1711 /* If the scan exposed nothing of special interest, there's no need to
1712 generate the glue code and relink so return now. */
1714 if (constructors.number == 0 && destructors.number == 0
1715 && frame_tables.number == 0
1716 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1717 /* If we will be running these functions ourselves, we want to emit
1718 stubs into the shared library so that we do not have to relink
1719 dependent programs when we add static objects. */
1720 && ! shared_obj
1721 #endif
1724 /* Do tlink without additional code generation now if we didn't
1725 do it earlier for scanning purposes. */
1726 if (ld1_filter == SCAN_NOTHING)
1727 do_tlink (ld1_argv, object_lst);
1729 if (lto_mode)
1730 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1732 /* Strip now if it was requested on the command line. */
1733 if (strip_flag)
1735 char **real_strip_argv = XCNEWVEC (char *, 3);
1736 const char ** strip_argv = CONST_CAST2 (const char **, char **,
1737 real_strip_argv);
1739 strip_argv[0] = strip_file_name;
1740 strip_argv[1] = output_file;
1741 strip_argv[2] = (char *) 0;
1742 fork_execute ("strip", real_strip_argv, false);
1745 #ifdef COLLECT_EXPORT_LIST
1746 maybe_unlink (export_file);
1747 #endif
1748 post_ld_pass (false);
1750 maybe_unlink (c_file);
1751 maybe_unlink (o_file);
1752 return 0;
1755 /* Sort ctor and dtor lists by priority. */
1756 sort_ids (&constructors);
1757 sort_ids (&destructors);
1759 maybe_unlink (output_file);
1760 outf = fopen (c_file, "w");
1761 if (outf == (FILE *) 0)
1762 fatal_error (input_location, "fopen %s: %m", c_file);
1764 write_c_file (outf, c_file);
1766 if (fclose (outf))
1767 fatal_error (input_location, "fclose %s: %m", c_file);
1769 /* Tell the linker that we have initializer and finalizer functions. */
1770 #ifdef LD_INIT_SWITCH
1771 #ifdef COLLECT_EXPORT_LIST
1772 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1773 #else
1774 *ld2++ = LD_INIT_SWITCH;
1775 *ld2++ = initname;
1776 *ld2++ = LD_FINI_SWITCH;
1777 *ld2++ = fininame;
1778 #endif
1779 #endif
1781 #ifdef COLLECT_EXPORT_LIST
1782 if (shared_obj)
1784 /* If we did not add export flag to link arguments before, add it to
1785 second link phase now. No new exports should have been added. */
1786 if (! exports.first)
1787 *ld2++ = concat ("-bE:", export_file, NULL);
1789 #ifdef TARGET_AIX_VERSION
1790 add_to_list (&exports, aix_shared_initname);
1791 add_to_list (&exports, aix_shared_fininame);
1792 #endif
1794 #ifndef LD_INIT_SWITCH
1795 add_to_list (&exports, initname);
1796 add_to_list (&exports, fininame);
1797 add_to_list (&exports, "_GLOBAL__DI");
1798 add_to_list (&exports, "_GLOBAL__DD");
1799 #endif
1800 exportf = fopen (export_file, "w");
1801 if (exportf == (FILE *) 0)
1802 fatal_error (input_location, "fopen %s: %m", export_file);
1803 write_aix_file (exportf, exports.first);
1804 if (fclose (exportf))
1805 fatal_error (input_location, "fclose %s: %m", export_file);
1807 #endif
1809 /* End of arguments to second link phase. */
1810 *ld2 = (char*) 0;
1812 if (debug)
1814 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1815 output_file, c_file);
1816 write_c_file (stderr, "stderr");
1817 fprintf (stderr, "========== end of c_file\n\n");
1818 #ifdef COLLECT_EXPORT_LIST
1819 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1820 write_aix_file (stderr, exports.first);
1821 fprintf (stderr, "========== end of export_file\n\n");
1822 #endif
1825 /* Assemble the constructor and destructor tables.
1826 Link the tables in with the rest of the program. */
1828 fork_execute ("gcc", c_argv, at_file_supplied);
1829 #ifdef COLLECT_EXPORT_LIST
1830 /* On AIX we must call tlink because of possible templates resolution. */
1831 do_tlink (ld2_argv, object_lst);
1833 if (lto_mode)
1834 maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1835 #else
1836 /* Otherwise, simply call ld because tlink is already done. */
1837 if (lto_mode)
1838 maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1839 else
1841 fork_execute ("ld", ld2_argv, HAVE_GNU_LD && at_file_supplied);
1842 post_ld_pass (false);
1845 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1846 constructors/destructors in shared libraries. */
1847 scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1848 #endif
1850 maybe_unlink (c_file);
1851 maybe_unlink (o_file);
1853 #ifdef COLLECT_EXPORT_LIST
1854 maybe_unlink (export_file);
1855 #endif
1857 return 0;
1861 /* Unlink FILE unless we are debugging or this is the output_file
1862 and we may not unlink it. */
1864 void
1865 maybe_unlink (const char *file)
1867 if (debug)
1869 notice ("[Leaving %s]\n", file);
1870 return;
1873 if (file == output_file && !may_unlink_output_file)
1874 return;
1876 unlink_if_ordinary (file);
1879 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
1881 static void
1882 maybe_unlink_list (char **file_list)
1884 char **tmp = file_list;
1886 while (*tmp)
1887 maybe_unlink (*(tmp++));
1891 static long sequence_number = 0;
1893 /* Add a name to a linked list. */
1895 static void
1896 add_to_list (struct head *head_ptr, const char *name)
1898 struct id *newid
1899 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
1900 struct id *p;
1901 strcpy (newid->name, name);
1903 if (head_ptr->first)
1904 head_ptr->last->next = newid;
1905 else
1906 head_ptr->first = newid;
1908 /* Check for duplicate symbols. */
1909 for (p = head_ptr->first;
1910 strcmp (name, p->name) != 0;
1911 p = p->next)
1913 if (p != newid)
1915 head_ptr->last->next = 0;
1916 free (newid);
1917 return;
1920 newid->sequence = ++sequence_number;
1921 head_ptr->last = newid;
1922 head_ptr->number++;
1925 /* Grab the init priority number from an init function name that
1926 looks like "_GLOBAL_.I.12345.foo". */
1928 static int
1929 extract_init_priority (const char *name)
1931 int pos = 0, pri;
1933 #ifdef TARGET_AIX_VERSION
1934 /* Run dependent module initializers before any constructors in this
1935 module. */
1936 switch (is_ctor_dtor (name))
1938 case SYM_AIXI:
1939 case SYM_AIXD:
1940 return INT_MIN;
1941 default:
1942 break;
1944 #endif
1946 while (name[pos] == '_')
1947 ++pos;
1948 pos += 10; /* strlen ("GLOBAL__X_") */
1950 /* Extract init_p number from ctor/dtor name. */
1951 pri = atoi (name + pos);
1952 return pri ? pri : DEFAULT_INIT_PRIORITY;
1955 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
1956 ctors will be run from right to left, dtors from left to right. */
1958 static void
1959 sort_ids (struct head *head_ptr)
1961 /* id holds the current element to insert. id_next holds the next
1962 element to insert. id_ptr iterates through the already sorted elements
1963 looking for the place to insert id. */
1964 struct id *id, *id_next, **id_ptr;
1966 id = head_ptr->first;
1968 /* We don't have any sorted elements yet. */
1969 head_ptr->first = NULL;
1971 for (; id; id = id_next)
1973 id_next = id->next;
1974 id->sequence = extract_init_priority (id->name);
1976 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
1977 if (*id_ptr == NULL
1978 /* If the sequence numbers are the same, we put the id from the
1979 file later on the command line later in the list. */
1980 || id->sequence > (*id_ptr)->sequence
1981 /* Hack: do lexical compare, too.
1982 || (id->sequence == (*id_ptr)->sequence
1983 && strcmp (id->name, (*id_ptr)->name) > 0) */
1986 id->next = *id_ptr;
1987 *id_ptr = id;
1988 break;
1992 /* Now set the sequence numbers properly so write_c_file works. */
1993 for (id = head_ptr->first; id; id = id->next)
1994 id->sequence = ++sequence_number;
1997 /* Write: `prefix', the names on list LIST, `suffix'. */
1999 static void
2000 write_list (FILE *stream, const char *prefix, struct id *list)
2002 while (list)
2004 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2005 list = list->next;
2009 #ifdef COLLECT_EXPORT_LIST
2010 /* This function is really used only on AIX, but may be useful. */
2011 static int
2012 is_in_list (const char *prefix, struct id *list)
2014 while (list)
2016 if (!strcmp (prefix, list->name)) return 1;
2017 list = list->next;
2019 return 0;
2021 #endif /* COLLECT_EXPORT_LIST */
2023 /* Added for debugging purpose. */
2024 #ifdef COLLECT_EXPORT_LIST
2025 static void
2026 dump_list (FILE *stream, const char *prefix, struct id *list)
2028 while (list)
2030 fprintf (stream, "%s%s,\n", prefix, list->name);
2031 list = list->next;
2034 #endif
2036 #if 0
2037 static void
2038 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2040 while (list)
2042 fprintf (stream, "%s%s,\n", prefix, list->prefix);
2043 list = list->next;
2046 #endif
2048 static void
2049 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2051 while (list)
2053 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2054 prefix, list->sequence, list->name);
2055 list = list->next;
2059 /* Write out the constructor and destructor tables statically (for a shared
2060 object), along with the functions to execute them. */
2062 static void
2063 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2065 const char *p, *q;
2066 char *prefix, *r;
2067 int frames = (frame_tables.number > 0);
2069 /* Figure out name of output_file, stripping off .so version. */
2070 q = p = lbasename (output_file);
2072 while (q)
2074 q = strchr (q,'.');
2075 if (q == 0)
2077 q = p + strlen (p);
2078 break;
2080 else
2082 if (filename_ncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2084 q += strlen (SHLIB_SUFFIX);
2085 break;
2087 else
2088 q++;
2091 /* q points to null at end of the string (or . of the .so version) */
2092 prefix = XNEWVEC (char, q - p + 1);
2093 strncpy (prefix, p, q - p);
2094 prefix[q - p] = 0;
2095 for (r = prefix; *r; r++)
2096 if (!ISALNUM ((unsigned char)*r))
2097 *r = '_';
2098 if (debug)
2099 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2100 output_file, prefix);
2102 initname = concat ("_GLOBAL__FI_", prefix, NULL);
2103 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2104 #ifdef TARGET_AIX_VERSION
2105 aix_shared_initname = concat ("_GLOBAL__AIXI_", prefix, NULL);
2106 aix_shared_fininame = concat ("_GLOBAL__AIXD_", prefix, NULL);
2107 #endif
2109 free (prefix);
2111 /* Write the tables as C code. */
2113 /* This count variable is used to prevent multiple calls to the
2114 constructors/destructors.
2115 This guard against multiple calls is important on AIX as the initfini
2116 functions are deliberately invoked multiple times as part of the
2117 mechanisms GCC uses to order constructors across different dependent
2118 shared libraries (see config/rs6000/aix.h).
2120 fprintf (stream, "static int count;\n");
2121 fprintf (stream, "typedef void entry_pt();\n");
2122 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2124 if (frames)
2126 write_list_with_asm (stream, "extern void *", frame_tables.first);
2128 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2129 write_list (stream, "\t\t&", frame_tables.first);
2130 fprintf (stream, "\t0\n};\n");
2132 /* This must match what's in frame.h. */
2133 fprintf (stream, "struct object {\n");
2134 fprintf (stream, " void *pc_begin;\n");
2135 fprintf (stream, " void *pc_end;\n");
2136 fprintf (stream, " void *fde_begin;\n");
2137 fprintf (stream, " void *fde_array;\n");
2138 fprintf (stream, " __SIZE_TYPE__ count;\n");
2139 fprintf (stream, " struct object *next;\n");
2140 fprintf (stream, "};\n");
2142 fprintf (stream, "extern void __register_frame_info_table_bases (void *, struct object *, void *tbase, void *dbase);\n");
2143 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2144 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2145 #ifdef TARGET_AIX_VERSION
2146 fprintf (stream, "extern void *__gcc_unwind_dbase;\n");
2147 #endif
2149 fprintf (stream, "static void reg_frame () {\n");
2150 fprintf (stream, "\tstatic struct object ob;\n");
2151 #ifdef TARGET_AIX_VERSION
2152 /* Use __gcc_unwind_dbase as the base address for data on AIX.
2153 This might not be the start of the segment, signed offsets assumed.
2155 fprintf (stream, "\t__register_frame_info_table_bases (frame_table, &ob, (void *)0, &__gcc_unwind_dbase);\n");
2156 #else
2157 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2158 #endif
2159 fprintf (stream, "\t}\n");
2161 fprintf (stream, "static void dereg_frame () {\n");
2162 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2163 fprintf (stream, "\t}\n");
2166 fprintf (stream, "void %s() {\n", initname);
2167 if (constructors.number > 0 || frames)
2169 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2170 write_list (stream, "\t\t", constructors.first);
2171 if (frames)
2172 fprintf (stream, "\treg_frame,\n");
2173 fprintf (stream, "\t};\n");
2174 fprintf (stream, "\tentry_pt **p;\n");
2175 fprintf (stream, "\tif (count++ != 0) return;\n");
2176 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2177 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2179 else
2180 fprintf (stream, "\t++count;\n");
2181 fprintf (stream, "}\n");
2182 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2183 fprintf (stream, "void %s() {\n", fininame);
2184 if (destructors.number > 0 || frames)
2186 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2187 write_list (stream, "\t\t", destructors.first);
2188 if (frames)
2189 fprintf (stream, "\tdereg_frame,\n");
2190 fprintf (stream, "\t};\n");
2191 fprintf (stream, "\tentry_pt **p;\n");
2192 fprintf (stream, "\tif (--count != 0) return;\n");
2193 fprintf (stream, "\tp = dtors;\n");
2194 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2195 destructors.number + frames);
2197 fprintf (stream, "}\n");
2199 if (shared_obj)
2201 COLLECT_SHARED_INIT_FUNC (stream, initname);
2202 COLLECT_SHARED_FINI_FUNC (stream, fininame);
2206 /* Write the constructor/destructor tables. */
2208 #ifndef LD_INIT_SWITCH
2209 static void
2210 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2212 /* Write the tables as C code. */
2214 int frames = (frame_tables.number > 0);
2216 fprintf (stream, "typedef void entry_pt();\n\n");
2218 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2220 if (frames)
2222 write_list_with_asm (stream, "extern void *", frame_tables.first);
2224 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2225 write_list (stream, "\t\t&", frame_tables.first);
2226 fprintf (stream, "\t0\n};\n");
2228 /* This must match what's in frame.h. */
2229 fprintf (stream, "struct object {\n");
2230 fprintf (stream, " void *pc_begin;\n");
2231 fprintf (stream, " void *pc_end;\n");
2232 fprintf (stream, " void *fde_begin;\n");
2233 fprintf (stream, " void *fde_array;\n");
2234 fprintf (stream, " __SIZE_TYPE__ count;\n");
2235 fprintf (stream, " struct object *next;\n");
2236 fprintf (stream, "};\n");
2238 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2239 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2241 fprintf (stream, "static void reg_frame () {\n");
2242 fprintf (stream, "\tstatic struct object ob;\n");
2243 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2244 fprintf (stream, "\t}\n");
2246 fprintf (stream, "static void dereg_frame () {\n");
2247 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2248 fprintf (stream, "\t}\n");
2251 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2252 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2253 write_list (stream, "\t", constructors.first);
2254 if (frames)
2255 fprintf (stream, "\treg_frame,\n");
2256 fprintf (stream, "\t0\n};\n\n");
2258 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2260 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2261 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2262 write_list (stream, "\t", destructors.first);
2263 if (frames)
2264 fprintf (stream, "\tdereg_frame,\n");
2265 fprintf (stream, "\t0\n};\n\n");
2267 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2268 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2270 #endif /* ! LD_INIT_SWITCH */
2272 static void
2273 write_c_file (FILE *stream, const char *name)
2275 #ifndef LD_INIT_SWITCH
2276 if (! shared_obj)
2277 write_c_file_glob (stream, name);
2278 else
2279 #endif
2280 write_c_file_stat (stream, name);
2283 #ifdef COLLECT_EXPORT_LIST
2284 static void
2285 write_aix_file (FILE *stream, struct id *list)
2287 for (; list; list = list->next)
2289 fputs (list->name, stream);
2290 putc ('\n', stream);
2293 #endif
2295 #ifdef OBJECT_FORMAT_NONE
2297 /* Check to make sure the file is an LTO object file. */
2299 static bool
2300 maybe_lto_object_file (const char *prog_name)
2302 FILE *f;
2303 unsigned char buf[4];
2304 int i;
2306 static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2307 static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2308 static unsigned char coffmagic_x64[2] = { 0x64, 0x86 };
2309 static unsigned char machomagic[4][4] = {
2310 { 0xcf, 0xfa, 0xed, 0xfe },
2311 { 0xce, 0xfa, 0xed, 0xfe },
2312 { 0xfe, 0xed, 0xfa, 0xcf },
2313 { 0xfe, 0xed, 0xfa, 0xce }
2316 f = fopen (prog_name, "rb");
2317 if (f == NULL)
2318 return false;
2319 if (fread (buf, sizeof (buf), 1, f) != 1)
2320 buf[0] = 0;
2321 fclose (f);
2323 if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2324 || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0
2325 || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0)
2326 return true;
2327 for (i = 0; i < 4; i++)
2328 if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2329 return true;
2331 return false;
2334 /* Generic version to scan the name list of the loaded program for
2335 the symbols g++ uses for static constructors and destructors. */
2337 static void
2338 scan_prog_file (const char *prog_name, scanpass which_pass,
2339 scanfilter filter)
2341 void (*int_handler) (int);
2342 #ifdef SIGQUIT
2343 void (*quit_handler) (int);
2344 #endif
2345 char *real_nm_argv[4];
2346 const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2347 int argc = 0;
2348 struct pex_obj *pex;
2349 const char *errmsg;
2350 int err;
2351 char *p, buf[1024];
2352 FILE *inf;
2353 int found_lto = 0;
2355 if (which_pass == PASS_SECOND)
2356 return;
2358 /* LTO objects must be in a known format. This check prevents
2359 us from accepting an archive containing LTO objects, which
2360 gcc cannot currently handle. */
2361 if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2362 return;
2364 /* If we do not have an `nm', complain. */
2365 if (nm_file_name == 0)
2366 fatal_error (input_location, "cannot find 'nm'");
2368 nm_argv[argc++] = nm_file_name;
2369 if (NM_FLAGS[0] != '\0')
2370 nm_argv[argc++] = NM_FLAGS;
2372 nm_argv[argc++] = prog_name;
2373 nm_argv[argc++] = (char *) 0;
2375 /* Trace if needed. */
2376 if (verbose)
2378 const char **p_argv;
2379 const char *str;
2381 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2382 fprintf (stderr, " %s", str);
2384 fprintf (stderr, "\n");
2387 fflush (stdout);
2388 fflush (stderr);
2390 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2391 if (pex == NULL)
2392 fatal_error (input_location, "pex_init failed: %m");
2394 errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2395 &err);
2396 if (errmsg != NULL)
2398 if (err != 0)
2400 errno = err;
2401 fatal_error (input_location, "%s: %m", _(errmsg));
2403 else
2404 fatal_error (input_location, errmsg);
2407 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2408 #ifdef SIGQUIT
2409 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2410 #endif
2412 inf = pex_read_output (pex, 0);
2413 if (inf == NULL)
2414 fatal_error (input_location, "can't open nm output: %m");
2416 if (debug)
2418 if (which_pass == PASS_LTOINFO)
2419 fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2420 else
2421 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2424 /* Read each line of nm output. */
2425 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2427 int ch, ch2;
2428 char *name, *end;
2430 if (debug)
2431 fprintf (stderr, "\t%s\n", buf);
2433 if (which_pass == PASS_LTOINFO)
2435 if (found_lto)
2436 continue;
2438 /* Look for the LTO info marker symbol, and add filename to
2439 the LTO objects list if found. */
2440 for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2441 if (ch == ' ' && p[1] == '_' && p[2] == '_'
2442 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2443 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2445 add_lto_object (&lto_objects, prog_name);
2447 /* We need to read all the input, so we can't just
2448 return here. But we can avoid useless work. */
2449 found_lto = 1;
2451 break;
2454 continue;
2457 /* If it contains a constructor or destructor name, add the name
2458 to the appropriate list unless this is a kind of symbol we're
2459 not supposed to even consider. */
2461 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2462 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2463 break;
2465 if (ch != '_')
2466 continue;
2468 name = p;
2469 /* Find the end of the symbol name.
2470 Do not include `|', because Encore nm can tack that on the end. */
2471 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2472 end++)
2473 continue;
2476 *end = '\0';
2478 switch (is_ctor_dtor (name))
2480 case SYM_CTOR:
2481 if (! (filter & SCAN_CTOR))
2482 break;
2483 if (which_pass != PASS_LIB)
2484 add_to_list (&constructors, name);
2485 break;
2487 case SYM_DTOR:
2488 if (! (filter & SCAN_DTOR))
2489 break;
2490 if (which_pass != PASS_LIB)
2491 add_to_list (&destructors, name);
2492 break;
2494 case SYM_INIT:
2495 if (! (filter & SCAN_INIT))
2496 break;
2497 if (which_pass != PASS_LIB)
2498 fatal_error (input_location, "init function found in object %s",
2499 prog_name);
2500 #ifndef LD_INIT_SWITCH
2501 add_to_list (&constructors, name);
2502 #endif
2503 break;
2505 case SYM_FINI:
2506 if (! (filter & SCAN_FINI))
2507 break;
2508 if (which_pass != PASS_LIB)
2509 fatal_error (input_location, "fini function found in object %s",
2510 prog_name);
2511 #ifndef LD_FINI_SWITCH
2512 add_to_list (&destructors, name);
2513 #endif
2514 break;
2516 case SYM_DWEH:
2517 if (! (filter & SCAN_DWEH))
2518 break;
2519 if (which_pass != PASS_LIB)
2520 add_to_list (&frame_tables, name);
2521 break;
2523 default: /* not a constructor or destructor */
2524 continue;
2528 if (debug)
2529 fprintf (stderr, "\n");
2531 do_wait (nm_file_name, pex);
2533 signal (SIGINT, int_handler);
2534 #ifdef SIGQUIT
2535 signal (SIGQUIT, quit_handler);
2536 #endif
2539 #ifdef LDD_SUFFIX
2541 /* Use the List Dynamic Dependencies program to find shared libraries that
2542 the output file depends upon and their initialization/finalization
2543 routines, if any. */
2545 static void
2546 scan_libraries (const char *prog_name)
2548 static struct head libraries; /* list of shared libraries found */
2549 struct id *list;
2550 void (*int_handler) (int);
2551 #ifdef SIGQUIT
2552 void (*quit_handler) (int);
2553 #endif
2554 char *real_ldd_argv[4];
2555 const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2556 int argc = 0;
2557 struct pex_obj *pex;
2558 const char *errmsg;
2559 int err;
2560 char buf[1024];
2561 FILE *inf;
2563 /* If we do not have an `ldd', complain. */
2564 if (ldd_file_name == 0)
2566 error ("cannot find 'ldd'");
2567 return;
2570 ldd_argv[argc++] = ldd_file_name;
2571 ldd_argv[argc++] = prog_name;
2572 ldd_argv[argc++] = (char *) 0;
2574 /* Trace if needed. */
2575 if (verbose)
2577 const char **p_argv;
2578 const char *str;
2580 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2581 fprintf (stderr, " %s", str);
2583 fprintf (stderr, "\n");
2586 fflush (stdout);
2587 fflush (stderr);
2589 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2590 if (pex == NULL)
2591 fatal_error (input_location, "pex_init failed: %m");
2593 errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2594 if (errmsg != NULL)
2596 if (err != 0)
2598 errno = err;
2599 fatal_error (input_location, "%s: %m", _(errmsg));
2601 else
2602 fatal_error (input_location, errmsg);
2605 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2606 #ifdef SIGQUIT
2607 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2608 #endif
2610 inf = pex_read_output (pex, 0);
2611 if (inf == NULL)
2612 fatal_error (input_location, "can't open ldd output: %m");
2614 if (debug)
2615 notice ("\nldd output with constructors/destructors.\n");
2617 /* Read each line of ldd output. */
2618 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2620 int ch2;
2621 char *name, *end, *p = buf;
2623 /* Extract names of libraries and add to list. */
2624 PARSE_LDD_OUTPUT (p);
2625 if (p == 0)
2626 continue;
2628 name = p;
2629 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2630 fatal_error (input_location, "dynamic dependency %s not found", buf);
2632 /* Find the end of the symbol name. */
2633 for (end = p;
2634 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2635 end++)
2636 continue;
2637 *end = '\0';
2639 if (access (name, R_OK) == 0)
2640 add_to_list (&libraries, name);
2641 else
2642 fatal_error (input_location, "unable to open dynamic dependency '%s'",
2643 buf);
2645 if (debug)
2646 fprintf (stderr, "\t%s\n", buf);
2648 if (debug)
2649 fprintf (stderr, "\n");
2651 do_wait (ldd_file_name, pex);
2653 signal (SIGINT, int_handler);
2654 #ifdef SIGQUIT
2655 signal (SIGQUIT, quit_handler);
2656 #endif
2658 /* Now iterate through the library list adding their symbols to
2659 the list. */
2660 for (list = libraries.first; list; list = list->next)
2661 scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2664 #endif /* LDD_SUFFIX */
2666 #endif /* OBJECT_FORMAT_NONE */
2670 * COFF specific stuff.
2673 #ifdef OBJECT_FORMAT_COFF
2675 # define GCC_SYMBOLS(X) (HEADER (ldptr).f_nsyms)
2676 # define GCC_SYMENT SYMENT
2677 # if defined (C_WEAKEXT)
2678 # define GCC_OK_SYMBOL(X) \
2679 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2680 ((X).n_scnum > N_UNDEF) && \
2681 (aix64_flag \
2682 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2683 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2684 # define GCC_UNDEF_SYMBOL(X) \
2685 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2686 ((X).n_scnum == N_UNDEF))
2687 # else
2688 # define GCC_OK_SYMBOL(X) \
2689 (((X).n_sclass == C_EXT) && \
2690 ((X).n_scnum > N_UNDEF) && \
2691 (aix64_flag \
2692 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2693 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2694 # define GCC_UNDEF_SYMBOL(X) \
2695 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2696 # endif
2697 # define GCC_SYMINC(X) ((X).n_numaux+1)
2698 # define GCC_SYMZERO(X) 0
2700 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2701 #if TARGET_AIX_VERSION >= 51
2702 # define GCC_CHECK_HDR(X) \
2703 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2704 || (HEADER (X).f_magic == 0767 && aix64_flag)) \
2705 && !(HEADER (X).f_flags & F_LOADONLY))
2706 #else
2707 # define GCC_CHECK_HDR(X) \
2708 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2709 || (HEADER (X).f_magic == 0757 && aix64_flag)) \
2710 && !(HEADER (X).f_flags & F_LOADONLY))
2711 #endif
2713 #ifdef COLLECT_EXPORT_LIST
2714 /* Array of standard AIX libraries which should not
2715 be scanned for ctors/dtors. */
2716 static const char *const aix_std_libs[] = {
2717 "/unix",
2718 "/lib/libc.a",
2719 "/lib/libm.a",
2720 "/lib/libc_r.a",
2721 "/lib/libm_r.a",
2722 "/usr/lib/libc.a",
2723 "/usr/lib/libm.a",
2724 "/usr/lib/libc_r.a",
2725 "/usr/lib/libm_r.a",
2726 "/usr/lib/threads/libc.a",
2727 "/usr/ccs/lib/libc.a",
2728 "/usr/ccs/lib/libm.a",
2729 "/usr/ccs/lib/libc_r.a",
2730 "/usr/ccs/lib/libm_r.a",
2731 NULL
2734 /* This function checks the filename and returns 1
2735 if this name matches the location of a standard AIX library. */
2736 static int ignore_library (const char *);
2737 static int
2738 ignore_library (const char *name)
2740 const char *const *p;
2741 size_t length;
2743 if (target_system_root[0] != '\0')
2745 length = strlen (target_system_root);
2746 if (strncmp (name, target_system_root, length) != 0)
2747 return 0;
2748 name += length;
2750 for (p = &aix_std_libs[0]; *p != NULL; ++p)
2751 if (strcmp (name, *p) == 0)
2752 return 1;
2753 return 0;
2755 #endif /* COLLECT_EXPORT_LIST */
2757 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2758 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2759 #endif
2761 /* COFF version to scan the name list of the loaded program for
2762 the symbols g++ uses for static constructors and destructors. */
2764 static void
2765 scan_prog_file (const char *prog_name, scanpass which_pass,
2766 scanfilter filter)
2768 LDFILE *ldptr = NULL;
2769 int sym_index, sym_count;
2770 int is_shared = 0;
2771 int found_lto = 0;
2773 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ
2774 && which_pass != PASS_LTOINFO)
2775 return;
2777 #ifdef COLLECT_EXPORT_LIST
2778 /* We do not need scanning for some standard C libraries. */
2779 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2780 return;
2782 /* On AIX we have a loop, because there is not much difference
2783 between an object and an archive. This trick allows us to
2784 eliminate scan_libraries() function. */
2787 found_lto = 0;
2788 #endif
2789 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2790 non-const char * filename parameter, even though it will not
2791 modify that string. So we must cast away const-ness here,
2792 using CONST_CAST to prevent complaints from -Wcast-qual. */
2793 if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
2795 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
2796 fatal_error (input_location, "%s: not a COFF file", prog_name);
2798 if (GCC_CHECK_HDR (ldptr))
2800 sym_count = GCC_SYMBOLS (ldptr);
2801 sym_index = GCC_SYMZERO (ldptr);
2803 #ifdef COLLECT_EXPORT_LIST
2804 /* Is current archive member a shared object? */
2805 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2806 #endif
2808 while (sym_index < sym_count)
2810 GCC_SYMENT symbol;
2812 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2813 break;
2814 sym_index += GCC_SYMINC (symbol);
2816 if (GCC_OK_SYMBOL (symbol))
2818 char *name;
2820 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2821 continue; /* Should never happen. */
2823 #ifdef XCOFF_DEBUGGING_INFO
2824 /* All AIX function names have a duplicate entry
2825 beginning with a dot. */
2826 if (*name == '.')
2827 ++name;
2828 #endif
2830 if (which_pass == PASS_LTOINFO)
2832 if (found_lto)
2833 continue;
2834 if (strncmp (name, "__gnu_lto_v1", 12) == 0)
2836 add_lto_object (&lto_objects, prog_name);
2837 found_lto = 1;
2838 break;
2840 continue;
2843 switch (is_ctor_dtor (name))
2845 #if TARGET_AIX_VERSION
2846 /* Add AIX shared library initalisers/finalisers
2847 to the constructors/destructors list of the
2848 current module. */
2849 case SYM_AIXI:
2850 if (! (filter & SCAN_CTOR))
2851 break;
2852 if (is_shared && !aixlazy_flag
2853 #ifdef COLLECT_EXPORT_LIST
2854 && ! static_obj
2855 && ! is_in_list (prog_name, static_libs.first)
2856 #endif
2858 add_to_list (&constructors, name);
2859 break;
2861 case SYM_AIXD:
2862 if (! (filter & SCAN_DTOR))
2863 break;
2864 if (is_shared && !aixlazy_flag)
2865 add_to_list (&destructors, name);
2866 break;
2867 #endif
2869 case SYM_CTOR:
2870 if (! (filter & SCAN_CTOR))
2871 break;
2872 if (! is_shared)
2873 add_to_list (&constructors, name);
2874 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2875 if (which_pass == PASS_OBJ)
2876 add_to_list (&exports, name);
2877 #endif
2878 break;
2880 case SYM_DTOR:
2881 if (! (filter & SCAN_DTOR))
2882 break;
2883 if (! is_shared)
2884 add_to_list (&destructors, name);
2885 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2886 if (which_pass == PASS_OBJ)
2887 add_to_list (&exports, name);
2888 #endif
2889 break;
2891 #ifdef COLLECT_EXPORT_LIST
2892 case SYM_INIT:
2893 if (! (filter & SCAN_INIT))
2894 break;
2895 #ifndef LD_INIT_SWITCH
2896 if (is_shared)
2897 add_to_list (&constructors, name);
2898 #endif
2899 break;
2901 case SYM_FINI:
2902 if (! (filter & SCAN_FINI))
2903 break;
2904 #ifndef LD_INIT_SWITCH
2905 if (is_shared)
2906 add_to_list (&destructors, name);
2907 #endif
2908 break;
2909 #endif
2911 case SYM_DWEH:
2912 if (! (filter & SCAN_DWEH))
2913 break;
2914 if (! is_shared)
2915 add_to_list (&frame_tables, name);
2916 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2917 if (which_pass == PASS_OBJ)
2918 add_to_list (&exports, name);
2919 #endif
2920 break;
2922 default: /* not a constructor or destructor */
2923 #ifdef COLLECT_EXPORT_LIST
2924 /* Explicitly export all global symbols when
2925 building a shared object on AIX, but do not
2926 re-export symbols from another shared object
2927 and do not export symbols if the user
2928 provides an explicit export list. */
2929 if (shared_obj && !is_shared
2930 && which_pass == PASS_OBJ && !export_flag)
2932 /* Do not auto-export __dso_handle or
2933 __gcc_unwind_dbase. They are required
2934 to be local to each module. */
2935 if (strcmp(name, "__dso_handle") != 0
2936 && strcmp(name, "__gcc_unwind_dbase") != 0)
2938 add_to_list (&exports, name);
2941 #endif
2942 continue;
2945 if (debug)
2946 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
2947 symbol.n_scnum, symbol.n_sclass,
2948 (symbol.n_type ? "0" : ""), symbol.n_type,
2949 name);
2953 #ifdef COLLECT_EXPORT_LIST
2954 else
2956 /* If archive contains both 32-bit and 64-bit objects,
2957 we want to skip objects in other mode so mismatch normal. */
2958 if (debug)
2959 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
2960 prog_name, HEADER (ldptr).f_magic, aix64_flag);
2962 #endif
2964 else
2966 fatal_error (input_location, "%s: cannot open as COFF file",
2967 prog_name);
2969 #ifdef COLLECT_EXPORT_LIST
2970 /* On AIX loop continues while there are more members in archive. */
2972 while (ldclose (ldptr) == FAILURE);
2973 #else
2974 /* Otherwise we simply close ldptr. */
2975 (void) ldclose (ldptr);
2976 #endif
2978 #endif /* OBJECT_FORMAT_COFF */
2980 #ifdef COLLECT_EXPORT_LIST
2981 /* Given a library name without "lib" prefix, this function
2982 returns a full library name including a path. */
2983 static char *
2984 resolve_lib_name (const char *name)
2986 char *lib_buf;
2987 int i, j, l = 0;
2988 /* Library extensions for AIX dynamic linking. */
2989 const char * const libexts[2] = {"a", "so"};
2991 for (i = 0; libpaths[i]; i++)
2992 if (libpaths[i]->max_len > l)
2993 l = libpaths[i]->max_len;
2995 lib_buf = XNEWVEC (char, l + strlen (name) + 10);
2997 for (i = 0; libpaths[i]; i++)
2999 struct prefix_list *list = libpaths[i]->plist;
3000 for (; list; list = list->next)
3002 /* The following lines are needed because path_prefix list
3003 may contain directories both with trailing DIR_SEPARATOR and
3004 without it. */
3005 const char *p = "";
3006 if (!IS_DIR_SEPARATOR (list->prefix[strlen (list->prefix)-1]))
3007 p = "/";
3008 for (j = 0; j < 2; j++)
3010 sprintf (lib_buf, "%s%slib%s.%s",
3011 list->prefix, p, name,
3012 libexts[(j + aixrtl_flag) % 2]);
3013 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3014 if (file_exists (lib_buf))
3016 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3017 return (lib_buf);
3022 if (debug)
3023 fprintf (stderr, "not found\n");
3024 else
3025 fatal_error (input_location, "library lib%s not found", name);
3026 return (NULL);
3028 #endif /* COLLECT_EXPORT_LIST */
3030 #ifdef COLLECT_RUN_DSYMUTIL
3031 static int flag_dsym = false;
3032 static int flag_idsym = false;
3034 static void
3035 process_args (int *argcp, char **argv) {
3036 int i, j;
3037 int argc = *argcp;
3038 for (i=0; i<argc; ++i)
3040 if (strcmp (argv[i], "-dsym") == 0)
3042 flag_dsym = true;
3043 /* Remove the flag, as we handle all processing for it. */
3044 j = i;
3046 argv[j] = argv[j+1];
3047 while (++j < argc);
3048 --i;
3049 argc = --(*argcp);
3051 else if (strcmp (argv[i], "-idsym") == 0)
3053 flag_idsym = true;
3054 /* Remove the flag, as we handle all processing for it. */
3055 j = i;
3057 argv[j] = argv[j+1];
3058 while (++j < argc);
3059 --i;
3060 argc = --(*argcp);
3065 static void
3066 do_dsymutil (const char *output_file) {
3067 const char *dsymutil = DSYMUTIL + 1;
3068 struct pex_obj *pex;
3069 char **real_argv = XCNEWVEC (char *, 3);
3070 const char ** argv = CONST_CAST2 (const char **, char **,
3071 real_argv);
3073 argv[0] = dsymutil;
3074 argv[1] = output_file;
3075 argv[2] = (char *) 0;
3077 pex = collect_execute (dsymutil, real_argv, NULL, NULL,
3078 PEX_LAST | PEX_SEARCH, false);
3079 do_wait (dsymutil, pex);
3082 static void
3083 post_ld_pass (bool temp_file) {
3084 if (!(temp_file && flag_idsym) && !flag_dsym)
3085 return;
3087 do_dsymutil (output_file);
3089 #else
3090 static void
3091 process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { }
3092 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { }
3093 #endif