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 Free Software Foundation, Inc.
5 Contributed by Chris Smith (csmith@convex.com).
6 Heavily modified by Michael Meissner (meissner@cygnus.com),
7 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 2, or (at your option) any later
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING. If not, write to the Free
23 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 /* Build tables of static constructors and destructors and run ld. */
31 #include "coretypes.h"
34 #if ! defined( SIGCHLD ) && defined( SIGCLD )
35 # define SIGCHLD SIGCLD
38 #ifdef vfork /* Autoconf may define this to fork for us. */
39 # define VFORK_STRING "fork"
41 # define VFORK_STRING "vfork"
47 #define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \
48 lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1)
51 #ifndef LIBRARY_PATH_ENV
52 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
63 /* On certain systems, we have code that works by scanning the object file
64 directly. But this code uses system-specific header files and library
65 functions, so turn it off in a cross-compiler. Likewise, the names of
66 the utilities are not correct for a cross-compiler; we have to hope that
67 cross-versions are in the proper directories. */
70 #undef OBJECT_FORMAT_COFF
72 #undef REAL_LD_FILE_NAME
73 #undef REAL_NM_FILE_NAME
74 #undef REAL_STRIP_FILE_NAME
77 /* If we cannot use a special method, use the ordinary one:
78 run nm to find what symbols are present.
79 In a cross-compiler, this means you need a cross nm,
80 but that is not quite as unpleasant as special headers. */
82 #if !defined (OBJECT_FORMAT_COFF)
83 #define OBJECT_FORMAT_NONE
86 #ifdef OBJECT_FORMAT_COFF
95 /* Many versions of ldfcn.h define these. */
103 /* Some systems have an ISCOFF macro, but others do not. In some cases
104 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
105 that either do not have an ISCOFF macro in /usr/include or for those
106 where it is wrong. */
109 #define MY_ISCOFF(X) ISCOFF (X)
112 #endif /* OBJECT_FORMAT_COFF */
114 #ifdef OBJECT_FORMAT_NONE
116 /* Default flags to pass to nm. */
118 #define NM_FLAGS "-n"
121 #endif /* OBJECT_FORMAT_NONE */
123 /* Some systems use __main in a way incompatible with its use in gcc, in these
124 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
125 give the same symbol without quotes for an alternative entry point. */
127 #define NAME__MAIN "__main"
130 /* This must match tree.h. */
131 #define DEFAULT_INIT_PRIORITY 65535
133 #ifndef COLLECT_SHARED_INIT_FUNC
134 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
135 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
137 #ifndef COLLECT_SHARED_FINI_FUNC
138 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
139 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
143 #define SCAN_LIBRARIES
147 int do_collecting
= 1;
149 int do_collecting
= 0;
152 #ifndef COLLECT_PARSE_FLAG
153 #define COLLECT_PARSE_FLAG(FLAG)
156 /* Nonzero if we should suppress the automatic demangling of identifiers
157 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
160 /* Linked lists of constructor and destructor names. */
176 /* Enumeration giving which pass this is for scanning the program file. */
179 PASS_FIRST
, /* without constructors */
180 PASS_OBJ
, /* individual objects */
181 PASS_LIB
, /* looking for shared libraries */
182 PASS_SECOND
/* with constructors linked in */
185 int vflag
; /* true if -v */
186 static int rflag
; /* true if -r */
187 static int strip_flag
; /* true if -s */
188 #ifdef COLLECT_EXPORT_LIST
189 static int export_flag
; /* true if -bE */
190 static int aix64_flag
; /* true if -b64 */
193 int debug
; /* true if -debug */
195 static int shared_obj
; /* true if -shared */
197 static const char *c_file
; /* <xxx>.c for constructor/destructor list. */
198 static const char *o_file
; /* <xxx>.o for constructor/destructor list. */
199 #ifdef COLLECT_EXPORT_LIST
200 static const char *export_file
; /* <xxx>.x for AIX export list. */
202 const char *ldout
; /* File for ld errors. */
203 static const char *output_file
; /* Output file for ld. */
204 static const char *nm_file_name
; /* pathname of nm */
206 static const char *ldd_file_name
; /* pathname of ldd (or equivalent) */
208 static const char *strip_file_name
; /* pathname of strip */
209 const char *c_file_name
; /* pathname of gcc */
210 static char *initname
, *fininame
; /* names of init and fini funcs */
212 static struct head constructors
; /* list of constructors found */
213 static struct head destructors
; /* list of destructors found */
214 #ifdef COLLECT_EXPORT_LIST
215 static struct head exports
; /* list of exported symbols */
217 static struct head frame_tables
; /* list of frame unwind info tables */
219 struct obstack temporary_obstack
;
220 char * temporary_firstobj
;
222 /* Holds the return value of pexecute and fork. */
225 /* Structure to hold all the directories in which to search for files to
230 const char *prefix
; /* String to prepend to the path. */
231 struct prefix_list
*next
; /* Next in linked list. */
236 struct prefix_list
*plist
; /* List of prefixes to try */
237 int max_len
; /* Max length of a prefix in PLIST */
238 const char *name
; /* Name of this list (used in config stuff) */
241 #ifdef COLLECT_EXPORT_LIST
242 /* Lists to keep libraries to be scanned for global constructors/destructors. */
243 static struct head libs
; /* list of libraries */
244 static struct path_prefix cmdline_lib_dirs
; /* directories specified with -L */
245 static struct path_prefix libpath_lib_dirs
; /* directories in LIBPATH */
246 static struct path_prefix
*libpaths
[3] = {&cmdline_lib_dirs
,
247 &libpath_lib_dirs
, NULL
};
248 static const char *const libexts
[3] = {"a", "so", NULL
}; /* possible library extensions */
251 static void handler (int);
252 static int is_ctor_dtor (const char *);
253 static char *find_a_file (struct path_prefix
*, const char *);
254 static void add_prefix (struct path_prefix
*, const char *);
255 static void prefix_from_env (const char *, struct path_prefix
*);
256 static void prefix_from_string (const char *, struct path_prefix
*);
257 static void do_wait (const char *);
258 static void fork_execute (const char *, char **);
259 static void maybe_unlink (const char *);
260 static void add_to_list (struct head
*, const char *);
261 static int extract_init_priority (const char *);
262 static void sort_ids (struct head
*);
263 static void write_list (FILE *, const char *, struct id
*);
264 #ifdef COLLECT_EXPORT_LIST
265 static void dump_list (FILE *, const char *, struct id
*);
268 static void dump_prefix_list (FILE *, const char *, struct prefix_list
*);
270 static void write_list_with_asm (FILE *, const char *, struct id
*);
271 static void write_c_file (FILE *, const char *);
272 static void write_c_file_stat (FILE *, const char *);
273 #ifndef LD_INIT_SWITCH
274 static void write_c_file_glob (FILE *, const char *);
276 static void scan_prog_file (const char *, enum pass
);
277 #ifdef SCAN_LIBRARIES
278 static void scan_libraries (const char *);
280 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
281 static int is_in_args (const char *, const char **, const char **);
283 #ifdef COLLECT_EXPORT_LIST
285 static int is_in_list (const char *, struct id
*);
287 static void write_aix_file (FILE *, struct id
*);
288 static char *resolve_lib_name (const char *);
290 static char *extract_string (const char **);
294 dup2 (int oldfd
, int newfd
)
303 while ((fd
= dup (oldfd
)) != newfd
&& fd
>= 0) /* good enough for low fd's */
306 close (fdtmp
[--fdx
]);
310 #endif /* ! HAVE_DUP2 */
312 /* Delete tempfiles and exit function. */
315 collect_exit (int status
)
317 if (c_file
!= 0 && c_file
[0])
318 maybe_unlink (c_file
);
320 if (o_file
!= 0 && o_file
[0])
321 maybe_unlink (o_file
);
323 #ifdef COLLECT_EXPORT_LIST
324 if (export_file
!= 0 && export_file
[0])
325 maybe_unlink (export_file
);
328 if (ldout
!= 0 && ldout
[0])
331 maybe_unlink (ldout
);
334 if (status
!= 0 && output_file
!= 0 && output_file
[0])
335 maybe_unlink (output_file
);
341 /* Notify user of a non-error. */
343 notice (const char *msgid
, ...)
347 va_start (ap
, msgid
);
348 vfprintf (stderr
, _(msgid
), ap
);
352 /* Die when sys call fails. */
355 fatal_perror (const char * msgid
, ...)
360 va_start (ap
, msgid
);
361 fprintf (stderr
, "collect2: ");
362 vfprintf (stderr
, _(msgid
), ap
);
363 fprintf (stderr
, ": %s\n", xstrerror (e
));
366 collect_exit (FATAL_EXIT_CODE
);
372 fatal (const char * msgid
, ...)
376 va_start (ap
, msgid
);
377 fprintf (stderr
, "collect2: ");
378 vfprintf (stderr
, _(msgid
), ap
);
379 fprintf (stderr
, "\n");
382 collect_exit (FATAL_EXIT_CODE
);
385 /* Write error message. */
388 error (const char * msgid
, ...)
392 va_start (ap
, msgid
);
393 fprintf (stderr
, "collect2: ");
394 vfprintf (stderr
, _(msgid
), ap
);
395 fprintf (stderr
, "\n");
399 /* In case obstack is linked in, and abort is defined to fancy_abort,
400 provide a default entry. */
405 fatal ("internal error");
411 if (c_file
!= 0 && c_file
[0])
412 maybe_unlink (c_file
);
414 if (o_file
!= 0 && o_file
[0])
415 maybe_unlink (o_file
);
417 if (ldout
!= 0 && ldout
[0])
418 maybe_unlink (ldout
);
420 #ifdef COLLECT_EXPORT_LIST
421 if (export_file
!= 0 && export_file
[0])
422 maybe_unlink (export_file
);
425 signal (signo
, SIG_DFL
);
426 kill (getpid (), signo
);
431 file_exists (const char *name
)
433 return access (name
, R_OK
) == 0;
436 /* Parse a reasonable subset of shell quoting syntax. */
439 extract_string (const char **pp
)
452 obstack_1grow (&temporary_obstack
, c
);
453 else if (! inside
&& c
== ' ')
455 else if (! inside
&& c
== '\\')
460 obstack_1grow (&temporary_obstack
, c
);
463 obstack_1grow (&temporary_obstack
, '\0');
465 return obstack_finish (&temporary_obstack
);
469 dump_file (const char *name
)
471 FILE *stream
= fopen (name
, "r");
478 while (c
= getc (stream
),
479 c
!= EOF
&& (ISIDNUM (c
) || c
== '$' || c
== '.'))
480 obstack_1grow (&temporary_obstack
, c
);
481 if (obstack_object_size (&temporary_obstack
) > 0)
483 const char *word
, *p
;
485 obstack_1grow (&temporary_obstack
, '\0');
486 word
= obstack_finish (&temporary_obstack
);
489 ++word
, putc ('.', stderr
);
491 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
492 p
+= strlen (USER_LABEL_PREFIX
);
497 result
= cplus_demangle (p
, DMGL_PARAMS
| DMGL_ANSI
| DMGL_VERBOSE
);
502 fputs (result
, stderr
);
504 diff
= strlen (word
) - strlen (result
);
505 while (diff
> 0 && c
== ' ')
506 --diff
, putc (' ', stderr
);
507 while (diff
< 0 && c
== ' ')
508 ++diff
, c
= getc (stream
);
513 fputs (word
, stderr
);
516 obstack_free (&temporary_obstack
, temporary_firstobj
);
525 /* Decide whether the given symbol is: a constructor (1), a destructor
526 (2), a routine in a shared object that calls all the constructors
527 (3) or destructors (4), a DWARF exception-handling table (5), or
528 nothing special (0). */
531 is_ctor_dtor (const char *s
)
533 struct names
{ const char *const name
; const int len
; const int ret
;
534 const int two_underscores
; };
536 const struct names
*p
;
538 const char *orig_s
= s
;
540 static const struct names special
[] = {
541 #ifndef NO_DOLLAR_IN_LABEL
542 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, 1, 0 },
543 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, 2, 0 },
545 #ifndef NO_DOT_IN_LABEL
546 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, 1, 0 },
547 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, 2, 0 },
548 #endif /* NO_DOT_IN_LABEL */
549 #endif /* NO_DOLLAR_IN_LABEL */
550 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, 1, 0 },
551 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, 2, 0 },
552 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, 5, 0 },
553 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, 3, 0 },
554 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, 4, 0 },
558 while ((ch
= *s
) == '_')
564 for (p
= &special
[0]; p
->len
> 0; p
++)
567 && (!p
->two_underscores
|| ((s
- orig_s
) >= 2))
568 && strncmp(s
, p
->name
, p
->len
) == 0)
576 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
577 and one from the PATH variable. */
579 static struct path_prefix cpath
, path
;
582 /* This is the name of the target machine. We use it to form the name
583 of the files to execute. */
585 static const char *const target_machine
= TARGET_MACHINE
;
588 /* Search for NAME using prefix list PPREFIX. We only look for executable
591 Return 0 if not found, otherwise return its name, allocated with malloc. */
594 find_a_file (struct path_prefix
*pprefix
, const char *name
)
597 struct prefix_list
*pl
;
598 int len
= pprefix
->max_len
+ strlen (name
) + 1;
601 fprintf (stderr
, "Looking for '%s'\n", name
);
603 #ifdef HOST_EXECUTABLE_SUFFIX
604 len
+= strlen (HOST_EXECUTABLE_SUFFIX
);
607 temp
= xmalloc (len
);
609 /* Determine the filename to execute (special case for absolute paths). */
612 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
613 || (*name
&& name
[1] == ':')
617 if (access (name
, X_OK
) == 0)
622 fprintf (stderr
, " - found: absolute path\n");
627 #ifdef HOST_EXECUTABLE_SUFFIX
628 /* Some systems have a suffix for executable files.
629 So try appending that. */
631 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
633 if (access (temp
, X_OK
) == 0)
638 fprintf (stderr
, " - failed to locate using absolute path\n");
641 for (pl
= pprefix
->plist
; pl
; pl
= pl
->next
)
645 strcpy (temp
, pl
->prefix
);
648 if (stat (temp
, &st
) >= 0
649 && ! S_ISDIR (st
.st_mode
)
650 && access (temp
, X_OK
) == 0)
653 #ifdef HOST_EXECUTABLE_SUFFIX
654 /* Some systems have a suffix for executable files.
655 So try appending that. */
656 strcat (temp
, HOST_EXECUTABLE_SUFFIX
);
658 if (stat (temp
, &st
) >= 0
659 && ! S_ISDIR (st
.st_mode
)
660 && access (temp
, X_OK
) == 0)
665 if (debug
&& pprefix
->plist
== NULL
)
666 fprintf (stderr
, " - failed: no entries in prefix list\n");
672 /* Add an entry for PREFIX to prefix list PPREFIX. */
675 add_prefix (struct path_prefix
*pprefix
, const char *prefix
)
677 struct prefix_list
*pl
, **prev
;
682 for (pl
= pprefix
->plist
; pl
->next
; pl
= pl
->next
)
687 prev
= &pprefix
->plist
;
689 /* Keep track of the longest prefix. */
691 len
= strlen (prefix
);
692 if (len
> pprefix
->max_len
)
693 pprefix
->max_len
= len
;
695 pl
= xmalloc (sizeof (struct prefix_list
));
696 pl
->prefix
= xstrdup (prefix
);
701 pl
->next
= (struct prefix_list
*) 0;
705 /* Take the value of the environment variable ENV, break it into a path, and
706 add of the entries to PPREFIX. */
709 prefix_from_env (const char *env
, struct path_prefix
*pprefix
)
712 GET_ENVIRONMENT (p
, env
);
715 prefix_from_string (p
, pprefix
);
719 prefix_from_string (const char *p
, struct path_prefix
*pprefix
)
721 const char *startp
, *endp
;
722 char *nstore
= xmalloc (strlen (p
) + 3);
725 fprintf (stderr
, "Convert string '%s' into prefixes, separator = '%c'\n", p
, PATH_SEPARATOR
);
730 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
732 strncpy (nstore
, startp
, endp
-startp
);
735 strcpy (nstore
, "./");
737 else if (! IS_DIR_SEPARATOR (endp
[-1]))
739 nstore
[endp
-startp
] = DIR_SEPARATOR
;
740 nstore
[endp
-startp
+1] = 0;
743 nstore
[endp
-startp
] = 0;
746 fprintf (stderr
, " - add prefix: %s\n", nstore
);
748 add_prefix (pprefix
, nstore
);
751 endp
= startp
= endp
+ 1;
761 main (int argc
, char **argv
)
763 static const char *const ld_suffix
= "ld";
764 static const char *const real_ld_suffix
= "real-ld";
765 static const char *const collect_ld_suffix
= "collect-ld";
766 static const char *const nm_suffix
= "nm";
767 static const char *const gnm_suffix
= "gnm";
769 static const char *const ldd_suffix
= LDD_SUFFIX
;
771 static const char *const strip_suffix
= "strip";
772 static const char *const gstrip_suffix
= "gstrip";
775 /* If we look for a program in the compiler directories, we just use
776 the short name, since these directories are already system-specific.
777 But it we look for a program in the system directories, we need to
778 qualify the program name with the target machine. */
780 const char *const full_ld_suffix
=
781 concat(target_machine
, "-", ld_suffix
, NULL
);
782 const char *const full_nm_suffix
=
783 concat (target_machine
, "-", nm_suffix
, NULL
);
784 const char *const full_gnm_suffix
=
785 concat (target_machine
, "-", gnm_suffix
, NULL
);
787 const char *const full_ldd_suffix
=
788 concat (target_machine
, "-", ldd_suffix
, NULL
);
790 const char *const full_strip_suffix
=
791 concat (target_machine
, "-", strip_suffix
, NULL
);
792 const char *const full_gstrip_suffix
=
793 concat (target_machine
, "-", gstrip_suffix
, NULL
);
795 const char *const full_ld_suffix
= ld_suffix
;
796 const char *const full_nm_suffix
= nm_suffix
;
797 const char *const full_gnm_suffix
= gnm_suffix
;
799 const char *const full_ldd_suffix
= ldd_suffix
;
801 const char *const full_strip_suffix
= strip_suffix
;
802 const char *const full_gstrip_suffix
= gstrip_suffix
;
803 #endif /* CROSS_COMPILE */
807 #ifdef COLLECT_EXPORT_LIST
810 const char *ld_file_name
;
821 int num_c_args
= argc
+9;
823 no_demangle
= !! getenv ("COLLECT_NO_DEMANGLE");
825 /* Suppress demangling by the real linker, which may be broken. */
826 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
828 #if defined (COLLECT2_HOST_INITIALIZATION)
829 /* Perform system dependent initialization, if necessary. */
830 COLLECT2_HOST_INITIALIZATION
;
834 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
835 receive the signal. A different setting is inheritable */
836 signal (SIGCHLD
, SIG_DFL
);
841 /* Do not invoke xcalloc before this point, since locale needs to be
842 set first, in case a diagnostic is issued. */
844 ld1
= (const char **)(ld1_argv
= xcalloc(sizeof (char *), argc
+3));
845 ld2
= (const char **)(ld2_argv
= xcalloc(sizeof (char *), argc
+10));
846 object
= (const char **)(object_lst
= xcalloc(sizeof (char *), argc
));
852 /* Parse command line early for instances of -debug. This allows
853 the debug flag to be set before functions like find_a_file()
858 for (i
= 1; argv
[i
] != NULL
; i
++)
860 if (! strcmp (argv
[i
], "-debug"))
862 COLLECT_PARSE_FLAG (argv
[i
]);
867 #ifndef DEFAULT_A_OUT_NAME
868 output_file
= "a.out";
870 output_file
= DEFAULT_A_OUT_NAME
;
873 obstack_begin (&temporary_obstack
, 0);
874 temporary_firstobj
= obstack_alloc (&temporary_obstack
, 0);
876 current_demangling_style
= auto_demangling
;
877 p
= getenv ("COLLECT_GCC_OPTIONS");
880 const char *q
= extract_string (&p
);
881 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
884 obstack_free (&temporary_obstack
, temporary_firstobj
);
886 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
887 -fno-exceptions -w */
890 c_ptr
= (const char **) (c_argv
= xcalloc (sizeof (char *), num_c_args
));
893 fatal ("no arguments");
896 if (signal (SIGQUIT
, SIG_IGN
) != SIG_IGN
)
897 signal (SIGQUIT
, handler
);
899 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
900 signal (SIGINT
, handler
);
902 if (signal (SIGALRM
, SIG_IGN
) != SIG_IGN
)
903 signal (SIGALRM
, handler
);
906 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
907 signal (SIGHUP
, handler
);
909 if (signal (SIGSEGV
, SIG_IGN
) != SIG_IGN
)
910 signal (SIGSEGV
, handler
);
912 if (signal (SIGBUS
, SIG_IGN
) != SIG_IGN
)
913 signal (SIGBUS
, handler
);
916 /* Extract COMPILER_PATH and PATH into our prefix list. */
917 prefix_from_env ("COMPILER_PATH", &cpath
);
918 prefix_from_env ("PATH", &path
);
920 /* Try to discover a valid linker/nm/strip to use. */
922 /* Maybe we know the right file to use (if not cross). */
924 #ifdef DEFAULT_LINKER
925 if (access (DEFAULT_LINKER
, X_OK
) == 0)
926 ld_file_name
= DEFAULT_LINKER
;
927 if (ld_file_name
== 0)
929 #ifdef REAL_LD_FILE_NAME
930 ld_file_name
= find_a_file (&path
, REAL_LD_FILE_NAME
);
931 if (ld_file_name
== 0)
933 /* Search the (target-specific) compiler dirs for ld'. */
934 ld_file_name
= find_a_file (&cpath
, real_ld_suffix
);
935 /* Likewise for `collect-ld'. */
936 if (ld_file_name
== 0)
937 ld_file_name
= find_a_file (&cpath
, collect_ld_suffix
);
938 /* Search the compiler directories for `ld'. We have protection against
939 recursive calls in find_a_file. */
940 if (ld_file_name
== 0)
941 ld_file_name
= find_a_file (&cpath
, ld_suffix
);
942 /* Search the ordinary system bin directories
943 for `ld' (if native linking) or `TARGET-ld' (if cross). */
944 if (ld_file_name
== 0)
945 ld_file_name
= find_a_file (&path
, full_ld_suffix
);
947 #ifdef REAL_NM_FILE_NAME
948 nm_file_name
= find_a_file (&path
, REAL_NM_FILE_NAME
);
949 if (nm_file_name
== 0)
951 nm_file_name
= find_a_file (&cpath
, gnm_suffix
);
952 if (nm_file_name
== 0)
953 nm_file_name
= find_a_file (&path
, full_gnm_suffix
);
954 if (nm_file_name
== 0)
955 nm_file_name
= find_a_file (&cpath
, nm_suffix
);
956 if (nm_file_name
== 0)
957 nm_file_name
= find_a_file (&path
, full_nm_suffix
);
960 ldd_file_name
= find_a_file (&cpath
, ldd_suffix
);
961 if (ldd_file_name
== 0)
962 ldd_file_name
= find_a_file (&path
, full_ldd_suffix
);
965 #ifdef REAL_STRIP_FILE_NAME
966 strip_file_name
= find_a_file (&path
, REAL_STRIP_FILE_NAME
);
967 if (strip_file_name
== 0)
969 strip_file_name
= find_a_file (&cpath
, gstrip_suffix
);
970 if (strip_file_name
== 0)
971 strip_file_name
= find_a_file (&path
, full_gstrip_suffix
);
972 if (strip_file_name
== 0)
973 strip_file_name
= find_a_file (&cpath
, strip_suffix
);
974 if (strip_file_name
== 0)
975 strip_file_name
= find_a_file (&path
, full_strip_suffix
);
977 /* Determine the full path name of the C compiler to use. */
978 c_file_name
= getenv ("COLLECT_GCC");
979 if (c_file_name
== 0)
982 c_file_name
= concat (target_machine
, "-gcc", NULL
);
988 p
= find_a_file (&cpath
, c_file_name
);
990 /* Here it should be safe to use the system search path since we should have
991 already qualified the name of the compiler when it is needed. */
993 p
= find_a_file (&path
, c_file_name
);
998 *ld1
++ = *ld2
++ = ld_file_name
;
1000 /* Make temp file names. */
1001 c_file
= make_temp_file (".c");
1002 o_file
= make_temp_file (".o");
1003 #ifdef COLLECT_EXPORT_LIST
1004 export_file
= make_temp_file (".x");
1006 ldout
= make_temp_file (".ld");
1007 *c_ptr
++ = c_file_name
;
1014 #ifdef COLLECT_EXPORT_LIST
1015 /* Generate a list of directories from LIBPATH. */
1016 prefix_from_env ("LIBPATH", &libpath_lib_dirs
);
1017 /* Add to this list also two standard directories where
1018 AIX loader always searches for libraries. */
1019 add_prefix (&libpath_lib_dirs
, "/lib");
1020 add_prefix (&libpath_lib_dirs
, "/usr/lib");
1023 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1025 AIX support needs to know if -shared has been specified before
1026 parsing commandline arguments. */
1028 p
= getenv ("COLLECT_GCC_OPTIONS");
1031 const char *q
= extract_string (&p
);
1032 if (*q
== '-' && (q
[1] == 'm' || q
[1] == 'f'))
1033 *c_ptr
++ = xstrdup (q
);
1034 if (strcmp (q
, "-EL") == 0 || strcmp (q
, "-EB") == 0)
1035 *c_ptr
++ = xstrdup (q
);
1036 if (strcmp (q
, "-shared") == 0)
1038 if (*q
== '-' && q
[1] == 'B')
1040 *c_ptr
++ = xstrdup (q
);
1043 q
= extract_string (&p
);
1044 *c_ptr
++ = xstrdup (q
);
1048 obstack_free (&temporary_obstack
, temporary_firstobj
);
1049 *c_ptr
++ = "-fno-profile-arcs";
1050 *c_ptr
++ = "-fno-test-coverage";
1051 *c_ptr
++ = "-fno-branch-probabilities";
1052 *c_ptr
++ = "-fno-exceptions";
1055 /* !!! When GCC calls collect2,
1056 it does not know whether it is calling collect2 or ld.
1057 So collect2 cannot meaningfully understand any options
1058 except those ld understands.
1059 If you propose to make GCC pass some other option,
1060 just imagine what will happen if ld is really ld!!! */
1062 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1063 /* After the first file, put in the c++ rt0. */
1066 while ((arg
= *++argv
) != (char *) 0)
1068 *ld1
++ = *ld2
++ = arg
;
1074 #ifdef COLLECT_EXPORT_LIST
1075 /* We want to disable automatic exports on AIX when user
1076 explicitly puts an export list in command line */
1078 if (arg
[2] == 'E' || strncmp (&arg
[2], "export", 6) == 0)
1080 else if (arg
[2] == '6' && arg
[3] == '4')
1086 if (!strcmp (arg
, "-debug"))
1088 /* Already parsed. */
1097 /* place o_file BEFORE this argument! */
1103 #ifdef COLLECT_EXPORT_LIST
1105 /* Resolving full library name. */
1106 const char *s
= resolve_lib_name (arg
+2);
1108 /* Saving a full library name. */
1109 add_to_list (&libs
, s
);
1114 #ifdef COLLECT_EXPORT_LIST
1115 /* Saving directories where to search for libraries. */
1117 add_prefix (&cmdline_lib_dirs
, arg
+2);
1120 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1122 if (is_in_args (arg
, (const char **) ld1_argv
, ld1
-1))
1125 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1130 output_file
= *ld1
++ = *ld2
++ = *++argv
;
1132 #ifdef SWITCHES_NEED_SPACES
1133 && ! strchr (SWITCHES_NEED_SPACES
, arg
[1])
1137 output_file
= &arg
[2];
1146 if (arg
[2] == '\0' && do_collecting
)
1148 /* We must strip after the nm run, otherwise C++ linking
1149 will not work. Thus we strip in the second ld run, or
1150 else with strip if there is no second ld run. */
1162 else if ((p
= strrchr (arg
, '.')) != (char *) 0
1163 && (strcmp (p
, ".o") == 0 || strcmp (p
, ".a") == 0
1164 || strcmp (p
, ".so") == 0 || strcmp (p
, ".lo") == 0
1165 || strcmp (p
, ".obj") == 0))
1174 /* place o_file BEFORE this argument! */
1180 if (p
[1] == 'o' || p
[1] == 'l')
1182 #ifdef COLLECT_EXPORT_LIST
1183 /* libraries can be specified directly, i.e. without -l flag. */
1186 /* Saving a full library name. */
1187 add_to_list (&libs
, arg
);
1193 #ifdef COLLECT_EXPORT_LIST
1194 /* This is added only for debugging purposes. */
1197 fprintf (stderr
, "List of libraries:\n");
1198 dump_list (stderr
, "\t", libs
.first
);
1201 /* The AIX linker will discard static constructors in object files if
1202 nothing else in the file is referenced, so look at them first. */
1204 const char **export_object_lst
= (const char **)object_lst
;
1206 while (export_object_lst
< object
)
1207 scan_prog_file (*export_object_lst
++, PASS_OBJ
);
1210 struct id
*list
= libs
.first
;
1212 for (; list
; list
= list
->next
)
1213 scan_prog_file (list
->name
, PASS_FIRST
);
1218 char *buf
= concat ("-bE:", export_file
, NULL
);
1223 exportf
= fopen (export_file
, "w");
1224 if (exportf
== (FILE *) 0)
1225 fatal_perror ("fopen %s", export_file
);
1226 write_aix_file (exportf
, exports
.first
);
1227 if (fclose (exportf
))
1228 fatal_perror ("fclose %s", export_file
);
1233 *c_ptr
= *ld1
= *object
= (char *) 0;
1237 notice ("collect2 version %s", version_string
);
1238 #ifdef TARGET_VERSION
1241 fprintf (stderr
, "\n");
1247 fprintf (stderr
, "ld_file_name = %s\n",
1248 (ld_file_name
? ld_file_name
: "not found"));
1249 fprintf (stderr
, "c_file_name = %s\n",
1250 (c_file_name
? c_file_name
: "not found"));
1251 fprintf (stderr
, "nm_file_name = %s\n",
1252 (nm_file_name
? nm_file_name
: "not found"));
1254 fprintf (stderr
, "ldd_file_name = %s\n",
1255 (ldd_file_name
? ldd_file_name
: "not found"));
1257 fprintf (stderr
, "strip_file_name = %s\n",
1258 (strip_file_name
? strip_file_name
: "not found"));
1259 fprintf (stderr
, "c_file = %s\n",
1260 (c_file
? c_file
: "not found"));
1261 fprintf (stderr
, "o_file = %s\n",
1262 (o_file
? o_file
: "not found"));
1264 ptr
= getenv ("COLLECT_GCC_OPTIONS");
1266 fprintf (stderr
, "COLLECT_GCC_OPTIONS = %s\n", ptr
);
1268 ptr
= getenv ("COLLECT_GCC");
1270 fprintf (stderr
, "COLLECT_GCC = %s\n", ptr
);
1272 ptr
= getenv ("COMPILER_PATH");
1274 fprintf (stderr
, "COMPILER_PATH = %s\n", ptr
);
1276 ptr
= getenv (LIBRARY_PATH_ENV
);
1278 fprintf (stderr
, "%-20s= %s\n", LIBRARY_PATH_ENV
, ptr
);
1280 fprintf (stderr
, "\n");
1283 /* Load the program, searching all libraries and attempting to provide
1284 undefined symbols from repository information. */
1286 /* On AIX we do this later. */
1287 #ifndef COLLECT_EXPORT_LIST
1288 do_tlink (ld1_argv
, object_lst
);
1291 /* If -r or they will be run via some other method, do not build the
1292 constructor or destructor list, just return now. */
1294 #ifndef COLLECT_EXPORT_LIST
1299 #ifdef COLLECT_EXPORT_LIST
1300 /* Do the link we avoided above if we are exiting. */
1301 do_tlink (ld1_argv
, object_lst
);
1303 /* But make sure we delete the export file we may have created. */
1304 if (export_file
!= 0 && export_file
[0])
1305 maybe_unlink (export_file
);
1307 maybe_unlink (c_file
);
1308 maybe_unlink (o_file
);
1312 /* Examine the namelist with nm and search it for static constructors
1313 and destructors to call.
1314 Write the constructor and destructor tables to a .s file and reload. */
1316 /* On AIX we already scanned for global constructors/destructors. */
1317 #ifndef COLLECT_EXPORT_LIST
1318 scan_prog_file (output_file
, PASS_FIRST
);
1321 #ifdef SCAN_LIBRARIES
1322 scan_libraries (output_file
);
1327 notice ("%d constructor(s) found\n", constructors
.number
);
1328 notice ("%d destructor(s) found\n", destructors
.number
);
1329 notice ("%d frame table(s) found\n", frame_tables
.number
);
1332 if (constructors
.number
== 0 && destructors
.number
== 0
1333 && frame_tables
.number
== 0
1334 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1335 /* If we will be running these functions ourselves, we want to emit
1336 stubs into the shared library so that we do not have to relink
1337 dependent programs when we add static objects. */
1342 #ifdef COLLECT_EXPORT_LIST
1343 /* Do tlink without additional code generation. */
1344 do_tlink (ld1_argv
, object_lst
);
1346 /* Strip now if it was requested on the command line. */
1349 char **real_strip_argv
= xcalloc (sizeof (char *), 3);
1350 const char ** strip_argv
= (const char **) real_strip_argv
;
1352 strip_argv
[0] = strip_file_name
;
1353 strip_argv
[1] = output_file
;
1354 strip_argv
[2] = (char *) 0;
1355 fork_execute ("strip", real_strip_argv
);
1358 #ifdef COLLECT_EXPORT_LIST
1359 maybe_unlink (export_file
);
1361 maybe_unlink (c_file
);
1362 maybe_unlink (o_file
);
1366 /* Sort ctor and dtor lists by priority. */
1367 sort_ids (&constructors
);
1368 sort_ids (&destructors
);
1370 maybe_unlink(output_file
);
1371 outf
= fopen (c_file
, "w");
1372 if (outf
== (FILE *) 0)
1373 fatal_perror ("fopen %s", c_file
);
1375 write_c_file (outf
, c_file
);
1378 fatal_perror ("fclose %s", c_file
);
1380 /* Tell the linker that we have initializer and finalizer functions. */
1381 #ifdef LD_INIT_SWITCH
1382 #ifdef COLLECT_EXPORT_LIST
1383 *ld2
++ = concat (LD_INIT_SWITCH
, ":", initname
, ":", fininame
, NULL
);
1385 *ld2
++ = LD_INIT_SWITCH
;
1387 *ld2
++ = LD_FINI_SWITCH
;
1392 #ifdef COLLECT_EXPORT_LIST
1395 /* If we did not add export flag to link arguments before, add it to
1396 second link phase now. No new exports should have been added. */
1397 if (! exports
.first
)
1398 *ld2
++ = concat ("-bE:", export_file
, NULL
);
1400 #ifndef LD_INIT_SWITCH
1401 add_to_list (&exports
, initname
);
1402 add_to_list (&exports
, fininame
);
1403 add_to_list (&exports
, "_GLOBAL__DI");
1404 add_to_list (&exports
, "_GLOBAL__DD");
1406 exportf
= fopen (export_file
, "w");
1407 if (exportf
== (FILE *) 0)
1408 fatal_perror ("fopen %s", export_file
);
1409 write_aix_file (exportf
, exports
.first
);
1410 if (fclose (exportf
))
1411 fatal_perror ("fclose %s", export_file
);
1415 /* End of arguments to second link phase. */
1420 fprintf (stderr
, "\n========== output_file = %s, c_file = %s\n",
1421 output_file
, c_file
);
1422 write_c_file (stderr
, "stderr");
1423 fprintf (stderr
, "========== end of c_file\n\n");
1424 #ifdef COLLECT_EXPORT_LIST
1425 fprintf (stderr
, "\n========== export_file = %s\n", export_file
);
1426 write_aix_file (stderr
, exports
.first
);
1427 fprintf (stderr
, "========== end of export_file\n\n");
1431 /* Assemble the constructor and destructor tables.
1432 Link the tables in with the rest of the program. */
1434 fork_execute ("gcc", c_argv
);
1435 #ifdef COLLECT_EXPORT_LIST
1436 /* On AIX we must call tlink because of possible templates resolution. */
1437 do_tlink (ld2_argv
, object_lst
);
1439 /* Otherwise, simply call ld because tlink is already done. */
1440 fork_execute ("ld", ld2_argv
);
1442 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1443 constructors/destructors in shared libraries. */
1444 scan_prog_file (output_file
, PASS_SECOND
);
1447 maybe_unlink (c_file
);
1448 maybe_unlink (o_file
);
1450 #ifdef COLLECT_EXPORT_LIST
1451 maybe_unlink (export_file
);
1458 /* Wait for a process to finish, and exit if a nonzero status is found. */
1461 collect_wait (const char *prog
)
1465 pwait (pid
, &status
, 0);
1468 if (WIFSIGNALED (status
))
1470 int sig
= WTERMSIG (status
);
1471 error ("%s terminated with signal %d [%s]%s",
1472 prog
, sig
, strsignal(sig
),
1473 WCOREDUMP(status
) ? ", core dumped" : "");
1474 collect_exit (FATAL_EXIT_CODE
);
1477 if (WIFEXITED (status
))
1478 return WEXITSTATUS (status
);
1484 do_wait (const char *prog
)
1486 int ret
= collect_wait (prog
);
1489 error ("%s returned %d exit status", prog
, ret
);
1495 /* Execute a program, and wait for the reply. */
1498 collect_execute (const char *prog
, char **argv
, const char *redir
)
1502 int redir_handle
= -1;
1503 int stdout_save
= -1;
1504 int stderr_save
= -1;
1512 fprintf (stderr
, "%s", argv
[0]);
1514 notice ("[cannot find %s]", prog
);
1516 for (p_argv
= &argv
[1]; (str
= *p_argv
) != (char *) 0; p_argv
++)
1517 fprintf (stderr
, " %s", str
);
1519 fprintf (stderr
, "\n");
1525 /* If we cannot find a program we need, complain error. Do this here
1526 since we might not end up needing something that we could not find. */
1529 fatal ("cannot find `%s'", prog
);
1533 /* Open response file. */
1534 redir_handle
= open (redir
, O_WRONLY
| O_TRUNC
| O_CREAT
);
1536 /* Duplicate the stdout and stderr file handles
1537 so they can be restored later. */
1538 stdout_save
= dup (STDOUT_FILENO
);
1539 if (stdout_save
== -1)
1540 fatal_perror ("redirecting stdout: %s", redir
);
1541 stderr_save
= dup (STDERR_FILENO
);
1542 if (stderr_save
== -1)
1543 fatal_perror ("redirecting stdout: %s", redir
);
1545 /* Redirect stdout & stderr to our response file. */
1546 dup2 (redir_handle
, STDOUT_FILENO
);
1547 dup2 (redir_handle
, STDERR_FILENO
);
1550 pid
= pexecute (argv
[0], argv
, argv
[0], NULL
, &errmsg_fmt
, &errmsg_arg
,
1551 (PEXECUTE_FIRST
| PEXECUTE_LAST
| PEXECUTE_SEARCH
));
1555 /* Restore stdout and stderr to their previous settings. */
1556 dup2 (stdout_save
, STDOUT_FILENO
);
1557 dup2 (stderr_save
, STDERR_FILENO
);
1559 /* Close response file. */
1560 close (redir_handle
);
1564 fatal_perror (errmsg_fmt
, errmsg_arg
);
1568 fork_execute (const char *prog
, char **argv
)
1570 collect_execute (prog
, argv
, NULL
);
1574 /* Unlink a file unless we are debugging. */
1577 maybe_unlink (const char *file
)
1582 notice ("[Leaving %s]\n", file
);
1586 static long sequence_number
= 0;
1588 /* Add a name to a linked list. */
1591 add_to_list (struct head
*head_ptr
, const char *name
)
1593 struct id
*newid
= xcalloc (sizeof (struct id
) + strlen (name
), 1);
1595 strcpy (newid
->name
, name
);
1597 if (head_ptr
->first
)
1598 head_ptr
->last
->next
= newid
;
1600 head_ptr
->first
= newid
;
1602 /* Check for duplicate symbols. */
1603 for (p
= head_ptr
->first
;
1604 strcmp (name
, p
->name
) != 0;
1609 head_ptr
->last
->next
= 0;
1614 newid
->sequence
= ++sequence_number
;
1615 head_ptr
->last
= newid
;
1619 /* Grab the init priority number from an init function name that
1620 looks like "_GLOBAL_.I.12345.foo". */
1623 extract_init_priority (const char *name
)
1627 while (name
[pos
] == '_')
1629 pos
+= 10; /* strlen ("GLOBAL__X_") */
1631 /* Extract init_p number from ctor/dtor name. */
1632 pri
= atoi (name
+ pos
);
1633 return pri
? pri
: DEFAULT_INIT_PRIORITY
;
1636 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
1637 ctors will be run from right to left, dtors from left to right. */
1640 sort_ids (struct head
*head_ptr
)
1642 /* id holds the current element to insert. id_next holds the next
1643 element to insert. id_ptr iterates through the already sorted elements
1644 looking for the place to insert id. */
1645 struct id
*id
, *id_next
, **id_ptr
;
1647 id
= head_ptr
->first
;
1649 /* We don't have any sorted elements yet. */
1650 head_ptr
->first
= NULL
;
1652 for (; id
; id
= id_next
)
1655 id
->sequence
= extract_init_priority (id
->name
);
1657 for (id_ptr
= &(head_ptr
->first
); ; id_ptr
= &((*id_ptr
)->next
))
1659 /* If the sequence numbers are the same, we put the id from the
1660 file later on the command line later in the list. */
1661 || id
->sequence
> (*id_ptr
)->sequence
1662 /* Hack: do lexical compare, too.
1663 || (id->sequence == (*id_ptr)->sequence
1664 && strcmp (id->name, (*id_ptr)->name) > 0) */
1673 /* Now set the sequence numbers properly so write_c_file works. */
1674 for (id
= head_ptr
->first
; id
; id
= id
->next
)
1675 id
->sequence
= ++sequence_number
;
1678 /* Write: `prefix', the names on list LIST, `suffix'. */
1681 write_list (FILE *stream
, const char *prefix
, struct id
*list
)
1685 fprintf (stream
, "%sx%d,\n", prefix
, list
->sequence
);
1690 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1691 /* Given a STRING, return nonzero if it occurs in the list in range
1692 [ARGS_BEGIN,ARGS_END). */
1695 is_in_args (const char *string
, const char **args_begin
,
1696 const char **args_end
)
1698 const char **args_pointer
;
1699 for (args_pointer
= args_begin
; args_pointer
!= args_end
; ++args_pointer
)
1700 if (strcmp (string
, *args_pointer
) == 0)
1704 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1706 #ifdef COLLECT_EXPORT_LIST
1707 /* This function is really used only on AIX, but may be useful. */
1710 is_in_list (const char *prefix
, struct id
*list
)
1714 if (!strcmp (prefix
, list
->name
)) return 1;
1720 #endif /* COLLECT_EXPORT_LIST */
1722 /* Added for debugging purpose. */
1723 #ifdef COLLECT_EXPORT_LIST
1725 dump_list (FILE *stream
, const char *prefix
, struct id
*list
)
1729 fprintf (stream
, "%s%s,\n", prefix
, list
->name
);
1737 dump_prefix_list (FILE *stream
, const char *prefix
, struct prefix_list
*list
)
1741 fprintf (stream
, "%s%s,\n", prefix
, list
->prefix
);
1748 write_list_with_asm (FILE *stream
, const char *prefix
, struct id
*list
)
1752 fprintf (stream
, "%sx%d __asm__ (\"%s\");\n",
1753 prefix
, list
->sequence
, list
->name
);
1758 /* Write out the constructor and destructor tables statically (for a shared
1759 object), along with the functions to execute them. */
1762 write_c_file_stat (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
1766 int frames
= (frame_tables
.number
> 0);
1768 /* Figure out name of output_file, stripping off .so version. */
1769 p
= strrchr (output_file
, '/');
1785 if (strncmp (q
, ".so", 3) == 0)
1794 /* q points to null at end of the string (or . of the .so version) */
1795 prefix
= xmalloc (q
- p
+ 1);
1796 strncpy (prefix
, p
, q
- p
);
1798 for (r
= prefix
; *r
; r
++)
1799 if (!ISALNUM ((unsigned char)*r
))
1802 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
1803 output_file
, prefix
);
1805 initname
= concat ("_GLOBAL__FI_", prefix
, NULL
);
1806 fininame
= concat ("_GLOBAL__FD_", prefix
, NULL
);
1810 /* Write the tables as C code. */
1812 fprintf (stream
, "static int count;\n");
1813 fprintf (stream
, "typedef void entry_pt();\n");
1814 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
1818 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
1820 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
1821 write_list (stream
, "\t\t&", frame_tables
.first
);
1822 fprintf (stream
, "\t0\n};\n");
1824 /* This must match what's in frame.h. */
1825 fprintf (stream
, "struct object {\n");
1826 fprintf (stream
, " void *pc_begin;\n");
1827 fprintf (stream
, " void *pc_end;\n");
1828 fprintf (stream
, " void *fde_begin;\n");
1829 fprintf (stream
, " void *fde_array;\n");
1830 fprintf (stream
, " __SIZE_TYPE__ count;\n");
1831 fprintf (stream
, " struct object *next;\n");
1832 fprintf (stream
, "};\n");
1834 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
1835 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
1837 fprintf (stream
, "static void reg_frame () {\n");
1838 fprintf (stream
, "\tstatic struct object ob;\n");
1839 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
1840 fprintf (stream
, "\t}\n");
1842 fprintf (stream
, "static void dereg_frame () {\n");
1843 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
1844 fprintf (stream
, "\t}\n");
1847 fprintf (stream
, "void %s() {\n", initname
);
1848 if (constructors
.number
> 0 || frames
)
1850 fprintf (stream
, "\tstatic entry_pt *ctors[] = {\n");
1851 write_list (stream
, "\t\t", constructors
.first
);
1853 fprintf (stream
, "\treg_frame,\n");
1854 fprintf (stream
, "\t};\n");
1855 fprintf (stream
, "\tentry_pt **p;\n");
1856 fprintf (stream
, "\tif (count++ != 0) return;\n");
1857 fprintf (stream
, "\tp = ctors + %d;\n", constructors
.number
+ frames
);
1858 fprintf (stream
, "\twhile (p > ctors) (*--p)();\n");
1861 fprintf (stream
, "\t++count;\n");
1862 fprintf (stream
, "}\n");
1863 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
1864 fprintf (stream
, "void %s() {\n", fininame
);
1865 if (destructors
.number
> 0 || frames
)
1867 fprintf (stream
, "\tstatic entry_pt *dtors[] = {\n");
1868 write_list (stream
, "\t\t", destructors
.first
);
1870 fprintf (stream
, "\tdereg_frame,\n");
1871 fprintf (stream
, "\t};\n");
1872 fprintf (stream
, "\tentry_pt **p;\n");
1873 fprintf (stream
, "\tif (--count != 0) return;\n");
1874 fprintf (stream
, "\tp = dtors;\n");
1875 fprintf (stream
, "\twhile (p < dtors + %d) (*p++)();\n",
1876 destructors
.number
+ frames
);
1878 fprintf (stream
, "}\n");
1882 COLLECT_SHARED_INIT_FUNC(stream
, initname
);
1883 COLLECT_SHARED_FINI_FUNC(stream
, fininame
);
1887 /* Write the constructor/destructor tables. */
1889 #ifndef LD_INIT_SWITCH
1891 write_c_file_glob (FILE *stream
, const char *name ATTRIBUTE_UNUSED
)
1893 /* Write the tables as C code. */
1895 int frames
= (frame_tables
.number
> 0);
1897 fprintf (stream
, "typedef void entry_pt();\n\n");
1899 write_list_with_asm (stream
, "extern entry_pt ", constructors
.first
);
1903 write_list_with_asm (stream
, "extern void *", frame_tables
.first
);
1905 fprintf (stream
, "\tstatic void *frame_table[] = {\n");
1906 write_list (stream
, "\t\t&", frame_tables
.first
);
1907 fprintf (stream
, "\t0\n};\n");
1909 /* This must match what's in frame.h. */
1910 fprintf (stream
, "struct object {\n");
1911 fprintf (stream
, " void *pc_begin;\n");
1912 fprintf (stream
, " void *pc_end;\n");
1913 fprintf (stream
, " void *fde_begin;\n");
1914 fprintf (stream
, " void *fde_array;\n");
1915 fprintf (stream
, " __SIZE_TYPE__ count;\n");
1916 fprintf (stream
, " struct object *next;\n");
1917 fprintf (stream
, "};\n");
1919 fprintf (stream
, "extern void __register_frame_info_table (void *, struct object *);\n");
1920 fprintf (stream
, "extern void *__deregister_frame_info (void *);\n");
1922 fprintf (stream
, "static void reg_frame () {\n");
1923 fprintf (stream
, "\tstatic struct object ob;\n");
1924 fprintf (stream
, "\t__register_frame_info_table (frame_table, &ob);\n");
1925 fprintf (stream
, "\t}\n");
1927 fprintf (stream
, "static void dereg_frame () {\n");
1928 fprintf (stream
, "\t__deregister_frame_info (frame_table);\n");
1929 fprintf (stream
, "\t}\n");
1932 fprintf (stream
, "\nentry_pt * __CTOR_LIST__[] = {\n");
1933 fprintf (stream
, "\t(entry_pt *) %d,\n", constructors
.number
+ frames
);
1934 write_list (stream
, "\t", constructors
.first
);
1936 fprintf (stream
, "\treg_frame,\n");
1937 fprintf (stream
, "\t0\n};\n\n");
1939 write_list_with_asm (stream
, "extern entry_pt ", destructors
.first
);
1941 fprintf (stream
, "\nentry_pt * __DTOR_LIST__[] = {\n");
1942 fprintf (stream
, "\t(entry_pt *) %d,\n", destructors
.number
+ frames
);
1943 write_list (stream
, "\t", destructors
.first
);
1945 fprintf (stream
, "\tdereg_frame,\n");
1946 fprintf (stream
, "\t0\n};\n\n");
1948 fprintf (stream
, "extern entry_pt %s;\n", NAME__MAIN
);
1949 fprintf (stream
, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN
);
1951 #endif /* ! LD_INIT_SWITCH */
1954 write_c_file (FILE *stream
, const char *name
)
1956 fprintf (stream
, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
1957 #ifndef LD_INIT_SWITCH
1959 write_c_file_glob (stream
, name
);
1962 write_c_file_stat (stream
, name
);
1963 fprintf (stream
, "#ifdef __cplusplus\n}\n#endif\n");
1966 #ifdef COLLECT_EXPORT_LIST
1968 write_aix_file (FILE *stream
, struct id
*list
)
1970 for (; list
; list
= list
->next
)
1972 fputs (list
->name
, stream
);
1973 putc ('\n', stream
);
1978 #ifdef OBJECT_FORMAT_NONE
1980 /* Generic version to scan the name list of the loaded program for
1981 the symbols g++ uses for static constructors and destructors.
1983 The constructor table begins at __CTOR_LIST__ and contains a count
1984 of the number of pointers (or -1 if the constructors are built in a
1985 separate section by the linker), followed by the pointers to the
1986 constructor functions, terminated with a null pointer. The
1987 destructor table has the same format, and begins at __DTOR_LIST__. */
1990 scan_prog_file (const char *prog_name
, enum pass which_pass
)
1992 void (*int_handler
) (int);
1993 void (*quit_handler
) (int);
1994 char *real_nm_argv
[4];
1995 const char **nm_argv
= (const char **) real_nm_argv
;
2001 if (which_pass
== PASS_SECOND
)
2004 /* If we do not have an `nm', complain. */
2005 if (nm_file_name
== 0)
2006 fatal ("cannot find `nm'");
2008 nm_argv
[argc
++] = nm_file_name
;
2009 if (NM_FLAGS
[0] != '\0')
2010 nm_argv
[argc
++] = NM_FLAGS
;
2012 nm_argv
[argc
++] = prog_name
;
2013 nm_argv
[argc
++] = (char *) 0;
2015 if (pipe (pipe_fd
) < 0)
2016 fatal_perror ("pipe");
2018 inf
= fdopen (pipe_fd
[0], "r");
2019 if (inf
== (FILE *) 0)
2020 fatal_perror ("fdopen");
2022 /* Trace if needed. */
2025 const char **p_argv
;
2028 for (p_argv
= &nm_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2029 fprintf (stderr
, " %s", str
);
2031 fprintf (stderr
, "\n");
2037 /* Spawn child nm on pipe. */
2040 fatal_perror (VFORK_STRING
);
2042 if (pid
== 0) /* child context */
2045 if (dup2 (pipe_fd
[1], 1) < 0)
2046 fatal_perror ("dup2 %d 1", pipe_fd
[1]);
2048 if (close (pipe_fd
[0]) < 0)
2049 fatal_perror ("close %d", pipe_fd
[0]);
2051 if (close (pipe_fd
[1]) < 0)
2052 fatal_perror ("close %d", pipe_fd
[1]);
2054 execv (nm_file_name
, real_nm_argv
);
2055 fatal_perror ("execv %s", nm_file_name
);
2058 /* Parent context from here on. */
2059 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2061 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2064 if (close (pipe_fd
[1]) < 0)
2065 fatal_perror ("close %d", pipe_fd
[1]);
2068 fprintf (stderr
, "\nnm output with constructors/destructors.\n");
2070 /* Read each line of nm output. */
2071 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2076 /* If it contains a constructor or destructor name, add the name
2077 to the appropriate list. */
2079 for (p
= buf
; (ch
= *p
) != '\0' && ch
!= '\n' && ch
!= '_'; p
++)
2080 if (ch
== ' ' && p
[1] == 'U' && p
[2] == ' ')
2087 /* Find the end of the symbol name.
2088 Do not include `|', because Encore nm can tack that on the end. */
2089 for (end
= p
; (ch2
= *end
) != '\0' && !ISSPACE (ch2
) && ch2
!= '|';
2095 switch (is_ctor_dtor (name
))
2098 if (which_pass
!= PASS_LIB
)
2099 add_to_list (&constructors
, name
);
2103 if (which_pass
!= PASS_LIB
)
2104 add_to_list (&destructors
, name
);
2108 if (which_pass
!= PASS_LIB
)
2109 fatal ("init function found in object %s", prog_name
);
2110 #ifndef LD_INIT_SWITCH
2111 add_to_list (&constructors
, name
);
2116 if (which_pass
!= PASS_LIB
)
2117 fatal ("fini function found in object %s", prog_name
);
2118 #ifndef LD_FINI_SWITCH
2119 add_to_list (&destructors
, name
);
2124 if (which_pass
!= PASS_LIB
)
2125 add_to_list (&frame_tables
, name
);
2128 default: /* not a constructor or destructor */
2133 fprintf (stderr
, "\t%s\n", buf
);
2137 fprintf (stderr
, "\n");
2139 if (fclose (inf
) != 0)
2140 fatal_perror ("fclose");
2142 do_wait (nm_file_name
);
2144 signal (SIGINT
, int_handler
);
2146 signal (SIGQUIT
, quit_handler
);
2152 /* Use the List Dynamic Dependencies program to find shared libraries that
2153 the output file depends upon and their initialization/finalization
2154 routines, if any. */
2157 scan_libraries (const char *prog_name
)
2159 static struct head libraries
; /* list of shared libraries found */
2161 void (*int_handler
) (int);
2162 void (*quit_handler
) (int);
2163 char *real_ldd_argv
[4];
2164 const char **ldd_argv
= (const char **) real_ldd_argv
;
2170 /* If we do not have an `ldd', complain. */
2171 if (ldd_file_name
== 0)
2173 error ("cannot find `ldd'");
2177 ldd_argv
[argc
++] = ldd_file_name
;
2178 ldd_argv
[argc
++] = prog_name
;
2179 ldd_argv
[argc
++] = (char *) 0;
2181 if (pipe (pipe_fd
) < 0)
2182 fatal_perror ("pipe");
2184 inf
= fdopen (pipe_fd
[0], "r");
2185 if (inf
== (FILE *) 0)
2186 fatal_perror ("fdopen");
2188 /* Trace if needed. */
2191 const char **p_argv
;
2194 for (p_argv
= &ldd_argv
[0]; (str
= *p_argv
) != (char *) 0; p_argv
++)
2195 fprintf (stderr
, " %s", str
);
2197 fprintf (stderr
, "\n");
2203 /* Spawn child ldd on pipe. */
2206 fatal_perror (VFORK_STRING
);
2208 if (pid
== 0) /* child context */
2211 if (dup2 (pipe_fd
[1], 1) < 0)
2212 fatal_perror ("dup2 %d 1", pipe_fd
[1]);
2214 if (close (pipe_fd
[0]) < 0)
2215 fatal_perror ("close %d", pipe_fd
[0]);
2217 if (close (pipe_fd
[1]) < 0)
2218 fatal_perror ("close %d", pipe_fd
[1]);
2220 execv (ldd_file_name
, real_ldd_argv
);
2221 fatal_perror ("execv %s", ldd_file_name
);
2224 /* Parent context from here on. */
2225 int_handler
= (void (*) (int)) signal (SIGINT
, SIG_IGN
);
2227 quit_handler
= (void (*) (int)) signal (SIGQUIT
, SIG_IGN
);
2230 if (close (pipe_fd
[1]) < 0)
2231 fatal_perror ("close %d", pipe_fd
[1]);
2234 notice ("\nldd output with constructors/destructors.\n");
2236 /* Read each line of ldd output. */
2237 while (fgets (buf
, sizeof buf
, inf
) != (char *) 0)
2240 char *name
, *end
, *p
= buf
;
2242 /* Extract names of libraries and add to list. */
2243 PARSE_LDD_OUTPUT (p
);
2248 if (strncmp (name
, "not found", sizeof ("not found") - 1) == 0)
2249 fatal ("dynamic dependency %s not found", buf
);
2251 /* Find the end of the symbol name. */
2253 (ch2
= *end
) != '\0' && ch2
!= '\n' && !ISSPACE (ch2
) && ch2
!= '|';
2258 if (access (name
, R_OK
) == 0)
2259 add_to_list (&libraries
, name
);
2261 fatal ("unable to open dynamic dependency '%s'", buf
);
2264 fprintf (stderr
, "\t%s\n", buf
);
2267 fprintf (stderr
, "\n");
2269 if (fclose (inf
) != 0)
2270 fatal_perror ("fclose");
2272 do_wait (ldd_file_name
);
2274 signal (SIGINT
, int_handler
);
2276 signal (SIGQUIT
, quit_handler
);
2279 /* Now iterate through the library list adding their symbols to
2281 for (list
= libraries
.first
; list
; list
= list
->next
)
2282 scan_prog_file (list
->name
, PASS_LIB
);
2285 #endif /* LDD_SUFFIX */
2287 #endif /* OBJECT_FORMAT_NONE */
2291 * COFF specific stuff.
2294 #ifdef OBJECT_FORMAT_COFF
2296 #if defined (EXTENDED_COFF)
2298 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2299 # define GCC_SYMENT SYMR
2300 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2301 # define GCC_SYMINC(X) (1)
2302 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2303 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2307 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2308 # define GCC_SYMENT SYMENT
2309 # if defined (C_WEAKEXT)
2310 # define GCC_OK_SYMBOL(X) \
2311 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2312 ((X).n_scnum > N_UNDEF) && \
2314 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2315 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2316 # define GCC_UNDEF_SYMBOL(X) \
2317 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2318 ((X).n_scnum == N_UNDEF))
2320 # define GCC_OK_SYMBOL(X) \
2321 (((X).n_sclass == C_EXT) && \
2322 ((X).n_scnum > N_UNDEF) && \
2324 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2325 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2326 # define GCC_UNDEF_SYMBOL(X) \
2327 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2329 # define GCC_SYMINC(X) ((X).n_numaux+1)
2330 # define GCC_SYMZERO(X) 0
2332 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2334 # define GCC_CHECK_HDR(X) \
2335 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2336 || (HEADER (X).f_magic == 0767 && aix64_flag))
2338 # define GCC_CHECK_HDR(X) \
2339 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2340 || (HEADER (X).f_magic == 0757 && aix64_flag))
2345 #ifdef COLLECT_EXPORT_LIST
2346 /* Array of standard AIX libraries which should not
2347 be scanned for ctors/dtors. */
2348 static const char *const aix_std_libs
[] = {
2356 "/usr/lib/libc_r.a",
2357 "/usr/lib/libm_r.a",
2358 "/usr/lib/threads/libc.a",
2359 "/usr/ccs/lib/libc.a",
2360 "/usr/ccs/lib/libm.a",
2361 "/usr/ccs/lib/libc_r.a",
2362 "/usr/ccs/lib/libm_r.a",
2366 /* This function checks the filename and returns 1
2367 if this name matches the location of a standard AIX library. */
2368 static int ignore_library (const char *);
2370 ignore_library (const char *name
)
2372 const char *const *p
= &aix_std_libs
[0];
2373 while (*p
++ != NULL
)
2374 if (! strcmp (name
, *p
)) return 1;
2377 #endif /* COLLECT_EXPORT_LIST */
2379 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2380 extern char *ldgetname (LDFILE
*, GCC_SYMENT
*);
2383 /* COFF version to scan the name list of the loaded program for
2384 the symbols g++ uses for static constructors and destructors.
2386 The constructor table begins at __CTOR_LIST__ and contains a count
2387 of the number of pointers (or -1 if the constructors are built in a
2388 separate section by the linker), followed by the pointers to the
2389 constructor functions, terminated with a null pointer. The
2390 destructor table has the same format, and begins at __DTOR_LIST__. */
2393 scan_prog_file (const char *prog_name
, enum pass which_pass
)
2395 LDFILE
*ldptr
= NULL
;
2396 int sym_index
, sym_count
;
2399 if (which_pass
!= PASS_FIRST
&& which_pass
!= PASS_OBJ
)
2402 #ifdef COLLECT_EXPORT_LIST
2403 /* We do not need scanning for some standard C libraries. */
2404 if (which_pass
== PASS_FIRST
&& ignore_library (prog_name
))
2407 /* On AIX we have a loop, because there is not much difference
2408 between an object and an archive. This trick allows us to
2409 eliminate scan_libraries() function. */
2413 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2414 non-const char * filename parameter, even though it will not
2415 modify that string. So we must cast away const-ness here,
2416 which will cause -Wcast-qual to burp. */
2417 if ((ldptr
= ldopen ((char *)prog_name
, ldptr
)) != NULL
)
2419 if (! MY_ISCOFF (HEADER (ldptr
).f_magic
))
2420 fatal ("%s: not a COFF file", prog_name
);
2422 if (GCC_CHECK_HDR (ldptr
))
2424 sym_count
= GCC_SYMBOLS (ldptr
);
2425 sym_index
= GCC_SYMZERO (ldptr
);
2427 #ifdef COLLECT_EXPORT_LIST
2428 /* Is current archive member a shared object? */
2429 is_shared
= HEADER (ldptr
).f_flags
& F_SHROBJ
;
2432 while (sym_index
< sym_count
)
2436 if (ldtbread (ldptr
, sym_index
, &symbol
) <= 0)
2438 sym_index
+= GCC_SYMINC (symbol
);
2440 if (GCC_OK_SYMBOL (symbol
))
2444 if ((name
= ldgetname (ldptr
, &symbol
)) == NULL
)
2445 continue; /* Should never happen. */
2447 #ifdef XCOFF_DEBUGGING_INFO
2448 /* All AIX function names have a duplicate entry
2449 beginning with a dot. */
2454 switch (is_ctor_dtor (name
))
2458 add_to_list (&constructors
, name
);
2459 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2460 if (which_pass
== PASS_OBJ
)
2461 add_to_list (&exports
, name
);
2467 add_to_list (&destructors
, name
);
2468 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2469 if (which_pass
== PASS_OBJ
)
2470 add_to_list (&exports
, name
);
2474 #ifdef COLLECT_EXPORT_LIST
2476 #ifndef LD_INIT_SWITCH
2478 add_to_list (&constructors
, name
);
2483 #ifndef LD_INIT_SWITCH
2485 add_to_list (&destructors
, name
);
2492 add_to_list (&frame_tables
, name
);
2493 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2494 if (which_pass
== PASS_OBJ
)
2495 add_to_list (&exports
, name
);
2499 default: /* not a constructor or destructor */
2500 #ifdef COLLECT_EXPORT_LIST
2501 /* Explicitly export all global symbols when
2502 building a shared object on AIX, but do not
2503 re-export symbols from another shared object
2504 and do not export symbols if the user
2505 provides an explicit export list. */
2506 if (shared_obj
&& !is_shared
2507 && which_pass
== PASS_OBJ
&& !export_flag
)
2508 add_to_list (&exports
, name
);
2514 #if !defined(EXTENDED_COFF)
2515 fprintf (stderr
, "\tsec=%d class=%d type=%s%o %s\n",
2516 symbol
.n_scnum
, symbol
.n_sclass
,
2517 (symbol
.n_type
? "0" : ""), symbol
.n_type
,
2521 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
2522 symbol
.iss
, (long) symbol
.value
, symbol
.index
, name
);
2527 #ifdef COLLECT_EXPORT_LIST
2530 /* If archive contains both 32-bit and 64-bit objects,
2531 we want to skip objects in other mode so mismatch normal. */
2533 fprintf (stderr
, "%s : magic=%o aix64=%d mismatch\n",
2534 prog_name
, HEADER (ldptr
).f_magic
, aix64_flag
);
2540 fatal ("%s: cannot open as COFF file", prog_name
);
2542 #ifdef COLLECT_EXPORT_LIST
2543 /* On AIX loop continues while there are more members in archive. */
2545 while (ldclose (ldptr
) == FAILURE
);
2547 /* Otherwise we simply close ldptr. */
2548 (void) ldclose(ldptr
);
2551 #endif /* OBJECT_FORMAT_COFF */
2553 #ifdef COLLECT_EXPORT_LIST
2554 /* Given a library name without "lib" prefix, this function
2555 returns a full library name including a path. */
2557 resolve_lib_name (const char *name
)
2562 for (i
= 0; libpaths
[i
]; i
++)
2563 if (libpaths
[i
]->max_len
> l
)
2564 l
= libpaths
[i
]->max_len
;
2566 lib_buf
= xmalloc (l
+ strlen(name
) + 10);
2568 for (i
= 0; libpaths
[i
]; i
++)
2570 struct prefix_list
*list
= libpaths
[i
]->plist
;
2571 for (; list
; list
= list
->next
)
2573 /* The following lines are needed because path_prefix list
2574 may contain directories both with trailing '/' and
2577 if (list
->prefix
[strlen(list
->prefix
)-1] != '/')
2579 for (j
= 0; libexts
[j
]; j
++)
2581 sprintf (lib_buf
, "%s%slib%s.%s",
2582 list
->prefix
, p
, name
, libexts
[j
]);
2583 if (debug
) fprintf (stderr
, "searching for: %s\n", lib_buf
);
2584 if (file_exists (lib_buf
))
2586 if (debug
) fprintf (stderr
, "found: %s\n", lib_buf
);
2593 fprintf (stderr
, "not found\n");
2595 fatal ("library lib%s not found", name
);
2598 #endif /* COLLECT_EXPORT_LIST */