1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992-2013 Free Software Foundation, Inc.
4 Contributed by Chris Smith (csmith@convex.com).
5 Heavily modified by Michael Meissner (meissner@cygnus.com),
6 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
25 /* Build tables of static constructors and destructors and run ld. */
29 #include "coretypes.h"
31 #include "filenames.h"
32 #include "file-find.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"
46 #include "diagnostic.h"
52 /* On certain systems, we have code that works by scanning the object file
53 directly. But this code uses system-specific header files and library
54 functions, so turn it off in a cross-compiler. Likewise, the names of
55 the utilities are not correct for a cross-compiler; we have to hope that
56 cross-versions are in the proper directories. */
58 #ifdef CROSS_DIRECTORY_STRUCTURE
59 #ifndef CROSS_AIX_SUPPORT
60 #undef OBJECT_FORMAT_COFF
63 #undef REAL_LD_FILE_NAME
64 #undef REAL_NM_FILE_NAME
65 #undef REAL_STRIP_FILE_NAME
68 /* If we cannot use a special method, use the ordinary one:
69 run nm to find what symbols are present.
70 In a cross-compiler, this means you need a cross nm,
71 but that is not quite as unpleasant as special headers. */
73 #if !defined (OBJECT_FORMAT_COFF)
74 #define OBJECT_FORMAT_NONE
77 #ifdef OBJECT_FORMAT_COFF
79 #ifndef CROSS_DIRECTORY_STRUCTURE
87 /* Many versions of ldfcn.h define these. */
96 /* Some systems have an ISCOFF macro, but others do not. In some cases
97 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
98 that either do not have an ISCOFF macro in /usr/include or for those
102 #define MY_ISCOFF(X) ISCOFF (X)
105 #endif /* OBJECT_FORMAT_COFF */
107 #ifdef OBJECT_FORMAT_NONE
109 /* Default flags to pass to nm. */
111 #define NM_FLAGS "-n"
114 #endif /* OBJECT_FORMAT_NONE */
116 /* Some systems use __main in a way incompatible with its use in gcc, in these
117 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
118 give the same symbol without quotes for an alternative entry point. */
120 #define NAME__MAIN "__main"
123 /* This must match tree.h. */
124 #define DEFAULT_INIT_PRIORITY 65535
126 #ifndef COLLECT_SHARED_INIT_FUNC
127 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
128 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
130 #ifndef COLLECT_SHARED_FINI_FUNC
131 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
132 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
136 #define SCAN_LIBRARIES
140 #define SHLIB_SUFFIX ".so"
144 int do_collecting
= 1;
146 int do_collecting
= 0;
149 /* Cook up an always defined indication of whether we proceed the
150 "EXPORT_LIST" way. */
152 #ifdef COLLECT_EXPORT_LIST
153 #define DO_COLLECT_EXPORT_LIST 1
155 #define DO_COLLECT_EXPORT_LIST 0
158 /* Nonzero if we should suppress the automatic demangling of identifiers
159 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
162 /* Linked lists of constructor and destructor names. */
178 bool vflag
; /* true if -v or --version */
179 static int rflag
; /* true if -r */
180 static int strip_flag
; /* true if -s */
181 #ifdef COLLECT_EXPORT_LIST
182 static int export_flag
; /* true if -bE */
183 static int aix64_flag
; /* true if -b64 */
184 static int aixrtl_flag
; /* true if -brtl */
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 /* Whether we may unlink the output file, which should be set as soon as we
240 know we have successfully produced it. This is typically useful to prevent
241 blindly attempting to unlink a read-only output that the target linker
242 would leave untouched. */
243 bool may_unlink_output_file
= false;
245 #ifdef COLLECT_EXPORT_LIST
246 /* Lists to keep libraries to be scanned for global constructors/destructors. */
247 static struct head libs
; /* list of libraries */
248 static struct path_prefix cmdline_lib_dirs
; /* directories specified with -L */
249 static struct path_prefix libpath_lib_dirs
; /* directories in LIBPATH */
250 static struct path_prefix
*libpaths
[3] = {&cmdline_lib_dirs
,
251 &libpath_lib_dirs
, NULL
};
254 /* List of names of object files containing LTO information.
255 These are a subset of the object file names appearing on the
256 command line, and must be identical, in the sense of pointer
257 equality, with the names passed to maybe_run_lto_and_relink(). */
261 const char *name
; /* Name of object file. */
262 struct lto_object
*next
; /* Next in linked list. */
265 struct lto_object_list
267 struct lto_object
*first
; /* First list element. */
268 struct lto_object
*last
; /* Last list element. */
271 static struct lto_object_list lto_objects
;
273 /* Special kinds of symbols that a name may denote. */
276 SYM_REGULAR
= 0, /* nothing special */
278 SYM_CTOR
= 1, /* constructor */
279 SYM_DTOR
= 2, /* destructor */
280 SYM_INIT
= 3, /* shared object routine that calls all the ctors */
281 SYM_FINI
= 4, /* shared object routine that calls all the dtors */
282 SYM_DWEH
= 5 /* DWARF exception handling table */
285 static symkind
is_ctor_dtor (const char *);
287 static void handler (int);
288 static void do_wait (const char *, struct pex_obj
*);
289 static void fork_execute (const char *, char **);
290 static void maybe_unlink (const char *);
291 static void maybe_unlink_list (char **);
292 static void add_to_list (struct head
*, const char *);
293 static int extract_init_priority (const char *);
294 static void sort_ids (struct head
*);
295 static void write_list (FILE *, const char *, struct id
*);
296 #ifdef COLLECT_EXPORT_LIST
297 static void dump_list (FILE *, const char *, struct id
*);
300 static void dump_prefix_list (FILE *, const char *, struct prefix_list
*);
302 static void write_list_with_asm (FILE *, const char *, struct id
*);
303 static void write_c_file (FILE *, const char *);
304 static void write_c_file_stat (FILE *, const char *);
305 #ifndef LD_INIT_SWITCH
306 static void write_c_file_glob (FILE *, const char *);
308 #ifdef SCAN_LIBRARIES
309 static void scan_libraries (const char *);
311 #ifdef COLLECT_EXPORT_LIST
313 static int is_in_list (const char *, struct id
*);
315 static void write_aix_file (FILE *, struct id
*);
316 static char *resolve_lib_name (const char *);
318 static char *extract_string (const char **);
319 static void post_ld_pass (bool);
320 static void process_args (int *argcp
, char **argv
);
322 /* Enumerations describing which pass this is for scanning the
326 PASS_FIRST
, /* without constructors */
327 PASS_OBJ
, /* individual objects */
328 PASS_LIB
, /* looking for shared libraries */
329 PASS_SECOND
, /* with constructors linked in */
330 PASS_LTOINFO
/* looking for objects with LTO info */
333 /* ... and which kinds of symbols are to be considered. */
335 enum scanfilter_masks
{
338 SCAN_CTOR
= 1 << SYM_CTOR
,
339 SCAN_DTOR
= 1 << SYM_DTOR
,
340 SCAN_INIT
= 1 << SYM_INIT
,
341 SCAN_FINI
= 1 << SYM_FINI
,
342 SCAN_DWEH
= 1 << SYM_DWEH
,
346 /* This type is used for parameters and variables which hold
347 combinations of the flags in enum scanfilter_masks. */
348 typedef int scanfilter
;
350 /* Scan the name list of the loaded program for the symbols g++ uses for
351 static constructors and destructors.
353 The SCANPASS argument tells which collect processing pass this is for and
354 the SCANFILTER argument tells which kinds of symbols to consider in this
355 pass. Symbols of a special kind not in the filter mask are considered as
358 The constructor table begins at __CTOR_LIST__ and contains a count of the
359 number of pointers (or -1 if the constructors are built in a separate
360 section by the linker), followed by the pointers to the constructor
361 functions, terminated with a null pointer. The destructor table has the
362 same format, and begins at __DTOR_LIST__. */
364 static void scan_prog_file (const char *, scanpass
, scanfilter
);
367 /* Delete tempfiles and exit function. */
370 collect_atexit (void)
372 if (c_file
!= 0 && c_file
[0])
373 maybe_unlink (c_file
);
375 if (o_file
!= 0 && o_file
[0])
376 maybe_unlink (o_file
);
378 #ifdef COLLECT_EXPORT_LIST
379 if (export_file
!= 0 && export_file
[0])
380 maybe_unlink (export_file
);
384 maybe_unlink_list (lto_o_files
);
386 if (ldout
!= 0 && ldout
[0])
388 dump_ld_file (ldout
, stdout
);
389 maybe_unlink (ldout
);
392 if (lderrout
!= 0 && lderrout
[0])
394 dump_ld_file (lderrout
, stderr
);
395 maybe_unlink (lderrout
);
399 maybe_unlink (response_file
);
403 /* Notify user of a non-error. */
405 notice (const char *cmsgid
, ...)
409 va_start (ap
, cmsgid
);
410 vfprintf (stderr
, _(cmsgid
), ap
);
414 /* Notify user of a non-error, without translating the format string. */
416 notice_translated (const char *cmsgid
, ...)
420 va_start (ap
, cmsgid
);
421 vfprintf (stderr
, cmsgid
, ap
);
428 if (c_file
!= 0 && c_file
[0])
429 maybe_unlink (c_file
);
431 if (o_file
!= 0 && o_file
[0])
432 maybe_unlink (o_file
);
434 if (ldout
!= 0 && ldout
[0])
435 maybe_unlink (ldout
);
437 if (lderrout
!= 0 && lderrout
[0])
438 maybe_unlink (lderrout
);
440 #ifdef COLLECT_EXPORT_LIST
441 if (export_file
!= 0 && export_file
[0])
442 maybe_unlink (export_file
);
446 maybe_unlink_list (lto_o_files
);
449 maybe_unlink (response_file
);
451 signal (signo
, SIG_DFL
);
457 file_exists (const char *name
)
459 return access (name
, R_OK
) == 0;
462 /* Parse a reasonable subset of shell quoting syntax. */
465 extract_string (const char **pp
)
478 obstack_1grow (&temporary_obstack
, c
);
479 else if (! inside
&& c
== ' ')
481 else if (! inside
&& c
== '\\')
486 obstack_1grow (&temporary_obstack
, c
);
489 obstack_1grow (&temporary_obstack
, '\0');
491 return XOBFINISH (&temporary_obstack
, char *);
495 dump_ld_file (const char *name
, FILE *to
)
497 FILE *stream
= fopen (name
, "r");
504 while (c
= getc (stream
),
505 c
!= EOF
&& (ISIDNUM (c
) || c
== '$' || c
== '.'))
506 obstack_1grow (&temporary_obstack
, c
);
507 if (obstack_object_size (&temporary_obstack
) > 0)
509 const char *word
, *p
;
511 obstack_1grow (&temporary_obstack
, '\0');
512 word
= XOBFINISH (&temporary_obstack
, const char *);
515 ++word
, putc ('.', to
);
517 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
518 p
+= strlen (USER_LABEL_PREFIX
);
520 #ifdef HAVE_LD_DEMANGLE
526 result
= cplus_demangle (p
, DMGL_PARAMS
| DMGL_ANSI
| DMGL_VERBOSE
);
534 diff
= strlen (word
) - strlen (result
);
535 while (diff
> 0 && c
== ' ')
536 --diff
, putc (' ', to
);
537 if (diff
< 0 && c
== ' ')
539 while (diff
< 0 && c
== ' ')
540 ++diff
, c
= getc (stream
);
543 /* Make sure we output at least one space, or
544 the demangled symbol name will run into
545 whatever text follows. */
556 obstack_free (&temporary_obstack
, temporary_firstobj
);
565 /* Return the kind of symbol denoted by name S. */
568 is_ctor_dtor (const char *s
)
570 struct names
{ const char *const name
; const int len
; symkind ret
;
571 const int two_underscores
; };
573 const struct names
*p
;
575 const char *orig_s
= s
;
577 static const struct names special
[] = {
578 #ifndef NO_DOLLAR_IN_LABEL
579 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR
, 0 },
580 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR
, 0 },
582 #ifndef NO_DOT_IN_LABEL
583 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR
, 0 },
584 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR
, 0 },
585 #endif /* NO_DOT_IN_LABEL */
586 #endif /* NO_DOLLAR_IN_LABEL */
587 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR
, 0 },
588 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR
, 0 },
589 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH
, 0 },
590 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT
, 0 },
591 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI
, 0 },
592 { NULL
, 0, SYM_REGULAR
, 0 }
595 while ((ch
= *s
) == '_')
601 for (p
= &special
[0]; p
->len
> 0; p
++)
604 && (!p
->two_underscores
|| ((s
- orig_s
) >= 2))
605 && strncmp (s
, p
->name
, p
->len
) == 0)
613 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
614 and one from the PATH variable. */
616 static struct path_prefix cpath
, path
;
618 #ifdef CROSS_DIRECTORY_STRUCTURE
619 /* This is the name of the target machine. We use it to form the name
620 of the files to execute. */
622 static const char *const target_machine
= TARGET_MACHINE
;
625 /* Search for NAME using prefix list PPREFIX. We only look for executable
628 Return 0 if not found, otherwise return its name, allocated with malloc. */
630 #ifdef OBJECT_FORMAT_NONE
632 /* Add an entry for the object file NAME to object file list LIST.
633 New entries are added at the end of the list. The original pointer
634 value of NAME is preserved, i.e., no string copy is performed. */
637 add_lto_object (struct lto_object_list
*list
, const char *name
)
639 struct lto_object
*n
= XNEW (struct lto_object
);
644 list
->last
->next
= n
;
650 #endif /* OBJECT_FORMAT_NONE */
653 /* Perform a link-time recompilation and relink if any of the object
654 files contain LTO info. The linker command line LTO_LD_ARGV
655 represents the linker command that would produce a final executable
656 without the use of LTO. OBJECT_LST is a vector of object file names
657 appearing in LTO_LD_ARGV that are to be considered for link-time
658 recompilation, where OBJECT is a pointer to the last valid element.
659 (This awkward convention avoids an impedance mismatch with the
660 usage of similarly-named variables in main().) The elements of
661 OBJECT_LST must be identical, i.e., pointer equal, to the
662 corresponding arguments in LTO_LD_ARGV.
664 Upon entry, at least one linker run has been performed without the
665 use of any LTO info that might be present. Any recompilations
666 necessary for template instantiations have been performed, and
667 initializer/finalizer tables have been created if needed and
668 included in the linker command line LTO_LD_ARGV. If any of the
669 object files contain LTO info, we run the LTO back end on all such
670 files, and perform the final link with the LTO back end output
671 substituted for the LTO-optimized files. In some cases, a final
672 link with all link-time generated code has already been performed,
673 so there is no need to relink if no LTO info is found. In other
674 cases, our caller has not produced the final executable, and is
675 relying on us to perform the required link whether LTO info is
676 present or not. In that case, the FORCE argument should be true.
677 Note that the linker command line argument LTO_LD_ARGV passed into
678 this function may be modified in place. */
681 maybe_run_lto_and_relink (char **lto_ld_argv
, char **object_lst
,
682 const char **object
, bool force
)
684 const char **object_file
= CONST_CAST2 (const char **, char **, object_lst
);
686 int num_lto_c_args
= 1; /* Allow space for the terminating NULL. */
688 while (object_file
< object
)
690 /* If file contains LTO info, add it to the list of LTO objects. */
691 scan_prog_file (*object_file
++, PASS_LTOINFO
, SCAN_ALL
);
693 /* Increment the argument count by the number of object file arguments
694 we will add. An upper bound suffices, so just count all of the
695 object files regardless of whether they contain LTO info. */
699 if (lto_objects
.first
)
702 const char **lto_c_ptr
;
705 struct lto_object
*list
;
706 char *lto_wrapper
= getenv ("COLLECT_LTO_WRAPPER");
708 const char *prog
= "lto-wrapper";
709 int lto_ld_argv_size
= 0;
710 char **out_lto_ld_argv
;
711 int out_lto_ld_argv_size
;
715 fatal_error ("COLLECT_LTO_WRAPPER must be set");
719 /* There is at least one object file containing LTO info,
720 so we need to run the LTO back end and relink.
722 To do so we build updated ld arguments with first
723 LTO object replaced by all partitions and other LTO
726 lto_c_argv
= (char **) xcalloc (sizeof (char *), num_lto_c_args
);
727 lto_c_ptr
= CONST_CAST2 (const char **, char **, lto_c_argv
);
729 *lto_c_ptr
++ = lto_wrapper
;
731 /* Add LTO objects to the wrapper command line. */
732 for (list
= lto_objects
.first
; list
; list
= list
->next
)
733 *lto_c_ptr
++ = list
->name
;
737 /* Run the LTO back end. */
738 pex
= collect_execute (prog
, lto_c_argv
, NULL
, NULL
, PEX_SEARCH
);
745 stream
= pex_read_output (pex
, 0);
749 while ((c
= getc (stream
)) != EOF
)
751 obstack_1grow (&temporary_obstack
, c
);
756 lto_o_files
= XNEWVEC (char *, num_files
+ 1);
757 lto_o_files
[num_files
] = NULL
;
758 start
= XOBFINISH (&temporary_obstack
, char *);
759 for (i
= 0; i
< num_files
; ++i
)
766 lto_o_files
[i
] = xstrdup (start
);
771 obstack_free (&temporary_obstack
, temporary_firstobj
);
776 /* Compute memory needed for new LD arguments. At most number of original arguemtns
777 plus number of partitions. */
778 for (lto_ld_argv_size
= 0; lto_ld_argv
[lto_ld_argv_size
]; lto_ld_argv_size
++)
780 out_lto_ld_argv
= XCNEWVEC (char *, num_files
+ lto_ld_argv_size
+ 1);
781 out_lto_ld_argv_size
= 0;
783 /* After running the LTO back end, we will relink, substituting
784 the LTO output for the object files that we submitted to the
785 LTO. Here, we modify the linker command line for the relink. */
787 /* Copy all arguments until we find first LTO file. */
791 for (list
= lto_objects
.first
; list
; list
= list
->next
)
792 if (*p
== list
->name
) /* Note test for pointer equality! */
796 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
++;
799 /* Now insert all LTO partitions. */
800 lto_o_ptr
= lto_o_files
;
802 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *lto_o_ptr
++;
804 /* ... and copy the rest. */
807 for (list
= lto_objects
.first
; list
; list
= list
->next
)
808 if (*p
== list
->name
) /* Note test for pointer equality! */
811 out_lto_ld_argv
[out_lto_ld_argv_size
++] = *p
;
814 out_lto_ld_argv
[out_lto_ld_argv_size
++] = 0;
816 /* Run the linker again, this time replacing the object files
817 optimized by the LTO with the temporary file generated by the LTO. */
818 fork_execute ("ld", out_lto_ld_argv
);
822 maybe_unlink_list (lto_o_files
);
826 /* Our caller is relying on us to do the link
827 even though there is no LTO back end work to be done. */
828 fork_execute ("ld", lto_ld_argv
);
829 post_ld_pass (false);
836 main (int argc
, char **argv
)
845 } selected_linker
= USE_DEFAULT_LD
;
846 static const char *const ld_suffixes
[USE_LD_MAX
] =
853 static const char *const real_ld_suffix
= "real-ld";
854 static const char *const collect_ld_suffix
= "collect-ld";
855 static const char *const nm_suffix
= "nm";
856 static const char *const gnm_suffix
= "gnm";
858 static const char *const ldd_suffix
= LDD_SUFFIX
;
860 static const char *const strip_suffix
= "strip";
861 static const char *const gstrip_suffix
= "gstrip";
863 const char *full_ld_suffixes
[USE_LD_MAX
];
864 #ifdef CROSS_DIRECTORY_STRUCTURE
865 /* If we look for a program in the compiler directories, we just use
866 the short name, since these directories are already system-specific.
867 But it we look for a program in the system directories, we need to
868 qualify the program name with the target machine. */
870 const char *const full_nm_suffix
=
871 concat (target_machine
, "-", nm_suffix
, NULL
);
872 const char *const full_gnm_suffix
=
873 concat (target_machine
, "-", gnm_suffix
, NULL
);
875 const char *const full_ldd_suffix
=
876 concat (target_machine
, "-", ldd_suffix
, NULL
);
878 const char *const full_strip_suffix
=
879 concat (target_machine
, "-", strip_suffix
, NULL
);
880 const char *const full_gstrip_suffix
=
881 concat (target_machine
, "-", gstrip_suffix
, NULL
);
884 const char *const full_ldd_suffix
= ldd_suffix
;
886 const char *const full_nm_suffix
= nm_suffix
;
887 const char *const full_gnm_suffix
= gnm_suffix
;
888 const char *const full_strip_suffix
= strip_suffix
;
889 const char *const full_gstrip_suffix
= gstrip_suffix
;
890 #endif /* CROSS_DIRECTORY_STRUCTURE */
894 #ifdef COLLECT_EXPORT_LIST
897 const char *ld_file_name
;
903 bool use_plugin
= false;
904 bool use_collect_ld
= false;
906 /* The kinds of symbols we will have to consider when scanning the
907 outcome of a first pass link. This is ALL to start with, then might
908 be adjusted before getting to the first pass link per se, typically on
909 AIX where we perform an early scan of objects and libraries to fetch
910 the list of global ctors/dtors and make sure they are not garbage
912 scanfilter ld1_filter
= SCAN_ALL
;
918 #ifdef TARGET_AIX_VERSION
919 int object_nbr
= argc
;
926 for (i
= 0; i
< USE_LD_MAX
; i
++)
928 #ifdef CROSS_DIRECTORY_STRUCTURE
929 = concat (target_machine
, "-", ld_suffixes
[i
], NULL
);
934 p
= argv
[0] + strlen (argv
[0]);
935 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
939 xmalloc_set_program_name (progname
);
942 expandargv (&argc
, &argv
);
943 if (argv
!= old_argv
)
944 at_file_supplied
= 1;
946 process_args (&argc
, argv
);
948 num_c_args
= argc
+ 9;
950 #ifndef HAVE_LD_DEMANGLE
951 no_demangle
= !! getenv ("COLLECT_NO_DEMANGLE");
953 /* Suppress demangling by the real linker, which may be broken. */
954 putenv (xstrdup ("COLLECT_NO_DEMANGLE=1"));
957 #if defined (COLLECT2_HOST_INITIALIZATION)
958 /* Perform system dependent initialization, if necessary. */
959 COLLECT2_HOST_INITIALIZATION
;
963 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
964 receive the signal. A different setting is inheritable */
965 signal (SIGCHLD
, SIG_DFL
);
968 if (atexit (collect_atexit
) != 0)
969 fatal_error ("atexit failed");
971 /* Unlock the stdio streams. */
972 unlock_std_streams ();
976 diagnostic_initialize (global_dc
, 0);
978 /* Do not invoke xcalloc before this point, since locale needs to be
979 set first, in case a diagnostic is issued. */
981 ld1_argv
= XCNEWVEC (char *, argc
+ 4);
982 ld1
= CONST_CAST2 (const char **, char **, ld1_argv
);
983 ld2_argv
= XCNEWVEC (char *, argc
+ 11);
984 ld2
= CONST_CAST2 (const char **, char **, ld2_argv
);
985 object_lst
= XCNEWVEC (char *, argc
);
986 object
= CONST_CAST2 (const char **, char **, object_lst
);
992 /* Parse command line early for instances of -debug. This allows
993 the debug flag to be set before functions like find_a_file()
994 are called. We also look for the -flto or -flto-partition=none flag to know
995 what LTO mode we are in. */
997 bool no_partition
= false;
999 for (i
= 1; argv
[i
] != NULL
; i
++)
1001 if (! strcmp (argv
[i
], "-debug"))
1003 else if (! strcmp (argv
[i
], "-flto-partition=none"))
1004 no_partition
= true;
1005 else if ((! strncmp (argv
[i
], "-flto=", 6)
1006 || ! strcmp (argv
[i
], "-flto")) && ! use_plugin
)
1007 lto_mode
= LTO_MODE_WHOPR
;
1008 else if (!strncmp (argv
[i
], "-fno-lto", 8))
1009 lto_mode
= LTO_MODE_NONE
;
1010 else if (! strcmp (argv
[i
], "-plugin"))
1013 lto_mode
= LTO_MODE_NONE
;
1014 if (selected_linker
== USE_DEFAULT_LD
)
1015 selected_linker
= USE_PLUGIN_LD
;
1017 else if (strcmp (argv
[i
], "-fuse-ld=bfd") == 0)
1018 selected_linker
= USE_BFD_LD
;
1019 else if (strcmp (argv
[i
], "-fuse-ld=gold") == 0)
1020 selected_linker
= USE_GOLD_LD
;
1022 #ifdef COLLECT_EXPORT_LIST
1023 /* These flags are position independent, although their order
1024 is important - subsequent flags override earlier ones. */
1025 else if (strcmp (argv
[i
], "-b64") == 0)
1027 /* -bexport:filename always needs the :filename */
1028 else if (strncmp (argv
[i
], "-bE:", 4) == 0
1029 || strncmp (argv
[i
], "-bexport:", 9) == 0)
1031 else if (strcmp (argv
[i
], "-brtl") == 0
1032 || strcmp (argv
[i
], "-bsvr4") == 0
1033 || strcmp (argv
[i
], "-G") == 0)
1035 else if (strcmp (argv
[i
], "-bnortl") == 0)
1040 find_file_set_debug (debug
);
1041 if (no_partition
&& lto_mode
== LTO_MODE_WHOPR
)
1042 lto_mode
= LTO_MODE_LTO
;
1045 #ifndef DEFAULT_A_OUT_NAME
1046 output_file
= "a.out";
1048 output_file
= DEFAULT_A_OUT_NAME
;
1051 obstack_begin (&temporary_obstack
, 0);
1052 temporary_firstobj
= (char *) obstack_alloc (&temporary_obstack
, 0);
1054 #ifndef HAVE_LD_DEMANGLE
1055 current_demangling_style
= auto_demangling
;
1057 p
= getenv ("COLLECT_GCC_OPTIONS");
1060 const char *q
= extract_string (&p
);
1061 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1064 obstack_free (&temporary_obstack
, temporary_firstobj
);
1066 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1067 -fno-exceptions -w -fno-whole-program */
1070 c_argv
= XCNEWVEC (char *, num_c_args
);
1071 c_ptr
= CONST_CAST2 (const char **, char **, c_argv
);
1074 fatal_error ("no arguments");
1077 if (signal (SIGQUIT
, SIG_IGN
) != SIG_IGN
)
1078 signal (SIGQUIT
, handler
);
1080 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1081 signal (SIGINT
, handler
);
1083 if (signal (SIGALRM
, SIG_IGN
) != SIG_IGN
)
1084 signal (SIGALRM
, handler
);
1087 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1088 signal (SIGHUP
, handler
);
1090 if (signal (SIGSEGV
, SIG_IGN
) != SIG_IGN
)
1091 signal (SIGSEGV
, handler
);
1093 if (signal (SIGBUS
, SIG_IGN
) != SIG_IGN
)
1094 signal (SIGBUS
, handler
);
1097 /* Extract COMPILER_PATH and PATH into our prefix list. */
1098 prefix_from_env ("COMPILER_PATH", &cpath
);
1099 prefix_from_env ("PATH", &path
);
1101 /* Try to discover a valid linker/nm/strip to use. */
1103 /* Maybe we know the right file to use (if not cross). */
1105 #ifdef DEFAULT_LINKER
1106 if (access (DEFAULT_LINKER
, X_OK
) == 0)
1107 ld_file_name
= DEFAULT_LINKER
;
1108 if (ld_file_name
== 0)
1110 #ifdef REAL_LD_FILE_NAME
1111 ld_file_name
= find_a_file (&path
, REAL_LD_FILE_NAME
, X_OK
);
1112 if (ld_file_name
== 0)
1114 /* Search the (target-specific) compiler dirs for ld'. */
1115 ld_file_name
= find_a_file (&cpath
, real_ld_suffix
, X_OK
);
1116 /* Likewise for `collect-ld'. */
1117 if (ld_file_name
== 0)
1119 ld_file_name
= find_a_file (&cpath
, collect_ld_suffix
, X_OK
);
1120 use_collect_ld
= ld_file_name
!= 0;
1122 /* Search the compiler directories for `ld'. We have protection against
1123 recursive calls in find_a_file. */
1124 if (ld_file_name
== 0)
1125 ld_file_name
= find_a_file (&cpath
, ld_suffixes
[selected_linker
], X_OK
);
1126 /* Search the ordinary system bin directories
1127 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1128 if (ld_file_name
== 0)
1129 ld_file_name
= find_a_file (&path
, full_ld_suffixes
[selected_linker
], X_OK
);
1131 #ifdef REAL_NM_FILE_NAME
1132 nm_file_name
= find_a_file (&path
, REAL_NM_FILE_NAME
, X_OK
);
1133 if (nm_file_name
== 0)
1135 nm_file_name
= find_a_file (&cpath
, gnm_suffix
, X_OK
);
1136 if (nm_file_name
== 0)
1137 nm_file_name
= find_a_file (&path
, full_gnm_suffix
, X_OK
);
1138 if (nm_file_name
== 0)
1139 nm_file_name
= find_a_file (&cpath
, nm_suffix
, X_OK
);
1140 if (nm_file_name
== 0)
1141 nm_file_name
= find_a_file (&path
, full_nm_suffix
, X_OK
);
1144 ldd_file_name
= find_a_file (&cpath
, ldd_suffix
, X_OK
);
1145 if (ldd_file_name
== 0)
1146 ldd_file_name
= find_a_file (&path
, full_ldd_suffix
, X_OK
);
1149 #ifdef REAL_STRIP_FILE_NAME
1150 strip_file_name
= find_a_file (&path
, REAL_STRIP_FILE_NAME
, X_OK
);
1151 if (strip_file_name
== 0)
1153 strip_file_name
= find_a_file (&cpath
, gstrip_suffix
, X_OK
);
1154 if (strip_file_name
== 0)
1155 strip_file_name
= find_a_file (&path
, full_gstrip_suffix
, X_OK
);
1156 if (strip_file_name
== 0)
1157 strip_file_name
= find_a_file (&cpath
, strip_suffix
, X_OK
);
1158 if (strip_file_name
== 0)
1159 strip_file_name
= find_a_file (&path
, full_strip_suffix
, X_OK
);
1161 /* Determine the full path name of the C compiler to use. */
1162 c_file_name
= getenv ("COLLECT_GCC");
1163 if (c_file_name
== 0)
1165 #ifdef CROSS_DIRECTORY_STRUCTURE
1166 c_file_name
= concat (target_machine
, "-gcc", NULL
);
1168 c_file_name
= "gcc";
1172 p
= find_a_file (&cpath
, c_file_name
, X_OK
);
1174 /* Here it should be safe to use the system search path since we should have
1175 already qualified the name of the compiler when it is needed. */
1177 p
= find_a_file (&path
, c_file_name
, X_OK
);
1182 *ld1
++ = *ld2
++ = ld_file_name
;
1184 /* Make temp file names. */
1185 c_file
= make_temp_file (".c");
1186 o_file
= make_temp_file (".o");
1187 #ifdef COLLECT_EXPORT_LIST
1188 export_file
= make_temp_file (".x");
1192 ldout
= make_temp_file (".ld");
1193 lderrout
= make_temp_file (".le");
1195 *c_ptr
++ = c_file_name
;
1202 #ifdef COLLECT_EXPORT_LIST
1203 /* Generate a list of directories from LIBPATH. */
1204 prefix_from_env ("LIBPATH", &libpath_lib_dirs
);
1205 /* Add to this list also two standard directories where
1206 AIX loader always searches for libraries. */
1207 add_prefix (&libpath_lib_dirs
, "/lib");
1208 add_prefix (&libpath_lib_dirs
, "/usr/lib");
1211 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1213 AIX support needs to know if -shared has been specified before
1214 parsing commandline arguments. */
1216 p
= getenv ("COLLECT_GCC_OPTIONS");
1219 const char *q
= extract_string (&p
);
1220 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1221 *c_ptr
++ = xstrdup (q
);
1222 if (strcmp (q
, "-EL") == 0 || strcmp (q
, "-EB") == 0)
1223 *c_ptr
++ = xstrdup (q
);
1224 if (strcmp (q
, "-shared") == 0)
1226 if (*q
== '-' && q
[1] == 'B')
1228 *c_ptr
++ = xstrdup (q
);
1231 q
= extract_string (&p
);
1232 *c_ptr
++ = xstrdup (q
);
1236 obstack_free (&temporary_obstack
, temporary_firstobj
);
1237 *c_ptr
++ = "-fno-profile-arcs";
1238 *c_ptr
++ = "-fno-test-coverage";
1239 *c_ptr
++ = "-fno-branch-probabilities";
1240 *c_ptr
++ = "-fno-exceptions";
1242 *c_ptr
++ = "-fno-whole-program";
1244 /* !!! When GCC calls collect2,
1245 it does not know whether it is calling collect2 or ld.
1246 So collect2 cannot meaningfully understand any options
1247 except those ld understands.
1248 If you propose to make GCC pass some other option,
1249 just imagine what will happen if ld is really ld!!! */
1251 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1252 /* After the first file, put in the c++ rt0. */
1255 while ((arg
= *++argv
) != (char *) 0)
1257 *ld1
++ = *ld2
++ = arg
;
1264 if (!strcmp (arg
, "-debug"))
1266 /* Already parsed. */
1270 if (!strcmp (arg
, "-dynamic-linker") && argv
[1])
1273 *ld1
++ = *ld2
++ = *argv
;
1278 if (strncmp (arg
, "-flto", 5) == 0)
1281 /* Do not pass LTO flag to the linker. */
1285 error ("LTO support has not been enabled in this "
1289 else if (!use_collect_ld
1290 && strncmp (arg
, "-fuse-ld=", 9) == 0)
1292 /* Do not pass -fuse-ld={bfd|gold} to the linker. */
1296 #ifdef TARGET_AIX_VERSION
1299 /* File containing a list of input files to process. */
1302 char buf
[MAXPATHLEN
+ 2];
1303 /* Number of additionnal object files. */
1305 /* Maximum of additionnal object files before vector
1308 const char *list_filename
= arg
+ 2;
1310 /* Accept -fFILENAME and -f FILENAME. */
1311 if (*list_filename
== '\0' && argv
[1])
1314 list_filename
= *argv
;
1315 *ld1
++ = *ld2
++ = *argv
;
1318 stream
= fopen (list_filename
, "r");
1320 fatal_error ("can't open %s: %m", list_filename
);
1322 while (fgets (buf
, sizeof buf
, stream
) != NULL
)
1324 /* Remove end of line. */
1325 int len
= strlen (buf
);
1326 if (len
>= 1 && buf
[len
- 1] =='\n')
1327 buf
[len
- 1] = '\0';
1329 /* Put on object vector.
1330 Note: we only expanse vector here, so we must keep
1331 extra space for remaining arguments. */
1332 if (add_nbr
>= add_max
)
1335 object
- CONST_CAST2 (const char **, char **,
1337 add_max
= (add_max
== 0) ? 16 : add_max
* 2;
1338 object_lst
= XRESIZEVEC (char *, object_lst
,
1339 object_nbr
+ add_max
);
1340 object
= CONST_CAST2 (const char **, char **,
1342 object_nbr
+= add_max
;
1344 *object
++ = xstrdup (buf
);
1355 /* place o_file BEFORE this argument! */
1361 #ifdef COLLECT_EXPORT_LIST
1363 /* Resolving full library name. */
1364 const char *s
= resolve_lib_name (arg
+2);
1366 /* Saving a full library name. */
1367 add_to_list (&libs
, s
);
1372 #ifdef COLLECT_EXPORT_LIST
1373 /* Saving directories where to search for libraries. */
1375 add_prefix (&cmdline_lib_dirs
, arg
+2);
1381 output_file
= *ld1
++ = *ld2
++ = *++argv
;
1383 output_file
= &arg
[2];
1392 if (arg
[2] == '\0' && do_collecting
)
1394 /* We must strip after the nm run, otherwise C++ linking
1395 will not work. Thus we strip in the second ld run, or
1396 else with strip if there is no second ld run. */
1408 if (strcmp (arg
, "--no-demangle") == 0)
1410 #ifndef HAVE_LD_DEMANGLE
1416 else if (strncmp (arg
, "--demangle", 10) == 0)
1418 #ifndef HAVE_LD_DEMANGLE
1422 enum demangling_styles style
1423 = cplus_demangle_name_to_style (arg
+11);
1424 if (style
== unknown_demangling
)
1425 error ("unknown demangling style '%s'", arg
+11);
1427 current_demangling_style
= style
;
1433 else if (strncmp (arg
, "--sysroot=", 10) == 0)
1434 target_system_root
= arg
+ 10;
1435 else if (strcmp (arg
, "--version") == 0)
1437 else if (strcmp (arg
, "--help") == 0)
1442 else if ((p
= strrchr (arg
, '.')) != (char *) 0
1443 && (strcmp (p
, ".o") == 0 || strcmp (p
, ".a") == 0
1444 || strcmp (p
, ".so") == 0 || strcmp (p
, ".lo") == 0
1445 || strcmp (p
, ".obj") == 0))
1454 /* place o_file BEFORE this argument! */
1460 if (p
[1] == 'o' || p
[1] == 'l')
1462 #ifdef COLLECT_EXPORT_LIST
1463 /* libraries can be specified directly, i.e. without -l flag. */
1466 /* Saving a full library name. */
1467 add_to_list (&libs
, arg
);
1473 #ifdef COLLECT_EXPORT_LIST
1474 /* This is added only for debugging purposes. */
1477 fprintf (stderr
, "List of libraries:\n");
1478 dump_list (stderr
, "\t", libs
.first
);
1481 /* The AIX linker will discard static constructors in object files if
1482 nothing else in the file is referenced, so look at them first. Unless
1483 we are building a shared object, ignore the eh frame tables, as we
1484 would otherwise reference them all, hence drag all the corresponding
1485 objects even if nothing else is referenced. */
1487 const char **export_object_lst
1488 = CONST_CAST2 (const char **, char **, object_lst
);
1490 struct id
*list
= libs
.first
;
1492 /* Compute the filter to use from the current one, do scan, then adjust
1493 the "current" filter to remove what we just included here. This will
1494 control whether we need a first pass link later on or not, and what
1495 will remain to be scanned there. */
1497 scanfilter this_filter
= ld1_filter
;
1500 this_filter
&= ~SCAN_DWEH
;
1503 while (export_object_lst
< object
)
1504 scan_prog_file (*export_object_lst
++, PASS_OBJ
, this_filter
);
1506 for (; list
; list
= list
->next
)
1507 scan_prog_file (list
->name
, PASS_FIRST
, this_filter
);
1509 ld1_filter
= ld1_filter
& ~this_filter
;
1514 char *buf
= concat ("-bE:", export_file
, NULL
);
1519 exportf
= fopen (export_file
, "w");
1520 if (exportf
== (FILE *) 0)
1521 fatal_error ("fopen %s: %m", export_file
);
1522 write_aix_file (exportf
, exports
.first
);
1523 if (fclose (exportf
))
1524 fatal_error ("fclose %s: %m", export_file
);
1529 *c_ptr
= *ld1
= *object
= (char *) 0;
1532 notice ("collect2 version %s\n", version_string
);
1536 printf ("Usage: collect2 [options]\n");
1537 printf (" Wrap linker and generate constructor code if needed.\n");
1538 printf (" Options:\n");
1539 printf (" -debug Enable debug output\n");
1540 printf (" --help Display this information\n");
1541 printf (" -v, --version Display this program's version number\n");
1543 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1544 printf ("Report bugs: %s\n", bug_report_url
);
1551 fprintf (stderr
, "ld_file_name = %s\n",
1552 (ld_file_name
? ld_file_name
: "not found"));
1553 fprintf (stderr
, "c_file_name = %s\n",
1554 (c_file_name
? c_file_name
: "not found"));
1555 fprintf (stderr
, "nm_file_name = %s\n",
1556 (nm_file_name
? nm_file_name
: "not found"));
1558 fprintf (stderr
, "ldd_file_name = %s\n",
1559 (ldd_file_name
? ldd_file_name
: "not found"));
1561 fprintf (stderr
, "strip_file_name = %s\n",
1562 (strip_file_name
? strip_file_name
: "not found"));
1563 fprintf (stderr
, "c_file = %s\n",
1564 (c_file
? c_file
: "not found"));
1565 fprintf (stderr
, "o_file = %s\n",
1566 (o_file
? o_file
: "not found"));
1568 ptr
= getenv ("COLLECT_GCC_OPTIONS");
1570 fprintf (stderr
, "COLLECT_GCC_OPTIONS = %s\n", ptr
);
1572 ptr
= getenv ("COLLECT_GCC");
1574 fprintf (stderr
, "COLLECT_GCC = %s\n", ptr
);
1576 ptr
= getenv ("COMPILER_PATH");
1578 fprintf (stderr
, "COMPILER_PATH = %s\n", ptr
);
1580 ptr
= getenv (LIBRARY_PATH_ENV
);
1582 fprintf (stderr
, "%-20s= %s\n", LIBRARY_PATH_ENV
, ptr
);
1584 fprintf (stderr
, "\n");
1587 /* Load the program, searching all libraries and attempting to provide
1588 undefined symbols from repository information.
1590 If -r or they will be run via some other method, do not build the
1591 constructor or destructor list, just return now. */
1594 = rflag
|| (! DO_COLLECT_EXPORT_LIST
&& ! do_collecting
);
1596 /* Perform the first pass link now, if we're about to exit or if we need
1597 to scan for things we haven't collected yet before pursuing further.
1599 On AIX, the latter typically includes nothing for shared objects or
1600 frame tables for an executable, out of what the required early scan on
1601 objects and libraries has performed above. In the !shared_obj case, we
1602 expect the relevant tables to be dragged together with their associated
1603 functions from precise cross reference insertions by the compiler. */
1605 if (early_exit
|| ld1_filter
!= SCAN_NOTHING
)
1606 do_tlink (ld1_argv
, object_lst
);
1610 #ifdef COLLECT_EXPORT_LIST
1611 /* Make sure we delete the export file we may have created. */
1612 if (export_file
!= 0 && export_file
[0])
1613 maybe_unlink (export_file
);
1615 if (lto_mode
!= LTO_MODE_NONE
)
1616 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1618 post_ld_pass (false);
1620 maybe_unlink (c_file
);
1621 maybe_unlink (o_file
);
1626 /* Unless we have done it all already, examine the namelist and search for
1627 static constructors and destructors to call. Write the constructor and
1628 destructor tables to a .s file and reload. */
1630 if (ld1_filter
!= SCAN_NOTHING
)
1631 scan_prog_file (output_file
, PASS_FIRST
, ld1_filter
);
1633 #ifdef SCAN_LIBRARIES
1634 scan_libraries (output_file
);
1639 notice_translated (ngettext ("%d constructor found\n",
1640 "%d constructors found\n",
1641 constructors
.number
),
1642 constructors
.number
);
1643 notice_translated (ngettext ("%d destructor found\n",
1644 "%d destructors found\n",
1645 destructors
.number
),
1646 destructors
.number
);
1647 notice_translated (ngettext ("%d frame table found\n",
1648 "%d frame tables found\n",
1649 frame_tables
.number
),
1650 frame_tables
.number
);
1653 /* If the scan exposed nothing of special interest, there's no need to
1654 generate the glue code and relink so return now. */
1656 if (constructors
.number
== 0 && destructors
.number
== 0
1657 && frame_tables
.number
== 0
1658 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1659 /* If we will be running these functions ourselves, we want to emit
1660 stubs into the shared library so that we do not have to relink
1661 dependent programs when we add static objects. */
1666 /* Do tlink without additional code generation now if we didn't
1667 do it earlier for scanning purposes. */
1668 if (ld1_filter
== SCAN_NOTHING
)
1669 do_tlink (ld1_argv
, object_lst
);
1672 maybe_run_lto_and_relink (ld1_argv
, object_lst
, object
, false);
1674 /* Strip now if it was requested on the command line. */
1677 char **real_strip_argv
= XCNEWVEC (char *, 3);
1678 const char ** strip_argv
= CONST_CAST2 (const char **, char **,
1681 strip_argv
[0] = strip_file_name
;
1682 strip_argv
[1] = output_file
;
1683 strip_argv
[2] = (char *) 0;
1684 fork_execute ("strip", real_strip_argv
);
1687 #ifdef COLLECT_EXPORT_LIST
1688 maybe_unlink (export_file
);
1690 post_ld_pass (false);
1692 maybe_unlink (c_file
);
1693 maybe_unlink (o_file
);
1697 /* Sort ctor and dtor lists by priority. */
1698 sort_ids (&constructors
);
1699 sort_ids (&destructors
);
1701 maybe_unlink (output_file
);
1702 outf
= fopen (c_file
, "w");
1703 if (outf
== (FILE *) 0)
1704 fatal_error ("fopen %s: %m", c_file
);
1706 write_c_file (outf
, c_file
);
1709 fatal_error ("fclose %s: %m", c_file
);
1711 /* Tell the linker that we have initializer and finalizer functions. */
1712 #ifdef LD_INIT_SWITCH
1713 #ifdef COLLECT_EXPORT_LIST
1714 *ld2
++ = concat (LD_INIT_SWITCH
, ":", initname
, ":", fininame
, NULL
);
1716 *ld2
++ = LD_INIT_SWITCH
;
1718 *ld2
++ = LD_FINI_SWITCH
;
1723 #ifdef COLLECT_EXPORT_LIST
1726 /* If we did not add export flag to link arguments before, add it to
1727 second link phase now. No new exports should have been added. */
1728 if (! exports
.first
)
1729 *ld2
++ = concat ("-bE:", export_file
, NULL
);
1731 #ifndef LD_INIT_SWITCH
1732 add_to_list (&exports
, initname
);
1733 add_to_list (&exports
, fininame
);
1734 add_to_list (&exports
, "_GLOBAL__DI");
1735 add_to_list (&exports
, "_GLOBAL__DD");
1737 exportf
= fopen (export_file
, "w");
1738 if (exportf
== (FILE *) 0)
1739 fatal_error ("fopen %s: %m", export_file
);
1740 write_aix_file (exportf
, exports
.first
);
1741 if (fclose (exportf
))
1742 fatal_error ("fclose %s: %m", export_file
);
1746 /* End of arguments to second link phase. */
1751 fprintf (stderr
, "\n========== output_file = %s, c_file = %s\n",
1752 output_file
, c_file
);
1753 write_c_file (stderr
, "stderr");
1754 fprintf (stderr
, "========== end of c_file\n\n");
1755 #ifdef COLLECT_EXPORT_LIST
1756 fprintf (stderr
, "\n========== export_file = %s\n", export_file
);
1757 write_aix_file (stderr
, exports
.first
);
1758 fprintf (stderr
, "========== end of export_file\n\n");
1762 /* Assemble the constructor and destructor tables.
1763 Link the tables in with the rest of the program. */
1765 fork_execute ("gcc", c_argv
);
1766 #ifdef COLLECT_EXPORT_LIST
1767 /* On AIX we must call tlink because of possible templates resolution. */
1768 do_tlink (ld2_argv
, object_lst
);
1771 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, false);
1773 /* Otherwise, simply call ld because tlink is already done. */
1775 maybe_run_lto_and_relink (ld2_argv
, object_lst
, object
, true);
1778 fork_execute ("ld", ld2_argv
);
1779 post_ld_pass (false);
1782 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1783 constructors/destructors in shared libraries. */
1784 scan_prog_file (output_file
, PASS_SECOND
, SCAN_ALL
);
1787 maybe_unlink (c_file
);
1788 maybe_unlink (o_file
);
1790 #ifdef COLLECT_EXPORT_LIST
1791 maybe_unlink (export_file
);
1798 /* Wait for a process to finish, and exit if a nonzero status is found. */
1801 collect_wait (const char *prog
, struct pex_obj
*pex
)
1805 if (!pex_get_status (pex
, 1, &status
))
1806 fatal_error ("can't get program status: %m");
1811 if (WIFSIGNALED (status
))
1813 int sig
= WTERMSIG (status
);
1814 error ("%s terminated with signal %d [%s]%s",
1815 prog
, sig
, strsignal (sig
),
1816 WCOREDUMP (status
) ? ", core dumped" : "");
1817 exit (FATAL_EXIT_CODE
);
1820 if (WIFEXITED (status
))
1821 return WEXITSTATUS (status
);
1827 do_wait (const char *prog
, struct pex_obj
*pex
)
1829 int ret
= collect_wait (prog
, pex
);
1832 error ("%s returned %d exit status", prog
, ret
);
1838 unlink (response_file
);
1839 response_file
= NULL
;
1844 /* Execute a program, and wait for the reply. */
1847 collect_execute (const char *prog
, char **argv
, const char *outname
,
1848 const char *errname
, int flags
)
1850 struct pex_obj
*pex
;
1853 char *response_arg
= NULL
;
1854 char *response_argv
[3] ATTRIBUTE_UNUSED
;
1856 if (HAVE_GNU_LD
&& at_file_supplied
&& argv
[0] != NULL
)
1858 /* If using @file arguments, create a temporary file and put the
1859 contents of argv into it. Then change argv to an array corresponding
1860 to a single argument @FILE, where FILE is the temporary filename. */
1862 char **current_argv
= argv
+ 1;
1863 char *argv0
= argv
[0];
1867 /* Note: we assume argv contains at least one element; this is
1870 response_file
= make_temp_file ("");
1872 f
= fopen (response_file
, "w");
1875 fatal_error ("could not open response file %s", response_file
);
1877 status
= writeargv (current_argv
, f
);
1880 fatal_error ("could not write to response file %s", response_file
);
1882 status
= fclose (f
);
1885 fatal_error ("could not close response file %s", response_file
);
1887 response_arg
= concat ("@", response_file
, NULL
);
1888 response_argv
[0] = argv0
;
1889 response_argv
[1] = response_arg
;
1890 response_argv
[2] = NULL
;
1892 argv
= response_argv
;
1901 fprintf (stderr
, "%s", argv
[0]);
1903 notice ("[cannot find %s]", prog
);
1905 for (p_argv
= &argv
[1]; (str
= *p_argv
) != (char *) 0; p_argv
++)
1906 fprintf (stderr
, " %s", str
);
1908 fprintf (stderr
, "\n");
1914 /* If we cannot find a program we need, complain error. Do this here
1915 since we might not end up needing something that we could not find. */
1918 fatal_error ("cannot find '%s'", prog
);
1920 pex
= pex_init (0, "collect2", NULL
);
1922 fatal_error ("pex_init failed: %m");
1924 errmsg
= pex_run (pex
, flags
, argv
[0], argv
, outname
,
1931 fatal_error ("%s: %m", _(errmsg
));
1934 fatal_error (errmsg
);
1937 free (response_arg
);
1943 fork_execute (const char *prog
, char **argv
)
1945 struct pex_obj
*pex
;
1947 pex
= collect_execute (prog
, argv
, NULL
, NULL
, PEX_LAST
| PEX_SEARCH
);
1948 do_wait (prog
, pex
);
1951 /* Unlink FILE unless we are debugging or this is the output_file
1952 and we may not unlink it. */
1955 maybe_unlink (const char *file
)
1959 notice ("[Leaving %s]\n", file
);
1963 if (file
== output_file
&& !may_unlink_output_file
)
1966 unlink_if_ordinary (file
);
1969 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
1972 maybe_unlink_list (char **file_list
)
1974 char **tmp
= file_list
;
1977 maybe_unlink (*(tmp
++));
1981 static long sequence_number
= 0;
1983 /* Add a name to a linked list. */
1986 add_to_list (struct head
*head_ptr
, const char *name
)
1989 = (struct id
*) xcalloc (sizeof (struct id
) + strlen (name
), 1);
1991 strcpy (newid
->name
, name
);
1993 if (head_ptr
->first
)
1994 head_ptr
->last
->next
= newid
;
1996 head_ptr
->first
= newid
;
1998 /* Check for duplicate symbols. */
1999 for (p
= head_ptr
->first
;
2000 strcmp (name
, p
->name
) != 0;
2005 head_ptr
->last
->next
= 0;
2010 newid
->sequence
= ++sequence_number
;
2011 head_ptr
->last
= newid
;
2015 /* Grab the init priority number from an init function name that
2016 looks like "_GLOBAL_.I.12345.foo". */
2019 extract_init_priority (const char *name
)
2023 while (name
[pos
] == '_')
2025 pos
+= 10; /* strlen ("GLOBAL__X_") */
2027 /* Extract init_p number from ctor/dtor name. */
2028 pri
= atoi (name
+ pos
);
2029 return pri
? pri
: DEFAULT_INIT_PRIORITY
;
2032 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2033 ctors will be run from right to left, dtors from left to right. */
2036 sort_ids (struct head
*head_ptr
)
2038 /* id holds the current element to insert. id_next holds the next
2039 element to insert. id_ptr iterates through the already sorted elements
2040 looking for the place to insert id. */
2041 struct id
*id
, *id_next
, **id_ptr
;
2043 id
= head_ptr
->first
;
2045 /* We don't have any sorted elements yet. */
2046 head_ptr
->first
= NULL
;
2048 for (; id
; id
= id_next
)
2051 id
->sequence
= extract_init_priority (id
->name
);
2053 for (id_ptr
= &(head_ptr
->first
); ; id_ptr
= &((*id_ptr
)->next
))
2055 /* If the sequence numbers are the same, we put the id from the
2056 file later on the command line later in the list. */
2057 || id
->sequence
> (*id_ptr
)->sequence
2058 /* Hack: do lexical compare, too.
2059 || (id->sequence == (*id_ptr)->sequence
2060 && strcmp (id->name, (*id_ptr)->name) > 0) */
2069 /* Now set the sequence numbers properly so write_c_file works. */
2070 for (id
= head_ptr
->first
; id
; id
= id
->next
)
2071 id
->sequence
= ++sequence_number
;
2074 /* Write: `prefix', the names on list LIST, `suffix'. */
2077 write_list (FILE *stream
, const char *prefix
, struct id
*list
)
2081 fprintf (stream
, "%sx%d,\n", prefix
, list
->sequence
);
2086 #ifdef COLLECT_EXPORT_LIST
2087 /* This function is really used only on AIX, but may be useful. */
2090 is_in_list (const char *prefix
, struct id
*list
)
2094 if (!strcmp (prefix
, list
->name
)) return 1;
2100 #endif /* COLLECT_EXPORT_LIST */
2102 /* Added for debugging purpose. */
2103 #ifdef COLLECT_EXPORT_LIST
2105 dump_list (FILE *stream
, const char *prefix
, struct id
*list
)
2109 fprintf (stream
, "%s%s,\n", prefix
, list
->name
);
2117 dump_prefix_list (FILE *stream
, const char *prefix
, struct prefix_list
*list
)
2121 fprintf (stream
, "%s%s,\n", prefix
, list
->prefix
);
2128 write_list_with_asm (FILE *stream
, const char *prefix
, struct id
*list
)
2132 fprintf (stream
, "%sx%d __asm__ (\"%s\");\n",
2133 prefix
, list
->sequence
, list
->name
);
2138 /* Write out the constructor and destructor tables statically (for a shared
2139 object), along with the functions to execute them. */
2142 write_c_file_stat (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2146 int frames
= (frame_tables
.number
> 0);
2148 /* Figure out name of output_file, stripping off .so version. */
2149 q
= p
= lbasename (output_file
);
2161 if (filename_ncmp (q
, SHLIB_SUFFIX
, strlen (SHLIB_SUFFIX
)) == 0)
2163 q
+= strlen (SHLIB_SUFFIX
);
2170 /* q points to null at end of the string (or . of the .so version) */
2171 prefix
= XNEWVEC (char, q
- p
+ 1);
2172 strncpy (prefix
, p
, q
- p
);
2174 for (r
= prefix
; *r
; r
++)
2175 if (!ISALNUM ((unsigned char)*r
))
2178 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2179 output_file
, prefix
);
2181 initname
= concat ("_GLOBAL__FI_", prefix
, NULL
);
2182 fininame
= concat ("_GLOBAL__FD_", prefix
, NULL
);
2186 /* Write the tables as C code. */
2188 fprintf (stream
, "static int count;\n");
2189 fprintf (stream
, "typedef void entry_pt();\n");
2190 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2194 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2196 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2197 write_list (stream
, "\t\t&", frame_tables
.first
);
2198 fprintf (stream
, "\t0\n};\n");
2200 /* This must match what's in frame.h. */
2201 fprintf (stream
, "struct object {\n");
2202 fprintf (stream
, " void *pc_begin;\n");
2203 fprintf (stream
, " void *pc_end;\n");
2204 fprintf (stream
, " void *fde_begin;\n");
2205 fprintf (stream
, " void *fde_array;\n");
2206 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2207 fprintf (stream
, " struct object *next;\n");
2208 fprintf (stream
, "};\n");
2210 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2211 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2213 fprintf (stream
, "static void reg_frame () {\n");
2214 fprintf (stream
, "\tstatic struct object ob;\n");
2215 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2216 fprintf (stream
, "\t}\n");
2218 fprintf (stream
, "static void dereg_frame () {\n");
2219 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2220 fprintf (stream
, "\t}\n");
2223 fprintf (stream
, "void %s() {\n", initname
);
2224 if (constructors
.number
> 0 || frames
)
2226 fprintf (stream
, "\tstatic entry_pt *ctors[] = {\n");
2227 write_list (stream
, "\t\t", constructors
.first
);
2229 fprintf (stream
, "\treg_frame,\n");
2230 fprintf (stream
, "\t};\n");
2231 fprintf (stream
, "\tentry_pt **p;\n");
2232 fprintf (stream
, "\tif (count++ != 0) return;\n");
2233 fprintf (stream
, "\tp = ctors + %d;\n", constructors
.number
+ frames
);
2234 fprintf (stream
, "\twhile (p > ctors) (*--p)();\n");
2237 fprintf (stream
, "\t++count;\n");
2238 fprintf (stream
, "}\n");
2239 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2240 fprintf (stream
, "void %s() {\n", fininame
);
2241 if (destructors
.number
> 0 || frames
)
2243 fprintf (stream
, "\tstatic entry_pt *dtors[] = {\n");
2244 write_list (stream
, "\t\t", destructors
.first
);
2246 fprintf (stream
, "\tdereg_frame,\n");
2247 fprintf (stream
, "\t};\n");
2248 fprintf (stream
, "\tentry_pt **p;\n");
2249 fprintf (stream
, "\tif (--count != 0) return;\n");
2250 fprintf (stream
, "\tp = dtors;\n");
2251 fprintf (stream
, "\twhile (p < dtors + %d) (*p++)();\n",
2252 destructors
.number
+ frames
);
2254 fprintf (stream
, "}\n");
2258 COLLECT_SHARED_INIT_FUNC (stream
, initname
);
2259 COLLECT_SHARED_FINI_FUNC (stream
, fininame
);
2263 /* Write the constructor/destructor tables. */
2265 #ifndef LD_INIT_SWITCH
2267 write_c_file_glob (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
2269 /* Write the tables as C code. */
2271 int frames
= (frame_tables
.number
> 0);
2273 fprintf (stream
, "typedef void entry_pt();\n\n");
2275 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
2279 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
2281 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
2282 write_list (stream
, "\t\t&", frame_tables
.first
);
2283 fprintf (stream
, "\t0\n};\n");
2285 /* This must match what's in frame.h. */
2286 fprintf (stream
, "struct object {\n");
2287 fprintf (stream
, " void *pc_begin;\n");
2288 fprintf (stream
, " void *pc_end;\n");
2289 fprintf (stream
, " void *fde_begin;\n");
2290 fprintf (stream
, " void *fde_array;\n");
2291 fprintf (stream
, " __SIZE_TYPE__ count;\n");
2292 fprintf (stream
, " struct object *next;\n");
2293 fprintf (stream
, "};\n");
2295 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
2296 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
2298 fprintf (stream
, "static void reg_frame () {\n");
2299 fprintf (stream
, "\tstatic struct object ob;\n");
2300 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
2301 fprintf (stream
, "\t}\n");
2303 fprintf (stream
, "static void dereg_frame () {\n");
2304 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
2305 fprintf (stream
, "\t}\n");
2308 fprintf (stream
, "\nentry_pt * __CTOR_LIST__[] = {\n");
2309 fprintf (stream
, "\t(entry_pt *) %d,\n", constructors
.number
+ frames
);
2310 write_list (stream
, "\t", constructors
.first
);
2312 fprintf (stream
, "\treg_frame,\n");
2313 fprintf (stream
, "\t0\n};\n\n");
2315 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
2317 fprintf (stream
, "\nentry_pt * __DTOR_LIST__[] = {\n");
2318 fprintf (stream
, "\t(entry_pt *) %d,\n", destructors
.number
+ frames
);
2319 write_list (stream
, "\t", destructors
.first
);
2321 fprintf (stream
, "\tdereg_frame,\n");
2322 fprintf (stream
, "\t0\n};\n\n");
2324 fprintf (stream
, "extern entry_pt %s;\n", NAME__MAIN
);
2325 fprintf (stream
, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN
);
2327 #endif /* ! LD_INIT_SWITCH */
2330 write_c_file (FILE *stream
, const char *name
)
2332 #ifndef LD_INIT_SWITCH
2334 write_c_file_glob (stream
, name
);
2337 write_c_file_stat (stream
, name
);
2340 #ifdef COLLECT_EXPORT_LIST
2342 write_aix_file (FILE *stream
, struct id
*list
)
2344 for (; list
; list
= list
->next
)
2346 fputs (list
->name
, stream
);
2347 putc ('\n', stream
);
2352 #ifdef OBJECT_FORMAT_NONE
2354 /* Check to make sure the file is an LTO object file. */
2357 maybe_lto_object_file (const char *prog_name
)
2360 unsigned char buf
[4];
2363 static unsigned char elfmagic
[4] = { 0x7f, 'E', 'L', 'F' };
2364 static unsigned char coffmagic
[2] = { 0x4c, 0x01 };
2365 static unsigned char coffmagic_x64
[2] = { 0x64, 0x86 };
2366 static unsigned char machomagic
[4][4] = {
2367 { 0xcf, 0xfa, 0xed, 0xfe },
2368 { 0xce, 0xfa, 0xed, 0xfe },
2369 { 0xfe, 0xed, 0xfa, 0xcf },
2370 { 0xfe, 0xed, 0xfa, 0xce }
2373 f
= fopen (prog_name
, "rb");
2376 if (fread (buf
, sizeof (buf
), 1, f
) != 1)
2380 if (memcmp (buf
, elfmagic
, sizeof (elfmagic
)) == 0
2381 || memcmp (buf
, coffmagic
, sizeof (coffmagic
)) == 0
2382 || memcmp (buf
, coffmagic_x64
, sizeof (coffmagic_x64
)) == 0)
2384 for (i
= 0; i
< 4; i
++)
2385 if (memcmp (buf
, machomagic
[i
], sizeof (machomagic
[i
])) == 0)
2391 /* Generic version to scan the name list of the loaded program for
2392 the symbols g++ uses for static constructors and destructors. */
2395 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2398 void (*int_handler
) (int);
2400 void (*quit_handler
) (int);
2402 char *real_nm_argv
[4];
2403 const char **nm_argv
= CONST_CAST2 (const char **, char**, real_nm_argv
);
2405 struct pex_obj
*pex
;
2412 if (which_pass
== PASS_SECOND
)
2415 /* LTO objects must be in a known format. This check prevents
2416 us from accepting an archive containing LTO objects, which
2417 gcc cannot currently handle. */
2418 if (which_pass
== PASS_LTOINFO
&& !maybe_lto_object_file (prog_name
))
2421 /* If we do not have an `nm', complain. */
2422 if (nm_file_name
== 0)
2423 fatal_error ("cannot find 'nm'");
2425 nm_argv
[argc
++] = nm_file_name
;
2426 if (NM_FLAGS
[0] != '\0')
2427 nm_argv
[argc
++] = NM_FLAGS
;
2429 nm_argv
[argc
++] = prog_name
;
2430 nm_argv
[argc
++] = (char *) 0;
2432 /* Trace if needed. */
2435 const char **p_argv
;
2438 for (p_argv
= &nm_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2439 fprintf (stderr
, " %s", str
);
2441 fprintf (stderr
, "\n");
2447 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2449 fatal_error ("pex_init failed: %m");
2451 errmsg
= pex_run (pex
, 0, nm_file_name
, real_nm_argv
, NULL
, HOST_BIT_BUCKET
,
2458 fatal_error ("%s: %m", _(errmsg
));
2461 fatal_error (errmsg
);
2464 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2466 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2469 inf
= pex_read_output (pex
, 0);
2471 fatal_error ("can't open nm output: %m");
2475 if (which_pass
== PASS_LTOINFO
)
2476 fprintf (stderr
, "\nnm output with LTO info marker symbol.\n");
2478 fprintf (stderr
, "\nnm output with constructors/destructors.\n");
2481 /* Read each line of nm output. */
2482 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2488 fprintf (stderr
, "\t%s\n", buf
);
2490 if (which_pass
== PASS_LTOINFO
)
2495 /* Look for the LTO info marker symbol, and add filename to
2496 the LTO objects list if found. */
2497 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n'; p
++)
2498 if (ch
== ' ' && p
[1] == '_' && p
[2] == '_'
2499 && (strncmp (p
+ (p
[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2500 && ISSPACE (p
[p
[3] == '_' ? 14 : 13]))
2502 add_lto_object (<o_objects
, prog_name
);
2504 /* We need to read all the input, so we can't just
2505 return here. But we can avoid useless work. */
2514 /* If it contains a constructor or destructor name, add the name
2515 to the appropriate list unless this is a kind of symbol we're
2516 not supposed to even consider. */
2518 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n' && ch
!= '_'; p
++)
2519 if (ch
== ' ' && p
[1] == 'U' && p
[2] == ' ')
2526 /* Find the end of the symbol name.
2527 Do not include `|', because Encore nm can tack that on the end. */
2528 for (end
= p
; (ch2
= *end
) != '\0' && !ISSPACE (ch2
) && ch2
!= '|';
2534 switch (is_ctor_dtor (name
))
2537 if (! (filter
& SCAN_CTOR
))
2539 if (which_pass
!= PASS_LIB
)
2540 add_to_list (&constructors
, name
);
2544 if (! (filter
& SCAN_DTOR
))
2546 if (which_pass
!= PASS_LIB
)
2547 add_to_list (&destructors
, name
);
2551 if (! (filter
& SCAN_INIT
))
2553 if (which_pass
!= PASS_LIB
)
2554 fatal_error ("init function found in object %s", prog_name
);
2555 #ifndef LD_INIT_SWITCH
2556 add_to_list (&constructors
, name
);
2561 if (! (filter
& SCAN_FINI
))
2563 if (which_pass
!= PASS_LIB
)
2564 fatal_error ("fini function found in object %s", prog_name
);
2565 #ifndef LD_FINI_SWITCH
2566 add_to_list (&destructors
, name
);
2571 if (! (filter
& SCAN_DWEH
))
2573 if (which_pass
!= PASS_LIB
)
2574 add_to_list (&frame_tables
, name
);
2577 default: /* not a constructor or destructor */
2583 fprintf (stderr
, "\n");
2585 do_wait (nm_file_name
, pex
);
2587 signal (SIGINT
, int_handler
);
2589 signal (SIGQUIT
, quit_handler
);
2595 /* Use the List Dynamic Dependencies program to find shared libraries that
2596 the output file depends upon and their initialization/finalization
2597 routines, if any. */
2600 scan_libraries (const char *prog_name
)
2602 static struct head libraries
; /* list of shared libraries found */
2604 void (*int_handler
) (int);
2606 void (*quit_handler
) (int);
2608 char *real_ldd_argv
[4];
2609 const char **ldd_argv
= CONST_CAST2 (const char **, char **, real_ldd_argv
);
2611 struct pex_obj
*pex
;
2617 /* If we do not have an `ldd', complain. */
2618 if (ldd_file_name
== 0)
2620 error ("cannot find 'ldd'");
2624 ldd_argv
[argc
++] = ldd_file_name
;
2625 ldd_argv
[argc
++] = prog_name
;
2626 ldd_argv
[argc
++] = (char *) 0;
2628 /* Trace if needed. */
2631 const char **p_argv
;
2634 for (p_argv
= &ldd_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2635 fprintf (stderr
, " %s", str
);
2637 fprintf (stderr
, "\n");
2643 pex
= pex_init (PEX_USE_PIPES
, "collect2", NULL
);
2645 fatal_error ("pex_init failed: %m");
2647 errmsg
= pex_run (pex
, 0, ldd_file_name
, real_ldd_argv
, NULL
, NULL
, &err
);
2653 fatal_error ("%s: %m", _(errmsg
));
2656 fatal_error (errmsg
);
2659 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2661 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2664 inf
= pex_read_output (pex
, 0);
2666 fatal_error ("can't open ldd output: %m");
2669 notice ("\nldd output with constructors/destructors.\n");
2671 /* Read each line of ldd output. */
2672 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2675 char *name
, *end
, *p
= buf
;
2677 /* Extract names of libraries and add to list. */
2678 PARSE_LDD_OUTPUT (p
);
2683 if (strncmp (name
, "not found", sizeof ("not found") - 1) == 0)
2684 fatal_error ("dynamic dependency %s not found", buf
);
2686 /* Find the end of the symbol name. */
2688 (ch2
= *end
) != '\0' && ch2
!= '\n' && !ISSPACE (ch2
) && ch2
!= '|';
2693 if (access (name
, R_OK
) == 0)
2694 add_to_list (&libraries
, name
);
2696 fatal_error ("unable to open dynamic dependency '%s'", buf
);
2699 fprintf (stderr
, "\t%s\n", buf
);
2702 fprintf (stderr
, "\n");
2704 do_wait (ldd_file_name
, pex
);
2706 signal (SIGINT
, int_handler
);
2708 signal (SIGQUIT
, quit_handler
);
2711 /* Now iterate through the library list adding their symbols to
2713 for (list
= libraries
.first
; list
; list
= list
->next
)
2714 scan_prog_file (list
->name
, PASS_LIB
, SCAN_ALL
);
2717 #endif /* LDD_SUFFIX */
2719 #endif /* OBJECT_FORMAT_NONE */
2723 * COFF specific stuff.
2726 #ifdef OBJECT_FORMAT_COFF
2728 #if defined (EXTENDED_COFF)
2730 # define GCC_SYMBOLS(X) (SYMHEADER (X).isymMax + SYMHEADER (X).iextMax)
2731 # define GCC_SYMENT SYMR
2732 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2733 # define GCC_SYMINC(X) (1)
2734 # define GCC_SYMZERO(X) (SYMHEADER (X).isymMax)
2735 # define GCC_CHECK_HDR(X) (PSYMTAB (X) != 0)
2739 # define GCC_SYMBOLS(X) (HEADER (ldptr).f_nsyms)
2740 # define GCC_SYMENT SYMENT
2741 # if defined (C_WEAKEXT)
2742 # define GCC_OK_SYMBOL(X) \
2743 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2744 ((X).n_scnum > N_UNDEF) && \
2746 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2747 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2748 # define GCC_UNDEF_SYMBOL(X) \
2749 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2750 ((X).n_scnum == N_UNDEF))
2752 # define GCC_OK_SYMBOL(X) \
2753 (((X).n_sclass == C_EXT) && \
2754 ((X).n_scnum > N_UNDEF) && \
2756 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2757 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2758 # define GCC_UNDEF_SYMBOL(X) \
2759 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2761 # define GCC_SYMINC(X) ((X).n_numaux+1)
2762 # define GCC_SYMZERO(X) 0
2764 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2765 #if TARGET_AIX_VERSION >= 51
2766 # define GCC_CHECK_HDR(X) \
2767 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2768 || (HEADER (X).f_magic == 0767 && aix64_flag)) \
2769 && !(HEADER (X).f_flags & F_LOADONLY))
2771 # define GCC_CHECK_HDR(X) \
2772 (((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2773 || (HEADER (X).f_magic == 0757 && aix64_flag)) \
2774 && !(HEADER (X).f_flags & F_LOADONLY))
2779 #ifdef COLLECT_EXPORT_LIST
2780 /* Array of standard AIX libraries which should not
2781 be scanned for ctors/dtors. */
2782 static const char *const aix_std_libs
[] = {
2790 "/usr/lib/libc_r.a",
2791 "/usr/lib/libm_r.a",
2792 "/usr/lib/threads/libc.a",
2793 "/usr/ccs/lib/libc.a",
2794 "/usr/ccs/lib/libm.a",
2795 "/usr/ccs/lib/libc_r.a",
2796 "/usr/ccs/lib/libm_r.a",
2800 /* This function checks the filename and returns 1
2801 if this name matches the location of a standard AIX library. */
2802 static int ignore_library (const char *);
2804 ignore_library (const char *name
)
2806 const char *const *p
;
2809 if (target_system_root
[0] != '\0')
2811 length
= strlen (target_system_root
);
2812 if (strncmp (name
, target_system_root
, length
) != 0)
2816 for (p
= &aix_std_libs
[0]; *p
!= NULL
; ++p
)
2817 if (strcmp (name
, *p
) == 0)
2821 #endif /* COLLECT_EXPORT_LIST */
2823 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2824 extern char *ldgetname (LDFILE
*, GCC_SYMENT
*);
2827 /* COFF version to scan the name list of the loaded program for
2828 the symbols g++ uses for static constructors and destructors. */
2831 scan_prog_file (const char *prog_name
, scanpass which_pass
,
2834 LDFILE
*ldptr
= NULL
;
2835 int sym_index
, sym_count
;
2838 if (which_pass
!= PASS_FIRST
&& which_pass
!= PASS_OBJ
)
2841 #ifdef COLLECT_EXPORT_LIST
2842 /* We do not need scanning for some standard C libraries. */
2843 if (which_pass
== PASS_FIRST
&& ignore_library (prog_name
))
2846 /* On AIX we have a loop, because there is not much difference
2847 between an object and an archive. This trick allows us to
2848 eliminate scan_libraries() function. */
2852 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2853 non-const char * filename parameter, even though it will not
2854 modify that string. So we must cast away const-ness here,
2855 using CONST_CAST to prevent complaints from -Wcast-qual. */
2856 if ((ldptr
= ldopen (CONST_CAST (char *, prog_name
), ldptr
)) != NULL
)
2858 if (! MY_ISCOFF (HEADER (ldptr
).f_magic
))
2859 fatal_error ("%s: not a COFF file", prog_name
);
2861 if (GCC_CHECK_HDR (ldptr
))
2863 sym_count
= GCC_SYMBOLS (ldptr
);
2864 sym_index
= GCC_SYMZERO (ldptr
);
2866 #ifdef COLLECT_EXPORT_LIST
2867 /* Is current archive member a shared object? */
2868 is_shared
= HEADER (ldptr
).f_flags
& F_SHROBJ
;
2871 while (sym_index
< sym_count
)
2875 if (ldtbread (ldptr
, sym_index
, &symbol
) <= 0)
2877 sym_index
+= GCC_SYMINC (symbol
);
2879 if (GCC_OK_SYMBOL (symbol
))
2883 if ((name
= ldgetname (ldptr
, &symbol
)) == NULL
)
2884 continue; /* Should never happen. */
2886 #ifdef XCOFF_DEBUGGING_INFO
2887 /* All AIX function names have a duplicate entry
2888 beginning with a dot. */
2893 switch (is_ctor_dtor (name
))
2896 if (! (filter
& SCAN_CTOR
))
2899 add_to_list (&constructors
, name
);
2900 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2901 if (which_pass
== PASS_OBJ
)
2902 add_to_list (&exports
, name
);
2907 if (! (filter
& SCAN_DTOR
))
2910 add_to_list (&destructors
, name
);
2911 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2912 if (which_pass
== PASS_OBJ
)
2913 add_to_list (&exports
, name
);
2917 #ifdef COLLECT_EXPORT_LIST
2919 if (! (filter
& SCAN_INIT
))
2921 #ifndef LD_INIT_SWITCH
2923 add_to_list (&constructors
, name
);
2928 if (! (filter
& SCAN_FINI
))
2930 #ifndef LD_INIT_SWITCH
2932 add_to_list (&destructors
, name
);
2938 if (! (filter
& SCAN_DWEH
))
2941 add_to_list (&frame_tables
, name
);
2942 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2943 if (which_pass
== PASS_OBJ
)
2944 add_to_list (&exports
, name
);
2948 default: /* not a constructor or destructor */
2949 #ifdef COLLECT_EXPORT_LIST
2950 /* Explicitly export all global symbols when
2951 building a shared object on AIX, but do not
2952 re-export symbols from another shared object
2953 and do not export symbols if the user
2954 provides an explicit export list. */
2955 if (shared_obj
&& !is_shared
2956 && which_pass
== PASS_OBJ
&& !export_flag
)
2957 add_to_list (&exports
, name
);
2963 #if !defined(EXTENDED_COFF)
2964 fprintf (stderr
, "\tsec=%d class=%d type=%s%o %s\n",
2965 symbol
.n_scnum
, symbol
.n_sclass
,
2966 (symbol
.n_type
? "0" : ""), symbol
.n_type
,
2970 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
2971 symbol
.iss
, (long) symbol
.value
, symbol
.index
, name
);
2976 #ifdef COLLECT_EXPORT_LIST
2979 /* If archive contains both 32-bit and 64-bit objects,
2980 we want to skip objects in other mode so mismatch normal. */
2982 fprintf (stderr
, "%s : magic=%o aix64=%d mismatch\n",
2983 prog_name
, HEADER (ldptr
).f_magic
, aix64_flag
);
2989 fatal_error ("%s: cannot open as COFF file", prog_name
);
2991 #ifdef COLLECT_EXPORT_LIST
2992 /* On AIX loop continues while there are more members in archive. */
2994 while (ldclose (ldptr
) == FAILURE
);
2996 /* Otherwise we simply close ldptr. */
2997 (void) ldclose (ldptr
);
3000 #endif /* OBJECT_FORMAT_COFF */
3002 #ifdef COLLECT_EXPORT_LIST
3003 /* Given a library name without "lib" prefix, this function
3004 returns a full library name including a path. */
3006 resolve_lib_name (const char *name
)
3010 /* Library extensions for AIX dynamic linking. */
3011 const char * const libexts
[2] = {"a", "so"};
3013 for (i
= 0; libpaths
[i
]; i
++)
3014 if (libpaths
[i
]->max_len
> l
)
3015 l
= libpaths
[i
]->max_len
;
3017 lib_buf
= XNEWVEC (char, l
+ strlen (name
) + 10);
3019 for (i
= 0; libpaths
[i
]; i
++)
3021 struct prefix_list
*list
= libpaths
[i
]->plist
;
3022 for (; list
; list
= list
->next
)
3024 /* The following lines are needed because path_prefix list
3025 may contain directories both with trailing DIR_SEPARATOR and
3028 if (!IS_DIR_SEPARATOR (list
->prefix
[strlen (list
->prefix
)-1]))
3030 for (j
= 0; j
< 2; j
++)
3032 sprintf (lib_buf
, "%s%slib%s.%s",
3033 list
->prefix
, p
, name
,
3034 libexts
[(j
+ aixrtl_flag
) % 2]);
3035 if (debug
) fprintf (stderr
, "searching for: %s\n", lib_buf
);
3036 if (file_exists (lib_buf
))
3038 if (debug
) fprintf (stderr
, "found: %s\n", lib_buf
);
3045 fprintf (stderr
, "not found\n");
3047 fatal_error ("library lib%s not found", name
);
3050 #endif /* COLLECT_EXPORT_LIST */
3052 #ifdef COLLECT_RUN_DSYMUTIL
3053 static int flag_dsym
= false;
3054 static int flag_idsym
= false;
3057 process_args (int *argcp
, char **argv
) {
3060 for (i
=0; i
<argc
; ++i
)
3062 if (strcmp (argv
[i
], "-dsym") == 0)
3065 /* Remove the flag, as we handle all processing for it. */
3068 argv
[j
] = argv
[j
+1];
3073 else if (strcmp (argv
[i
], "-idsym") == 0)
3076 /* Remove the flag, as we handle all processing for it. */
3079 argv
[j
] = argv
[j
+1];
3088 do_dsymutil (const char *output_file
) {
3089 const char *dsymutil
= DSYMUTIL
+ 1;
3090 struct pex_obj
*pex
;
3091 char **real_argv
= XCNEWVEC (char *, 3);
3092 const char ** argv
= CONST_CAST2 (const char **, char **,
3096 argv
[1] = output_file
;
3097 argv
[2] = (char *) 0;
3099 pex
= collect_execute (dsymutil
, real_argv
, NULL
, NULL
, PEX_LAST
| PEX_SEARCH
);
3100 do_wait (dsymutil
, pex
);
3104 post_ld_pass (bool temp_file
) {
3105 if (!(temp_file
&& flag_idsym
) && !flag_dsym
)
3108 do_dsymutil (output_file
);
3112 process_args (int *argcp ATTRIBUTE_UNUSED
, char **argv ATTRIBUTE_UNUSED
) { }
3113 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED
) { }