1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
5 Free Software Foundation, Inc.
6 Contributed by Chris Smith (csmith@convex.com).
7 Heavily modified by Michael Meissner (meissner@cygnus.com),
8 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
10 This file is part of GCC.
12 GCC is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 3, or (at your option) any later
17 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
18 WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3. If not see
24 <http://www.gnu.org/licenses/>. */
27 /* Build tables of static constructors and destructors and run ld. */
31 #include "coretypes.h"
34 /* TARGET_64BIT may be defined to use driver specific functionality. */
36 #define TARGET_64BIT TARGET_64BIT_DEFAULT
38 #ifndef LIBRARY_PATH_ENV
39 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
45 #include "collect2-aix.h"
51 /* On certain systems, we have code that works by scanning the object file
52 directly. But this code uses system-specific header files and library
53 functions, so turn it off in a cross-compiler. Likewise, the names of
54 the utilities are not correct for a cross-compiler; we have to hope that
55 cross-versions are in the proper directories. */
57 #ifdef CROSS_DIRECTORY_STRUCTURE
58 #ifndef CROSS_AIX_SUPPORT
59 #undef OBJECT_FORMAT_COFF
62 #undef REAL_LD_FILE_NAME
63 #undef REAL_NM_FILE_NAME
64 #undef REAL_STRIP_FILE_NAME
67 /* If we cannot use a special method, use the ordinary one:
68 run nm to find what symbols are present.
69 In a cross-compiler, this means you need a cross nm,
70 but that is not quite as unpleasant as special headers. */
72 #if !defined (OBJECT_FORMAT_COFF)
73 #define OBJECT_FORMAT_NONE
76 #ifdef OBJECT_FORMAT_COFF
78 #ifndef CROSS_DIRECTORY_STRUCTURE
86 /* Many versions of ldfcn.h define these. */
95 /* Some systems have an ISCOFF macro, but others do not. In some cases
96 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
97 that either do not have an ISCOFF macro in /usr/include or for those
101 #define MY_ISCOFF(X) ISCOFF (X)
104 #endif /* OBJECT_FORMAT_COFF */
106 #ifdef OBJECT_FORMAT_NONE
108 /* Default flags to pass to nm. */
110 #define NM_FLAGS "-n"
113 #endif /* OBJECT_FORMAT_NONE */
115 /* Some systems use __main in a way incompatible with its use in gcc, in these
116 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
117 give the same symbol without quotes for an alternative entry point. */
119 #define NAME__MAIN "__main"
122 /* This must match tree.h. */
123 #define DEFAULT_INIT_PRIORITY 65535
125 #ifndef COLLECT_SHARED_INIT_FUNC
126 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
127 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
129 #ifndef COLLECT_SHARED_FINI_FUNC
130 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
131 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
135 #define SCAN_LIBRARIES
139 #define SHLIB_SUFFIX ".so"
143 int do_collecting
= 1;
145 int do_collecting
= 0;
148 /* Cook up an always defined indication of whether we proceed the
149 "EXPORT_LIST" way. */
151 #ifdef COLLECT_EXPORT_LIST
152 #define DO_COLLECT_EXPORT_LIST 1
154 #define DO_COLLECT_EXPORT_LIST 0
157 /* Nonzero if we should suppress the automatic demangling of identifiers
158 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
161 /* Linked lists of constructor and destructor names. */
177 bool vflag
; /* true if -v or --version */
178 static int rflag
; /* true if -r */
179 static int strip_flag
; /* true if -s */
180 static const char *demangle_flag
;
181 #ifdef COLLECT_EXPORT_LIST
182 static int export_flag
; /* true if -bE */
183 static int aix64_flag
; /* true if -b64 */
184 static int aixrtl_flag
; /* true if -brtl */
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. */
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 */
212 static const char *ldd_file_name
; /* pathname of ldd (or equivalent) */
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 */
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
;
236 static const char *target_system_root
= "";
239 /* Structure to hold all the directories in which to search for files to
244 const char *prefix
; /* String to prepend to the path. */
245 struct prefix_list
*next
; /* Next in linked list. */
250 struct prefix_list
*plist
; /* List of prefixes to try */
251 int max_len
; /* Max length of a prefix in PLIST */
252 const char *name
; /* Name of this list (used in config stuff) */
255 #ifdef COLLECT_EXPORT_LIST
256 /* Lists to keep libraries to be scanned for global constructors/destructors. */
257 static struct head libs
; /* list of libraries */
258 static struct path_prefix cmdline_lib_dirs
; /* directories specified with -L */
259 static struct path_prefix libpath_lib_dirs
; /* directories in LIBPATH */
260 static struct path_prefix
*libpaths
[3] = {&cmdline_lib_dirs
,
261 &libpath_lib_dirs
, NULL
};
264 /* List of names of object files containing LTO information.
265 These are a subset of the object file names appearing on the
266 command line, and must be identical, in the sense of pointer
267 equality, with the names passed to maybe_run_lto_and_relink(). */
271 const char *name
; /* Name of object file. */
272 struct lto_object
*next
; /* Next in linked list. */
275 struct lto_object_list
277 struct lto_object
*first
; /* First list element. */
278 struct lto_object
*last
; /* Last list element. */
281 static struct lto_object_list lto_objects
;
283 /* Special kinds of symbols that a name may denote. */
286 SYM_REGULAR
= 0, /* nothing special */
288 SYM_CTOR
= 1, /* constructor */
289 SYM_DTOR
= 2, /* destructor */
290 SYM_INIT
= 3, /* shared object routine that calls all the ctors */
291 SYM_FINI
= 4, /* shared object routine that calls all the dtors */
292 SYM_DWEH
= 5 /* DWARF exception handling table */
295 static symkind
is_ctor_dtor (const char *);
297 static void handler (int);
298 static char *find_a_file (struct path_prefix
*, const char *);
299 static void add_prefix (struct path_prefix
*, const char *);
300 static void prefix_from_env (const char *, struct path_prefix
*);
301 static void prefix_from_string (const char *, struct path_prefix
*);
302 static void do_wait (const char *, struct pex_obj
*);
303 static void fork_execute (const char *, char **);
304 static void maybe_unlink (const char *);
305 static void maybe_unlink_list (char **);
306 static void add_to_list (struct head
*, const char *);
307 static int extract_init_priority (const char *);
308 static void sort_ids (struct head
*);
309 static void write_list (FILE *, const char *, struct id
*);
310 #ifdef COLLECT_EXPORT_LIST
311 static void dump_list (FILE *, const char *, struct id
*);
314 static void dump_prefix_list (FILE *, const char *, struct prefix_list
*);
316 static void write_list_with_asm (FILE *, const char *, struct id
*);
317 static void write_c_file (FILE *, const char *);
318 static void write_c_file_stat (FILE *, const char *);
319 #ifndef LD_INIT_SWITCH
320 static void write_c_file_glob (FILE *, const char *);
322 #ifdef SCAN_LIBRARIES
323 static void scan_libraries (const char *);
325 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
326 static int is_in_args (const char *, const char **, const char **);
328 #ifdef COLLECT_EXPORT_LIST
330 static int is_in_list (const char *, struct id
*);
332 static void write_aix_file (FILE *, struct id
*);
333 static char *resolve_lib_name (const char *);
335 static char *extract_string (const char **);
337 /* Enumerations describing which pass this is for scanning the
341 PASS_FIRST
, /* without constructors */
342 PASS_OBJ
, /* individual objects */
343 PASS_LIB
, /* looking for shared libraries */
344 PASS_SECOND
, /* with constructors linked in */
345 PASS_LTOINFO
/* looking for objects with LTO info */
348 /* ... and which kinds of symbols are to be considered. */
350 enum scanfilter_masks
{
353 SCAN_CTOR
= 1 << SYM_CTOR
,
354 SCAN_DTOR
= 1 << SYM_DTOR
,
355 SCAN_INIT
= 1 << SYM_INIT
,
356 SCAN_FINI
= 1 << SYM_FINI
,
357 SCAN_DWEH
= 1 << SYM_DWEH
,
361 /* This type is used for parameters and variables which hold
362 combinations of the flags in enum scanfilter_masks. */
363 typedef int scanfilter
;
365 /* Scan the name list of the loaded program for the symbols g++ uses for
366 static constructors and destructors.
368 The SCANPASS argument tells which collect processing pass this is for and
369 the SCANFILTER argument tells which kinds of symbols to consider in this
370 pass. Symbols of a special kind not in the filter mask are considered as
373 The constructor table begins at __CTOR_LIST__ and contains a count of the
374 number of pointers (or -1 if the constructors are built in a separate
375 section by the linker), followed by the pointers to the constructor
376 functions, terminated with a null pointer. The destructor table has the
377 same format, and begins at __DTOR_LIST__. */
379 static void scan_prog_file (const char *, scanpass
, scanfilter
);
382 /* Delete tempfiles and exit function. */
385 collect_exit (int status
)
387 if (c_file
!= 0 && c_file
[0])
388 maybe_unlink (c_file
);
390 if (o_file
!= 0 && o_file
[0])
391 maybe_unlink (o_file
);
393 #ifdef COLLECT_EXPORT_LIST
394 if (export_file
!= 0 && export_file
[0])
395 maybe_unlink (export_file
);
399 maybe_unlink_list (lto_o_files
);
401 if (ldout
!= 0 && ldout
[0])
403 dump_file (ldout
, stdout
);
404 maybe_unlink (ldout
);
407 if (lderrout
!= 0 && lderrout
[0])
409 dump_file (lderrout
, stderr
);
410 maybe_unlink (lderrout
);
413 if (status
!= 0 && output_file
!= 0 && output_file
[0])
414 maybe_unlink (output_file
);
417 maybe_unlink (response_file
);
423 /* Notify user of a non-error. */
425 notice (const char *cmsgid
, ...)
429 va_start (ap
, cmsgid
);
430 vfprintf (stderr
, _(cmsgid
), ap
);
434 /* Notify user of a non-error, without translating the format string. */
436 notice_translated (const char *cmsgid
, ...)
440 va_start (ap
, cmsgid
);
441 vfprintf (stderr
, cmsgid
, ap
);
445 /* Die when sys call fails. */
448 fatal_perror (const char * cmsgid
, ...)
453 va_start (ap
, cmsgid
);
454 fprintf (stderr
, "collect2: ");
455 vfprintf (stderr
, _(cmsgid
), ap
);
456 fprintf (stderr
, ": %s\n", xstrerror (e
));
459 collect_exit (FATAL_EXIT_CODE
);
465 fatal (const char * cmsgid
, ...)
469 va_start (ap
, cmsgid
);
470 fprintf (stderr
, "collect2: ");
471 vfprintf (stderr
, _(cmsgid
), ap
);
472 fprintf (stderr
, "\n");
475 collect_exit (FATAL_EXIT_CODE
);
478 /* Write error message. */
481 error (const char * gmsgid
, ...)
485 va_start (ap
, gmsgid
);
486 fprintf (stderr
, "collect2: ");
487 vfprintf (stderr
, _(gmsgid
), ap
);
488 fprintf (stderr
, "\n");
492 /* In case obstack is linked in, and abort is defined to fancy_abort,
493 provide a default entry. */
496 fancy_abort (const char *file
, int line
, const char *func
)
498 fatal ("internal gcc abort in %s, at %s:%d", func
, file
, line
);
504 if (c_file
!= 0 && c_file
[0])
505 maybe_unlink (c_file
);
507 if (o_file
!= 0 && o_file
[0])
508 maybe_unlink (o_file
);
510 if (ldout
!= 0 && ldout
[0])
511 maybe_unlink (ldout
);
513 if (lderrout
!= 0 && lderrout
[0])
514 maybe_unlink (lderrout
);
516 #ifdef COLLECT_EXPORT_LIST
517 if (export_file
!= 0 && export_file
[0])
518 maybe_unlink (export_file
);
522 maybe_unlink_list (lto_o_files
);
525 maybe_unlink (response_file
);
527 signal (signo
, SIG_DFL
);
533 file_exists (const char *name
)
535 return access (name
, R_OK
) == 0;
538 /* Parse a reasonable subset of shell quoting syntax. */
541 extract_string (const char **pp
)
554 obstack_1grow (&temporary_obstack
, c
);
555 else if (! inside
&& c
== ' ')
557 else if (! inside
&& c
== '\\')
562 obstack_1grow (&temporary_obstack
, c
);
565 obstack_1grow (&temporary_obstack
, '\0');
567 return XOBFINISH (&temporary_obstack
, char *);
571 dump_file (const char *name
, FILE *to
)
573 FILE *stream
= fopen (name
, "r");
580 while (c
= getc (stream
),
581 c
!= EOF
&& (ISIDNUM (c
) || c
== '$' || c
== '.'))
582 obstack_1grow (&temporary_obstack
, c
);
583 if (obstack_object_size (&temporary_obstack
) > 0)
585 const char *word
, *p
;
587 obstack_1grow (&temporary_obstack
, '\0');
588 word
= XOBFINISH (&temporary_obstack
, const char *);
591 ++word
, putc ('.', to
);
593 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
594 p
+= strlen (USER_LABEL_PREFIX
);
596 #ifdef HAVE_LD_DEMANGLE
602 result
= cplus_demangle (p
, DMGL_PARAMS
| DMGL_ANSI
| DMGL_VERBOSE
);
610 diff
= strlen (word
) - strlen (result
);
611 while (diff
> 0 && c
== ' ')
612 --diff
, putc (' ', to
);
613 if (diff
< 0 && c
== ' ')
615 while (diff
< 0 && c
== ' ')
616 ++diff
, c
= getc (stream
);
619 /* Make sure we output at least one space, or
620 the demangled symbol name will run into
621 whatever text follows. */
632 obstack_free (&temporary_obstack
, temporary_firstobj
);
641 /* Return the kind of symbol denoted by name S. */
644 is_ctor_dtor (const char *s
)
646 struct names
{ const char *const name
; const int len
; symkind ret
;
647 const int two_underscores
; };
649 const struct names
*p
;
651 const char *orig_s
= s
;
653 static const struct names special
[] = {
654 #ifndef NO_DOLLAR_IN_LABEL
655 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR
, 0 },
656 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR
, 0 },
658 #ifndef NO_DOT_IN_LABEL
659 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR
, 0 },
660 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR
, 0 },
661 #endif /* NO_DOT_IN_LABEL */
662 #endif /* NO_DOLLAR_IN_LABEL */
663 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR
, 0 },
664 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR
, 0 },
665 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH
, 0 },
666 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT
, 0 },
667 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI
, 0 },
668 { NULL
, 0, SYM_REGULAR
, 0 }
671 while ((ch
= *s
) == '_')
677 for (p
= &special
[0]; p
->len
> 0; p
++)
680 && (!p
->two_underscores
|| ((s
- orig_s
) >= 2))
681 && strncmp(s
, p
->name
, p
->len
) == 0)
689 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
690 and one from the PATH variable. */
692 static struct path_prefix cpath
, path
;
694 #ifdef CROSS_DIRECTORY_STRUCTURE
695 /* This is the name of the target machine. We use it to form the name
696 of the files to execute. */
698 static const char *const target_machine
= TARGET_MACHINE
;
701 /* Search for NAME using prefix list PPREFIX. We only look for executable
704 Return 0 if not found, otherwise return its name, allocated with malloc. */
707 find_a_file (struct path_prefix
*pprefix
, const char *name
)
710 struct prefix_list
*pl
;
711 int len
= pprefix
->max_len
+ strlen (name
) + 1;
714 fprintf (stderr
, "Looking for '%s'\n", name
);
716 #ifdef HOST_EXECUTABLE_SUFFIX
717 len
+= strlen (HOST_EXECUTABLE_SUFFIX
);
720 temp
= XNEWVEC (char, len
);
722 /* Determine the filename to execute (special case for absolute paths). */
724 if (IS_ABSOLUTE_PATH (name
))
726 if (access (name
, X_OK
) == 0)
731 fprintf (stderr
, " - found: absolute path\n");
736 #ifdef HOST_EXECUTABLE_SUFFIX
737 /* Some systems have a suffix for executable files.
738 So try appending that. */
740 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
742 if (access (temp
, X_OK
) == 0)
747 fprintf (stderr
, " - failed to locate using absolute path\n");
750 for (pl
= pprefix
->plist
; pl
; pl
= pl
->next
)
754 strcpy (temp
, pl
->prefix
);
757 if (stat (temp
, &st
) >= 0
758 && ! S_ISDIR (st
.st_mode
)
759 && access (temp
, X_OK
) == 0)
762 #ifdef HOST_EXECUTABLE_SUFFIX
763 /* Some systems have a suffix for executable files.
764 So try appending that. */
765 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
767 if (stat (temp
, &st
) >= 0
768 && ! S_ISDIR (st
.st_mode
)
769 && access (temp
, X_OK
) == 0)
774 if (debug
&& pprefix
->plist
== NULL
)
775 fprintf (stderr
, " - failed: no entries in prefix list\n");
781 /* Add an entry for PREFIX to prefix list PPREFIX. */
784 add_prefix (struct path_prefix
*pprefix
, const char *prefix
)
786 struct prefix_list
*pl
, **prev
;
791 for (pl
= pprefix
->plist
; pl
->next
; pl
= pl
->next
)
796 prev
= &pprefix
->plist
;
798 /* Keep track of the longest prefix. */
800 len
= strlen (prefix
);
801 if (len
> pprefix
->max_len
)
802 pprefix
->max_len
= len
;
804 pl
= XNEW (struct prefix_list
);
805 pl
->prefix
= xstrdup (prefix
);
810 pl
->next
= (struct prefix_list
*) 0;
814 /* Take the value of the environment variable ENV, break it into a path, and
815 add of the entries to PPREFIX. */
818 prefix_from_env (const char *env
, struct path_prefix
*pprefix
)
824 prefix_from_string (p
, pprefix
);
828 prefix_from_string (const char *p
, struct path_prefix
*pprefix
)
830 const char *startp
, *endp
;
831 char *nstore
= XNEWVEC (char, strlen (p
) + 3);
834 fprintf (stderr
, "Convert string '%s' into prefixes, separator = '%c'\n", p
, PATH_SEPARATOR
);
839 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
841 strncpy (nstore
, startp
, endp
-startp
);
844 strcpy (nstore
, "./");
846 else if (! IS_DIR_SEPARATOR (endp
[-1]))
848 nstore
[endp
-startp
] = DIR_SEPARATOR
;
849 nstore
[endp
-startp
+1] = 0;
852 nstore
[endp
-startp
] = 0;
855 fprintf (stderr
, " - add prefix: %s\n", nstore
);
857 add_prefix (pprefix
, nstore
);
860 endp
= startp
= endp
+ 1;
868 #ifdef OBJECT_FORMAT_NONE
870 /* Add an entry for the object file NAME to object file list LIST.
871 New entries are added at the end of the list. The original pointer
872 value of NAME is preserved, i.e., no string copy is performed. */
875 add_lto_object (struct lto_object_list
*list
, const char *name
)
877 struct lto_object
*n
= XNEW (struct lto_object
);
882 list
->last
->next
= n
;
888 #endif /* OBJECT_FORMAT_NONE */
891 /* Perform a link-time recompilation and relink if any of the object
892 files contain LTO info. The linker command line LTO_LD_ARGV
893 represents the linker command that would produce a final executable
894 without the use of LTO. OBJECT_LST is a vector of object file names
895 appearing in LTO_LD_ARGV that are to be considerd for link-time
896 recompilation, where OBJECT is a pointer to the last valid element.
897 (This awkward convention avoids an impedance mismatch with the
898 usage of similarly-named variables in main().) The elements of
899 OBJECT_LST must be identical, i.e., pointer equal, to the
900 corresponding arguments in LTO_LD_ARGV.
902 Upon entry, at least one linker run has been performed without the
903 use of any LTO info that might be present. Any recompilations
904 necessary for template instantiations have been performed, and
905 initializer/finalizer tables have been created if needed and
906 included in the linker command line LTO_LD_ARGV. If any of the
907 object files contain LTO info, we run the LTO back end on all such
908 files, and perform the final link with the LTO back end output
909 substituted for the LTO-optimized files. In some cases, a final
910 link with all link-time generated code has already been performed,
911 so there is no need to relink if no LTO info is found. In other
912 cases, our caller has not produced the final executable, and is
913 relying on us to perform the required link whether LTO info is
914 present or not. In that case, the FORCE argument should be true.
915 Note that the linker command line argument LTO_LD_ARGV passed into
916 this function may be modified in place. */
919 maybe_run_lto_and_relink (char **lto_ld_argv
, char **object_lst
,
920 const char **object
, bool force
)
922 const char **object_file
= CONST_CAST2 (const char **, char **, object_lst
);
924 int num_lto_c_args
= 1; /* Allow space for the terminating NULL. */
926 while (object_file
< object
)
928 /* If file contains LTO info, add it to the list of LTO objects. */
929 scan_prog_file (*object_file
++, PASS_LTOINFO
, SCAN_ALL
);
931 /* Increment the argument count by the number of object file arguments
932 we will add. An upper bound suffices, so just count all of the
933 object files regardless of whether they contain LTO info. */
937 if (lto_objects
.first
)
940 const char **lto_c_ptr
;
943 struct lto_object
*list
;
944 char *lto_wrapper
= getenv ("COLLECT_LTO_WRAPPER");
946 const char *prog
= "lto-wrapper";
947 int lto_ld_argv_size
= 0;
948 char **out_lto_ld_argv
;
949 int out_lto_ld_argv_size
;
953 fatal ("COLLECT_LTO_WRAPPER must be set");
957 /* There is at least one object file containing LTO info,
958 so we need to run the LTO back end and relink.
960 To do so we build updated ld arguments with first
961 LTO object replaced by all partitions and other LTO
964 lto_c_argv
= (char **) xcalloc (sizeof (char *), num_lto_c_args
);
965 lto_c_ptr
= CONST_CAST2 (const char **, char **, lto_c_argv
);
967 *lto_c_ptr
++ = lto_wrapper
;
969 /* Add LTO objects to the wrapper command line. */
970 for (list
= lto_objects
.first
; list
; list
= list
->next
)
971 *lto_c_ptr
++ = list
->name
;
975 /* Run the LTO back end. */
976 pex
= collect_execute (prog
, lto_c_argv
, NULL
, NULL
, PEX_SEARCH
);
983 stream
= pex_read_output (pex
, 0);
987 while ((c
= getc (stream
)) != EOF
)
989 obstack_1grow (&temporary_obstack
, c
);
994 lto_o_files
= XNEWVEC (char *, num_files
+ 1);
995 lto_o_files
[num_files
] = NULL
;
996 start
= XOBFINISH (&temporary_obstack
, char *);
997 for (i
= 0; i
< num_files
; ++i
)
1000 while (*end
!= '\n')
1004 lto_o_files
[i
] = xstrdup (start
);
1009 obstack_free (&temporary_obstack
, temporary_firstobj
);
1011 do_wait (prog
, pex
);
1014 /* Compute memory needed for new LD arguments. At most number of original arguemtns
1015 plus number of partitions. */
1016 for (lto_ld_argv_size
= 0; lto_ld_argv
[lto_ld_argv_size
]; lto_ld_argv_size
++)
1018 out_lto_ld_argv
= XCNEWVEC(char *, num_files
+ lto_ld_argv_size
+ 1);
1019 out_lto_ld_argv_size
= 0;
1021 /* After running the LTO back end, we will relink, substituting
1022 the LTO output for the object files that we submitted to the
1023 LTO. Here, we modify the linker command line for the relink. */
1025 /* Copy all arguments until we find first LTO file. */
1029 for (list
= lto_objects
.first
; list
; list
= list
->next
)
1030 if (*p
== list
->name
) /* Note test for pointer equality! */
1034 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
++;
1037 /* Now insert all LTO partitions. */
1038 lto_o_ptr
= lto_o_files
;
1040 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *lto_o_ptr
++;
1042 /* ... and copy the rest. */
1045 for (list
= lto_objects
.first
; list
; list
= list
->next
)
1046 if (*p
== list
->name
) /* Note test for pointer equality! */
1049 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
;
1052 out_lto_ld_argv
[out_lto_ld_argv_size
++] = 0;
1054 /* Run the linker again, this time replacing the object files
1055 optimized by the LTO with the temporary file generated by the LTO. */
1056 fork_execute ("ld", out_lto_ld_argv
);
1059 maybe_unlink_list (lto_o_files
);
1063 /* Our caller is relying on us to do the link
1064 even though there is no LTO back end work to be done. */
1065 fork_execute ("ld", lto_ld_argv
);
1072 main (int argc
, char **argv
)
1074 static const char *const ld_suffix
= "ld";
1075 static const char *const plugin_ld_suffix
= PLUGIN_LD
;
1076 static const char *const real_ld_suffix
= "real-ld";
1077 static const char *const collect_ld_suffix
= "collect-ld";
1078 static const char *const nm_suffix
= "nm";
1079 static const char *const gnm_suffix
= "gnm";
1081 static const char *const ldd_suffix
= LDD_SUFFIX
;
1083 static const char *const strip_suffix
= "strip";
1084 static const char *const gstrip_suffix
= "gstrip";
1086 #ifdef CROSS_DIRECTORY_STRUCTURE
1087 /* If we look for a program in the compiler directories, we just use
1088 the short name, since these directories are already system-specific.
1089 But it we look for a program in the system directories, we need to
1090 qualify the program name with the target machine. */
1092 const char *const full_ld_suffix
=
1093 concat(target_machine
, "-", ld_suffix
, NULL
);
1094 const char *const full_plugin_ld_suffix
=
1095 concat(target_machine
, "-", plugin_ld_suffix
, NULL
);
1096 const char *const full_nm_suffix
=
1097 concat (target_machine
, "-", nm_suffix
, NULL
);
1098 const char *const full_gnm_suffix
=
1099 concat (target_machine
, "-", gnm_suffix
, NULL
);
1101 const char *const full_ldd_suffix
=
1102 concat (target_machine
, "-", ldd_suffix
, NULL
);
1104 const char *const full_strip_suffix
=
1105 concat (target_machine
, "-", strip_suffix
, NULL
);
1106 const char *const full_gstrip_suffix
=
1107 concat (target_machine
, "-", gstrip_suffix
, NULL
);
1109 const char *const full_ld_suffix
= ld_suffix
;
1110 const char *const full_plugin_ld_suffix
= plugin_ld_suffix
;
1111 const char *const full_nm_suffix
= nm_suffix
;
1112 const char *const full_gnm_suffix
= gnm_suffix
;
1114 const char *const full_ldd_suffix
= ldd_suffix
;
1116 const char *const full_strip_suffix
= strip_suffix
;
1117 const char *const full_gstrip_suffix
= gstrip_suffix
;
1118 #endif /* CROSS_DIRECTORY_STRUCTURE */
1122 #ifdef COLLECT_EXPORT_LIST
1125 const char *ld_file_name
;
1131 bool use_plugin
= false;
1133 /* The kinds of symbols we will have to consider when scanning the
1134 outcome of a first pass link. This is ALL to start with, then might
1135 be adjusted before getting to the first pass link per se, typically on
1136 AIX where we perform an early scan of objects and libraries to fetch
1137 the list of global ctors/dtors and make sure they are not garbage
1139 scanfilter ld1_filter
= SCAN_ALL
;
1144 const char **object
;
1150 expandargv (&argc
, &argv
);
1151 if (argv
!= old_argv
)
1152 at_file_supplied
= 1;
1154 num_c_args
= argc
+ 9;
1156 no_demangle
= !! getenv ("COLLECT_NO_DEMANGLE");
1158 /* Suppress demangling by the real linker, which may be broken. */
1159 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1161 #if defined (COLLECT2_HOST_INITIALIZATION)
1162 /* Perform system dependent initialization, if necessary. */
1163 COLLECT2_HOST_INITIALIZATION
;
1167 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1168 receive the signal. A different setting is inheritable */
1169 signal (SIGCHLD
, SIG_DFL
);
1172 /* Unlock the stdio streams. */
1173 unlock_std_streams ();
1175 gcc_init_libintl ();
1177 /* Do not invoke xcalloc before this point, since locale needs to be
1178 set first, in case a diagnostic is issued. */
1180 ld1_argv
= XCNEWVEC (char *, argc
+ 4);
1181 ld1
= CONST_CAST2 (const char **, char **, ld1_argv
);
1182 ld2_argv
= XCNEWVEC (char *, argc
+ 11);
1183 ld2
= CONST_CAST2 (const char **, char **, ld2_argv
);
1184 object_lst
= XCNEWVEC (char *, argc
);
1185 object
= CONST_CAST2 (const char **, char **, object_lst
);
1191 /* Parse command line early for instances of -debug. This allows
1192 the debug flag to be set before functions like find_a_file()
1193 are called. We also look for the -flto or -flto-partition=none flag to know
1194 what LTO mode we are in. */
1197 bool no_partition
= false;
1199 for (i
= 1; argv
[i
] != NULL
; i
++)
1201 if (! strcmp (argv
[i
], "-debug"))
1203 else if (! strcmp (argv
[i
], "-flto-partition=none"))
1204 no_partition
= true;
1205 else if ((! strncmp (argv
[i
], "-flto=", 6)
1206 || ! strcmp (argv
[i
], "-flto")) && ! use_plugin
)
1207 lto_mode
= LTO_MODE_WHOPR
;
1208 else if (! strcmp (argv
[i
], "-plugin"))
1211 lto_mode
= LTO_MODE_NONE
;
1213 #ifdef COLLECT_EXPORT_LIST
1214 /* since -brtl, -bexport, -b64 are not position dependent
1215 also check for them here */
1216 if ((argv
[i
][0] == '-') && (argv
[i
][1] == 'b'))
1219 /* We want to disable automatic exports on AIX when user
1220 explicitly puts an export list in command line */
1221 if (arg
[2] == 'E' || strncmp (&arg
[2], "export", 6) == 0)
1223 else if (arg
[2] == '6' && arg
[3] == '4')
1225 else if (arg
[2] == 'r' && arg
[3] == 't' && arg
[4] == 'l')
1232 lto_mode
= LTO_MODE_LTO
;
1235 #ifndef DEFAULT_A_OUT_NAME
1236 output_file
= "a.out";
1238 output_file
= DEFAULT_A_OUT_NAME
;
1241 obstack_begin (&temporary_obstack
, 0);
1242 temporary_firstobj
= (char *) obstack_alloc (&temporary_obstack
, 0);
1244 #ifndef HAVE_LD_DEMANGLE
1245 current_demangling_style
= auto_demangling
;
1247 p
= getenv ("COLLECT_GCC_OPTIONS");
1250 const char *q
= extract_string (&p
);
1251 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1254 obstack_free (&temporary_obstack
, temporary_firstobj
);
1256 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1257 -fno-exceptions -w -fno-whole-program */
1260 c_argv
= XCNEWVEC (char *, num_c_args
);
1261 c_ptr
= CONST_CAST2 (const char **, char **, c_argv
);
1264 fatal ("no arguments");
1267 if (signal (SIGQUIT
, SIG_IGN
) != SIG_IGN
)
1268 signal (SIGQUIT
, handler
);
1270 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1271 signal (SIGINT
, handler
);
1273 if (signal (SIGALRM
, SIG_IGN
) != SIG_IGN
)
1274 signal (SIGALRM
, handler
);
1277 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1278 signal (SIGHUP
, handler
);
1280 if (signal (SIGSEGV
, SIG_IGN
) != SIG_IGN
)
1281 signal (SIGSEGV
, handler
);
1283 if (signal (SIGBUS
, SIG_IGN
) != SIG_IGN
)
1284 signal (SIGBUS
, handler
);
1287 /* Extract COMPILER_PATH and PATH into our prefix list. */
1288 prefix_from_env ("COMPILER_PATH", &cpath
);
1289 prefix_from_env ("PATH", &path
);
1291 /* Try to discover a valid linker/nm/strip to use. */
1293 /* Maybe we know the right file to use (if not cross). */
1295 #ifdef DEFAULT_LINKER
1296 if (access (DEFAULT_LINKER
, X_OK
) == 0)
1297 ld_file_name
= DEFAULT_LINKER
;
1298 if (ld_file_name
== 0)
1300 #ifdef REAL_LD_FILE_NAME
1301 ld_file_name
= find_a_file (&path
, REAL_LD_FILE_NAME
);
1302 if (ld_file_name
== 0)
1304 /* Search the (target-specific) compiler dirs for ld'. */
1305 ld_file_name
= find_a_file (&cpath
, real_ld_suffix
);
1306 /* Likewise for `collect-ld'. */
1307 if (ld_file_name
== 0)
1308 ld_file_name
= find_a_file (&cpath
, collect_ld_suffix
);
1309 /* Search the compiler directories for `ld'. We have protection against
1310 recursive calls in find_a_file. */
1311 if (ld_file_name
== 0)
1312 ld_file_name
= find_a_file (&cpath
,
1316 /* Search the ordinary system bin directories
1317 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1318 if (ld_file_name
== 0)
1319 ld_file_name
= find_a_file (&path
,
1321 ? full_plugin_ld_suffix
1324 #ifdef REAL_NM_FILE_NAME
1325 nm_file_name
= find_a_file (&path
, REAL_NM_FILE_NAME
);
1326 if (nm_file_name
== 0)
1328 nm_file_name
= find_a_file (&cpath
, gnm_suffix
);
1329 if (nm_file_name
== 0)
1330 nm_file_name
= find_a_file (&path
, full_gnm_suffix
);
1331 if (nm_file_name
== 0)
1332 nm_file_name
= find_a_file (&cpath
, nm_suffix
);
1333 if (nm_file_name
== 0)
1334 nm_file_name
= find_a_file (&path
, full_nm_suffix
);
1337 ldd_file_name
= find_a_file (&cpath
, ldd_suffix
);
1338 if (ldd_file_name
== 0)
1339 ldd_file_name
= find_a_file (&path
, full_ldd_suffix
);
1342 #ifdef REAL_STRIP_FILE_NAME
1343 strip_file_name
= find_a_file (&path
, REAL_STRIP_FILE_NAME
);
1344 if (strip_file_name
== 0)
1346 strip_file_name
= find_a_file (&cpath
, gstrip_suffix
);
1347 if (strip_file_name
== 0)
1348 strip_file_name
= find_a_file (&path
, full_gstrip_suffix
);
1349 if (strip_file_name
== 0)
1350 strip_file_name
= find_a_file (&cpath
, strip_suffix
);
1351 if (strip_file_name
== 0)
1352 strip_file_name
= find_a_file (&path
, full_strip_suffix
);
1354 /* Determine the full path name of the C compiler to use. */
1355 c_file_name
= getenv ("COLLECT_GCC");
1356 if (c_file_name
== 0)
1358 #ifdef CROSS_DIRECTORY_STRUCTURE
1359 c_file_name
= concat (target_machine
, "-gcc", NULL
);
1361 c_file_name
= "gcc";
1365 p
= find_a_file (&cpath
, c_file_name
);
1367 /* Here it should be safe to use the system search path since we should have
1368 already qualified the name of the compiler when it is needed. */
1370 p
= find_a_file (&path
, c_file_name
);
1375 *ld1
++ = *ld2
++ = ld_file_name
;
1377 /* Make temp file names. */
1378 c_file
= make_temp_file (".c");
1379 o_file
= make_temp_file (".o");
1380 #ifdef COLLECT_EXPORT_LIST
1381 export_file
= make_temp_file (".x");
1383 ldout
= make_temp_file (".ld");
1384 lderrout
= make_temp_file (".le");
1385 *c_ptr
++ = c_file_name
;
1392 #ifdef COLLECT_EXPORT_LIST
1393 /* Generate a list of directories from LIBPATH. */
1394 prefix_from_env ("LIBPATH", &libpath_lib_dirs
);
1395 /* Add to this list also two standard directories where
1396 AIX loader always searches for libraries. */
1397 add_prefix (&libpath_lib_dirs
, "/lib");
1398 add_prefix (&libpath_lib_dirs
, "/usr/lib");
1401 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1403 AIX support needs to know if -shared has been specified before
1404 parsing commandline arguments. */
1406 p
= getenv ("COLLECT_GCC_OPTIONS");
1409 const char *q
= extract_string (&p
);
1410 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1411 *c_ptr
++ = xstrdup (q
);
1412 if (strcmp (q
, "-EL") == 0 || strcmp (q
, "-EB") == 0)
1413 *c_ptr
++ = xstrdup (q
);
1414 if (strcmp (q
, "-shared") == 0)
1416 if (*q
== '-' && q
[1] == 'B')
1418 *c_ptr
++ = xstrdup (q
);
1421 q
= extract_string (&p
);
1422 *c_ptr
++ = xstrdup (q
);
1426 obstack_free (&temporary_obstack
, temporary_firstobj
);
1427 *c_ptr
++ = "-fno-profile-arcs";
1428 *c_ptr
++ = "-fno-test-coverage";
1429 *c_ptr
++ = "-fno-branch-probabilities";
1430 *c_ptr
++ = "-fno-exceptions";
1432 *c_ptr
++ = "-fno-whole-program";
1434 /* !!! When GCC calls collect2,
1435 it does not know whether it is calling collect2 or ld.
1436 So collect2 cannot meaningfully understand any options
1437 except those ld understands.
1438 If you propose to make GCC pass some other option,
1439 just imagine what will happen if ld is really ld!!! */
1441 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1442 /* After the first file, put in the c++ rt0. */
1445 #ifdef HAVE_LD_DEMANGLE
1446 if (!demangle_flag
&& !no_demangle
)
1447 demangle_flag
= "--demangle";
1449 *ld1
++ = *ld2
++ = demangle_flag
;
1451 while ((arg
= *++argv
) != (char *) 0)
1453 *ld1
++ = *ld2
++ = arg
;
1460 if (!strcmp (arg
, "-debug"))
1462 /* Already parsed. */
1466 if (!strcmp (arg
, "-dynamic-linker") && argv
[1])
1469 *ld1
++ = *ld2
++ = *argv
;
1474 if (strncmp (arg
, "-flto", 5) == 0)
1477 /* Do not pass LTO flag to the linker. */
1481 error ("LTO support has not been enabled in this "
1490 /* place o_file BEFORE this argument! */
1496 #ifdef COLLECT_EXPORT_LIST
1498 /* Resolving full library name. */
1499 const char *s
= resolve_lib_name (arg
+2);
1501 /* Saving a full library name. */
1502 add_to_list (&libs
, s
);
1507 #ifdef COLLECT_EXPORT_LIST
1508 /* Saving directories where to search for libraries. */
1510 add_prefix (&cmdline_lib_dirs
, arg
+2);
1513 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1515 if (is_in_args (arg
,
1516 CONST_CAST2 (const char **, char **, ld1_argv
),
1520 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1525 output_file
= *ld1
++ = *ld2
++ = *++argv
;
1527 output_file
= &arg
[2];
1536 if (arg
[2] == '\0' && do_collecting
)
1538 /* We must strip after the nm run, otherwise C++ linking
1539 will not work. Thus we strip in the second ld run, or
1540 else with strip if there is no second ld run. */
1552 if (strcmp (arg
, "--no-demangle") == 0)
1554 demangle_flag
= arg
;
1559 else if (strncmp (arg
, "--demangle", 10) == 0)
1561 demangle_flag
= arg
;
1563 #ifndef HAVE_LD_DEMANGLE
1566 enum demangling_styles style
1567 = cplus_demangle_name_to_style (arg
+11);
1568 if (style
== unknown_demangling
)
1569 error ("unknown demangling style '%s'", arg
+11);
1571 current_demangling_style
= style
;
1577 else if (strncmp (arg
, "--sysroot=", 10) == 0)
1578 target_system_root
= arg
+ 10;
1579 else if (strcmp (arg
, "--version") == 0)
1581 else if (strcmp (arg
, "--help") == 0)
1586 else if ((p
= strrchr (arg
, '.')) != (char *) 0
1587 && (strcmp (p
, ".o") == 0 || strcmp (p
, ".a") == 0
1588 || strcmp (p
, ".so") == 0 || strcmp (p
, ".lo") == 0
1589 || strcmp (p
, ".obj") == 0))
1598 /* place o_file BEFORE this argument! */
1604 if (p
[1] == 'o' || p
[1] == 'l')
1606 #ifdef COLLECT_EXPORT_LIST
1607 /* libraries can be specified directly, i.e. without -l flag. */
1610 /* Saving a full library name. */
1611 add_to_list (&libs
, arg
);
1617 #ifdef COLLECT_EXPORT_LIST
1618 /* This is added only for debugging purposes. */
1621 fprintf (stderr
, "List of libraries:\n");
1622 dump_list (stderr
, "\t", libs
.first
);
1625 /* The AIX linker will discard static constructors in object files if
1626 nothing else in the file is referenced, so look at them first. Unless
1627 we are building a shared object, ignore the eh frame tables, as we
1628 would otherwise reference them all, hence drag all the corresponding
1629 objects even if nothing else is referenced. */
1631 const char **export_object_lst
1632 = CONST_CAST2 (const char **, char **, object_lst
);
1634 struct id
*list
= libs
.first
;
1636 /* Compute the filter to use from the current one, do scan, then adjust
1637 the "current" filter to remove what we just included here. This will
1638 control whether we need a first pass link later on or not, and what
1639 will remain to be scanned there. */
1641 scanfilter this_filter
= ld1_filter
;
1644 this_filter
&= ~SCAN_DWEH
;
1647 while (export_object_lst
< object
)
1648 scan_prog_file (*export_object_lst
++, PASS_OBJ
, this_filter
);
1650 for (; list
; list
= list
->next
)
1651 scan_prog_file (list
->name
, PASS_FIRST
, this_filter
);
1653 ld1_filter
= ld1_filter
& ~this_filter
;
1658 char *buf
= concat ("-bE:", export_file
, NULL
);
1663 exportf
= fopen (export_file
, "w");
1664 if (exportf
== (FILE *) 0)
1665 fatal_perror ("fopen %s", export_file
);
1666 write_aix_file (exportf
, exports
.first
);
1667 if (fclose (exportf
))
1668 fatal_perror ("fclose %s", export_file
);
1673 *c_ptr
= *ld1
= *object
= (char *) 0;
1677 notice ("collect2 version %s", version_string
);
1678 #ifdef TARGET_VERSION
1681 fprintf (stderr
, "\n");
1686 printf ("Usage: collect2 [options]\n");
1687 printf (" Wrap linker and generate constructor code if needed.\n");
1688 printf (" Options:\n");
1689 printf (" -debug Enable debug output\n");
1690 printf (" --help Display this information\n");
1691 printf (" -v, --version Display this program's version number\n");
1693 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1694 printf ("Report bugs: %s\n", bug_report_url
);
1701 fprintf (stderr
, "ld_file_name = %s\n",
1702 (ld_file_name
? ld_file_name
: "not found"));
1703 fprintf (stderr
, "c_file_name = %s\n",
1704 (c_file_name
? c_file_name
: "not found"));
1705 fprintf (stderr
, "nm_file_name = %s\n",
1706 (nm_file_name
? nm_file_name
: "not found"));
1708 fprintf (stderr
, "ldd_file_name = %s\n",
1709 (ldd_file_name
? ldd_file_name
: "not found"));
1711 fprintf (stderr
, "strip_file_name = %s\n",
1712 (strip_file_name
? strip_file_name
: "not found"));
1713 fprintf (stderr
, "c_file = %s\n",
1714 (c_file
? c_file
: "not found"));
1715 fprintf (stderr
, "o_file = %s\n",
1716 (o_file
? o_file
: "not found"));
1718 ptr
= getenv ("COLLECT_GCC_OPTIONS");
1720 fprintf (stderr
, "COLLECT_GCC_OPTIONS = %s\n", ptr
);
1722 ptr
= getenv ("COLLECT_GCC");
1724 fprintf (stderr
, "COLLECT_GCC = %s\n", ptr
);
1726 ptr
= getenv ("COMPILER_PATH");
1728 fprintf (stderr
, "COMPILER_PATH = %s\n", ptr
);
1730 ptr
= getenv (LIBRARY_PATH_ENV
);
1732 fprintf (stderr
, "%-20s= %s\n", LIBRARY_PATH_ENV
, ptr
);
1734 fprintf (stderr
, "\n");
1737 /* Load the program, searching all libraries and attempting to provide
1738 undefined symbols from repository information.
1740 If -r or they will be run via some other method, do not build the
1741 constructor or destructor list, just return now. */
1744 = rflag
|| (! DO_COLLECT_EXPORT_LIST
&& ! do_collecting
);
1746 /* Perform the first pass link now, if we're about to exit or if we need
1747 to scan for things we haven't collected yet before pursuing further.
1749 On AIX, the latter typically includes nothing for shared objects or
1750 frame tables for an executable, out of what the required early scan on
1751 objects and libraries has performed above. In the !shared_obj case, we
1752 expect the relevant tables to be dragged together with their associated
1753 functions from precise cross reference insertions by the compiler. */
1755 if (early_exit
|| ld1_filter
!= SCAN_NOTHING
)
1756 do_tlink (ld1_argv
, object_lst
);
1760 #ifdef COLLECT_EXPORT_LIST
1761 /* Make sure we delete the export file we may have created. */
1762 if (export_file
!= 0 && export_file
[0])
1763 maybe_unlink (export_file
);
1765 if (lto_mode
!= LTO_MODE_NONE
)
1766 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1768 maybe_unlink (c_file
);
1769 maybe_unlink (o_file
);
1774 /* Unless we have done it all already, examine the namelist and search for
1775 static constructors and destructors to call. Write the constructor and
1776 destructor tables to a .s file and reload. */
1778 if (ld1_filter
!= SCAN_NOTHING
)
1779 scan_prog_file (output_file
, PASS_FIRST
, ld1_filter
);
1781 #ifdef SCAN_LIBRARIES
1782 scan_libraries (output_file
);
1787 notice_translated (ngettext ("%d constructor found\n",
1788 "%d constructors found\n",
1789 constructors
.number
),
1790 constructors
.number
);
1791 notice_translated (ngettext ("%d destructor found\n",
1792 "%d destructors found\n",
1793 destructors
.number
),
1794 destructors
.number
);
1795 notice_translated (ngettext("%d frame table found\n",
1796 "%d frame tables found\n",
1797 frame_tables
.number
),
1798 frame_tables
.number
);
1801 /* If the scan exposed nothing of special interest, there's no need to
1802 generate the glue code and relink so return now. */
1804 if (constructors
.number
== 0 && destructors
.number
== 0
1805 && frame_tables
.number
== 0
1806 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1807 /* If we will be running these functions ourselves, we want to emit
1808 stubs into the shared library so that we do not have to relink
1809 dependent programs when we add static objects. */
1814 /* Do tlink without additional code generation now if we didn't
1815 do it earlier for scanning purposes. */
1816 if (ld1_filter
== SCAN_NOTHING
)
1817 do_tlink (ld1_argv
, object_lst
);
1820 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1822 /* Strip now if it was requested on the command line. */
1825 char **real_strip_argv
= XCNEWVEC (char *, 3);
1826 const char ** strip_argv
= CONST_CAST2 (const char **, char **,
1829 strip_argv
[0] = strip_file_name
;
1830 strip_argv
[1] = output_file
;
1831 strip_argv
[2] = (char *) 0;
1832 fork_execute ("strip", real_strip_argv
);
1835 #ifdef COLLECT_EXPORT_LIST
1836 maybe_unlink (export_file
);
1838 maybe_unlink (c_file
);
1839 maybe_unlink (o_file
);
1843 /* Sort ctor and dtor lists by priority. */
1844 sort_ids (&constructors
);
1845 sort_ids (&destructors
);
1847 maybe_unlink(output_file
);
1848 outf
= fopen (c_file
, "w");
1849 if (outf
== (FILE *) 0)
1850 fatal_perror ("fopen %s", c_file
);
1852 write_c_file (outf
, c_file
);
1855 fatal_perror ("fclose %s", c_file
);
1857 /* Tell the linker that we have initializer and finalizer functions. */
1858 #ifdef LD_INIT_SWITCH
1859 #ifdef COLLECT_EXPORT_LIST
1860 *ld2
++ = concat (LD_INIT_SWITCH
, ":", initname
, ":", fininame
, NULL
);
1862 *ld2
++ = LD_INIT_SWITCH
;
1864 *ld2
++ = LD_FINI_SWITCH
;
1869 #ifdef COLLECT_EXPORT_LIST
1872 /* If we did not add export flag to link arguments before, add it to
1873 second link phase now. No new exports should have been added. */
1874 if (! exports
.first
)
1875 *ld2
++ = concat ("-bE:", export_file
, NULL
);
1877 #ifndef LD_INIT_SWITCH
1878 add_to_list (&exports
, initname
);
1879 add_to_list (&exports
, fininame
);
1880 add_to_list (&exports
, "_GLOBAL__DI");
1881 add_to_list (&exports
, "_GLOBAL__DD");
1883 exportf
= fopen (export_file
, "w");
1884 if (exportf
== (FILE *) 0)
1885 fatal_perror ("fopen %s", export_file
);
1886 write_aix_file (exportf
, exports
.first
);
1887 if (fclose (exportf
))
1888 fatal_perror ("fclose %s", export_file
);
1892 /* End of arguments to second link phase. */
1897 fprintf (stderr
, "\n========== output_file = %s, c_file = %s\n",
1898 output_file
, c_file
);
1899 write_c_file (stderr
, "stderr");
1900 fprintf (stderr
, "========== end of c_file\n\n");
1901 #ifdef COLLECT_EXPORT_LIST
1902 fprintf (stderr
, "\n========== export_file = %s\n", export_file
);
1903 write_aix_file (stderr
, exports
.first
);
1904 fprintf (stderr
, "========== end of export_file\n\n");
1908 /* Assemble the constructor and destructor tables.
1909 Link the tables in with the rest of the program. */
1911 fork_execute ("gcc", c_argv
);
1912 #ifdef COLLECT_EXPORT_LIST
1913 /* On AIX we must call tlink because of possible templates resolution. */
1914 do_tlink (ld2_argv
, object_lst
);
1917 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, false);
1919 /* Otherwise, simply call ld because tlink is already done. */
1921 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, true);
1923 fork_execute ("ld", ld2_argv
);
1925 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1926 constructors/destructors in shared libraries. */
1927 scan_prog_file (output_file
, PASS_SECOND
, SCAN_ALL
);
1930 maybe_unlink (c_file
);
1931 maybe_unlink (o_file
);
1933 #ifdef COLLECT_EXPORT_LIST
1934 maybe_unlink (export_file
);
1941 /* Wait for a process to finish, and exit if a nonzero status is found. */
1944 collect_wait (const char *prog
, struct pex_obj
*pex
)
1948 if (!pex_get_status (pex
, 1, &status
))
1949 fatal_perror ("can't get program status");
1954 if (WIFSIGNALED (status
))
1956 int sig
= WTERMSIG (status
);
1957 error ("%s terminated with signal %d [%s]%s",
1958 prog
, sig
, strsignal(sig
),
1959 WCOREDUMP(status
) ? ", core dumped" : "");
1960 collect_exit (FATAL_EXIT_CODE
);
1963 if (WIFEXITED (status
))
1964 return WEXITSTATUS (status
);
1970 do_wait (const char *prog
, struct pex_obj
*pex
)
1972 int ret
= collect_wait (prog
, pex
);
1975 error ("%s returned %d exit status", prog
, ret
);
1981 unlink (response_file
);
1982 response_file
= NULL
;
1987 /* Execute a program, and wait for the reply. */
1990 collect_execute (const char *prog
, char **argv
, const char *outname
,
1991 const char *errname
, int flags
)
1993 struct pex_obj
*pex
;
1996 char *response_arg
= NULL
;
1997 char *response_argv
[3] ATTRIBUTE_UNUSED
;
1999 if (HAVE_GNU_LD
&& at_file_supplied
&& argv
[0] != NULL
)
2001 /* If using @file arguments, create a temporary file and put the
2002 contents of argv into it. Then change argv to an array corresponding
2003 to a single argument @FILE, where FILE is the temporary filename. */
2005 char **current_argv
= argv
+ 1;
2006 char *argv0
= argv
[0];
2010 /* Note: we assume argv contains at least one element; this is
2013 response_file
= make_temp_file ("");
2015 f
= fopen (response_file
, "w");
2018 fatal ("could not open response file %s", response_file
);
2020 status
= writeargv (current_argv
, f
);
2023 fatal ("could not write to response file %s", response_file
);
2025 status
= fclose (f
);
2028 fatal ("could not close response file %s", response_file
);
2030 response_arg
= concat ("@", response_file
, NULL
);
2031 response_argv
[0] = argv0
;
2032 response_argv
[1] = response_arg
;
2033 response_argv
[2] = NULL
;
2035 argv
= response_argv
;
2044 fprintf (stderr
, "%s", argv
[0]);
2046 notice ("[cannot find %s]", prog
);
2048 for (p_argv
= &argv
[1]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2049 fprintf (stderr
, " %s", str
);
2051 fprintf (stderr
, "\n");
2057 /* If we cannot find a program we need, complain error. Do this here
2058 since we might not end up needing something that we could not find. */
2061 fatal ("cannot find '%s'", prog
);
2063 pex
= pex_init (0, "collect2", NULL
);
2065 fatal_perror ("pex_init failed");
2067 errmsg
= pex_run (pex
, flags
, argv
[0], argv
, outname
,
2074 fatal_perror (errmsg
);
2081 free (response_arg
);
2087 fork_execute (const char *prog
, char **argv
)
2089 struct pex_obj
*pex
;
2091 pex
= collect_execute (prog
, argv
, NULL
, NULL
, PEX_LAST
| PEX_SEARCH
);
2092 do_wait (prog
, pex
);
2095 /* Unlink a file unless we are debugging. */
2098 maybe_unlink (const char *file
)
2101 unlink_if_ordinary (file
);
2103 notice ("[Leaving %s]\n", file
);
2106 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
2109 maybe_unlink_list (char **file_list
)
2111 char **tmp
= file_list
;
2114 maybe_unlink (*(tmp
++));
2118 static long sequence_number
= 0;
2120 /* Add a name to a linked list. */
2123 add_to_list (struct head
*head_ptr
, const char *name
)
2126 = (struct id
*) xcalloc (sizeof (struct id
) + strlen (name
), 1);
2128 strcpy (newid
->name
, name
);
2130 if (head_ptr
->first
)
2131 head_ptr
->last
->next
= newid
;
2133 head_ptr
->first
= newid
;
2135 /* Check for duplicate symbols. */
2136 for (p
= head_ptr
->first
;
2137 strcmp (name
, p
->name
) != 0;
2142 head_ptr
->last
->next
= 0;
2147 newid
->sequence
= ++sequence_number
;
2148 head_ptr
->last
= newid
;
2152 /* Grab the init priority number from an init function name that
2153 looks like "_GLOBAL_.I.12345.foo". */
2156 extract_init_priority (const char *name
)
2160 while (name
[pos
] == '_')
2162 pos
+= 10; /* strlen ("GLOBAL__X_") */
2164 /* Extract init_p number from ctor/dtor name. */
2165 pri
= atoi (name
+ pos
);
2166 return pri
? pri
: DEFAULT_INIT_PRIORITY
;
2169 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2170 ctors will be run from right to left, dtors from left to right. */
2173 sort_ids (struct head
*head_ptr
)
2175 /* id holds the current element to insert. id_next holds the next
2176 element to insert. id_ptr iterates through the already sorted elements
2177 looking for the place to insert id. */
2178 struct id
*id
, *id_next
, **id_ptr
;
2180 id
= head_ptr
->first
;
2182 /* We don't have any sorted elements yet. */
2183 head_ptr
->first
= NULL
;
2185 for (; id
; id
= id_next
)
2188 id
->sequence
= extract_init_priority (id
->name
);
2190 for (id_ptr
= &(head_ptr
->first
); ; id_ptr
= &((*id_ptr
)->next
))
2192 /* If the sequence numbers are the same, we put the id from the
2193 file later on the command line later in the list. */
2194 || id
->sequence
> (*id_ptr
)->sequence
2195 /* Hack: do lexical compare, too.
2196 || (id->sequence == (*id_ptr)->sequence
2197 && strcmp (id->name, (*id_ptr)->name) > 0) */
2206 /* Now set the sequence numbers properly so write_c_file works. */
2207 for (id
= head_ptr
->first
; id
; id
= id
->next
)
2208 id
->sequence
= ++sequence_number
;
2211 /* Write: `prefix', the names on list LIST, `suffix'. */
2214 write_list (FILE *stream
, const char *prefix
, struct id
*list
)
2218 fprintf (stream
, "%sx%d,\n", prefix
, list
->sequence
);
2223 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2224 /* Given a STRING, return nonzero if it occurs in the list in range
2225 [ARGS_BEGIN,ARGS_END). */
2228 is_in_args (const char *string
, const char **args_begin
,
2229 const char **args_end
)
2231 const char **args_pointer
;
2232 for (args_pointer
= args_begin
; args_pointer
!= args_end
; ++args_pointer
)
2233 if (strcmp (string
, *args_pointer
) == 0)
2237 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2239 #ifdef COLLECT_EXPORT_LIST
2240 /* This function is really used only on AIX, but may be useful. */
2243 is_in_list (const char *prefix
, struct id
*list
)
2247 if (!strcmp (prefix
, list
->name
)) return 1;
2253 #endif /* COLLECT_EXPORT_LIST */
2255 /* Added for debugging purpose. */
2256 #ifdef COLLECT_EXPORT_LIST
2258 dump_list (FILE *stream
, const char *prefix
, struct id
*list
)
2262 fprintf (stream
, "%s%s,\n", prefix
, list
->name
);
2270 dump_prefix_list (FILE *stream
, const char *prefix
, struct prefix_list
*list
)
2274 fprintf (stream
, "%s%s,\n", prefix
, list
->prefix
);
2281 write_list_with_asm (FILE *stream
, const char *prefix
, struct id
*list
)
2285 fprintf (stream
, "%sx%d __asm__ (\"%s\");\n",
2286 prefix
, list
->sequence
, list
->name
);
2291 /* Write out the constructor and destructor tables statically (for a shared
2292 object), along with the functions to execute them. */
2295 write_c_file_stat (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2299 int frames
= (frame_tables
.number
> 0);
2301 /* Figure out name of output_file, stripping off .so version. */
2302 p
= strrchr (output_file
, '/');
2318 if (strncmp (q
, SHLIB_SUFFIX
, strlen (SHLIB_SUFFIX
)) == 0)
2320 q
+= strlen (SHLIB_SUFFIX
);
2327 /* q points to null at end of the string (or . of the .so version) */
2328 prefix
= XNEWVEC (char, q
- p
+ 1);
2329 strncpy (prefix
, p
, q
- p
);
2331 for (r
= prefix
; *r
; r
++)
2332 if (!ISALNUM ((unsigned char)*r
))
2335 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2336 output_file
, prefix
);
2338 initname
= concat ("_GLOBAL__FI_", prefix
, NULL
);
2339 fininame
= concat ("_GLOBAL__FD_", prefix
, NULL
);
2343 /* Write the tables as C code. */
2345 fprintf (stream
, "static int count;\n");
2346 fprintf (stream
, "typedef void entry_pt();\n");
2347 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2351 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2353 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2354 write_list (stream
, "\t\t&", frame_tables
.first
);
2355 fprintf (stream
, "\t0\n};\n");
2357 /* This must match what's in frame.h. */
2358 fprintf (stream
, "struct object {\n");
2359 fprintf (stream
, " void *pc_begin;\n");
2360 fprintf (stream
, " void *pc_end;\n");
2361 fprintf (stream
, " void *fde_begin;\n");
2362 fprintf (stream
, " void *fde_array;\n");
2363 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2364 fprintf (stream
, " struct object *next;\n");
2365 fprintf (stream
, "};\n");
2367 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2368 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2370 fprintf (stream
, "static void reg_frame () {\n");
2371 fprintf (stream
, "\tstatic struct object ob;\n");
2372 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2373 fprintf (stream
, "\t}\n");
2375 fprintf (stream
, "static void dereg_frame () {\n");
2376 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2377 fprintf (stream
, "\t}\n");
2380 fprintf (stream
, "void %s() {\n", initname
);
2381 if (constructors
.number
> 0 || frames
)
2383 fprintf (stream
, "\tstatic entry_pt *ctors[] = {\n");
2384 write_list (stream
, "\t\t", constructors
.first
);
2386 fprintf (stream
, "\treg_frame,\n");
2387 fprintf (stream
, "\t};\n");
2388 fprintf (stream
, "\tentry_pt **p;\n");
2389 fprintf (stream
, "\tif (count++ != 0) return;\n");
2390 fprintf (stream
, "\tp = ctors + %d;\n", constructors
.number
+ frames
);
2391 fprintf (stream
, "\twhile (p > ctors) (*--p)();\n");
2394 fprintf (stream
, "\t++count;\n");
2395 fprintf (stream
, "}\n");
2396 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2397 fprintf (stream
, "void %s() {\n", fininame
);
2398 if (destructors
.number
> 0 || frames
)
2400 fprintf (stream
, "\tstatic entry_pt *dtors[] = {\n");
2401 write_list (stream
, "\t\t", destructors
.first
);
2403 fprintf (stream
, "\tdereg_frame,\n");
2404 fprintf (stream
, "\t};\n");
2405 fprintf (stream
, "\tentry_pt **p;\n");
2406 fprintf (stream
, "\tif (--count != 0) return;\n");
2407 fprintf (stream
, "\tp = dtors;\n");
2408 fprintf (stream
, "\twhile (p < dtors + %d) (*p++)();\n",
2409 destructors
.number
+ frames
);
2411 fprintf (stream
, "}\n");
2415 COLLECT_SHARED_INIT_FUNC(stream
, initname
);
2416 COLLECT_SHARED_FINI_FUNC(stream
, fininame
);
2420 /* Write the constructor/destructor tables. */
2422 #ifndef LD_INIT_SWITCH
2424 write_c_file_glob (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2426 /* Write the tables as C code. */
2428 int frames
= (frame_tables
.number
> 0);
2430 fprintf (stream
, "typedef void entry_pt();\n\n");
2432 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2436 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2438 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2439 write_list (stream
, "\t\t&", frame_tables
.first
);
2440 fprintf (stream
, "\t0\n};\n");
2442 /* This must match what's in frame.h. */
2443 fprintf (stream
, "struct object {\n");
2444 fprintf (stream
, " void *pc_begin;\n");
2445 fprintf (stream
, " void *pc_end;\n");
2446 fprintf (stream
, " void *fde_begin;\n");
2447 fprintf (stream
, " void *fde_array;\n");
2448 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2449 fprintf (stream
, " struct object *next;\n");
2450 fprintf (stream
, "};\n");
2452 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2453 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2455 fprintf (stream
, "static void reg_frame () {\n");
2456 fprintf (stream
, "\tstatic struct object ob;\n");
2457 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2458 fprintf (stream
, "\t}\n");
2460 fprintf (stream
, "static void dereg_frame () {\n");
2461 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2462 fprintf (stream
, "\t}\n");
2465 fprintf (stream
, "\nentry_pt * __CTOR_LIST__[] = {\n");
2466 fprintf (stream
, "\t(entry_pt *) %d,\n", constructors
.number
+ frames
);
2467 write_list (stream
, "\t", constructors
.first
);
2469 fprintf (stream
, "\treg_frame,\n");
2470 fprintf (stream
, "\t0\n};\n\n");
2472 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2474 fprintf (stream
, "\nentry_pt * __DTOR_LIST__[] = {\n");
2475 fprintf (stream
, "\t(entry_pt *) %d,\n", destructors
.number
+ frames
);
2476 write_list (stream
, "\t", destructors
.first
);
2478 fprintf (stream
, "\tdereg_frame,\n");
2479 fprintf (stream
, "\t0\n};\n\n");
2481 fprintf (stream
, "extern entry_pt %s;\n", NAME__MAIN
);
2482 fprintf (stream
, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN
);
2484 #endif /* ! LD_INIT_SWITCH */
2487 write_c_file (FILE *stream
, const char *name
)
2489 #ifndef LD_INIT_SWITCH
2491 write_c_file_glob (stream
, name
);
2494 write_c_file_stat (stream
, name
);
2497 #ifdef COLLECT_EXPORT_LIST
2499 write_aix_file (FILE *stream
, struct id
*list
)
2501 for (; list
; list
= list
->next
)
2503 fputs (list
->name
, stream
);
2504 putc ('\n', stream
);
2509 #ifdef OBJECT_FORMAT_NONE
2511 /* Check to make sure the file is an LTO object file. */
2514 maybe_lto_object_file (const char *prog_name
)
2517 unsigned char buf
[4];
2520 static unsigned char elfmagic
[4] = { 0x7f, 'E', 'L', 'F' };
2521 static unsigned char coffmagic
[2] = { 0x4c, 0x01 };
2522 static unsigned char coffmagic_x64
[2] = { 0x64, 0x86 };
2523 static unsigned char machomagic
[4][4] = {
2524 { 0xcf, 0xfa, 0xed, 0xfe },
2525 { 0xce, 0xfa, 0xed, 0xfe },
2526 { 0xfe, 0xed, 0xfa, 0xcf },
2527 { 0xfe, 0xed, 0xfa, 0xce }
2530 f
= fopen (prog_name
, "rb");
2533 if (fread (buf
, sizeof (buf
), 1, f
) != 1)
2537 if (memcmp (buf
, elfmagic
, sizeof (elfmagic
)) == 0
2538 || memcmp (buf
, coffmagic
, sizeof (coffmagic
)) == 0
2539 || memcmp (buf
, coffmagic_x64
, sizeof (coffmagic_x64
)) == 0)
2541 for (i
= 0; i
< 4; i
++)
2542 if (memcmp (buf
, machomagic
[i
], sizeof (machomagic
[i
])) == 0)
2548 /* Generic version to scan the name list of the loaded program for
2549 the symbols g++ uses for static constructors and destructors. */
2552 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2555 void (*int_handler
) (int);
2557 void (*quit_handler
) (int);
2559 char *real_nm_argv
[4];
2560 const char **nm_argv
= CONST_CAST2 (const char **, char**, real_nm_argv
);
2562 struct pex_obj
*pex
;
2569 if (which_pass
== PASS_SECOND
)
2572 /* LTO objects must be in a known format. This check prevents
2573 us from accepting an archive containing LTO objects, which
2574 gcc cannnot currently handle. */
2575 if (which_pass
== PASS_LTOINFO
&& !maybe_lto_object_file (prog_name
))
2578 /* If we do not have an `nm', complain. */
2579 if (nm_file_name
== 0)
2580 fatal ("cannot find 'nm'");
2582 nm_argv
[argc
++] = nm_file_name
;
2583 if (NM_FLAGS
[0] != '\0')
2584 nm_argv
[argc
++] = NM_FLAGS
;
2586 nm_argv
[argc
++] = prog_name
;
2587 nm_argv
[argc
++] = (char *) 0;
2589 /* Trace if needed. */
2592 const char **p_argv
;
2595 for (p_argv
= &nm_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2596 fprintf (stderr
, " %s", str
);
2598 fprintf (stderr
, "\n");
2604 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2606 fatal_perror ("pex_init failed");
2608 errmsg
= pex_run (pex
, 0, nm_file_name
, real_nm_argv
, NULL
, HOST_BIT_BUCKET
,
2615 fatal_perror (errmsg
);
2621 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2623 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2626 inf
= pex_read_output (pex
, 0);
2628 fatal_perror ("can't open nm output");
2632 if (which_pass
== PASS_LTOINFO
)
2633 fprintf (stderr
, "\nnm output with LTO info marker symbol.\n");
2635 fprintf (stderr
, "\nnm output with constructors/destructors.\n");
2638 /* Read each line of nm output. */
2639 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2645 fprintf (stderr
, "\t%s\n", buf
);
2647 if (which_pass
== PASS_LTOINFO
)
2652 /* Look for the LTO info marker symbol, and add filename to
2653 the LTO objects list if found. */
2654 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n'; p
++)
2655 if (ch
== ' ' && p
[1] == '_' && p
[2] == '_'
2656 && (strncmp (p
+ (p
[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2657 && ISSPACE (p
[p
[3] == '_' ? 14 : 13]))
2659 add_lto_object (<o_objects
, prog_name
);
2661 /* We need to read all the input, so we can't just
2662 return here. But we can avoid useless work. */
2671 /* If it contains a constructor or destructor name, add the name
2672 to the appropriate list unless this is a kind of symbol we're
2673 not supposed to even consider. */
2675 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n' && ch
!= '_'; p
++)
2676 if (ch
== ' ' && p
[1] == 'U' && p
[2] == ' ')
2683 /* Find the end of the symbol name.
2684 Do not include `|', because Encore nm can tack that on the end. */
2685 for (end
= p
; (ch2
= *end
) != '\0' && !ISSPACE (ch2
) && ch2
!= '|';
2691 switch (is_ctor_dtor (name
))
2694 if (! (filter
& SCAN_CTOR
))
2696 if (which_pass
!= PASS_LIB
)
2697 add_to_list (&constructors
, name
);
2701 if (! (filter
& SCAN_DTOR
))
2703 if (which_pass
!= PASS_LIB
)
2704 add_to_list (&destructors
, name
);
2708 if (! (filter
& SCAN_INIT
))
2710 if (which_pass
!= PASS_LIB
)
2711 fatal ("init function found in object %s", prog_name
);
2712 #ifndef LD_INIT_SWITCH
2713 add_to_list (&constructors
, name
);
2718 if (! (filter
& SCAN_FINI
))
2720 if (which_pass
!= PASS_LIB
)
2721 fatal ("fini function found in object %s", prog_name
);
2722 #ifndef LD_FINI_SWITCH
2723 add_to_list (&destructors
, name
);
2728 if (! (filter
& SCAN_DWEH
))
2730 if (which_pass
!= PASS_LIB
)
2731 add_to_list (&frame_tables
, name
);
2734 default: /* not a constructor or destructor */
2740 fprintf (stderr
, "\n");
2742 do_wait (nm_file_name
, pex
);
2744 signal (SIGINT
, int_handler
);
2746 signal (SIGQUIT
, quit_handler
);
2752 /* Use the List Dynamic Dependencies program to find shared libraries that
2753 the output file depends upon and their initialization/finalization
2754 routines, if any. */
2757 scan_libraries (const char *prog_name
)
2759 static struct head libraries
; /* list of shared libraries found */
2761 void (*int_handler
) (int);
2763 void (*quit_handler
) (int);
2765 char *real_ldd_argv
[4];
2766 const char **ldd_argv
= CONST_CAST2 (const char **, char **, real_ldd_argv
);
2768 struct pex_obj
*pex
;
2774 /* If we do not have an `ldd', complain. */
2775 if (ldd_file_name
== 0)
2777 error ("cannot find 'ldd'");
2781 ldd_argv
[argc
++] = ldd_file_name
;
2782 ldd_argv
[argc
++] = prog_name
;
2783 ldd_argv
[argc
++] = (char *) 0;
2785 /* Trace if needed. */
2788 const char **p_argv
;
2791 for (p_argv
= &ldd_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2792 fprintf (stderr
, " %s", str
);
2794 fprintf (stderr
, "\n");
2800 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2802 fatal_perror ("pex_init failed");
2804 errmsg
= pex_run (pex
, 0, ldd_file_name
, real_ldd_argv
, NULL
, NULL
, &err
);
2810 fatal_perror (errmsg
);
2816 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2818 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2821 inf
= pex_read_output (pex
, 0);
2823 fatal_perror ("can't open ldd output");
2826 notice ("\nldd output with constructors/destructors.\n");
2828 /* Read each line of ldd output. */
2829 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2832 char *name
, *end
, *p
= buf
;
2834 /* Extract names of libraries and add to list. */
2835 PARSE_LDD_OUTPUT (p
);
2840 if (strncmp (name
, "not found", sizeof ("not found") - 1) == 0)
2841 fatal ("dynamic dependency %s not found", buf
);
2843 /* Find the end of the symbol name. */
2845 (ch2
= *end
) != '\0' && ch2
!= '\n' && !ISSPACE (ch2
) && ch2
!= '|';
2850 if (access (name
, R_OK
) == 0)
2851 add_to_list (&libraries
, name
);
2853 fatal ("unable to open dynamic dependency '%s'", buf
);
2856 fprintf (stderr
, "\t%s\n", buf
);
2859 fprintf (stderr
, "\n");
2861 do_wait (ldd_file_name
, pex
);
2863 signal (SIGINT
, int_handler
);
2865 signal (SIGQUIT
, quit_handler
);
2868 /* Now iterate through the library list adding their symbols to
2870 for (list
= libraries
.first
; list
; list
= list
->next
)
2871 scan_prog_file (list
->name
, PASS_LIB
, SCAN_ALL
);
2874 #endif /* LDD_SUFFIX */
2876 #endif /* OBJECT_FORMAT_NONE */
2880 * COFF specific stuff.
2883 #ifdef OBJECT_FORMAT_COFF
2885 #if defined (EXTENDED_COFF)
2887 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2888 # define GCC_SYMENT SYMR
2889 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2890 # define GCC_SYMINC(X) (1)
2891 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2892 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2896 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2897 # define GCC_SYMENT SYMENT
2898 # if defined (C_WEAKEXT)
2899 # define GCC_OK_SYMBOL(X) \
2900 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2901 ((X).n_scnum > N_UNDEF) && \
2903 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2904 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2905 # define GCC_UNDEF_SYMBOL(X) \
2906 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2907 ((X).n_scnum == N_UNDEF))
2909 # define GCC_OK_SYMBOL(X) \
2910 (((X).n_sclass == C_EXT) && \
2911 ((X).n_scnum > N_UNDEF) && \
2913 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2914 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2915 # define GCC_UNDEF_SYMBOL(X) \
2916 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2918 # define GCC_SYMINC(X) ((X).n_numaux+1)
2919 # define GCC_SYMZERO(X) 0
2921 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2922 #if TARGET_AIX_VERSION >= 51
2923 # define GCC_CHECK_HDR(X) \
2924 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2925 || (HEADER (X).f_magic == 0767 && aix64_flag))
2927 # define GCC_CHECK_HDR(X) \
2928 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2929 || (HEADER (X).f_magic == 0757 && aix64_flag))
2934 #ifdef COLLECT_EXPORT_LIST
2935 /* Array of standard AIX libraries which should not
2936 be scanned for ctors/dtors. */
2937 static const char *const aix_std_libs
[] = {
2945 "/usr/lib/libc_r.a",
2946 "/usr/lib/libm_r.a",
2947 "/usr/lib/threads/libc.a",
2948 "/usr/ccs/lib/libc.a",
2949 "/usr/ccs/lib/libm.a",
2950 "/usr/ccs/lib/libc_r.a",
2951 "/usr/ccs/lib/libm_r.a",
2955 /* This function checks the filename and returns 1
2956 if this name matches the location of a standard AIX library. */
2957 static int ignore_library (const char *);
2959 ignore_library (const char *name
)
2961 const char *const *p
;
2964 if (target_system_root
[0] != '\0')
2966 length
= strlen (target_system_root
);
2967 if (strncmp (name
, target_system_root
, length
) != 0)
2971 for (p
= &aix_std_libs
[0]; *p
!= NULL
; ++p
)
2972 if (strcmp (name
, *p
) == 0)
2976 #endif /* COLLECT_EXPORT_LIST */
2978 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2979 extern char *ldgetname (LDFILE
*, GCC_SYMENT
*);
2982 /* COFF version to scan the name list of the loaded program for
2983 the symbols g++ uses for static constructors and destructors. */
2986 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2989 LDFILE
*ldptr
= NULL
;
2990 int sym_index
, sym_count
;
2993 if (which_pass
!= PASS_FIRST
&& which_pass
!= PASS_OBJ
)
2996 #ifdef COLLECT_EXPORT_LIST
2997 /* We do not need scanning for some standard C libraries. */
2998 if (which_pass
== PASS_FIRST
&& ignore_library (prog_name
))
3001 /* On AIX we have a loop, because there is not much difference
3002 between an object and an archive. This trick allows us to
3003 eliminate scan_libraries() function. */
3007 /* Some platforms (e.g. OSF4) declare ldopen as taking a
3008 non-const char * filename parameter, even though it will not
3009 modify that string. So we must cast away const-ness here,
3010 using CONST_CAST to prevent complaints from -Wcast-qual. */
3011 if ((ldptr
= ldopen (CONST_CAST (char *, prog_name
), ldptr
)) != NULL
)
3013 if (! MY_ISCOFF (HEADER (ldptr
).f_magic
))
3014 fatal ("%s: not a COFF file", prog_name
);
3016 if (GCC_CHECK_HDR (ldptr
))
3018 sym_count
= GCC_SYMBOLS (ldptr
);
3019 sym_index
= GCC_SYMZERO (ldptr
);
3021 #ifdef COLLECT_EXPORT_LIST
3022 /* Is current archive member a shared object? */
3023 is_shared
= HEADER (ldptr
).f_flags
& F_SHROBJ
;
3026 while (sym_index
< sym_count
)
3030 if (ldtbread (ldptr
, sym_index
, &symbol
) <= 0)
3032 sym_index
+= GCC_SYMINC (symbol
);
3034 if (GCC_OK_SYMBOL (symbol
))
3038 if ((name
= ldgetname (ldptr
, &symbol
)) == NULL
)
3039 continue; /* Should never happen. */
3041 #ifdef XCOFF_DEBUGGING_INFO
3042 /* All AIX function names have a duplicate entry
3043 beginning with a dot. */
3048 switch (is_ctor_dtor (name
))
3051 if (! (filter
& SCAN_CTOR
))
3054 add_to_list (&constructors
, name
);
3055 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3056 if (which_pass
== PASS_OBJ
)
3057 add_to_list (&exports
, name
);
3062 if (! (filter
& SCAN_DTOR
))
3065 add_to_list (&destructors
, name
);
3066 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3067 if (which_pass
== PASS_OBJ
)
3068 add_to_list (&exports
, name
);
3072 #ifdef COLLECT_EXPORT_LIST
3074 if (! (filter
& SCAN_INIT
))
3076 #ifndef LD_INIT_SWITCH
3078 add_to_list (&constructors
, name
);
3083 if (! (filter
& SCAN_FINI
))
3085 #ifndef LD_INIT_SWITCH
3087 add_to_list (&destructors
, name
);
3093 if (! (filter
& SCAN_DWEH
))
3096 add_to_list (&frame_tables
, name
);
3097 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3098 if (which_pass
== PASS_OBJ
)
3099 add_to_list (&exports
, name
);
3103 default: /* not a constructor or destructor */
3104 #ifdef COLLECT_EXPORT_LIST
3105 /* Explicitly export all global symbols when
3106 building a shared object on AIX, but do not
3107 re-export symbols from another shared object
3108 and do not export symbols if the user
3109 provides an explicit export list. */
3110 if (shared_obj
&& !is_shared
3111 && which_pass
== PASS_OBJ
&& !export_flag
)
3112 add_to_list (&exports
, name
);
3118 #if !defined(EXTENDED_COFF)
3119 fprintf (stderr
, "\tsec=%d class=%d type=%s%o %s\n",
3120 symbol
.n_scnum
, symbol
.n_sclass
,
3121 (symbol
.n_type
? "0" : ""), symbol
.n_type
,
3125 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3126 symbol
.iss
, (long) symbol
.value
, symbol
.index
, name
);
3131 #ifdef COLLECT_EXPORT_LIST
3134 /* If archive contains both 32-bit and 64-bit objects,
3135 we want to skip objects in other mode so mismatch normal. */
3137 fprintf (stderr
, "%s : magic=%o aix64=%d mismatch\n",
3138 prog_name
, HEADER (ldptr
).f_magic
, aix64_flag
);
3144 fatal ("%s: cannot open as COFF file", prog_name
);
3146 #ifdef COLLECT_EXPORT_LIST
3147 /* On AIX loop continues while there are more members in archive. */
3149 while (ldclose (ldptr
) == FAILURE
);
3151 /* Otherwise we simply close ldptr. */
3152 (void) ldclose(ldptr
);
3155 #endif /* OBJECT_FORMAT_COFF */
3157 #ifdef COLLECT_EXPORT_LIST
3158 /* Given a library name without "lib" prefix, this function
3159 returns a full library name including a path. */
3161 resolve_lib_name (const char *name
)
3165 /* Library extensions for AIX dynamic linking. */
3166 const char * const libexts
[2] = {"a", "so"};
3168 for (i
= 0; libpaths
[i
]; i
++)
3169 if (libpaths
[i
]->max_len
> l
)
3170 l
= libpaths
[i
]->max_len
;
3172 lib_buf
= XNEWVEC (char, l
+ strlen(name
) + 10);
3174 for (i
= 0; libpaths
[i
]; i
++)
3176 struct prefix_list
*list
= libpaths
[i
]->plist
;
3177 for (; list
; list
= list
->next
)
3179 /* The following lines are needed because path_prefix list
3180 may contain directories both with trailing '/' and
3183 if (list
->prefix
[strlen(list
->prefix
)-1] != '/')
3185 for (j
= 0; j
< 2; j
++)
3187 sprintf (lib_buf
, "%s%slib%s.%s",
3188 list
->prefix
, p
, name
,
3189 libexts
[(j
+ aixrtl_flag
) % 2]);
3190 if (debug
) fprintf (stderr
, "searching for: %s\n", lib_buf
);
3191 if (file_exists (lib_buf
))
3193 if (debug
) fprintf (stderr
, "found: %s\n", lib_buf
);
3200 fprintf (stderr
, "not found\n");
3202 fatal ("library lib%s not found", name
);
3205 #endif /* COLLECT_EXPORT_LIST */