1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
5 Free Software Foundation, Inc.
6 Contributed by Chris Smith (csmith@convex.com).
7 Heavily modified by Michael Meissner (meissner@cygnus.com),
8 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
10 This file is part of GCC.
12 GCC is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 3, or (at your option) any later
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"
33 #include "filenames.h"
35 /* TARGET_64BIT may be defined to use driver specific functionality. */
37 #define TARGET_64BIT TARGET_64BIT_DEFAULT
39 #ifndef LIBRARY_PATH_ENV
40 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
46 #include "collect2-aix.h"
47 #include "diagnostic.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
64 #undef REAL_LD_FILE_NAME
65 #undef REAL_NM_FILE_NAME
66 #undef REAL_STRIP_FILE_NAME
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
78 #ifdef OBJECT_FORMAT_COFF
80 #ifndef CROSS_DIRECTORY_STRUCTURE
88 /* Many versions of ldfcn.h define these. */
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. */
103 #define MY_ISCOFF(X) ISCOFF (X)
106 #endif /* OBJECT_FORMAT_COFF */
108 #ifdef OBJECT_FORMAT_NONE
110 /* Default flags to pass to nm. */
112 #define NM_FLAGS "-n"
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. */
121 #define NAME__MAIN "__main"
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))
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))
137 #define SCAN_LIBRARIES
141 #define SHLIB_SUFFIX ".so"
145 int do_collecting
= 1;
147 int do_collecting
= 0;
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
156 #define DO_COLLECT_EXPORT_LIST 0
159 /* Nonzero if we should suppress the automatic demangling of identifiers
160 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
163 /* Linked lists of constructor and destructor names. */
179 bool vflag
; /* true if -v or --version */
180 static int rflag
; /* true if -r */
181 static int strip_flag
; /* true if -s */
182 static const char *demangle_flag
;
183 #ifdef COLLECT_EXPORT_LIST
184 static int export_flag
; /* true if -bE */
185 static int aix64_flag
; /* true if -b64 */
186 static int aixrtl_flag
; /* true if -brtl */
190 LTO_MODE_NONE
, /* Not doing LTO. */
191 LTO_MODE_LTO
, /* Normal LTO. */
192 LTO_MODE_WHOPR
/* WHOPR. */
195 /* Current LTO mode. */
196 static enum lto_mode_d lto_mode
= LTO_MODE_NONE
;
198 bool debug
; /* true if -debug */
199 bool helpflag
; /* true if --help */
201 static int shared_obj
; /* true if -shared */
203 static const char *c_file
; /* <xxx>.c for constructor/destructor list. */
204 static const char *o_file
; /* <xxx>.o for constructor/destructor list. */
205 #ifdef COLLECT_EXPORT_LIST
206 static const char *export_file
; /* <xxx>.x for AIX export list. */
208 static char **lto_o_files
; /* Output files for LTO. */
209 const char *ldout
; /* File for ld stdout. */
210 const char *lderrout
; /* File for ld stderr. */
211 static const char *output_file
; /* Output file for ld. */
212 static const char *nm_file_name
; /* pathname of nm */
214 static const char *ldd_file_name
; /* pathname of ldd (or equivalent) */
216 static const char *strip_file_name
; /* pathname of strip */
217 const char *c_file_name
; /* pathname of gcc */
218 static char *initname
, *fininame
; /* names of init and fini funcs */
220 static struct head constructors
; /* list of constructors found */
221 static struct head destructors
; /* list of destructors found */
222 #ifdef COLLECT_EXPORT_LIST
223 static struct head exports
; /* list of exported symbols */
225 static struct head frame_tables
; /* list of frame unwind info tables */
227 static bool at_file_supplied
; /* Whether to use @file arguments */
228 static char *response_file
; /* Name of any current response file */
230 struct obstack temporary_obstack
;
231 char * temporary_firstobj
;
233 /* A string that must be prepended to a target OS path in order to find
234 it on the host system. */
235 #ifdef TARGET_SYSTEM_ROOT
236 static const char *target_system_root
= TARGET_SYSTEM_ROOT
;
238 static const char *target_system_root
= "";
241 /* Structure to hold all the directories in which to search for files to
246 const char *prefix
; /* String to prepend to the path. */
247 struct prefix_list
*next
; /* Next in linked list. */
252 struct prefix_list
*plist
; /* List of prefixes to try */
253 int max_len
; /* Max length of a prefix in PLIST */
254 const char *name
; /* Name of this list (used in config stuff) */
257 #ifdef COLLECT_EXPORT_LIST
258 /* Lists to keep libraries to be scanned for global constructors/destructors. */
259 static struct head libs
; /* list of libraries */
260 static struct path_prefix cmdline_lib_dirs
; /* directories specified with -L */
261 static struct path_prefix libpath_lib_dirs
; /* directories in LIBPATH */
262 static struct path_prefix
*libpaths
[3] = {&cmdline_lib_dirs
,
263 &libpath_lib_dirs
, NULL
};
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(). */
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. */
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 */
297 static symkind
is_ctor_dtor (const char *);
299 static void handler (int);
300 static char *find_a_file (struct path_prefix
*, const char *);
301 static void add_prefix (struct path_prefix
*, const char *);
302 static void prefix_from_env (const char *, struct path_prefix
*);
303 static void prefix_from_string (const char *, struct path_prefix
*);
304 static void do_wait (const char *, struct pex_obj
*);
305 static void fork_execute (const char *, char **);
306 static void maybe_unlink (const char *);
307 static void maybe_unlink_list (char **);
308 static void add_to_list (struct head
*, const char *);
309 static int extract_init_priority (const char *);
310 static void sort_ids (struct head
*);
311 static void write_list (FILE *, const char *, struct id
*);
312 #ifdef COLLECT_EXPORT_LIST
313 static void dump_list (FILE *, const char *, struct id
*);
316 static void dump_prefix_list (FILE *, const char *, struct prefix_list
*);
318 static void write_list_with_asm (FILE *, const char *, struct id
*);
319 static void write_c_file (FILE *, const char *);
320 static void write_c_file_stat (FILE *, const char *);
321 #ifndef LD_INIT_SWITCH
322 static void write_c_file_glob (FILE *, const char *);
324 #ifdef SCAN_LIBRARIES
325 static void scan_libraries (const char *);
327 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
328 static int is_in_args (const char *, const char **, const char **);
330 #ifdef COLLECT_EXPORT_LIST
332 static int is_in_list (const char *, struct id
*);
334 static void write_aix_file (FILE *, struct id
*);
335 static char *resolve_lib_name (const char *);
337 static char *extract_string (const char **);
338 static void post_ld_pass (bool);
339 static void process_args (int *argcp
, char **argv
);
341 /* Enumerations describing which pass this is for scanning the
345 PASS_FIRST
, /* without constructors */
346 PASS_OBJ
, /* individual objects */
347 PASS_LIB
, /* looking for shared libraries */
348 PASS_SECOND
, /* with constructors linked in */
349 PASS_LTOINFO
/* looking for objects with LTO info */
352 /* ... and which kinds of symbols are to be considered. */
354 enum scanfilter_masks
{
357 SCAN_CTOR
= 1 << SYM_CTOR
,
358 SCAN_DTOR
= 1 << SYM_DTOR
,
359 SCAN_INIT
= 1 << SYM_INIT
,
360 SCAN_FINI
= 1 << SYM_FINI
,
361 SCAN_DWEH
= 1 << SYM_DWEH
,
365 /* This type is used for parameters and variables which hold
366 combinations of the flags in enum scanfilter_masks. */
367 typedef int scanfilter
;
369 /* Scan the name list of the loaded program for the symbols g++ uses for
370 static constructors and destructors.
372 The SCANPASS argument tells which collect processing pass this is for and
373 the SCANFILTER argument tells which kinds of symbols to consider in this
374 pass. Symbols of a special kind not in the filter mask are considered as
377 The constructor table begins at __CTOR_LIST__ and contains a count of the
378 number of pointers (or -1 if the constructors are built in a separate
379 section by the linker), followed by the pointers to the constructor
380 functions, terminated with a null pointer. The destructor table has the
381 same format, and begins at __DTOR_LIST__. */
383 static void scan_prog_file (const char *, scanpass
, scanfilter
);
386 /* Delete tempfiles and exit function. */
389 collect_exit (int status
)
391 if (c_file
!= 0 && c_file
[0])
392 maybe_unlink (c_file
);
394 if (o_file
!= 0 && o_file
[0])
395 maybe_unlink (o_file
);
397 #ifdef COLLECT_EXPORT_LIST
398 if (export_file
!= 0 && export_file
[0])
399 maybe_unlink (export_file
);
403 maybe_unlink_list (lto_o_files
);
405 if (ldout
!= 0 && ldout
[0])
407 dump_file (ldout
, stdout
);
408 maybe_unlink (ldout
);
411 if (lderrout
!= 0 && lderrout
[0])
413 dump_file (lderrout
, stderr
);
414 maybe_unlink (lderrout
);
417 if (status
!= 0 && output_file
!= 0 && output_file
[0])
418 maybe_unlink (output_file
);
421 maybe_unlink (response_file
);
427 /* Notify user of a non-error. */
429 notice (const char *cmsgid
, ...)
433 va_start (ap
, cmsgid
);
434 vfprintf (stderr
, _(cmsgid
), ap
);
438 /* Notify user of a non-error, without translating the format string. */
440 notice_translated (const char *cmsgid
, ...)
444 va_start (ap
, cmsgid
);
445 vfprintf (stderr
, cmsgid
, ap
);
452 if (c_file
!= 0 && c_file
[0])
453 maybe_unlink (c_file
);
455 if (o_file
!= 0 && o_file
[0])
456 maybe_unlink (o_file
);
458 if (ldout
!= 0 && ldout
[0])
459 maybe_unlink (ldout
);
461 if (lderrout
!= 0 && lderrout
[0])
462 maybe_unlink (lderrout
);
464 #ifdef COLLECT_EXPORT_LIST
465 if (export_file
!= 0 && export_file
[0])
466 maybe_unlink (export_file
);
470 maybe_unlink_list (lto_o_files
);
473 maybe_unlink (response_file
);
475 signal (signo
, SIG_DFL
);
481 file_exists (const char *name
)
483 return access (name
, R_OK
) == 0;
486 /* Parse a reasonable subset of shell quoting syntax. */
489 extract_string (const char **pp
)
502 obstack_1grow (&temporary_obstack
, c
);
503 else if (! inside
&& c
== ' ')
505 else if (! inside
&& c
== '\\')
510 obstack_1grow (&temporary_obstack
, c
);
513 obstack_1grow (&temporary_obstack
, '\0');
515 return XOBFINISH (&temporary_obstack
, char *);
519 dump_file (const char *name
, FILE *to
)
521 FILE *stream
= fopen (name
, "r");
528 while (c
= getc (stream
),
529 c
!= EOF
&& (ISIDNUM (c
) || c
== '$' || c
== '.'))
530 obstack_1grow (&temporary_obstack
, c
);
531 if (obstack_object_size (&temporary_obstack
) > 0)
533 const char *word
, *p
;
535 obstack_1grow (&temporary_obstack
, '\0');
536 word
= XOBFINISH (&temporary_obstack
, const char *);
539 ++word
, putc ('.', to
);
541 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
542 p
+= strlen (USER_LABEL_PREFIX
);
544 #ifdef HAVE_LD_DEMANGLE
550 result
= cplus_demangle (p
, DMGL_PARAMS
| DMGL_ANSI
| DMGL_VERBOSE
);
558 diff
= strlen (word
) - strlen (result
);
559 while (diff
> 0 && c
== ' ')
560 --diff
, putc (' ', to
);
561 if (diff
< 0 && c
== ' ')
563 while (diff
< 0 && c
== ' ')
564 ++diff
, c
= getc (stream
);
567 /* Make sure we output at least one space, or
568 the demangled symbol name will run into
569 whatever text follows. */
580 obstack_free (&temporary_obstack
, temporary_firstobj
);
589 /* Return the kind of symbol denoted by name S. */
592 is_ctor_dtor (const char *s
)
594 struct names
{ const char *const name
; const int len
; symkind ret
;
595 const int two_underscores
; };
597 const struct names
*p
;
599 const char *orig_s
= s
;
601 static const struct names special
[] = {
602 #ifndef NO_DOLLAR_IN_LABEL
603 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR
, 0 },
604 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR
, 0 },
606 #ifndef NO_DOT_IN_LABEL
607 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR
, 0 },
608 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR
, 0 },
609 #endif /* NO_DOT_IN_LABEL */
610 #endif /* NO_DOLLAR_IN_LABEL */
611 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR
, 0 },
612 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR
, 0 },
613 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH
, 0 },
614 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT
, 0 },
615 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI
, 0 },
616 { NULL
, 0, SYM_REGULAR
, 0 }
619 while ((ch
= *s
) == '_')
625 for (p
= &special
[0]; p
->len
> 0; p
++)
628 && (!p
->two_underscores
|| ((s
- orig_s
) >= 2))
629 && strncmp(s
, p
->name
, p
->len
) == 0)
637 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
638 and one from the PATH variable. */
640 static struct path_prefix cpath
, path
;
642 #ifdef CROSS_DIRECTORY_STRUCTURE
643 /* This is the name of the target machine. We use it to form the name
644 of the files to execute. */
646 static const char *const target_machine
= TARGET_MACHINE
;
649 /* Search for NAME using prefix list PPREFIX. We only look for executable
652 Return 0 if not found, otherwise return its name, allocated with malloc. */
655 find_a_file (struct path_prefix
*pprefix
, const char *name
)
658 struct prefix_list
*pl
;
659 int len
= pprefix
->max_len
+ strlen (name
) + 1;
662 fprintf (stderr
, "Looking for '%s'\n", name
);
664 #ifdef HOST_EXECUTABLE_SUFFIX
665 len
+= strlen (HOST_EXECUTABLE_SUFFIX
);
668 temp
= XNEWVEC (char, len
);
670 /* Determine the filename to execute (special case for absolute paths). */
672 if (IS_ABSOLUTE_PATH (name
))
674 if (access (name
, X_OK
) == 0)
679 fprintf (stderr
, " - found: absolute path\n");
684 #ifdef HOST_EXECUTABLE_SUFFIX
685 /* Some systems have a suffix for executable files.
686 So try appending that. */
688 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
690 if (access (temp
, X_OK
) == 0)
695 fprintf (stderr
, " - failed to locate using absolute path\n");
698 for (pl
= pprefix
->plist
; pl
; pl
= pl
->next
)
702 strcpy (temp
, pl
->prefix
);
705 if (stat (temp
, &st
) >= 0
706 && ! S_ISDIR (st
.st_mode
)
707 && access (temp
, X_OK
) == 0)
710 #ifdef HOST_EXECUTABLE_SUFFIX
711 /* Some systems have a suffix for executable files.
712 So try appending that. */
713 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
715 if (stat (temp
, &st
) >= 0
716 && ! S_ISDIR (st
.st_mode
)
717 && access (temp
, X_OK
) == 0)
722 if (debug
&& pprefix
->plist
== NULL
)
723 fprintf (stderr
, " - failed: no entries in prefix list\n");
729 /* Add an entry for PREFIX to prefix list PPREFIX. */
732 add_prefix (struct path_prefix
*pprefix
, const char *prefix
)
734 struct prefix_list
*pl
, **prev
;
739 for (pl
= pprefix
->plist
; pl
->next
; pl
= pl
->next
)
744 prev
= &pprefix
->plist
;
746 /* Keep track of the longest prefix. */
748 len
= strlen (prefix
);
749 if (len
> pprefix
->max_len
)
750 pprefix
->max_len
= len
;
752 pl
= XNEW (struct prefix_list
);
753 pl
->prefix
= xstrdup (prefix
);
758 pl
->next
= (struct prefix_list
*) 0;
762 /* Take the value of the environment variable ENV, break it into a path, and
763 add of the entries to PPREFIX. */
766 prefix_from_env (const char *env
, struct path_prefix
*pprefix
)
772 prefix_from_string (p
, pprefix
);
776 prefix_from_string (const char *p
, struct path_prefix
*pprefix
)
778 const char *startp
, *endp
;
779 char *nstore
= XNEWVEC (char, strlen (p
) + 3);
782 fprintf (stderr
, "Convert string '%s' into prefixes, separator = '%c'\n", p
, PATH_SEPARATOR
);
787 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
789 strncpy (nstore
, startp
, endp
-startp
);
792 strcpy (nstore
, "./");
794 else if (! IS_DIR_SEPARATOR (endp
[-1]))
796 nstore
[endp
-startp
] = DIR_SEPARATOR
;
797 nstore
[endp
-startp
+1] = 0;
800 nstore
[endp
-startp
] = 0;
803 fprintf (stderr
, " - add prefix: %s\n", nstore
);
805 add_prefix (pprefix
, nstore
);
808 endp
= startp
= endp
+ 1;
816 #ifdef OBJECT_FORMAT_NONE
818 /* Add an entry for the object file NAME to object file list LIST.
819 New entries are added at the end of the list. The original pointer
820 value of NAME is preserved, i.e., no string copy is performed. */
823 add_lto_object (struct lto_object_list
*list
, const char *name
)
825 struct lto_object
*n
= XNEW (struct lto_object
);
830 list
->last
->next
= n
;
836 #endif /* OBJECT_FORMAT_NONE */
839 /* Perform a link-time recompilation and relink if any of the object
840 files contain LTO info. The linker command line LTO_LD_ARGV
841 represents the linker command that would produce a final executable
842 without the use of LTO. OBJECT_LST is a vector of object file names
843 appearing in LTO_LD_ARGV that are to be considerd for link-time
844 recompilation, where OBJECT is a pointer to the last valid element.
845 (This awkward convention avoids an impedance mismatch with the
846 usage of similarly-named variables in main().) The elements of
847 OBJECT_LST must be identical, i.e., pointer equal, to the
848 corresponding arguments in LTO_LD_ARGV.
850 Upon entry, at least one linker run has been performed without the
851 use of any LTO info that might be present. Any recompilations
852 necessary for template instantiations have been performed, and
853 initializer/finalizer tables have been created if needed and
854 included in the linker command line LTO_LD_ARGV. If any of the
855 object files contain LTO info, we run the LTO back end on all such
856 files, and perform the final link with the LTO back end output
857 substituted for the LTO-optimized files. In some cases, a final
858 link with all link-time generated code has already been performed,
859 so there is no need to relink if no LTO info is found. In other
860 cases, our caller has not produced the final executable, and is
861 relying on us to perform the required link whether LTO info is
862 present or not. In that case, the FORCE argument should be true.
863 Note that the linker command line argument LTO_LD_ARGV passed into
864 this function may be modified in place. */
867 maybe_run_lto_and_relink (char **lto_ld_argv
, char **object_lst
,
868 const char **object
, bool force
)
870 const char **object_file
= CONST_CAST2 (const char **, char **, object_lst
);
872 int num_lto_c_args
= 1; /* Allow space for the terminating NULL. */
874 while (object_file
< object
)
876 /* If file contains LTO info, add it to the list of LTO objects. */
877 scan_prog_file (*object_file
++, PASS_LTOINFO
, SCAN_ALL
);
879 /* Increment the argument count by the number of object file arguments
880 we will add. An upper bound suffices, so just count all of the
881 object files regardless of whether they contain LTO info. */
885 if (lto_objects
.first
)
888 const char **lto_c_ptr
;
891 struct lto_object
*list
;
892 char *lto_wrapper
= getenv ("COLLECT_LTO_WRAPPER");
894 const char *prog
= "lto-wrapper";
895 int lto_ld_argv_size
= 0;
896 char **out_lto_ld_argv
;
897 int out_lto_ld_argv_size
;
901 fatal_error ("COLLECT_LTO_WRAPPER must be set");
905 /* There is at least one object file containing LTO info,
906 so we need to run the LTO back end and relink.
908 To do so we build updated ld arguments with first
909 LTO object replaced by all partitions and other LTO
912 lto_c_argv
= (char **) xcalloc (sizeof (char *), num_lto_c_args
);
913 lto_c_ptr
= CONST_CAST2 (const char **, char **, lto_c_argv
);
915 *lto_c_ptr
++ = lto_wrapper
;
917 /* Add LTO objects to the wrapper command line. */
918 for (list
= lto_objects
.first
; list
; list
= list
->next
)
919 *lto_c_ptr
++ = list
->name
;
923 /* Run the LTO back end. */
924 pex
= collect_execute (prog
, lto_c_argv
, NULL
, NULL
, PEX_SEARCH
);
931 stream
= pex_read_output (pex
, 0);
935 while ((c
= getc (stream
)) != EOF
)
937 obstack_1grow (&temporary_obstack
, c
);
942 lto_o_files
= XNEWVEC (char *, num_files
+ 1);
943 lto_o_files
[num_files
] = NULL
;
944 start
= XOBFINISH (&temporary_obstack
, char *);
945 for (i
= 0; i
< num_files
; ++i
)
952 lto_o_files
[i
] = xstrdup (start
);
957 obstack_free (&temporary_obstack
, temporary_firstobj
);
962 /* Compute memory needed for new LD arguments. At most number of original arguemtns
963 plus number of partitions. */
964 for (lto_ld_argv_size
= 0; lto_ld_argv
[lto_ld_argv_size
]; lto_ld_argv_size
++)
966 out_lto_ld_argv
= XCNEWVEC(char *, num_files
+ lto_ld_argv_size
+ 1);
967 out_lto_ld_argv_size
= 0;
969 /* After running the LTO back end, we will relink, substituting
970 the LTO output for the object files that we submitted to the
971 LTO. Here, we modify the linker command line for the relink. */
973 /* Copy all arguments until we find first LTO file. */
977 for (list
= lto_objects
.first
; list
; list
= list
->next
)
978 if (*p
== list
->name
) /* Note test for pointer equality! */
982 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
++;
985 /* Now insert all LTO partitions. */
986 lto_o_ptr
= lto_o_files
;
988 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *lto_o_ptr
++;
990 /* ... and copy the rest. */
993 for (list
= lto_objects
.first
; list
; list
= list
->next
)
994 if (*p
== list
->name
) /* Note test for pointer equality! */
997 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
;
1000 out_lto_ld_argv
[out_lto_ld_argv_size
++] = 0;
1002 /* Run the linker again, this time replacing the object files
1003 optimized by the LTO with the temporary file generated by the LTO. */
1004 fork_execute ("ld", out_lto_ld_argv
);
1005 post_ld_pass (true);
1008 maybe_unlink_list (lto_o_files
);
1012 /* Our caller is relying on us to do the link
1013 even though there is no LTO back end work to be done. */
1014 fork_execute ("ld", lto_ld_argv
);
1015 post_ld_pass (false);
1022 main (int argc
, char **argv
)
1024 static const char *const ld_suffix
= "ld";
1025 static const char *const plugin_ld_suffix
= PLUGIN_LD
;
1026 static const char *const real_ld_suffix
= "real-ld";
1027 static const char *const collect_ld_suffix
= "collect-ld";
1028 static const char *const nm_suffix
= "nm";
1029 static const char *const gnm_suffix
= "gnm";
1031 static const char *const ldd_suffix
= LDD_SUFFIX
;
1033 static const char *const strip_suffix
= "strip";
1034 static const char *const gstrip_suffix
= "gstrip";
1036 #ifdef CROSS_DIRECTORY_STRUCTURE
1037 /* If we look for a program in the compiler directories, we just use
1038 the short name, since these directories are already system-specific.
1039 But it we look for a program in the system directories, we need to
1040 qualify the program name with the target machine. */
1042 const char *const full_ld_suffix
=
1043 concat(target_machine
, "-", ld_suffix
, NULL
);
1044 const char *const full_plugin_ld_suffix
=
1045 concat(target_machine
, "-", plugin_ld_suffix
, NULL
);
1046 const char *const full_nm_suffix
=
1047 concat (target_machine
, "-", nm_suffix
, NULL
);
1048 const char *const full_gnm_suffix
=
1049 concat (target_machine
, "-", gnm_suffix
, NULL
);
1051 const char *const full_ldd_suffix
=
1052 concat (target_machine
, "-", ldd_suffix
, NULL
);
1054 const char *const full_strip_suffix
=
1055 concat (target_machine
, "-", strip_suffix
, NULL
);
1056 const char *const full_gstrip_suffix
=
1057 concat (target_machine
, "-", gstrip_suffix
, NULL
);
1059 const char *const full_ld_suffix
= ld_suffix
;
1060 const char *const full_plugin_ld_suffix
= plugin_ld_suffix
;
1061 const char *const full_nm_suffix
= nm_suffix
;
1062 const char *const full_gnm_suffix
= gnm_suffix
;
1064 const char *const full_ldd_suffix
= ldd_suffix
;
1066 const char *const full_strip_suffix
= strip_suffix
;
1067 const char *const full_gstrip_suffix
= gstrip_suffix
;
1068 #endif /* CROSS_DIRECTORY_STRUCTURE */
1072 #ifdef COLLECT_EXPORT_LIST
1075 const char *ld_file_name
;
1081 bool use_plugin
= false;
1083 /* The kinds of symbols we will have to consider when scanning the
1084 outcome of a first pass link. This is ALL to start with, then might
1085 be adjusted before getting to the first pass link per se, typically on
1086 AIX where we perform an early scan of objects and libraries to fetch
1087 the list of global ctors/dtors and make sure they are not garbage
1089 scanfilter ld1_filter
= SCAN_ALL
;
1094 const char **object
;
1099 p
= argv
[0] + strlen (argv
[0]);
1100 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1104 xmalloc_set_program_name (progname
);
1107 expandargv (&argc
, &argv
);
1108 if (argv
!= old_argv
)
1109 at_file_supplied
= 1;
1111 process_args (&argc
, argv
);
1113 num_c_args
= argc
+ 9;
1115 no_demangle
= !! getenv ("COLLECT_NO_DEMANGLE");
1117 /* Suppress demangling by the real linker, which may be broken. */
1118 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
1120 #if defined (COLLECT2_HOST_INITIALIZATION)
1121 /* Perform system dependent initialization, if necessary. */
1122 COLLECT2_HOST_INITIALIZATION
;
1126 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1127 receive the signal. A different setting is inheritable */
1128 signal (SIGCHLD
, SIG_DFL
);
1131 /* Unlock the stdio streams. */
1132 unlock_std_streams ();
1134 gcc_init_libintl ();
1136 diagnostic_initialize (global_dc
, 0);
1138 /* Do not invoke xcalloc before this point, since locale needs to be
1139 set first, in case a diagnostic is issued. */
1141 ld1_argv
= XCNEWVEC (char *, argc
+ 4);
1142 ld1
= CONST_CAST2 (const char **, char **, ld1_argv
);
1143 ld2_argv
= XCNEWVEC (char *, argc
+ 11);
1144 ld2
= CONST_CAST2 (const char **, char **, ld2_argv
);
1145 object_lst
= XCNEWVEC (char *, argc
);
1146 object
= CONST_CAST2 (const char **, char **, object_lst
);
1152 /* Parse command line early for instances of -debug. This allows
1153 the debug flag to be set before functions like find_a_file()
1154 are called. We also look for the -flto or -flto-partition=none flag to know
1155 what LTO mode we are in. */
1158 bool no_partition
= false;
1160 for (i
= 1; argv
[i
] != NULL
; i
++)
1162 if (! strcmp (argv
[i
], "-debug"))
1164 else if (! strcmp (argv
[i
], "-flto-partition=none"))
1165 no_partition
= true;
1166 else if ((! strncmp (argv
[i
], "-flto=", 6)
1167 || ! strcmp (argv
[i
], "-flto")) && ! use_plugin
)
1168 lto_mode
= LTO_MODE_WHOPR
;
1169 else if (!strncmp (argv
[i
], "-fno-lto", 8))
1170 lto_mode
= LTO_MODE_NONE
;
1171 else if (! strcmp (argv
[i
], "-plugin"))
1174 lto_mode
= LTO_MODE_NONE
;
1176 #ifdef COLLECT_EXPORT_LIST
1177 /* since -brtl, -bexport, -b64 are not position dependent
1178 also check for them here */
1179 if ((argv
[i
][0] == '-') && (argv
[i
][1] == 'b'))
1182 /* We want to disable automatic exports on AIX when user
1183 explicitly puts an export list in command line */
1184 if (arg
[2] == 'E' || strncmp (&arg
[2], "export", 6) == 0)
1186 else if (arg
[2] == '6' && arg
[3] == '4')
1188 else if (arg
[2] == 'r' && arg
[3] == 't' && arg
[4] == 'l')
1194 if (no_partition
&& lto_mode
== LTO_MODE_WHOPR
)
1195 lto_mode
= LTO_MODE_LTO
;
1198 #ifndef DEFAULT_A_OUT_NAME
1199 output_file
= "a.out";
1201 output_file
= DEFAULT_A_OUT_NAME
;
1204 obstack_begin (&temporary_obstack
, 0);
1205 temporary_firstobj
= (char *) obstack_alloc (&temporary_obstack
, 0);
1207 #ifndef HAVE_LD_DEMANGLE
1208 current_demangling_style
= auto_demangling
;
1210 p
= getenv ("COLLECT_GCC_OPTIONS");
1213 const char *q
= extract_string (&p
);
1214 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1217 obstack_free (&temporary_obstack
, temporary_firstobj
);
1219 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1220 -fno-exceptions -w -fno-whole-program */
1223 c_argv
= XCNEWVEC (char *, num_c_args
);
1224 c_ptr
= CONST_CAST2 (const char **, char **, c_argv
);
1227 fatal_error ("no arguments");
1230 if (signal (SIGQUIT
, SIG_IGN
) != SIG_IGN
)
1231 signal (SIGQUIT
, handler
);
1233 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1234 signal (SIGINT
, handler
);
1236 if (signal (SIGALRM
, SIG_IGN
) != SIG_IGN
)
1237 signal (SIGALRM
, handler
);
1240 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1241 signal (SIGHUP
, handler
);
1243 if (signal (SIGSEGV
, SIG_IGN
) != SIG_IGN
)
1244 signal (SIGSEGV
, handler
);
1246 if (signal (SIGBUS
, SIG_IGN
) != SIG_IGN
)
1247 signal (SIGBUS
, handler
);
1250 /* Extract COMPILER_PATH and PATH into our prefix list. */
1251 prefix_from_env ("COMPILER_PATH", &cpath
);
1252 prefix_from_env ("PATH", &path
);
1254 /* Try to discover a valid linker/nm/strip to use. */
1256 /* Maybe we know the right file to use (if not cross). */
1258 #ifdef DEFAULT_LINKER
1259 if (access (DEFAULT_LINKER
, X_OK
) == 0)
1260 ld_file_name
= DEFAULT_LINKER
;
1261 if (ld_file_name
== 0)
1263 #ifdef REAL_LD_FILE_NAME
1264 ld_file_name
= find_a_file (&path
, REAL_LD_FILE_NAME
);
1265 if (ld_file_name
== 0)
1267 /* Search the (target-specific) compiler dirs for ld'. */
1268 ld_file_name
= find_a_file (&cpath
, real_ld_suffix
);
1269 /* Likewise for `collect-ld'. */
1270 if (ld_file_name
== 0)
1271 ld_file_name
= find_a_file (&cpath
, collect_ld_suffix
);
1272 /* Search the compiler directories for `ld'. We have protection against
1273 recursive calls in find_a_file. */
1274 if (ld_file_name
== 0)
1275 ld_file_name
= find_a_file (&cpath
,
1279 /* Search the ordinary system bin directories
1280 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1281 if (ld_file_name
== 0)
1282 ld_file_name
= find_a_file (&path
,
1284 ? full_plugin_ld_suffix
1287 #ifdef REAL_NM_FILE_NAME
1288 nm_file_name
= find_a_file (&path
, REAL_NM_FILE_NAME
);
1289 if (nm_file_name
== 0)
1291 nm_file_name
= find_a_file (&cpath
, gnm_suffix
);
1292 if (nm_file_name
== 0)
1293 nm_file_name
= find_a_file (&path
, full_gnm_suffix
);
1294 if (nm_file_name
== 0)
1295 nm_file_name
= find_a_file (&cpath
, nm_suffix
);
1296 if (nm_file_name
== 0)
1297 nm_file_name
= find_a_file (&path
, full_nm_suffix
);
1300 ldd_file_name
= find_a_file (&cpath
, ldd_suffix
);
1301 if (ldd_file_name
== 0)
1302 ldd_file_name
= find_a_file (&path
, full_ldd_suffix
);
1305 #ifdef REAL_STRIP_FILE_NAME
1306 strip_file_name
= find_a_file (&path
, REAL_STRIP_FILE_NAME
);
1307 if (strip_file_name
== 0)
1309 strip_file_name
= find_a_file (&cpath
, gstrip_suffix
);
1310 if (strip_file_name
== 0)
1311 strip_file_name
= find_a_file (&path
, full_gstrip_suffix
);
1312 if (strip_file_name
== 0)
1313 strip_file_name
= find_a_file (&cpath
, strip_suffix
);
1314 if (strip_file_name
== 0)
1315 strip_file_name
= find_a_file (&path
, full_strip_suffix
);
1317 /* Determine the full path name of the C compiler to use. */
1318 c_file_name
= getenv ("COLLECT_GCC");
1319 if (c_file_name
== 0)
1321 #ifdef CROSS_DIRECTORY_STRUCTURE
1322 c_file_name
= concat (target_machine
, "-gcc", NULL
);
1324 c_file_name
= "gcc";
1328 p
= find_a_file (&cpath
, c_file_name
);
1330 /* Here it should be safe to use the system search path since we should have
1331 already qualified the name of the compiler when it is needed. */
1333 p
= find_a_file (&path
, c_file_name
);
1338 *ld1
++ = *ld2
++ = ld_file_name
;
1340 /* Make temp file names. */
1341 c_file
= make_temp_file (".c");
1342 o_file
= make_temp_file (".o");
1343 #ifdef COLLECT_EXPORT_LIST
1344 export_file
= make_temp_file (".x");
1346 ldout
= make_temp_file (".ld");
1347 lderrout
= make_temp_file (".le");
1348 *c_ptr
++ = c_file_name
;
1355 #ifdef COLLECT_EXPORT_LIST
1356 /* Generate a list of directories from LIBPATH. */
1357 prefix_from_env ("LIBPATH", &libpath_lib_dirs
);
1358 /* Add to this list also two standard directories where
1359 AIX loader always searches for libraries. */
1360 add_prefix (&libpath_lib_dirs
, "/lib");
1361 add_prefix (&libpath_lib_dirs
, "/usr/lib");
1364 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1366 AIX support needs to know if -shared has been specified before
1367 parsing commandline arguments. */
1369 p
= getenv ("COLLECT_GCC_OPTIONS");
1372 const char *q
= extract_string (&p
);
1373 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1374 *c_ptr
++ = xstrdup (q
);
1375 if (strcmp (q
, "-EL") == 0 || strcmp (q
, "-EB") == 0)
1376 *c_ptr
++ = xstrdup (q
);
1377 if (strcmp (q
, "-shared") == 0)
1379 if (*q
== '-' && q
[1] == 'B')
1381 *c_ptr
++ = xstrdup (q
);
1384 q
= extract_string (&p
);
1385 *c_ptr
++ = xstrdup (q
);
1389 obstack_free (&temporary_obstack
, temporary_firstobj
);
1390 *c_ptr
++ = "-fno-profile-arcs";
1391 *c_ptr
++ = "-fno-test-coverage";
1392 *c_ptr
++ = "-fno-branch-probabilities";
1393 *c_ptr
++ = "-fno-exceptions";
1395 *c_ptr
++ = "-fno-whole-program";
1397 /* !!! When GCC calls collect2,
1398 it does not know whether it is calling collect2 or ld.
1399 So collect2 cannot meaningfully understand any options
1400 except those ld understands.
1401 If you propose to make GCC pass some other option,
1402 just imagine what will happen if ld is really ld!!! */
1404 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1405 /* After the first file, put in the c++ rt0. */
1408 #ifdef HAVE_LD_DEMANGLE
1409 if (!demangle_flag
&& !no_demangle
)
1410 demangle_flag
= "--demangle";
1412 *ld1
++ = *ld2
++ = demangle_flag
;
1414 while ((arg
= *++argv
) != (char *) 0)
1416 *ld1
++ = *ld2
++ = arg
;
1423 if (!strcmp (arg
, "-debug"))
1425 /* Already parsed. */
1429 if (!strcmp (arg
, "-dynamic-linker") && argv
[1])
1432 *ld1
++ = *ld2
++ = *argv
;
1437 if (strncmp (arg
, "-flto", 5) == 0)
1440 /* Do not pass LTO flag to the linker. */
1444 error ("LTO support has not been enabled in this "
1453 /* place o_file BEFORE this argument! */
1459 #ifdef COLLECT_EXPORT_LIST
1461 /* Resolving full library name. */
1462 const char *s
= resolve_lib_name (arg
+2);
1464 /* Saving a full library name. */
1465 add_to_list (&libs
, s
);
1470 #ifdef COLLECT_EXPORT_LIST
1471 /* Saving directories where to search for libraries. */
1473 add_prefix (&cmdline_lib_dirs
, arg
+2);
1476 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1478 if (is_in_args (arg
,
1479 CONST_CAST2 (const char **, char **, ld1_argv
),
1483 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1488 output_file
= *ld1
++ = *ld2
++ = *++argv
;
1490 output_file
= &arg
[2];
1499 if (arg
[2] == '\0' && do_collecting
)
1501 /* We must strip after the nm run, otherwise C++ linking
1502 will not work. Thus we strip in the second ld run, or
1503 else with strip if there is no second ld run. */
1515 if (strcmp (arg
, "--no-demangle") == 0)
1517 demangle_flag
= arg
;
1522 else if (strncmp (arg
, "--demangle", 10) == 0)
1524 demangle_flag
= arg
;
1526 #ifndef HAVE_LD_DEMANGLE
1529 enum demangling_styles style
1530 = cplus_demangle_name_to_style (arg
+11);
1531 if (style
== unknown_demangling
)
1532 error ("unknown demangling style '%s'", arg
+11);
1534 current_demangling_style
= style
;
1540 else if (strncmp (arg
, "--sysroot=", 10) == 0)
1541 target_system_root
= arg
+ 10;
1542 else if (strcmp (arg
, "--version") == 0)
1544 else if (strcmp (arg
, "--help") == 0)
1549 else if ((p
= strrchr (arg
, '.')) != (char *) 0
1550 && (strcmp (p
, ".o") == 0 || strcmp (p
, ".a") == 0
1551 || strcmp (p
, ".so") == 0 || strcmp (p
, ".lo") == 0
1552 || strcmp (p
, ".obj") == 0))
1561 /* place o_file BEFORE this argument! */
1567 if (p
[1] == 'o' || p
[1] == 'l')
1569 #ifdef COLLECT_EXPORT_LIST
1570 /* libraries can be specified directly, i.e. without -l flag. */
1573 /* Saving a full library name. */
1574 add_to_list (&libs
, arg
);
1580 #ifdef COLLECT_EXPORT_LIST
1581 /* This is added only for debugging purposes. */
1584 fprintf (stderr
, "List of libraries:\n");
1585 dump_list (stderr
, "\t", libs
.first
);
1588 /* The AIX linker will discard static constructors in object files if
1589 nothing else in the file is referenced, so look at them first. Unless
1590 we are building a shared object, ignore the eh frame tables, as we
1591 would otherwise reference them all, hence drag all the corresponding
1592 objects even if nothing else is referenced. */
1594 const char **export_object_lst
1595 = CONST_CAST2 (const char **, char **, object_lst
);
1597 struct id
*list
= libs
.first
;
1599 /* Compute the filter to use from the current one, do scan, then adjust
1600 the "current" filter to remove what we just included here. This will
1601 control whether we need a first pass link later on or not, and what
1602 will remain to be scanned there. */
1604 scanfilter this_filter
= ld1_filter
;
1607 this_filter
&= ~SCAN_DWEH
;
1610 while (export_object_lst
< object
)
1611 scan_prog_file (*export_object_lst
++, PASS_OBJ
, this_filter
);
1613 for (; list
; list
= list
->next
)
1614 scan_prog_file (list
->name
, PASS_FIRST
, this_filter
);
1616 ld1_filter
= ld1_filter
& ~this_filter
;
1621 char *buf
= concat ("-bE:", export_file
, NULL
);
1626 exportf
= fopen (export_file
, "w");
1627 if (exportf
== (FILE *) 0)
1628 fatal_error ("fopen %s: %m", export_file
);
1629 write_aix_file (exportf
, exports
.first
);
1630 if (fclose (exportf
))
1631 fatal_error ("fclose %s: %m", export_file
);
1636 *c_ptr
= *ld1
= *object
= (char *) 0;
1639 notice ("collect2 version %s\n", version_string
);
1643 printf ("Usage: collect2 [options]\n");
1644 printf (" Wrap linker and generate constructor code if needed.\n");
1645 printf (" Options:\n");
1646 printf (" -debug Enable debug output\n");
1647 printf (" --help Display this information\n");
1648 printf (" -v, --version Display this program's version number\n");
1650 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1651 printf ("Report bugs: %s\n", bug_report_url
);
1658 fprintf (stderr
, "ld_file_name = %s\n",
1659 (ld_file_name
? ld_file_name
: "not found"));
1660 fprintf (stderr
, "c_file_name = %s\n",
1661 (c_file_name
? c_file_name
: "not found"));
1662 fprintf (stderr
, "nm_file_name = %s\n",
1663 (nm_file_name
? nm_file_name
: "not found"));
1665 fprintf (stderr
, "ldd_file_name = %s\n",
1666 (ldd_file_name
? ldd_file_name
: "not found"));
1668 fprintf (stderr
, "strip_file_name = %s\n",
1669 (strip_file_name
? strip_file_name
: "not found"));
1670 fprintf (stderr
, "c_file = %s\n",
1671 (c_file
? c_file
: "not found"));
1672 fprintf (stderr
, "o_file = %s\n",
1673 (o_file
? o_file
: "not found"));
1675 ptr
= getenv ("COLLECT_GCC_OPTIONS");
1677 fprintf (stderr
, "COLLECT_GCC_OPTIONS = %s\n", ptr
);
1679 ptr
= getenv ("COLLECT_GCC");
1681 fprintf (stderr
, "COLLECT_GCC = %s\n", ptr
);
1683 ptr
= getenv ("COMPILER_PATH");
1685 fprintf (stderr
, "COMPILER_PATH = %s\n", ptr
);
1687 ptr
= getenv (LIBRARY_PATH_ENV
);
1689 fprintf (stderr
, "%-20s= %s\n", LIBRARY_PATH_ENV
, ptr
);
1691 fprintf (stderr
, "\n");
1694 /* Load the program, searching all libraries and attempting to provide
1695 undefined symbols from repository information.
1697 If -r or they will be run via some other method, do not build the
1698 constructor or destructor list, just return now. */
1701 = rflag
|| (! DO_COLLECT_EXPORT_LIST
&& ! do_collecting
);
1703 /* Perform the first pass link now, if we're about to exit or if we need
1704 to scan for things we haven't collected yet before pursuing further.
1706 On AIX, the latter typically includes nothing for shared objects or
1707 frame tables for an executable, out of what the required early scan on
1708 objects and libraries has performed above. In the !shared_obj case, we
1709 expect the relevant tables to be dragged together with their associated
1710 functions from precise cross reference insertions by the compiler. */
1712 if (early_exit
|| ld1_filter
!= SCAN_NOTHING
)
1713 do_tlink (ld1_argv
, object_lst
);
1717 #ifdef COLLECT_EXPORT_LIST
1718 /* Make sure we delete the export file we may have created. */
1719 if (export_file
!= 0 && export_file
[0])
1720 maybe_unlink (export_file
);
1722 if (lto_mode
!= LTO_MODE_NONE
)
1723 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1725 post_ld_pass (false);
1727 maybe_unlink (c_file
);
1728 maybe_unlink (o_file
);
1733 /* Unless we have done it all already, examine the namelist and search for
1734 static constructors and destructors to call. Write the constructor and
1735 destructor tables to a .s file and reload. */
1737 if (ld1_filter
!= SCAN_NOTHING
)
1738 scan_prog_file (output_file
, PASS_FIRST
, ld1_filter
);
1740 #ifdef SCAN_LIBRARIES
1741 scan_libraries (output_file
);
1746 notice_translated (ngettext ("%d constructor found\n",
1747 "%d constructors found\n",
1748 constructors
.number
),
1749 constructors
.number
);
1750 notice_translated (ngettext ("%d destructor found\n",
1751 "%d destructors found\n",
1752 destructors
.number
),
1753 destructors
.number
);
1754 notice_translated (ngettext("%d frame table found\n",
1755 "%d frame tables found\n",
1756 frame_tables
.number
),
1757 frame_tables
.number
);
1760 /* If the scan exposed nothing of special interest, there's no need to
1761 generate the glue code and relink so return now. */
1763 if (constructors
.number
== 0 && destructors
.number
== 0
1764 && frame_tables
.number
== 0
1765 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1766 /* If we will be running these functions ourselves, we want to emit
1767 stubs into the shared library so that we do not have to relink
1768 dependent programs when we add static objects. */
1773 /* Do tlink without additional code generation now if we didn't
1774 do it earlier for scanning purposes. */
1775 if (ld1_filter
== SCAN_NOTHING
)
1776 do_tlink (ld1_argv
, object_lst
);
1779 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1781 /* Strip now if it was requested on the command line. */
1784 char **real_strip_argv
= XCNEWVEC (char *, 3);
1785 const char ** strip_argv
= CONST_CAST2 (const char **, char **,
1788 strip_argv
[0] = strip_file_name
;
1789 strip_argv
[1] = output_file
;
1790 strip_argv
[2] = (char *) 0;
1791 fork_execute ("strip", real_strip_argv
);
1794 #ifdef COLLECT_EXPORT_LIST
1795 maybe_unlink (export_file
);
1797 post_ld_pass (false);
1799 maybe_unlink (c_file
);
1800 maybe_unlink (o_file
);
1804 /* Sort ctor and dtor lists by priority. */
1805 sort_ids (&constructors
);
1806 sort_ids (&destructors
);
1808 maybe_unlink(output_file
);
1809 outf
= fopen (c_file
, "w");
1810 if (outf
== (FILE *) 0)
1811 fatal_error ("fopen %s: %m", c_file
);
1813 write_c_file (outf
, c_file
);
1816 fatal_error ("fclose %s: %m", c_file
);
1818 /* Tell the linker that we have initializer and finalizer functions. */
1819 #ifdef LD_INIT_SWITCH
1820 #ifdef COLLECT_EXPORT_LIST
1821 *ld2
++ = concat (LD_INIT_SWITCH
, ":", initname
, ":", fininame
, NULL
);
1823 *ld2
++ = LD_INIT_SWITCH
;
1825 *ld2
++ = LD_FINI_SWITCH
;
1830 #ifdef COLLECT_EXPORT_LIST
1833 /* If we did not add export flag to link arguments before, add it to
1834 second link phase now. No new exports should have been added. */
1835 if (! exports
.first
)
1836 *ld2
++ = concat ("-bE:", export_file
, NULL
);
1838 #ifndef LD_INIT_SWITCH
1839 add_to_list (&exports
, initname
);
1840 add_to_list (&exports
, fininame
);
1841 add_to_list (&exports
, "_GLOBAL__DI");
1842 add_to_list (&exports
, "_GLOBAL__DD");
1844 exportf
= fopen (export_file
, "w");
1845 if (exportf
== (FILE *) 0)
1846 fatal_error ("fopen %s: %m", export_file
);
1847 write_aix_file (exportf
, exports
.first
);
1848 if (fclose (exportf
))
1849 fatal_error ("fclose %s: %m", export_file
);
1853 /* End of arguments to second link phase. */
1858 fprintf (stderr
, "\n========== output_file = %s, c_file = %s\n",
1859 output_file
, c_file
);
1860 write_c_file (stderr
, "stderr");
1861 fprintf (stderr
, "========== end of c_file\n\n");
1862 #ifdef COLLECT_EXPORT_LIST
1863 fprintf (stderr
, "\n========== export_file = %s\n", export_file
);
1864 write_aix_file (stderr
, exports
.first
);
1865 fprintf (stderr
, "========== end of export_file\n\n");
1869 /* Assemble the constructor and destructor tables.
1870 Link the tables in with the rest of the program. */
1872 fork_execute ("gcc", c_argv
);
1873 #ifdef COLLECT_EXPORT_LIST
1874 /* On AIX we must call tlink because of possible templates resolution. */
1875 do_tlink (ld2_argv
, object_lst
);
1878 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, false);
1880 /* Otherwise, simply call ld because tlink is already done. */
1882 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, true);
1885 fork_execute ("ld", ld2_argv
);
1886 post_ld_pass (false);
1889 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1890 constructors/destructors in shared libraries. */
1891 scan_prog_file (output_file
, PASS_SECOND
, SCAN_ALL
);
1894 maybe_unlink (c_file
);
1895 maybe_unlink (o_file
);
1897 #ifdef COLLECT_EXPORT_LIST
1898 maybe_unlink (export_file
);
1905 /* Wait for a process to finish, and exit if a nonzero status is found. */
1908 collect_wait (const char *prog
, struct pex_obj
*pex
)
1912 if (!pex_get_status (pex
, 1, &status
))
1913 fatal_error ("can't get program status: %m");
1918 if (WIFSIGNALED (status
))
1920 int sig
= WTERMSIG (status
);
1921 error ("%s terminated with signal %d [%s]%s",
1922 prog
, sig
, strsignal(sig
),
1923 WCOREDUMP(status
) ? ", core dumped" : "");
1924 collect_exit (FATAL_EXIT_CODE
);
1927 if (WIFEXITED (status
))
1928 return WEXITSTATUS (status
);
1934 do_wait (const char *prog
, struct pex_obj
*pex
)
1936 int ret
= collect_wait (prog
, pex
);
1939 error ("%s returned %d exit status", prog
, ret
);
1945 unlink (response_file
);
1946 response_file
= NULL
;
1951 /* Execute a program, and wait for the reply. */
1954 collect_execute (const char *prog
, char **argv
, const char *outname
,
1955 const char *errname
, int flags
)
1957 struct pex_obj
*pex
;
1960 char *response_arg
= NULL
;
1961 char *response_argv
[3] ATTRIBUTE_UNUSED
;
1963 if (HAVE_GNU_LD
&& at_file_supplied
&& argv
[0] != NULL
)
1965 /* If using @file arguments, create a temporary file and put the
1966 contents of argv into it. Then change argv to an array corresponding
1967 to a single argument @FILE, where FILE is the temporary filename. */
1969 char **current_argv
= argv
+ 1;
1970 char *argv0
= argv
[0];
1974 /* Note: we assume argv contains at least one element; this is
1977 response_file
= make_temp_file ("");
1979 f
= fopen (response_file
, "w");
1982 fatal_error ("could not open response file %s", response_file
);
1984 status
= writeargv (current_argv
, f
);
1987 fatal_error ("could not write to response file %s", response_file
);
1989 status
= fclose (f
);
1992 fatal_error ("could not close response file %s", response_file
);
1994 response_arg
= concat ("@", response_file
, NULL
);
1995 response_argv
[0] = argv0
;
1996 response_argv
[1] = response_arg
;
1997 response_argv
[2] = NULL
;
1999 argv
= response_argv
;
2008 fprintf (stderr
, "%s", argv
[0]);
2010 notice ("[cannot find %s]", prog
);
2012 for (p_argv
= &argv
[1]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2013 fprintf (stderr
, " %s", str
);
2015 fprintf (stderr
, "\n");
2021 /* If we cannot find a program we need, complain error. Do this here
2022 since we might not end up needing something that we could not find. */
2025 fatal_error ("cannot find '%s'", prog
);
2027 pex
= pex_init (0, "collect2", NULL
);
2029 fatal_error ("pex_init failed: %m");
2031 errmsg
= pex_run (pex
, flags
, argv
[0], argv
, outname
,
2038 fatal_error ("%s: %m", _(errmsg
));
2041 fatal_error (errmsg
);
2044 free (response_arg
);
2050 fork_execute (const char *prog
, char **argv
)
2052 struct pex_obj
*pex
;
2054 pex
= collect_execute (prog
, argv
, NULL
, NULL
, PEX_LAST
| PEX_SEARCH
);
2055 do_wait (prog
, pex
);
2058 /* Unlink a file unless we are debugging. */
2061 maybe_unlink (const char *file
)
2064 unlink_if_ordinary (file
);
2066 notice ("[Leaving %s]\n", file
);
2069 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
2072 maybe_unlink_list (char **file_list
)
2074 char **tmp
= file_list
;
2077 maybe_unlink (*(tmp
++));
2081 static long sequence_number
= 0;
2083 /* Add a name to a linked list. */
2086 add_to_list (struct head
*head_ptr
, const char *name
)
2089 = (struct id
*) xcalloc (sizeof (struct id
) + strlen (name
), 1);
2091 strcpy (newid
->name
, name
);
2093 if (head_ptr
->first
)
2094 head_ptr
->last
->next
= newid
;
2096 head_ptr
->first
= newid
;
2098 /* Check for duplicate symbols. */
2099 for (p
= head_ptr
->first
;
2100 strcmp (name
, p
->name
) != 0;
2105 head_ptr
->last
->next
= 0;
2110 newid
->sequence
= ++sequence_number
;
2111 head_ptr
->last
= newid
;
2115 /* Grab the init priority number from an init function name that
2116 looks like "_GLOBAL_.I.12345.foo". */
2119 extract_init_priority (const char *name
)
2123 while (name
[pos
] == '_')
2125 pos
+= 10; /* strlen ("GLOBAL__X_") */
2127 /* Extract init_p number from ctor/dtor name. */
2128 pri
= atoi (name
+ pos
);
2129 return pri
? pri
: DEFAULT_INIT_PRIORITY
;
2132 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2133 ctors will be run from right to left, dtors from left to right. */
2136 sort_ids (struct head
*head_ptr
)
2138 /* id holds the current element to insert. id_next holds the next
2139 element to insert. id_ptr iterates through the already sorted elements
2140 looking for the place to insert id. */
2141 struct id
*id
, *id_next
, **id_ptr
;
2143 id
= head_ptr
->first
;
2145 /* We don't have any sorted elements yet. */
2146 head_ptr
->first
= NULL
;
2148 for (; id
; id
= id_next
)
2151 id
->sequence
= extract_init_priority (id
->name
);
2153 for (id_ptr
= &(head_ptr
->first
); ; id_ptr
= &((*id_ptr
)->next
))
2155 /* If the sequence numbers are the same, we put the id from the
2156 file later on the command line later in the list. */
2157 || id
->sequence
> (*id_ptr
)->sequence
2158 /* Hack: do lexical compare, too.
2159 || (id->sequence == (*id_ptr)->sequence
2160 && strcmp (id->name, (*id_ptr)->name) > 0) */
2169 /* Now set the sequence numbers properly so write_c_file works. */
2170 for (id
= head_ptr
->first
; id
; id
= id
->next
)
2171 id
->sequence
= ++sequence_number
;
2174 /* Write: `prefix', the names on list LIST, `suffix'. */
2177 write_list (FILE *stream
, const char *prefix
, struct id
*list
)
2181 fprintf (stream
, "%sx%d,\n", prefix
, list
->sequence
);
2186 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
2187 /* Given a STRING, return nonzero if it occurs in the list in range
2188 [ARGS_BEGIN,ARGS_END). */
2191 is_in_args (const char *string
, const char **args_begin
,
2192 const char **args_end
)
2194 const char **args_pointer
;
2195 for (args_pointer
= args_begin
; args_pointer
!= args_end
; ++args_pointer
)
2196 if (strcmp (string
, *args_pointer
) == 0)
2200 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
2202 #ifdef COLLECT_EXPORT_LIST
2203 /* This function is really used only on AIX, but may be useful. */
2206 is_in_list (const char *prefix
, struct id
*list
)
2210 if (!strcmp (prefix
, list
->name
)) return 1;
2216 #endif /* COLLECT_EXPORT_LIST */
2218 /* Added for debugging purpose. */
2219 #ifdef COLLECT_EXPORT_LIST
2221 dump_list (FILE *stream
, const char *prefix
, struct id
*list
)
2225 fprintf (stream
, "%s%s,\n", prefix
, list
->name
);
2233 dump_prefix_list (FILE *stream
, const char *prefix
, struct prefix_list
*list
)
2237 fprintf (stream
, "%s%s,\n", prefix
, list
->prefix
);
2244 write_list_with_asm (FILE *stream
, const char *prefix
, struct id
*list
)
2248 fprintf (stream
, "%sx%d __asm__ (\"%s\");\n",
2249 prefix
, list
->sequence
, list
->name
);
2254 /* Write out the constructor and destructor tables statically (for a shared
2255 object), along with the functions to execute them. */
2258 write_c_file_stat (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2262 int frames
= (frame_tables
.number
> 0);
2264 /* Figure out name of output_file, stripping off .so version. */
2265 q
= p
= lbasename (output_file
);
2277 if (filename_ncmp (q
, SHLIB_SUFFIX
, strlen (SHLIB_SUFFIX
)) == 0)
2279 q
+= strlen (SHLIB_SUFFIX
);
2286 /* q points to null at end of the string (or . of the .so version) */
2287 prefix
= XNEWVEC (char, q
- p
+ 1);
2288 strncpy (prefix
, p
, q
- p
);
2290 for (r
= prefix
; *r
; r
++)
2291 if (!ISALNUM ((unsigned char)*r
))
2294 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2295 output_file
, prefix
);
2297 initname
= concat ("_GLOBAL__FI_", prefix
, NULL
);
2298 fininame
= concat ("_GLOBAL__FD_", prefix
, NULL
);
2302 /* Write the tables as C code. */
2304 fprintf (stream
, "static int count;\n");
2305 fprintf (stream
, "typedef void entry_pt();\n");
2306 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2310 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2312 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2313 write_list (stream
, "\t\t&", frame_tables
.first
);
2314 fprintf (stream
, "\t0\n};\n");
2316 /* This must match what's in frame.h. */
2317 fprintf (stream
, "struct object {\n");
2318 fprintf (stream
, " void *pc_begin;\n");
2319 fprintf (stream
, " void *pc_end;\n");
2320 fprintf (stream
, " void *fde_begin;\n");
2321 fprintf (stream
, " void *fde_array;\n");
2322 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2323 fprintf (stream
, " struct object *next;\n");
2324 fprintf (stream
, "};\n");
2326 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2327 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2329 fprintf (stream
, "static void reg_frame () {\n");
2330 fprintf (stream
, "\tstatic struct object ob;\n");
2331 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2332 fprintf (stream
, "\t}\n");
2334 fprintf (stream
, "static void dereg_frame () {\n");
2335 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2336 fprintf (stream
, "\t}\n");
2339 fprintf (stream
, "void %s() {\n", initname
);
2340 if (constructors
.number
> 0 || frames
)
2342 fprintf (stream
, "\tstatic entry_pt *ctors[] = {\n");
2343 write_list (stream
, "\t\t", constructors
.first
);
2345 fprintf (stream
, "\treg_frame,\n");
2346 fprintf (stream
, "\t};\n");
2347 fprintf (stream
, "\tentry_pt **p;\n");
2348 fprintf (stream
, "\tif (count++ != 0) return;\n");
2349 fprintf (stream
, "\tp = ctors + %d;\n", constructors
.number
+ frames
);
2350 fprintf (stream
, "\twhile (p > ctors) (*--p)();\n");
2353 fprintf (stream
, "\t++count;\n");
2354 fprintf (stream
, "}\n");
2355 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2356 fprintf (stream
, "void %s() {\n", fininame
);
2357 if (destructors
.number
> 0 || frames
)
2359 fprintf (stream
, "\tstatic entry_pt *dtors[] = {\n");
2360 write_list (stream
, "\t\t", destructors
.first
);
2362 fprintf (stream
, "\tdereg_frame,\n");
2363 fprintf (stream
, "\t};\n");
2364 fprintf (stream
, "\tentry_pt **p;\n");
2365 fprintf (stream
, "\tif (--count != 0) return;\n");
2366 fprintf (stream
, "\tp = dtors;\n");
2367 fprintf (stream
, "\twhile (p < dtors + %d) (*p++)();\n",
2368 destructors
.number
+ frames
);
2370 fprintf (stream
, "}\n");
2374 COLLECT_SHARED_INIT_FUNC(stream
, initname
);
2375 COLLECT_SHARED_FINI_FUNC(stream
, fininame
);
2379 /* Write the constructor/destructor tables. */
2381 #ifndef LD_INIT_SWITCH
2383 write_c_file_glob (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2385 /* Write the tables as C code. */
2387 int frames
= (frame_tables
.number
> 0);
2389 fprintf (stream
, "typedef void entry_pt();\n\n");
2391 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2395 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2397 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2398 write_list (stream
, "\t\t&", frame_tables
.first
);
2399 fprintf (stream
, "\t0\n};\n");
2401 /* This must match what's in frame.h. */
2402 fprintf (stream
, "struct object {\n");
2403 fprintf (stream
, " void *pc_begin;\n");
2404 fprintf (stream
, " void *pc_end;\n");
2405 fprintf (stream
, " void *fde_begin;\n");
2406 fprintf (stream
, " void *fde_array;\n");
2407 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2408 fprintf (stream
, " struct object *next;\n");
2409 fprintf (stream
, "};\n");
2411 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2412 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2414 fprintf (stream
, "static void reg_frame () {\n");
2415 fprintf (stream
, "\tstatic struct object ob;\n");
2416 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2417 fprintf (stream
, "\t}\n");
2419 fprintf (stream
, "static void dereg_frame () {\n");
2420 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2421 fprintf (stream
, "\t}\n");
2424 fprintf (stream
, "\nentry_pt * __CTOR_LIST__[] = {\n");
2425 fprintf (stream
, "\t(entry_pt *) %d,\n", constructors
.number
+ frames
);
2426 write_list (stream
, "\t", constructors
.first
);
2428 fprintf (stream
, "\treg_frame,\n");
2429 fprintf (stream
, "\t0\n};\n\n");
2431 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2433 fprintf (stream
, "\nentry_pt * __DTOR_LIST__[] = {\n");
2434 fprintf (stream
, "\t(entry_pt *) %d,\n", destructors
.number
+ frames
);
2435 write_list (stream
, "\t", destructors
.first
);
2437 fprintf (stream
, "\tdereg_frame,\n");
2438 fprintf (stream
, "\t0\n};\n\n");
2440 fprintf (stream
, "extern entry_pt %s;\n", NAME__MAIN
);
2441 fprintf (stream
, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN
);
2443 #endif /* ! LD_INIT_SWITCH */
2446 write_c_file (FILE *stream
, const char *name
)
2448 #ifndef LD_INIT_SWITCH
2450 write_c_file_glob (stream
, name
);
2453 write_c_file_stat (stream
, name
);
2456 #ifdef COLLECT_EXPORT_LIST
2458 write_aix_file (FILE *stream
, struct id
*list
)
2460 for (; list
; list
= list
->next
)
2462 fputs (list
->name
, stream
);
2463 putc ('\n', stream
);
2468 #ifdef OBJECT_FORMAT_NONE
2470 /* Check to make sure the file is an LTO object file. */
2473 maybe_lto_object_file (const char *prog_name
)
2476 unsigned char buf
[4];
2479 static unsigned char elfmagic
[4] = { 0x7f, 'E', 'L', 'F' };
2480 static unsigned char coffmagic
[2] = { 0x4c, 0x01 };
2481 static unsigned char coffmagic_x64
[2] = { 0x64, 0x86 };
2482 static unsigned char machomagic
[4][4] = {
2483 { 0xcf, 0xfa, 0xed, 0xfe },
2484 { 0xce, 0xfa, 0xed, 0xfe },
2485 { 0xfe, 0xed, 0xfa, 0xcf },
2486 { 0xfe, 0xed, 0xfa, 0xce }
2489 f
= fopen (prog_name
, "rb");
2492 if (fread (buf
, sizeof (buf
), 1, f
) != 1)
2496 if (memcmp (buf
, elfmagic
, sizeof (elfmagic
)) == 0
2497 || memcmp (buf
, coffmagic
, sizeof (coffmagic
)) == 0
2498 || memcmp (buf
, coffmagic_x64
, sizeof (coffmagic_x64
)) == 0)
2500 for (i
= 0; i
< 4; i
++)
2501 if (memcmp (buf
, machomagic
[i
], sizeof (machomagic
[i
])) == 0)
2507 /* Generic version to scan the name list of the loaded program for
2508 the symbols g++ uses for static constructors and destructors. */
2511 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2514 void (*int_handler
) (int);
2516 void (*quit_handler
) (int);
2518 char *real_nm_argv
[4];
2519 const char **nm_argv
= CONST_CAST2 (const char **, char**, real_nm_argv
);
2521 struct pex_obj
*pex
;
2528 if (which_pass
== PASS_SECOND
)
2531 /* LTO objects must be in a known format. This check prevents
2532 us from accepting an archive containing LTO objects, which
2533 gcc cannnot currently handle. */
2534 if (which_pass
== PASS_LTOINFO
&& !maybe_lto_object_file (prog_name
))
2537 /* If we do not have an `nm', complain. */
2538 if (nm_file_name
== 0)
2539 fatal_error ("cannot find 'nm'");
2541 nm_argv
[argc
++] = nm_file_name
;
2542 if (NM_FLAGS
[0] != '\0')
2543 nm_argv
[argc
++] = NM_FLAGS
;
2545 nm_argv
[argc
++] = prog_name
;
2546 nm_argv
[argc
++] = (char *) 0;
2548 /* Trace if needed. */
2551 const char **p_argv
;
2554 for (p_argv
= &nm_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2555 fprintf (stderr
, " %s", str
);
2557 fprintf (stderr
, "\n");
2563 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2565 fatal_error ("pex_init failed: %m");
2567 errmsg
= pex_run (pex
, 0, nm_file_name
, real_nm_argv
, NULL
, HOST_BIT_BUCKET
,
2574 fatal_error ("%s: %m", _(errmsg
));
2577 fatal_error (errmsg
);
2580 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2582 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2585 inf
= pex_read_output (pex
, 0);
2587 fatal_error ("can't open nm output: %m");
2591 if (which_pass
== PASS_LTOINFO
)
2592 fprintf (stderr
, "\nnm output with LTO info marker symbol.\n");
2594 fprintf (stderr
, "\nnm output with constructors/destructors.\n");
2597 /* Read each line of nm output. */
2598 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2604 fprintf (stderr
, "\t%s\n", buf
);
2606 if (which_pass
== PASS_LTOINFO
)
2611 /* Look for the LTO info marker symbol, and add filename to
2612 the LTO objects list if found. */
2613 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n'; p
++)
2614 if (ch
== ' ' && p
[1] == '_' && p
[2] == '_'
2615 && (strncmp (p
+ (p
[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2616 && ISSPACE (p
[p
[3] == '_' ? 14 : 13]))
2618 add_lto_object (<o_objects
, prog_name
);
2620 /* We need to read all the input, so we can't just
2621 return here. But we can avoid useless work. */
2630 /* If it contains a constructor or destructor name, add the name
2631 to the appropriate list unless this is a kind of symbol we're
2632 not supposed to even consider. */
2634 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n' && ch
!= '_'; p
++)
2635 if (ch
== ' ' && p
[1] == 'U' && p
[2] == ' ')
2642 /* Find the end of the symbol name.
2643 Do not include `|', because Encore nm can tack that on the end. */
2644 for (end
= p
; (ch2
= *end
) != '\0' && !ISSPACE (ch2
) && ch2
!= '|';
2650 switch (is_ctor_dtor (name
))
2653 if (! (filter
& SCAN_CTOR
))
2655 if (which_pass
!= PASS_LIB
)
2656 add_to_list (&constructors
, name
);
2660 if (! (filter
& SCAN_DTOR
))
2662 if (which_pass
!= PASS_LIB
)
2663 add_to_list (&destructors
, name
);
2667 if (! (filter
& SCAN_INIT
))
2669 if (which_pass
!= PASS_LIB
)
2670 fatal_error ("init function found in object %s", prog_name
);
2671 #ifndef LD_INIT_SWITCH
2672 add_to_list (&constructors
, name
);
2677 if (! (filter
& SCAN_FINI
))
2679 if (which_pass
!= PASS_LIB
)
2680 fatal_error ("fini function found in object %s", prog_name
);
2681 #ifndef LD_FINI_SWITCH
2682 add_to_list (&destructors
, name
);
2687 if (! (filter
& SCAN_DWEH
))
2689 if (which_pass
!= PASS_LIB
)
2690 add_to_list (&frame_tables
, name
);
2693 default: /* not a constructor or destructor */
2699 fprintf (stderr
, "\n");
2701 do_wait (nm_file_name
, pex
);
2703 signal (SIGINT
, int_handler
);
2705 signal (SIGQUIT
, quit_handler
);
2711 /* Use the List Dynamic Dependencies program to find shared libraries that
2712 the output file depends upon and their initialization/finalization
2713 routines, if any. */
2716 scan_libraries (const char *prog_name
)
2718 static struct head libraries
; /* list of shared libraries found */
2720 void (*int_handler
) (int);
2722 void (*quit_handler
) (int);
2724 char *real_ldd_argv
[4];
2725 const char **ldd_argv
= CONST_CAST2 (const char **, char **, real_ldd_argv
);
2727 struct pex_obj
*pex
;
2733 /* If we do not have an `ldd', complain. */
2734 if (ldd_file_name
== 0)
2736 error ("cannot find 'ldd'");
2740 ldd_argv
[argc
++] = ldd_file_name
;
2741 ldd_argv
[argc
++] = prog_name
;
2742 ldd_argv
[argc
++] = (char *) 0;
2744 /* Trace if needed. */
2747 const char **p_argv
;
2750 for (p_argv
= &ldd_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2751 fprintf (stderr
, " %s", str
);
2753 fprintf (stderr
, "\n");
2759 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2761 fatal_error ("pex_init failed: %m");
2763 errmsg
= pex_run (pex
, 0, ldd_file_name
, real_ldd_argv
, NULL
, NULL
, &err
);
2769 fatal_error ("%s: %m", _(errmsg
));
2772 fatal_error (errmsg
);
2775 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2777 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2780 inf
= pex_read_output (pex
, 0);
2782 fatal_error ("can't open ldd output: %m");
2785 notice ("\nldd output with constructors/destructors.\n");
2787 /* Read each line of ldd output. */
2788 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2791 char *name
, *end
, *p
= buf
;
2793 /* Extract names of libraries and add to list. */
2794 PARSE_LDD_OUTPUT (p
);
2799 if (strncmp (name
, "not found", sizeof ("not found") - 1) == 0)
2800 fatal_error ("dynamic dependency %s not found", buf
);
2802 /* Find the end of the symbol name. */
2804 (ch2
= *end
) != '\0' && ch2
!= '\n' && !ISSPACE (ch2
) && ch2
!= '|';
2809 if (access (name
, R_OK
) == 0)
2810 add_to_list (&libraries
, name
);
2812 fatal_error ("unable to open dynamic dependency '%s'", buf
);
2815 fprintf (stderr
, "\t%s\n", buf
);
2818 fprintf (stderr
, "\n");
2820 do_wait (ldd_file_name
, pex
);
2822 signal (SIGINT
, int_handler
);
2824 signal (SIGQUIT
, quit_handler
);
2827 /* Now iterate through the library list adding their symbols to
2829 for (list
= libraries
.first
; list
; list
= list
->next
)
2830 scan_prog_file (list
->name
, PASS_LIB
, SCAN_ALL
);
2833 #endif /* LDD_SUFFIX */
2835 #endif /* OBJECT_FORMAT_NONE */
2839 * COFF specific stuff.
2842 #ifdef OBJECT_FORMAT_COFF
2844 #if defined (EXTENDED_COFF)
2846 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2847 # define GCC_SYMENT SYMR
2848 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2849 # define GCC_SYMINC(X) (1)
2850 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2851 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2855 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2856 # define GCC_SYMENT SYMENT
2857 # if defined (C_WEAKEXT)
2858 # define GCC_OK_SYMBOL(X) \
2859 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2860 ((X).n_scnum > N_UNDEF) && \
2862 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2863 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2864 # define GCC_UNDEF_SYMBOL(X) \
2865 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2866 ((X).n_scnum == N_UNDEF))
2868 # define GCC_OK_SYMBOL(X) \
2869 (((X).n_sclass == C_EXT) && \
2870 ((X).n_scnum > N_UNDEF) && \
2872 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2873 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2874 # define GCC_UNDEF_SYMBOL(X) \
2875 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2877 # define GCC_SYMINC(X) ((X).n_numaux+1)
2878 # define GCC_SYMZERO(X) 0
2880 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2881 #if TARGET_AIX_VERSION >= 51
2882 # define GCC_CHECK_HDR(X) \
2883 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2884 || (HEADER (X).f_magic == 0767 && aix64_flag))
2886 # define GCC_CHECK_HDR(X) \
2887 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2888 || (HEADER (X).f_magic == 0757 && aix64_flag))
2893 #ifdef COLLECT_EXPORT_LIST
2894 /* Array of standard AIX libraries which should not
2895 be scanned for ctors/dtors. */
2896 static const char *const aix_std_libs
[] = {
2904 "/usr/lib/libc_r.a",
2905 "/usr/lib/libm_r.a",
2906 "/usr/lib/threads/libc.a",
2907 "/usr/ccs/lib/libc.a",
2908 "/usr/ccs/lib/libm.a",
2909 "/usr/ccs/lib/libc_r.a",
2910 "/usr/ccs/lib/libm_r.a",
2914 /* This function checks the filename and returns 1
2915 if this name matches the location of a standard AIX library. */
2916 static int ignore_library (const char *);
2918 ignore_library (const char *name
)
2920 const char *const *p
;
2923 if (target_system_root
[0] != '\0')
2925 length
= strlen (target_system_root
);
2926 if (strncmp (name
, target_system_root
, length
) != 0)
2930 for (p
= &aix_std_libs
[0]; *p
!= NULL
; ++p
)
2931 if (strcmp (name
, *p
) == 0)
2935 #endif /* COLLECT_EXPORT_LIST */
2937 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2938 extern char *ldgetname (LDFILE
*, GCC_SYMENT
*);
2941 /* COFF version to scan the name list of the loaded program for
2942 the symbols g++ uses for static constructors and destructors. */
2945 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2948 LDFILE
*ldptr
= NULL
;
2949 int sym_index
, sym_count
;
2952 if (which_pass
!= PASS_FIRST
&& which_pass
!= PASS_OBJ
)
2955 #ifdef COLLECT_EXPORT_LIST
2956 /* We do not need scanning for some standard C libraries. */
2957 if (which_pass
== PASS_FIRST
&& ignore_library (prog_name
))
2960 /* On AIX we have a loop, because there is not much difference
2961 between an object and an archive. This trick allows us to
2962 eliminate scan_libraries() function. */
2966 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2967 non-const char * filename parameter, even though it will not
2968 modify that string. So we must cast away const-ness here,
2969 using CONST_CAST to prevent complaints from -Wcast-qual. */
2970 if ((ldptr
= ldopen (CONST_CAST (char *, prog_name
), ldptr
)) != NULL
)
2972 if (! MY_ISCOFF (HEADER (ldptr
).f_magic
))
2973 fatal_error ("%s: not a COFF file", prog_name
);
2975 if (GCC_CHECK_HDR (ldptr
))
2977 sym_count
= GCC_SYMBOLS (ldptr
);
2978 sym_index
= GCC_SYMZERO (ldptr
);
2980 #ifdef COLLECT_EXPORT_LIST
2981 /* Is current archive member a shared object? */
2982 is_shared
= HEADER (ldptr
).f_flags
& F_SHROBJ
;
2985 while (sym_index
< sym_count
)
2989 if (ldtbread (ldptr
, sym_index
, &symbol
) <= 0)
2991 sym_index
+= GCC_SYMINC (symbol
);
2993 if (GCC_OK_SYMBOL (symbol
))
2997 if ((name
= ldgetname (ldptr
, &symbol
)) == NULL
)
2998 continue; /* Should never happen. */
3000 #ifdef XCOFF_DEBUGGING_INFO
3001 /* All AIX function names have a duplicate entry
3002 beginning with a dot. */
3007 switch (is_ctor_dtor (name
))
3010 if (! (filter
& SCAN_CTOR
))
3013 add_to_list (&constructors
, name
);
3014 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3015 if (which_pass
== PASS_OBJ
)
3016 add_to_list (&exports
, name
);
3021 if (! (filter
& SCAN_DTOR
))
3024 add_to_list (&destructors
, name
);
3025 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3026 if (which_pass
== PASS_OBJ
)
3027 add_to_list (&exports
, name
);
3031 #ifdef COLLECT_EXPORT_LIST
3033 if (! (filter
& SCAN_INIT
))
3035 #ifndef LD_INIT_SWITCH
3037 add_to_list (&constructors
, name
);
3042 if (! (filter
& SCAN_FINI
))
3044 #ifndef LD_INIT_SWITCH
3046 add_to_list (&destructors
, name
);
3052 if (! (filter
& SCAN_DWEH
))
3055 add_to_list (&frame_tables
, name
);
3056 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
3057 if (which_pass
== PASS_OBJ
)
3058 add_to_list (&exports
, name
);
3062 default: /* not a constructor or destructor */
3063 #ifdef COLLECT_EXPORT_LIST
3064 /* Explicitly export all global symbols when
3065 building a shared object on AIX, but do not
3066 re-export symbols from another shared object
3067 and do not export symbols if the user
3068 provides an explicit export list. */
3069 if (shared_obj
&& !is_shared
3070 && which_pass
== PASS_OBJ
&& !export_flag
)
3071 add_to_list (&exports
, name
);
3077 #if !defined(EXTENDED_COFF)
3078 fprintf (stderr
, "\tsec=%d class=%d type=%s%o %s\n",
3079 symbol
.n_scnum
, symbol
.n_sclass
,
3080 (symbol
.n_type
? "0" : ""), symbol
.n_type
,
3084 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
3085 symbol
.iss
, (long) symbol
.value
, symbol
.index
, name
);
3090 #ifdef COLLECT_EXPORT_LIST
3093 /* If archive contains both 32-bit and 64-bit objects,
3094 we want to skip objects in other mode so mismatch normal. */
3096 fprintf (stderr
, "%s : magic=%o aix64=%d mismatch\n",
3097 prog_name
, HEADER (ldptr
).f_magic
, aix64_flag
);
3103 fatal_error ("%s: cannot open as COFF file", prog_name
);
3105 #ifdef COLLECT_EXPORT_LIST
3106 /* On AIX loop continues while there are more members in archive. */
3108 while (ldclose (ldptr
) == FAILURE
);
3110 /* Otherwise we simply close ldptr. */
3111 (void) ldclose(ldptr
);
3114 #endif /* OBJECT_FORMAT_COFF */
3116 #ifdef COLLECT_EXPORT_LIST
3117 /* Given a library name without "lib" prefix, this function
3118 returns a full library name including a path. */
3120 resolve_lib_name (const char *name
)
3124 /* Library extensions for AIX dynamic linking. */
3125 const char * const libexts
[2] = {"a", "so"};
3127 for (i
= 0; libpaths
[i
]; i
++)
3128 if (libpaths
[i
]->max_len
> l
)
3129 l
= libpaths
[i
]->max_len
;
3131 lib_buf
= XNEWVEC (char, l
+ strlen(name
) + 10);
3133 for (i
= 0; libpaths
[i
]; i
++)
3135 struct prefix_list
*list
= libpaths
[i
]->plist
;
3136 for (; list
; list
= list
->next
)
3138 /* The following lines are needed because path_prefix list
3139 may contain directories both with trailing DIR_SEPARATOR and
3142 if (!IS_DIR_SEPARATOR (list
->prefix
[strlen(list
->prefix
)-1]))
3144 for (j
= 0; j
< 2; j
++)
3146 sprintf (lib_buf
, "%s%slib%s.%s",
3147 list
->prefix
, p
, name
,
3148 libexts
[(j
+ aixrtl_flag
) % 2]);
3149 if (debug
) fprintf (stderr
, "searching for: %s\n", lib_buf
);
3150 if (file_exists (lib_buf
))
3152 if (debug
) fprintf (stderr
, "found: %s\n", lib_buf
);
3159 fprintf (stderr
, "not found\n");
3161 fatal_error ("library lib%s not found", name
);
3164 #endif /* COLLECT_EXPORT_LIST */
3166 #ifdef COLLECT_RUN_DSYMUTIL
3167 static int flag_dsym
= false;
3168 static int flag_idsym
= false;
3171 process_args (int *argcp
, char **argv
) {
3174 for (i
=0; i
<argc
; ++i
)
3176 if (strcmp (argv
[i
], "-dsym") == 0)
3179 /* Remove the flag, as we handle all processing for it. */
3182 argv
[j
] = argv
[j
+1];
3187 else if (strcmp (argv
[i
], "-idsym") == 0)
3190 /* Remove the flag, as we handle all processing for it. */
3193 argv
[j
] = argv
[j
+1];
3202 do_dsymutil (const char *output_file
) {
3203 const char *dsymutil
= DSYMUTIL
+ 1;
3204 struct pex_obj
*pex
;
3205 char **real_argv
= XCNEWVEC (char *, 3);
3206 const char ** argv
= CONST_CAST2 (const char **, char **,
3210 argv
[1] = output_file
;
3211 argv
[2] = (char *) 0;
3213 pex
= collect_execute (dsymutil
, real_argv
, NULL
, NULL
, PEX_LAST
| PEX_SEARCH
);
3214 do_wait (dsymutil
, pex
);
3218 post_ld_pass (bool temp_file
) {
3219 if (!(temp_file
&& flag_idsym
) && !flag_dsym
)
3222 do_dsymutil (output_file
);
3226 process_args (int *argcp ATTRIBUTE_UNUSED
, char **argv ATTRIBUTE_UNUSED
) { }
3227 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED
) { }