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 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. */
32 #if ! defined( SIGCHLD ) && defined( SIGCLD )
33 # define SIGCHLD SIGCLD
36 #ifdef vfork /* Autoconf may define this to fork for us. */
37 # define VFORK_STRING "fork"
39 # define VFORK_STRING "vfork"
45 #define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \
46 lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1)
49 #ifndef LIBRARY_PATH_ENV
50 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
61 /* Obstack allocation and deallocation routines. */
62 #define obstack_chunk_alloc xmalloc
63 #define obstack_chunk_free free
65 /* On certain systems, we have code that works by scanning the object file
66 directly. But this code uses system-specific header files and library
67 functions, so turn it off in a cross-compiler. Likewise, the names of
68 the utilities are not correct for a cross-compiler; we have to hope that
69 cross-versions are in the proper directories. */
72 #undef SUNOS4_SHARED_LIBRARIES
73 #undef OBJECT_FORMAT_COFF
74 #undef OBJECT_FORMAT_ROSE
76 #undef REAL_LD_FILE_NAME
77 #undef REAL_NM_FILE_NAME
78 #undef REAL_STRIP_FILE_NAME
81 /* If we cannot use a special method, use the ordinary one:
82 run nm to find what symbols are present.
83 In a cross-compiler, this means you need a cross nm,
84 but that is not quite as unpleasant as special headers. */
86 #if !defined (OBJECT_FORMAT_COFF) && !defined (OBJECT_FORMAT_ROSE)
87 #define OBJECT_FORMAT_NONE
90 #ifdef OBJECT_FORMAT_COFF
99 /* Many versions of ldfcn.h define these. */
107 /* Some systems have an ISCOFF macro, but others do not. In some cases
108 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
109 that either do not have an ISCOFF macro in /usr/include or for those
110 where it is wrong. */
113 #define MY_ISCOFF(X) ISCOFF (X)
116 #endif /* OBJECT_FORMAT_COFF */
118 #ifdef OBJECT_FORMAT_ROSE
125 #include <sys/mman.h>
129 #include <mach_o_format.h>
130 #include <mach_o_header.h>
131 #include <mach_o_vals.h>
132 #include <mach_o_types.h>
134 #endif /* OBJECT_FORMAT_ROSE */
136 #ifdef OBJECT_FORMAT_NONE
138 /* Default flags to pass to nm. */
140 #define NM_FLAGS "-n"
143 #endif /* OBJECT_FORMAT_NONE */
145 /* Some systems use __main in a way incompatible with its use in gcc, in these
146 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
147 give the same symbol without quotes for an alternative entry point. You
148 must define both, or neither. */
150 #define NAME__MAIN "__main"
151 #define SYMBOL__MAIN __main
154 /* This must match tree.h. */
155 #define DEFAULT_INIT_PRIORITY 65535
157 #if defined (LDD_SUFFIX) || SUNOS4_SHARED_LIBRARIES
158 #define SCAN_LIBRARIES
162 int do_collecting = 1;
164 int do_collecting = 0;
167 /* Nonzero if we should suppress the automatic demangling of identifiers
168 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
171 /* Linked lists of constructor and destructor names. */
187 /* Enumeration giving which pass this is for scanning the program file. */
190 PASS_FIRST, /* without constructors */
191 PASS_OBJ, /* individual objects */
192 PASS_LIB, /* looking for shared libraries */
193 PASS_SECOND /* with constructors linked in */
196 int vflag; /* true if -v */
197 static int rflag; /* true if -r */
198 static int strip_flag; /* true if -s */
199 #ifdef COLLECT_EXPORT_LIST
200 static int export_flag; /* true if -bE */
201 static int aix64_flag; /* true if -b64 */
204 int debug; /* true if -debug */
206 static int shared_obj; /* true if -shared */
208 static const char *c_file; /* <xxx>.c for constructor/destructor list. */
209 static const char *o_file; /* <xxx>.o for constructor/destructor list. */
210 #ifdef COLLECT_EXPORT_LIST
211 static const char *export_file; /* <xxx>.x for AIX export list. */
213 const char *ldout; /* File for ld errors. */
214 static const char *output_file; /* Output file for ld. */
215 static const char *nm_file_name; /* pathname of nm */
217 static const char *ldd_file_name; /* pathname of ldd (or equivalent) */
219 static const char *strip_file_name; /* pathname of strip */
220 const char *c_file_name; /* pathname of gcc */
221 static char *initname, *fininame; /* names of init and fini funcs */
223 static struct head constructors; /* list of constructors found */
224 static struct head destructors; /* list of destructors found */
225 #ifdef COLLECT_EXPORT_LIST
226 static struct head exports; /* list of exported symbols */
228 static struct head frame_tables; /* list of frame unwind info tables */
230 struct obstack temporary_obstack;
231 struct obstack permanent_obstack;
232 char * temporary_firstobj;
234 /* Holds the return value of pexecute. */
237 /* Defined in the automatically-generated underscore.c. */
238 extern int prepends_underscore;
240 #ifndef GET_ENV_PATH_LIST
241 #define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0)
244 /* Structure to hold all the directories in which to search for files to
249 const char *prefix; /* String to prepend to the path. */
250 struct prefix_list *next; /* Next in linked list. */
255 struct prefix_list *plist; /* List of prefixes to try */
256 int max_len; /* Max length of a prefix in PLIST */
257 const char *name; /* Name of this list (used in config stuff) */
260 #ifdef COLLECT_EXPORT_LIST
261 /* Lists to keep libraries to be scanned for global constructors/destructors. */
262 static struct head libs; /* list of libraries */
263 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
264 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
265 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
266 &libpath_lib_dirs, NULL};
267 static const char *const libexts[3] = {"a", "so", NULL}; /* possible library extentions */
270 static void handler PARAMS ((int));
271 static int is_ctor_dtor PARAMS ((const char *));
272 static char *find_a_file PARAMS ((struct path_prefix *, const char *));
273 static void add_prefix PARAMS ((struct path_prefix *, const char *));
274 static void prefix_from_env PARAMS ((const char *, struct path_prefix *));
275 static void prefix_from_string PARAMS ((const char *, struct path_prefix *));
276 static void do_wait PARAMS ((const char *));
277 static void fork_execute PARAMS ((const char *, char **));
278 static void maybe_unlink PARAMS ((const char *));
279 static void add_to_list PARAMS ((struct head *, const char *));
280 static int extract_init_priority PARAMS ((const char *));
281 static void sort_ids PARAMS ((struct head *));
282 static void write_list PARAMS ((FILE *, const char *, struct id *));
283 #ifdef COLLECT_EXPORT_LIST
284 static void dump_list PARAMS ((FILE *, const char *, struct id *));
287 static void dump_prefix_list PARAMS ((FILE *, const char *, struct prefix_list *));
289 static void write_list_with_asm PARAMS ((FILE *, const char *, struct id *));
290 static void write_c_file PARAMS ((FILE *, const char *));
291 static void write_c_file_stat PARAMS ((FILE *, const char *));
292 #ifndef LD_INIT_SWITCH
293 static void write_c_file_glob PARAMS ((FILE *, const char *));
295 static void scan_prog_file PARAMS ((const char *, enum pass));
296 #ifdef SCAN_LIBRARIES
297 static void scan_libraries PARAMS ((const char *));
299 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
300 static int is_in_args PARAMS ((const char *, const char **, const char **));
302 #ifdef COLLECT_EXPORT_LIST
303 static int is_in_list PARAMS ((const char *, struct id *));
304 static void write_aix_file PARAMS ((FILE *, struct id *));
305 static char *resolve_lib_name PARAMS ((const char *));
306 static int ignore_library PARAMS ((const char *));
308 static char *extract_string PARAMS ((const char **));
323 while ((fd = dup (oldfd)) != newfd && fd >= 0) /* good enough for low fd's */
326 close (fdtmp[--fdx]);
332 /* Delete tempfiles and exit function. */
335 collect_exit (status)
338 if (c_file != 0 && c_file[0])
339 maybe_unlink (c_file);
341 if (o_file != 0 && o_file[0])
342 maybe_unlink (o_file);
344 #ifdef COLLECT_EXPORT_LIST
345 if (export_file != 0 && export_file[0])
346 maybe_unlink (export_file);
349 if (ldout != 0 && ldout[0])
352 maybe_unlink (ldout);
355 if (status != 0 && output_file != 0 && output_file[0])
356 maybe_unlink (output_file);
362 /* Notify user of a non-error. */
364 notice VPARAMS ((const char *msgid, ...))
367 VA_FIXEDARG (ap, const char *, msgid);
369 vfprintf (stderr, _(msgid), ap);
373 /* Die when sys call fails. */
376 fatal_perror VPARAMS ((const char * msgid, ...))
381 VA_FIXEDARG (ap, const char *, msgid);
383 fprintf (stderr, "collect2: ");
384 vfprintf (stderr, _(msgid), ap);
385 fprintf (stderr, ": %s\n", xstrerror (e));
388 collect_exit (FATAL_EXIT_CODE);
394 fatal VPARAMS ((const char * msgid, ...))
397 VA_FIXEDARG (ap, const char *, msgid);
399 fprintf (stderr, "collect2: ");
400 vfprintf (stderr, _(msgid), ap);
401 fprintf (stderr, "\n");
404 collect_exit (FATAL_EXIT_CODE);
407 /* Write error message. */
410 error VPARAMS ((const char * msgid, ...))
413 VA_FIXEDARG (ap, const char *, msgid);
415 fprintf (stderr, "collect2: ");
416 vfprintf (stderr, _(msgid), ap);
417 fprintf (stderr, "\n");
421 /* In case obstack is linked in, and abort is defined to fancy_abort,
422 provide a default entry. */
427 fatal ("internal error");
434 if (c_file != 0 && c_file[0])
435 maybe_unlink (c_file);
437 if (o_file != 0 && o_file[0])
438 maybe_unlink (o_file);
440 if (ldout != 0 && ldout[0])
441 maybe_unlink (ldout);
443 #ifdef COLLECT_EXPORT_LIST
444 if (export_file != 0 && export_file[0])
445 maybe_unlink (export_file);
448 signal (signo, SIG_DFL);
449 kill (getpid (), signo);
457 return access (name, R_OK) == 0;
460 /* Parse a reasonable subset of shell quoting syntax. */
477 obstack_1grow (&temporary_obstack, c);
478 else if (! inside && c == ' ')
480 else if (! inside && c == '\\')
485 obstack_1grow (&temporary_obstack, c);
488 obstack_1grow (&temporary_obstack, '\0');
490 return obstack_finish (&temporary_obstack);
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 = obstack_finish (&temporary_obstack);
515 ++word, putc ('.', stderr);
517 if (*p == '_' && prepends_underscore)
523 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI);
528 fputs (result, stderr);
530 diff = strlen (word) - strlen (result);
531 while (diff > 0 && c == ' ')
532 --diff, putc (' ', stderr);
533 while (diff < 0 && c == ' ')
534 ++diff, c = getc (stream);
539 fputs (word, stderr);
542 obstack_free (&temporary_obstack, temporary_firstobj);
551 /* Decide whether the given symbol is: a constructor (1), a destructor
552 (2), a routine in a shared object that calls all the constructors
553 (3) or destructors (4), a DWARF exception-handling table (5), or
554 nothing special (0). */
560 struct names { const char *const name; const int len; const int ret;
561 const int two_underscores; };
565 const char *orig_s = s;
567 static struct names special[] = {
568 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, 1, 0 },
569 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, 2, 0 },
570 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, 5, 0 },
571 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, 3, 0 },
572 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, 4, 0 },
573 #ifdef CFRONT_LOSSAGE /* Do not collect cfront initialization functions.
574 cfront has its own linker procedure to collect them;
575 if collect2 gets them too, they get collected twice
576 when the cfront procedure is run and the compiler used
577 for linking happens to be GCC. */
578 { "sti__", sizeof ("sti__")-1, 1, 1 },
579 { "std__", sizeof ("std__")-1, 2, 1 },
580 #endif /* CFRONT_LOSSAGE */
584 while ((ch = *s) == '_')
590 for (p = &special[0]; p->len > 0; p++)
593 && (!p->two_underscores || ((s - orig_s) >= 2))
594 && strncmp(s, p->name, p->len) == 0)
602 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
603 and one from the PATH variable. */
605 static struct path_prefix cpath, path;
608 /* This is the name of the target machine. We use it to form the name
609 of the files to execute. */
611 static const char *const target_machine = TARGET_MACHINE;
614 /* Search for NAME using prefix list PPREFIX. We only look for executable
617 Return 0 if not found, otherwise return its name, allocated with malloc. */
620 find_a_file (pprefix, name)
621 struct path_prefix *pprefix;
625 struct prefix_list *pl;
626 int len = pprefix->max_len + strlen (name) + 1;
629 fprintf (stderr, "Looking for '%s'\n", name);
631 #ifdef HOST_EXECUTABLE_SUFFIX
632 len += strlen (HOST_EXECUTABLE_SUFFIX);
635 temp = xmalloc (len);
637 /* Determine the filename to execute (special case for absolute paths). */
640 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
641 || (*name && name[1] == ':')
645 if (access (name, X_OK) == 0)
650 fprintf (stderr, " - found: absolute path\n");
655 #ifdef HOST_EXECUTABLE_SUFFIX
656 /* Some systems have a suffix for executable files.
657 So try appending that. */
659 strcat (temp, HOST_EXECUTABLE_SUFFIX);
661 if (access (temp, X_OK) == 0)
666 fprintf (stderr, " - failed to locate using absolute path\n");
669 for (pl = pprefix->plist; pl; pl = pl->next)
673 strcpy (temp, pl->prefix);
676 if (stat (temp, &st) >= 0
677 && ! S_ISDIR (st.st_mode)
678 && access (temp, X_OK) == 0)
681 #ifdef HOST_EXECUTABLE_SUFFIX
682 /* Some systems have a suffix for executable files.
683 So try appending that. */
684 strcat (temp, HOST_EXECUTABLE_SUFFIX);
686 if (stat (temp, &st) >= 0
687 && ! S_ISDIR (st.st_mode)
688 && access (temp, X_OK) == 0)
693 if (debug && pprefix->plist == NULL)
694 fprintf (stderr, " - failed: no entries in prefix list\n");
700 /* Add an entry for PREFIX to prefix list PPREFIX. */
703 add_prefix (pprefix, prefix)
704 struct path_prefix *pprefix;
707 struct prefix_list *pl, **prev;
712 for (pl = pprefix->plist; pl->next; pl = pl->next)
717 prev = &pprefix->plist;
719 /* Keep track of the longest prefix */
721 len = strlen (prefix);
722 if (len > pprefix->max_len)
723 pprefix->max_len = len;
725 pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
726 pl->prefix = xstrdup (prefix);
731 pl->next = (struct prefix_list *) 0;
735 /* Take the value of the environment variable ENV, break it into a path, and
736 add of the entries to PPREFIX. */
739 prefix_from_env (env, pprefix)
741 struct path_prefix *pprefix;
744 GET_ENV_PATH_LIST (p, env);
747 prefix_from_string (p, pprefix);
751 prefix_from_string (p, pprefix)
753 struct path_prefix *pprefix;
755 const char *startp, *endp;
756 char *nstore = (char *) xmalloc (strlen (p) + 3);
759 fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR);
764 if (*endp == PATH_SEPARATOR || *endp == 0)
766 strncpy (nstore, startp, endp-startp);
769 strcpy (nstore, "./");
771 else if (! IS_DIR_SEPARATOR (endp[-1]))
773 nstore[endp-startp] = DIR_SEPARATOR;
774 nstore[endp-startp+1] = 0;
777 nstore[endp-startp] = 0;
780 fprintf (stderr, " - add prefix: %s\n", nstore);
782 add_prefix (pprefix, nstore);
785 endp = startp = endp + 1;
794 int main PARAMS ((int, char *[]));
800 static const char *const ld_suffix = "ld";
801 static const char *const real_ld_suffix = "real-ld";
802 static const char *const collect_ld_suffix = "collect-ld";
803 static const char *const nm_suffix = "nm";
804 static const char *const gnm_suffix = "gnm";
806 static const char *const ldd_suffix = LDD_SUFFIX;
808 static const char *const strip_suffix = "strip";
809 static const char *const gstrip_suffix = "gstrip";
812 /* If we look for a program in the compiler directories, we just use
813 the short name, since these directories are already system-specific.
814 But it we look for a program in the system directories, we need to
815 qualify the program name with the target machine. */
817 const char *const full_ld_suffix =
818 concat(target_machine, "-", ld_suffix, NULL);
819 const char *const full_nm_suffix =
820 concat (target_machine, "-", nm_suffix, NULL);
821 const char *const full_gnm_suffix =
822 concat (target_machine, "-", gnm_suffix, NULL);
824 const char *const full_ldd_suffix =
825 concat (target_machine, "-", ldd_suffix, NULL);
827 const char *const full_strip_suffix =
828 concat (target_machine, "-", strip_suffix, NULL);
829 const char *const full_gstrip_suffix =
830 concat (target_machine, "-", gstrip_suffix, NULL);
832 const char *const full_ld_suffix = ld_suffix;
833 const char *const full_nm_suffix = nm_suffix;
834 const char *const full_gnm_suffix = gnm_suffix;
836 const char *const full_ldd_suffix = ldd_suffix;
838 const char *const full_strip_suffix = strip_suffix;
839 const char *const full_gstrip_suffix = gstrip_suffix;
840 #endif /* CROSS_COMPILE */
844 #ifdef COLLECT_EXPORT_LIST
847 const char *ld_file_name;
858 int num_c_args = argc+9;
860 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
862 /* Suppress demangling by the real linker, which may be broken. */
863 putenv (xstrdup ("COLLECT_NO_DEMANGLE="));
865 #if defined (COLLECT2_HOST_INITIALIZATION)
866 /* Perform system dependent initialization, if necessary. */
867 COLLECT2_HOST_INITIALIZATION;
871 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
872 receive the signal. A different setting is inheritable */
873 signal (SIGCHLD, SIG_DFL);
878 /* Do not invoke xcalloc before this point, since locale needs to be
879 set first, in case a diagnostic is issued. */
881 ld1 = (const char **)(ld1_argv = (char **) xcalloc(sizeof (char *), argc+3));
882 ld2 = (const char **)(ld2_argv = (char **) xcalloc(sizeof (char *), argc+10));
883 object = (const char **)(object_lst = (char **) xcalloc(sizeof (char *), argc));
889 /* Parse command line early for instances of -debug. This allows
890 the debug flag to be set before functions like find_a_file()
895 for (i = 1; argv[i] != NULL; i ++)
896 if (! strcmp (argv[i], "-debug"))
901 #ifndef DEFAULT_A_OUT_NAME
902 output_file = "a.out";
904 output_file = DEFAULT_A_OUT_NAME;
907 obstack_begin (&temporary_obstack, 0);
908 obstack_begin (&permanent_obstack, 0);
909 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
911 current_demangling_style = auto_demangling;
912 p = getenv ("COLLECT_GCC_OPTIONS");
915 const char *q = extract_string (&p);
916 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
919 obstack_free (&temporary_obstack, temporary_firstobj);
921 /* -fno-exceptions -w */
924 c_ptr = (const char **)
925 (c_argv = (char **) xcalloc (sizeof (char *), num_c_args));
928 fatal ("no arguments");
931 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
932 signal (SIGQUIT, handler);
934 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
935 signal (SIGINT, handler);
937 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
938 signal (SIGALRM, handler);
941 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
942 signal (SIGHUP, handler);
944 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
945 signal (SIGSEGV, handler);
947 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
948 signal (SIGBUS, handler);
951 /* Extract COMPILER_PATH and PATH into our prefix list. */
952 prefix_from_env ("COMPILER_PATH", &cpath);
953 prefix_from_env ("PATH", &path);
955 /* Try to discover a valid linker/nm/strip to use. */
957 /* Maybe we know the right file to use (if not cross). */
959 #ifdef DEFAULT_LINKER
960 if (access (DEFAULT_LINKER, X_OK) == 0)
961 ld_file_name = DEFAULT_LINKER;
962 if (ld_file_name == 0)
964 #ifdef REAL_LD_FILE_NAME
965 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
966 if (ld_file_name == 0)
968 /* Search the (target-specific) compiler dirs for ld'. */
969 ld_file_name = find_a_file (&cpath, real_ld_suffix);
970 /* Likewise for `collect-ld'. */
971 if (ld_file_name == 0)
972 ld_file_name = find_a_file (&cpath, collect_ld_suffix);
973 /* Search the compiler directories for `ld'. We have protection against
974 recursive calls in find_a_file. */
975 if (ld_file_name == 0)
976 ld_file_name = find_a_file (&cpath, ld_suffix);
977 /* Search the ordinary system bin directories
978 for `ld' (if native linking) or `TARGET-ld' (if cross). */
979 if (ld_file_name == 0)
980 ld_file_name = find_a_file (&path, full_ld_suffix);
982 #ifdef REAL_NM_FILE_NAME
983 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
984 if (nm_file_name == 0)
986 nm_file_name = find_a_file (&cpath, gnm_suffix);
987 if (nm_file_name == 0)
988 nm_file_name = find_a_file (&path, full_gnm_suffix);
989 if (nm_file_name == 0)
990 nm_file_name = find_a_file (&cpath, nm_suffix);
991 if (nm_file_name == 0)
992 nm_file_name = find_a_file (&path, full_nm_suffix);
995 ldd_file_name = find_a_file (&cpath, ldd_suffix);
996 if (ldd_file_name == 0)
997 ldd_file_name = find_a_file (&path, full_ldd_suffix);
1000 #ifdef REAL_STRIP_FILE_NAME
1001 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1002 if (strip_file_name == 0)
1004 strip_file_name = find_a_file (&cpath, gstrip_suffix);
1005 if (strip_file_name == 0)
1006 strip_file_name = find_a_file (&path, full_gstrip_suffix);
1007 if (strip_file_name == 0)
1008 strip_file_name = find_a_file (&cpath, strip_suffix);
1009 if (strip_file_name == 0)
1010 strip_file_name = find_a_file (&path, full_strip_suffix);
1012 /* Determine the full path name of the C compiler to use. */
1013 c_file_name = getenv ("COLLECT_GCC");
1014 if (c_file_name == 0)
1016 #ifdef CROSS_COMPILE
1017 c_file_name = concat (target_machine, "-gcc", NULL);
1019 c_file_name = "gcc";
1023 p = find_a_file (&cpath, c_file_name);
1025 /* Here it should be safe to use the system search path since we should have
1026 already qualified the name of the compiler when it is needed. */
1028 p = find_a_file (&path, c_file_name);
1033 *ld1++ = *ld2++ = ld_file_name;
1035 /* Make temp file names. */
1036 c_file = make_temp_file (".c");
1037 o_file = make_temp_file (".o");
1038 #ifdef COLLECT_EXPORT_LIST
1039 export_file = make_temp_file (".x");
1041 ldout = make_temp_file (".ld");
1042 *c_ptr++ = c_file_name;
1049 #ifdef COLLECT_EXPORT_LIST
1050 /* Generate a list of directories from LIBPATH. */
1051 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1052 /* Add to this list also two standard directories where
1053 AIX loader always searches for libraries. */
1054 add_prefix (&libpath_lib_dirs, "/lib");
1055 add_prefix (&libpath_lib_dirs, "/usr/lib");
1058 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1060 AIX support needs to know if -shared has been specified before
1061 parsing commandline arguments. */
1063 p = getenv ("COLLECT_GCC_OPTIONS");
1066 const char *q = extract_string (&p);
1067 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1068 *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
1069 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1070 *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
1071 if (strncmp (q, "-shared", sizeof ("-shared") - 1) == 0)
1073 if (*q == '-' && q[1] == 'B')
1075 *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
1078 q = extract_string (&p);
1079 *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
1083 obstack_free (&temporary_obstack, temporary_firstobj);
1084 *c_ptr++ = "-fno-exceptions";
1087 /* !!! When GCC calls collect2,
1088 it does not know whether it is calling collect2 or ld.
1089 So collect2 cannot meaningfully understand any options
1090 except those ld understands.
1091 If you propose to make GCC pass some other option,
1092 just imagine what will happen if ld is really ld!!! */
1094 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1095 /* After the first file, put in the c++ rt0. */
1098 while ((arg = *++argv) != (char *) 0)
1100 *ld1++ = *ld2++ = arg;
1106 #ifdef COLLECT_EXPORT_LIST
1107 /* We want to disable automatic exports on AIX when user
1108 explicitly puts an export list in command line */
1110 if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1112 else if (arg[2] == '6' && arg[3] == '4')
1118 if (!strcmp (arg, "-debug"))
1120 /* Already parsed. */
1129 /* place o_file BEFORE this argument! */
1135 #ifdef COLLECT_EXPORT_LIST
1137 /* Resolving full library name. */
1138 const char *s = resolve_lib_name (arg+2);
1140 /* Saving a full library name. */
1141 add_to_list (&libs, s);
1146 #ifdef COLLECT_EXPORT_LIST
1147 /* Saving directories where to search for libraries. */
1149 add_prefix (&cmdline_lib_dirs, arg+2);
1152 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1154 if (is_in_args (arg, (const char **) ld1_argv, ld1-1))
1157 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1162 output_file = *ld1++ = *ld2++ = *++argv;
1164 #ifdef SWITCHES_NEED_SPACES
1165 && ! strchr (SWITCHES_NEED_SPACES, arg[1])
1169 output_file = &arg[2];
1178 if (arg[2] == '\0' && do_collecting)
1180 /* We must strip after the nm run, otherwise C++ linking
1181 will not work. Thus we strip in the second ld run, or
1182 else with strip if there is no second ld run. */
1194 else if ((p = strrchr (arg, '.')) != (char *) 0
1195 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1196 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1197 || strcmp (p, ".obj") == 0))
1206 /* place o_file BEFORE this argument! */
1212 if (p[1] == 'o' || p[1] == 'l')
1214 #ifdef COLLECT_EXPORT_LIST
1215 /* libraries can be specified directly, i.e. without -l flag. */
1218 /* Saving a full library name. */
1219 add_to_list (&libs, arg);
1225 #ifdef COLLECT_EXPORT_LIST
1226 /* This is added only for debugging purposes. */
1229 fprintf (stderr, "List of libraries:\n");
1230 dump_list (stderr, "\t", libs.first);
1233 /* The AIX linker will discard static constructors in object files if
1234 nothing else in the file is referenced, so look at them first. */
1236 const char **export_object_lst = (const char **)object_lst;
1238 while (export_object_lst < object)
1239 scan_prog_file (*export_object_lst++, PASS_OBJ);
1242 struct id *list = libs.first;
1244 for (; list; list = list->next)
1245 scan_prog_file (list->name, PASS_FIRST);
1250 char *buf = concat ("-bE:", export_file, NULL);
1255 exportf = fopen (export_file, "w");
1256 if (exportf == (FILE *) 0)
1257 fatal_perror ("fopen %s", export_file);
1258 write_aix_file (exportf, exports.first);
1259 if (fclose (exportf))
1260 fatal_perror ("fclose %s", export_file);
1265 *c_ptr = *ld1 = *object = (char *) 0;
1269 notice ("collect2 version %s", version_string);
1270 #ifdef TARGET_VERSION
1273 fprintf (stderr, "\n");
1279 fprintf (stderr, "ld_file_name = %s\n",
1280 (ld_file_name ? ld_file_name : "not found"));
1281 fprintf (stderr, "c_file_name = %s\n",
1282 (c_file_name ? c_file_name : "not found"));
1283 fprintf (stderr, "nm_file_name = %s\n",
1284 (nm_file_name ? nm_file_name : "not found"));
1286 fprintf (stderr, "ldd_file_name = %s\n",
1287 (ldd_file_name ? ldd_file_name : "not found"));
1289 fprintf (stderr, "strip_file_name = %s\n",
1290 (strip_file_name ? strip_file_name : "not found"));
1291 fprintf (stderr, "c_file = %s\n",
1292 (c_file ? c_file : "not found"));
1293 fprintf (stderr, "o_file = %s\n",
1294 (o_file ? o_file : "not found"));
1296 ptr = getenv ("COLLECT_GCC_OPTIONS");
1298 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1300 ptr = getenv ("COLLECT_GCC");
1302 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1304 ptr = getenv ("COMPILER_PATH");
1306 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1308 ptr = getenv (LIBRARY_PATH_ENV);
1310 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1312 fprintf (stderr, "\n");
1315 /* Load the program, searching all libraries and attempting to provide
1316 undefined symbols from repository information. */
1318 /* On AIX we do this later. */
1319 #ifndef COLLECT_EXPORT_LIST
1320 do_tlink (ld1_argv, object_lst);
1323 /* If -r or they will be run via some other method, do not build the
1324 constructor or destructor list, just return now. */
1326 #ifndef COLLECT_EXPORT_LIST
1331 #ifdef COLLECT_EXPORT_LIST
1332 /* Do the link we avoided above if we are exiting. */
1333 do_tlink (ld1_argv, object_lst);
1335 /* But make sure we delete the export file we may have created. */
1336 if (export_file != 0 && export_file[0])
1337 maybe_unlink (export_file);
1339 maybe_unlink (c_file);
1340 maybe_unlink (o_file);
1344 /* Examine the namelist with nm and search it for static constructors
1345 and destructors to call.
1346 Write the constructor and destructor tables to a .s file and reload. */
1348 /* On AIX we already scanned for global constructors/destructors. */
1349 #ifndef COLLECT_EXPORT_LIST
1350 scan_prog_file (output_file, PASS_FIRST);
1353 #ifdef SCAN_LIBRARIES
1354 scan_libraries (output_file);
1359 notice ("%d constructor(s) found\n", constructors.number);
1360 notice ("%d destructor(s) found\n", destructors.number);
1361 notice ("%d frame table(s) found\n", frame_tables.number);
1364 if (constructors.number == 0 && destructors.number == 0
1365 && frame_tables.number == 0
1366 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1367 /* If we will be running these functions ourselves, we want to emit
1368 stubs into the shared library so that we do not have to relink
1369 dependent programs when we add static objects. */
1374 #ifdef COLLECT_EXPORT_LIST
1375 /* Do tlink without additional code generation */
1376 do_tlink (ld1_argv, object_lst);
1378 /* Strip now if it was requested on the command line. */
1381 char **real_strip_argv = (char **) xcalloc (sizeof (char *), 3);
1382 const char ** strip_argv = (const char **) real_strip_argv;
1384 strip_argv[0] = strip_file_name;
1385 strip_argv[1] = output_file;
1386 strip_argv[2] = (char *) 0;
1387 fork_execute ("strip", real_strip_argv);
1390 #ifdef COLLECT_EXPORT_LIST
1391 maybe_unlink (export_file);
1393 maybe_unlink (c_file);
1394 maybe_unlink (o_file);
1398 /* Sort ctor and dtor lists by priority. */
1399 sort_ids (&constructors);
1400 sort_ids (&destructors);
1402 maybe_unlink(output_file);
1403 outf = fopen (c_file, "w");
1404 if (outf == (FILE *) 0)
1405 fatal_perror ("fopen %s", c_file);
1407 write_c_file (outf, c_file);
1410 fatal_perror ("fclose %s", c_file);
1412 /* Tell the linker that we have initializer and finalizer functions. */
1413 #ifdef LD_INIT_SWITCH
1414 #ifdef COLLECT_EXPORT_LIST
1415 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1417 *ld2++ = LD_INIT_SWITCH;
1419 *ld2++ = LD_FINI_SWITCH;
1424 #ifdef COLLECT_EXPORT_LIST
1427 /* If we did not add export flag to link arguments before, add it to
1428 second link phase now. No new exports should have been added. */
1429 if (! exports.first)
1430 *ld2++ = concat ("-bE:", export_file, NULL);
1432 add_to_list (&exports, initname);
1433 add_to_list (&exports, fininame);
1434 add_to_list (&exports, "_GLOBAL__DI");
1435 add_to_list (&exports, "_GLOBAL__DD");
1436 exportf = fopen (export_file, "w");
1437 if (exportf == (FILE *) 0)
1438 fatal_perror ("fopen %s", export_file);
1439 write_aix_file (exportf, exports.first);
1440 if (fclose (exportf))
1441 fatal_perror ("fclose %s", export_file);
1445 /* End of arguments to second link phase. */
1450 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1451 output_file, c_file);
1452 write_c_file (stderr, "stderr");
1453 fprintf (stderr, "========== end of c_file\n\n");
1454 #ifdef COLLECT_EXPORT_LIST
1455 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1456 write_aix_file (stderr, exports.first);
1457 fprintf (stderr, "========== end of export_file\n\n");
1461 /* Assemble the constructor and destructor tables.
1462 Link the tables in with the rest of the program. */
1464 fork_execute ("gcc", c_argv);
1465 #ifdef COLLECT_EXPORT_LIST
1466 /* On AIX we must call tlink because of possible templates resolution */
1467 do_tlink (ld2_argv, object_lst);
1469 /* Otherwise, simply call ld because tlink is already done */
1470 fork_execute ("ld", ld2_argv);
1472 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1473 constructors/destructors in shared libraries. */
1474 scan_prog_file (output_file, PASS_SECOND);
1477 maybe_unlink (c_file);
1478 maybe_unlink (o_file);
1480 #ifdef COLLECT_EXPORT_LIST
1481 maybe_unlink (export_file);
1488 /* Wait for a process to finish, and exit if a non-zero status is found. */
1496 pwait (pexecute_pid, &status, 0);
1499 if (WIFSIGNALED (status))
1501 int sig = WTERMSIG (status);
1502 error ("%s terminated with signal %d [%s]%s",
1503 prog, sig, strsignal(sig),
1504 status & 0200 ? "" : ", core dumped");
1505 collect_exit (FATAL_EXIT_CODE);
1508 if (WIFEXITED (status))
1509 return WEXITSTATUS (status);
1518 int ret = collect_wait (prog);
1521 error ("%s returned %d exit status", prog, ret);
1527 /* Execute a program, and wait for the reply. */
1530 collect_execute (prog, argv, redir)
1537 int redir_handle = -1;
1538 int stdout_save = -1;
1539 int stderr_save = -1;
1547 fprintf (stderr, "%s", argv[0]);
1549 notice ("[cannot find %s]", prog);
1551 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
1552 fprintf (stderr, " %s", str);
1554 fprintf (stderr, "\n");
1560 /* If we cannot find a program we need, complain error. Do this here
1561 since we might not end up needing something that we could not find. */
1564 fatal ("cannot find `%s'", prog);
1568 /* Open response file. */
1569 redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT);
1571 /* Duplicate the stdout and stderr file handles
1572 so they can be restored later. */
1573 stdout_save = dup (STDOUT_FILENO);
1574 if (stdout_save == -1)
1575 fatal_perror ("redirecting stdout: %s", redir);
1576 stderr_save = dup (STDERR_FILENO);
1577 if (stderr_save == -1)
1578 fatal_perror ("redirecting stdout: %s", redir);
1580 /* Redirect stdout & stderr to our response file. */
1581 dup2 (redir_handle, STDOUT_FILENO);
1582 dup2 (redir_handle, STDERR_FILENO);
1585 pexecute_pid = pexecute (argv[0], argv, argv[0], NULL,
1586 &errmsg_fmt, &errmsg_arg,
1587 (PEXECUTE_FIRST | PEXECUTE_LAST | PEXECUTE_SEARCH));
1591 /* Restore stdout and stderr to their previous settings. */
1592 dup2 (stdout_save, STDOUT_FILENO);
1593 dup2 (stderr_save, STDERR_FILENO);
1595 /* Close reponse file. */
1596 close (redir_handle);
1599 if (pexecute_pid == -1)
1600 fatal_perror (errmsg_fmt, errmsg_arg);
1604 fork_execute (prog, argv)
1608 collect_execute (prog, argv, NULL);
1612 /* Unlink a file unless we are debugging. */
1621 notice ("[Leaving %s]\n", file);
1625 static long sequence_number = 0;
1627 /* Add a name to a linked list. */
1630 add_to_list (head_ptr, name)
1631 struct head *head_ptr;
1635 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
1637 strcpy (newid->name, name);
1639 if (head_ptr->first)
1640 head_ptr->last->next = newid;
1642 head_ptr->first = newid;
1644 /* Check for duplicate symbols. */
1645 for (p = head_ptr->first;
1646 strcmp (name, p->name) != 0;
1651 head_ptr->last->next = 0;
1656 newid->sequence = ++sequence_number;
1657 head_ptr->last = newid;
1661 /* Grab the init priority number from an init function name that
1662 looks like "_GLOBAL_.I.12345.foo". */
1665 extract_init_priority (name)
1670 while (name[pos] == '_')
1672 pos += 10; /* strlen ("GLOBAL__X_") */
1674 /* Extract init_p number from ctor/dtor name. */
1675 pri = atoi (name + pos);
1676 return pri ? pri : DEFAULT_INIT_PRIORITY;
1679 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
1680 ctors will be run from right to left, dtors from left to right. */
1684 struct head *head_ptr;
1686 /* id holds the current element to insert. id_next holds the next
1687 element to insert. id_ptr iterates through the already sorted elements
1688 looking for the place to insert id. */
1689 struct id *id, *id_next, **id_ptr;
1691 id = head_ptr->first;
1693 /* We don't have any sorted elements yet. */
1694 head_ptr->first = NULL;
1696 for (; id; id = id_next)
1699 id->sequence = extract_init_priority (id->name);
1701 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
1703 /* If the sequence numbers are the same, we put the id from the
1704 file later on the command line later in the list. */
1705 || id->sequence > (*id_ptr)->sequence
1706 /* Hack: do lexical compare, too.
1707 || (id->sequence == (*id_ptr)->sequence
1708 && strcmp (id->name, (*id_ptr)->name) > 0) */
1717 /* Now set the sequence numbers properly so write_c_file works. */
1718 for (id = head_ptr->first; id; id = id->next)
1719 id->sequence = ++sequence_number;
1722 /* Write: `prefix', the names on list LIST, `suffix'. */
1725 write_list (stream, prefix, list)
1732 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
1737 #if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
1738 /* Given a STRING, return nonzero if it occurs in the list in range
1739 [ARGS_BEGIN,ARGS_END). */
1742 is_in_args (string, args_begin, args_end)
1744 const char **args_begin;
1745 const char **args_end;
1747 const char **args_pointer;
1748 for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
1749 if (strcmp (string, *args_pointer) == 0)
1753 #endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
1755 #ifdef COLLECT_EXPORT_LIST
1756 /* This function is really used only on AIX, but may be useful. */
1758 is_in_list (prefix, list)
1764 if (!strcmp (prefix, list->name)) return 1;
1771 /* Added for debugging purpose. */
1772 #ifdef COLLECT_EXPORT_LIST
1774 dump_list (stream, prefix, list)
1781 fprintf (stream, "%s%s,\n", prefix, list->name);
1789 dump_prefix_list (stream, prefix, list)
1792 struct prefix_list *list;
1796 fprintf (stream, "%s%s,\n", prefix, list->prefix);
1803 write_list_with_asm (stream, prefix, list)
1810 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
1811 prefix, list->sequence, list->name);
1816 /* Write out the constructor and destructor tables statically (for a shared
1817 object), along with the functions to execute them. */
1820 write_c_file_stat (stream, name)
1822 const char *name ATTRIBUTE_UNUSED;
1826 int frames = (frame_tables.number > 0);
1828 /* Figure out name of output_file, stripping off .so version. */
1829 p = strrchr (output_file, '/');
1845 if (strncmp (q, ".so", 3) == 0)
1854 /* q points to null at end of the string (or . of the .so version) */
1855 prefix = xmalloc (q - p + 1);
1856 strncpy (prefix, p, q - p);
1858 for (r = prefix; *r; r++)
1859 if (!ISALNUM ((unsigned char)*r))
1862 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
1863 output_file, prefix);
1865 initname = concat ("_GLOBAL__FI_", prefix, NULL);
1866 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
1870 /* Write the tables as C code */
1872 fprintf (stream, "static int count;\n");
1873 fprintf (stream, "typedef void entry_pt();\n");
1874 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
1878 write_list_with_asm (stream, "extern void *", frame_tables.first);
1880 fprintf (stream, "\tstatic void *frame_table[] = {\n");
1881 write_list (stream, "\t\t&", frame_tables.first);
1882 fprintf (stream, "\t0\n};\n");
1884 /* This must match what's in frame.h. */
1885 fprintf (stream, "struct object {\n");
1886 fprintf (stream, " void *pc_begin;\n");
1887 fprintf (stream, " void *pc_end;\n");
1888 fprintf (stream, " void *fde_begin;\n");
1889 fprintf (stream, " void *fde_array;\n");
1890 fprintf (stream, " __SIZE_TYPE__ count;\n");
1891 fprintf (stream, " struct object *next;\n");
1892 fprintf (stream, "};\n");
1894 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
1895 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
1897 fprintf (stream, "static void reg_frame () {\n");
1898 fprintf (stream, "\tstatic struct object ob;\n");
1899 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
1900 fprintf (stream, "\t}\n");
1902 fprintf (stream, "static void dereg_frame () {\n");
1903 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
1904 fprintf (stream, "\t}\n");
1907 fprintf (stream, "void %s() {\n", initname);
1908 if (constructors.number > 0 || frames)
1910 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
1911 write_list (stream, "\t\t", constructors.first);
1913 fprintf (stream, "\treg_frame,\n");
1914 fprintf (stream, "\t};\n");
1915 fprintf (stream, "\tentry_pt **p;\n");
1916 fprintf (stream, "\tif (count++ != 0) return;\n");
1917 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
1918 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
1921 fprintf (stream, "\t++count;\n");
1922 fprintf (stream, "}\n");
1923 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
1924 fprintf (stream, "void %s() {\n", fininame);
1925 if (destructors.number > 0 || frames)
1927 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
1928 write_list (stream, "\t\t", destructors.first);
1930 fprintf (stream, "\tdereg_frame,\n");
1931 fprintf (stream, "\t};\n");
1932 fprintf (stream, "\tentry_pt **p;\n");
1933 fprintf (stream, "\tif (--count != 0) return;\n");
1934 fprintf (stream, "\tp = dtors;\n");
1935 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
1936 destructors.number + frames);
1938 fprintf (stream, "}\n");
1942 fprintf (stream, "void _GLOBAL__DI() {\n\t%s();\n}\n", initname);
1943 fprintf (stream, "void _GLOBAL__DD() {\n\t%s();\n}\n", fininame);
1947 /* Write the constructor/destructor tables. */
1949 #ifndef LD_INIT_SWITCH
1951 write_c_file_glob (stream, name)
1953 const char *name ATTRIBUTE_UNUSED;
1955 /* Write the tables as C code */
1957 int frames = (frame_tables.number > 0);
1959 fprintf (stream, "typedef void entry_pt();\n\n");
1961 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
1965 write_list_with_asm (stream, "extern void *", frame_tables.first);
1967 fprintf (stream, "\tstatic void *frame_table[] = {\n");
1968 write_list (stream, "\t\t&", frame_tables.first);
1969 fprintf (stream, "\t0\n};\n");
1971 /* This must match what's in frame.h. */
1972 fprintf (stream, "struct object {\n");
1973 fprintf (stream, " void *pc_begin;\n");
1974 fprintf (stream, " void *pc_end;\n");
1975 fprintf (stream, " void *fde_begin;\n");
1976 fprintf (stream, " void *fde_array;\n");
1977 fprintf (stream, " __SIZE_TYPE__ count;\n");
1978 fprintf (stream, " struct object *next;\n");
1979 fprintf (stream, "};\n");
1981 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
1982 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
1984 fprintf (stream, "static void reg_frame () {\n");
1985 fprintf (stream, "\tstatic struct object ob;\n");
1986 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
1987 fprintf (stream, "\t}\n");
1989 fprintf (stream, "static void dereg_frame () {\n");
1990 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
1991 fprintf (stream, "\t}\n");
1994 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
1995 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
1996 write_list (stream, "\t", constructors.first);
1998 fprintf (stream, "\treg_frame,\n");
1999 fprintf (stream, "\t0\n};\n\n");
2001 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2003 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2004 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2005 write_list (stream, "\t", destructors.first);
2007 fprintf (stream, "\tdereg_frame,\n");
2008 fprintf (stream, "\t0\n};\n\n");
2010 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2011 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2013 #endif /* ! LD_INIT_SWITCH */
2016 write_c_file (stream, name)
2020 fprintf (stream, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
2021 #ifndef LD_INIT_SWITCH
2023 write_c_file_glob (stream, name);
2026 write_c_file_stat (stream, name);
2027 fprintf (stream, "#ifdef __cplusplus\n}\n#endif\n");
2030 #ifdef COLLECT_EXPORT_LIST
2032 write_aix_file (stream, list)
2036 for (; list; list = list->next)
2038 fputs (list->name, stream);
2039 putc ('\n', stream);
2044 #ifdef OBJECT_FORMAT_NONE
2046 /* Generic version to scan the name list of the loaded program for
2047 the symbols g++ uses for static constructors and destructors.
2049 The constructor table begins at __CTOR_LIST__ and contains a count
2050 of the number of pointers (or -1 if the constructors are built in a
2051 separate section by the linker), followed by the pointers to the
2052 constructor functions, terminated with a null pointer. The
2053 destructor table has the same format, and begins at __DTOR_LIST__. */
2056 scan_prog_file (prog_name, which_pass)
2057 const char *prog_name;
2058 enum pass which_pass;
2060 void (*int_handler) PARAMS ((int));
2061 void (*quit_handler) PARAMS ((int));
2062 char *real_nm_argv[4];
2063 const char **nm_argv = (const char **) real_nm_argv;
2070 if (which_pass == PASS_SECOND)
2073 /* If we do not have an `nm', complain. */
2074 if (nm_file_name == 0)
2075 fatal ("cannot find `nm'");
2077 nm_argv[argc++] = nm_file_name;
2078 if (NM_FLAGS[0] != '\0')
2079 nm_argv[argc++] = NM_FLAGS;
2081 nm_argv[argc++] = prog_name;
2082 nm_argv[argc++] = (char *) 0;
2084 if (pipe (pipe_fd) < 0)
2085 fatal_perror ("pipe");
2087 inf = fdopen (pipe_fd[0], "r");
2088 if (inf == (FILE *) 0)
2089 fatal_perror ("fdopen");
2091 /* Trace if needed. */
2094 const char **p_argv;
2097 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2098 fprintf (stderr, " %s", str);
2100 fprintf (stderr, "\n");
2106 /* Spawn child nm on pipe */
2109 fatal_perror (VFORK_STRING);
2111 if (pid == 0) /* child context */
2114 if (dup2 (pipe_fd[1], 1) < 0)
2115 fatal_perror ("dup2 %d 1", pipe_fd[1]);
2117 if (close (pipe_fd[0]) < 0)
2118 fatal_perror ("close %d", pipe_fd[0]);
2120 if (close (pipe_fd[1]) < 0)
2121 fatal_perror ("close %d", pipe_fd[1]);
2123 execv (nm_file_name, real_nm_argv);
2124 fatal_perror ("execvp %s", nm_file_name);
2127 /* Parent context from here on. */
2128 int_handler = (void (*) PARAMS ((int))) signal (SIGINT, SIG_IGN);
2130 quit_handler = (void (*) PARAMS ((int))) signal (SIGQUIT, SIG_IGN);
2133 if (close (pipe_fd[1]) < 0)
2134 fatal_perror ("close %d", pipe_fd[1]);
2137 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2139 /* Read each line of nm output. */
2140 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2145 /* If it contains a constructor or destructor name, add the name
2146 to the appropriate list. */
2148 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2149 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2156 /* Find the end of the symbol name.
2157 Do not include `|', because Encore nm can tack that on the end. */
2158 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2164 switch (is_ctor_dtor (name))
2167 if (which_pass != PASS_LIB)
2168 add_to_list (&constructors, name);
2172 if (which_pass != PASS_LIB)
2173 add_to_list (&destructors, name);
2177 if (which_pass != PASS_LIB)
2178 fatal ("init function found in object %s", prog_name);
2179 #ifndef LD_INIT_SWITCH
2180 add_to_list (&constructors, name);
2185 if (which_pass != PASS_LIB)
2186 fatal ("fini function found in object %s", prog_name);
2187 #ifndef LD_FINI_SWITCH
2188 add_to_list (&destructors, name);
2193 if (which_pass != PASS_LIB)
2194 add_to_list (&frame_tables, name);
2197 default: /* not a constructor or destructor */
2202 fprintf (stderr, "\t%s\n", buf);
2206 fprintf (stderr, "\n");
2208 if (fclose (inf) != 0)
2209 fatal_perror ("fclose");
2211 do_wait (nm_file_name);
2213 signal (SIGINT, int_handler);
2215 signal (SIGQUIT, quit_handler);
2219 #if SUNOS4_SHARED_LIBRARIES
2221 /* Routines to scan the SunOS 4 _DYNAMIC structure to find shared libraries
2222 that the output file depends upon and their initialization/finalization
2223 routines, if any. */
2228 #include <sys/mman.h>
2229 #include <sys/param.h>
2231 #include <sys/dir.h>
2233 /* pointers to the object file */
2234 unsigned object; /* address of memory mapped file */
2235 unsigned objsize; /* size of memory mapped to file */
2236 char * code; /* pointer to code segment */
2237 char * data; /* pointer to data segment */
2238 struct nlist *symtab; /* pointer to symbol table */
2239 struct link_dynamic *ld;
2240 struct link_dynamic_2 *ld_2;
2241 struct head libraries;
2243 /* Map the file indicated by NAME into memory and store its address. */
2245 static void mapfile PARAMS ((const char *));
2253 if ((fp = open (name, O_RDONLY)) == -1)
2254 fatal ("unable to open file '%s'", name);
2255 if (fstat (fp, &s) == -1)
2256 fatal ("unable to stat file '%s'", name);
2258 objsize = s.st_size;
2259 object = (unsigned) mmap (0, objsize, PROT_READ|PROT_WRITE, MAP_PRIVATE,
2261 if (object == (unsigned)-1)
2262 fatal ("unable to mmap file '%s'", name);
2267 /* Helpers for locatelib. */
2269 static const char *libname;
2271 static int libselect PARAMS ((struct direct *));
2277 return (strncmp (libname, d->d_name, strlen (libname)) == 0);
2280 /* If one file has an additional numeric extension past LIBNAME, then put
2281 that one first in the sort. If both files have additional numeric
2282 extensions, then put the one with the higher number first in the sort.
2284 We must verify that the extension is numeric, because Sun saves the
2285 original versions of patched libraries with a .FCS extension. Files with
2286 invalid extensions must go last in the sort, so that they will not be used. */
2287 static int libcompare PARAMS ((struct direct **, struct direct **));
2291 struct direct **d1, **d2;
2293 int i1, i2 = strlen (libname);
2294 char *e1 = (*d1)->d_name + i2;
2295 char *e2 = (*d2)->d_name + i2;
2297 while (*e1 && *e2 && *e1 == '.' && *e2 == '.'
2298 && e1[1] && ISDIGIT (e1[1]) && e2[1] && ISDIGIT (e2[1]))
2302 i1 = strtol (e1, &e1, 10);
2303 i2 = strtol (e2, &e2, 10);
2310 /* It has a valid numeric extension, prefer this one. */
2311 if (*e1 == '.' && e1[1] && ISDIGIT (e1[1]))
2313 /* It has an invalid numeric extension, must prefer the other one. */
2319 /* It has a valid numeric extension, prefer this one. */
2320 if (*e2 == '.' && e2[1] && ISDIGIT (e2[1]))
2322 /* It has an invalid numeric extension, must prefer the other one. */
2330 /* Given the name NAME of a dynamic dependency, find its pathname and add
2331 it to the list of libraries. */
2332 static void locatelib PARAMS ((const char *));
2338 static const char **l;
2340 char buf[MAXPATHLEN];
2348 /* counting elements in array, need 1 extra for null */
2350 ld_rules = (char *) (ld_2->ld_rules + code);
2354 for (; *ld_rules != 0; ld_rules++)
2355 if (*ld_rules == ':')
2357 ld_rules = (char *) (ld_2->ld_rules + code);
2358 ldr = xstrdup (ld_rules);
2360 p = getenv ("LD_LIBRARY_PATH");
2365 for (q = p ; *q != 0; q++)
2370 l = (const char **) xmalloc ((cnt + 3) * sizeof (char *));
2375 for (; *ldr != 0; ldr++)
2385 for (; *q != 0; q++)
2392 /* built in directories are /lib, /usr/lib, and /usr/local/lib */
2395 *pp++ = "/usr/local/lib";
2399 for (pp = l; *pp != 0 ; pp++)
2401 struct direct **namelist;
2403 if ((entries = scandir (*pp, &namelist, libselect, libcompare)) > 0)
2405 sprintf (buf, "%s/%s", *pp, namelist[entries - 1]->d_name);
2406 add_to_list (&libraries, buf);
2408 fprintf (stderr, "%s\n", buf);
2415 notice ("not found\n");
2417 fatal ("dynamic dependency %s not found", name);
2421 /* Scan the _DYNAMIC structure of the output file to find shared libraries
2422 that it depends upon and any constructors or destructors they contain. */
2425 scan_libraries (prog_name)
2426 const char *prog_name;
2428 struct exec *header;
2430 struct link_object *lo;
2431 char buff[MAXPATHLEN];
2434 mapfile (prog_name);
2435 header = (struct exec *)object;
2436 if (N_BADMAG (*header))
2437 fatal ("bad magic number in file '%s'", prog_name);
2438 if (header->a_dynamic == 0)
2441 code = (char *) (N_TXTOFF (*header) + (long) header);
2442 data = (char *) (N_DATOFF (*header) + (long) header);
2443 symtab = (struct nlist *) (N_SYMOFF (*header) + (long) header);
2445 if (header->a_magic == ZMAGIC && header->a_entry == 0x20)
2448 ld = (struct link_dynamic *) (symtab->n_value + code);
2454 ld = (struct link_dynamic *) data;
2459 notice ("dynamic dependencies.\n");
2461 ld_2 = (struct link_dynamic_2 *) ((long) ld->ld_un.ld_2 + (long)base);
2462 for (lo = (struct link_object *) ld_2->ld_need; lo;
2463 lo = (struct link_object *) lo->lo_next)
2466 lo = (struct link_object *) ((long) lo + code);
2467 name = (char *) (code + lo->lo_name);
2471 fprintf (stderr, "\t-l%s.%d => ", name, lo->lo_major);
2472 sprintf (buff, "lib%s.so.%d.%d", name, lo->lo_major, lo->lo_minor);
2478 fprintf (stderr, "\t%s\n", name);
2479 add_to_list (&libraries, name);
2484 fprintf (stderr, "\n");
2486 /* now iterate through the library list adding their symbols to
2488 for (list = libraries.first; list; list = list->next)
2489 scan_prog_file (list->name, PASS_LIB);
2492 #else /* SUNOS4_SHARED_LIBRARIES */
2495 /* Use the List Dynamic Dependencies program to find shared libraries that
2496 the output file depends upon and their initialization/finalization
2497 routines, if any. */
2500 scan_libraries (prog_name)
2501 const char *prog_name;
2503 static struct head libraries; /* list of shared libraries found */
2505 void (*int_handler) PARAMS ((int));
2506 void (*quit_handler) PARAMS ((int));
2507 char *real_ldd_argv[4];
2508 const char **ldd_argv = (const char **) real_ldd_argv;
2515 /* If we do not have an `ldd', complain. */
2516 if (ldd_file_name == 0)
2518 error ("cannot find `ldd'");
2522 ldd_argv[argc++] = ldd_file_name;
2523 ldd_argv[argc++] = prog_name;
2524 ldd_argv[argc++] = (char *) 0;
2526 if (pipe (pipe_fd) < 0)
2527 fatal_perror ("pipe");
2529 inf = fdopen (pipe_fd[0], "r");
2530 if (inf == (FILE *) 0)
2531 fatal_perror ("fdopen");
2533 /* Trace if needed. */
2536 const char **p_argv;
2539 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2540 fprintf (stderr, " %s", str);
2542 fprintf (stderr, "\n");
2548 /* Spawn child ldd on pipe */
2551 fatal_perror (VFORK_STRING);
2553 if (pid == 0) /* child context */
2556 if (dup2 (pipe_fd[1], 1) < 0)
2557 fatal_perror ("dup2 %d 1", pipe_fd[1]);
2559 if (close (pipe_fd[0]) < 0)
2560 fatal_perror ("close %d", pipe_fd[0]);
2562 if (close (pipe_fd[1]) < 0)
2563 fatal_perror ("close %d", pipe_fd[1]);
2565 execv (ldd_file_name, real_ldd_argv);
2566 fatal_perror ("execv %s", ldd_file_name);
2569 /* Parent context from here on. */
2570 int_handler = (void (*) PARAMS ((int))) signal (SIGINT, SIG_IGN);
2572 quit_handler = (void (*) PARAMS ((int))) signal (SIGQUIT, SIG_IGN);
2575 if (close (pipe_fd[1]) < 0)
2576 fatal_perror ("close %d", pipe_fd[1]);
2579 notice ("\nldd output with constructors/destructors.\n");
2581 /* Read each line of ldd output. */
2582 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2585 char *name, *end, *p = buf;
2587 /* Extract names of libraries and add to list. */
2588 PARSE_LDD_OUTPUT (p);
2593 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2594 fatal ("dynamic dependency %s not found", buf);
2596 /* Find the end of the symbol name. */
2598 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2603 if (access (name, R_OK) == 0)
2604 add_to_list (&libraries, name);
2606 fatal ("unable to open dynamic dependency '%s'", buf);
2609 fprintf (stderr, "\t%s\n", buf);
2612 fprintf (stderr, "\n");
2614 if (fclose (inf) != 0)
2615 fatal_perror ("fclose");
2617 do_wait (ldd_file_name);
2619 signal (SIGINT, int_handler);
2621 signal (SIGQUIT, quit_handler);
2624 /* now iterate through the library list adding their symbols to
2626 for (list = libraries.first; list; list = list->next)
2627 scan_prog_file (list->name, PASS_LIB);
2630 #endif /* LDD_SUFFIX */
2631 #endif /* SUNOS4_SHARED_LIBRARIES */
2633 #endif /* OBJECT_FORMAT_NONE */
2637 * COFF specific stuff.
2640 #ifdef OBJECT_FORMAT_COFF
2642 #if defined(EXTENDED_COFF)
2644 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2645 # define GCC_SYMENT SYMR
2646 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2647 # define GCC_SYMINC(X) (1)
2648 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2649 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2653 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2654 # define GCC_SYMENT SYMENT
2655 # define GCC_OK_SYMBOL(X) \
2656 (((X).n_sclass == C_EXT) && \
2657 ((X).n_scnum > N_UNDEF) && \
2659 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2660 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2661 # define GCC_UNDEF_SYMBOL(X) \
2662 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2663 # define GCC_SYMINC(X) ((X).n_numaux+1)
2664 # define GCC_SYMZERO(X) 0
2666 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2668 # define GCC_CHECK_HDR(X) \
2669 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2670 || (HEADER (X).f_magic == 0767 && aix64_flag))
2672 # define GCC_CHECK_HDR(X) \
2673 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2674 || (HEADER (X).f_magic == 0757 && aix64_flag))
2679 extern char *ldgetname ();
2681 /* COFF version to scan the name list of the loaded program for
2682 the symbols g++ uses for static constructors and destructors.
2684 The constructor table begins at __CTOR_LIST__ and contains a count
2685 of the number of pointers (or -1 if the constructors are built in a
2686 separate section by the linker), followed by the pointers to the
2687 constructor functions, terminated with a null pointer. The
2688 destructor table has the same format, and begins at __DTOR_LIST__. */
2691 scan_prog_file (prog_name, which_pass)
2692 const char *prog_name;
2693 enum pass which_pass;
2695 LDFILE *ldptr = NULL;
2696 int sym_index, sym_count;
2699 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2702 #ifdef COLLECT_EXPORT_LIST
2703 /* We do not need scanning for some standard C libraries. */
2704 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2707 /* On AIX we have a loop, because there is not much difference
2708 between an object and an archive. This trick allows us to
2709 eliminate scan_libraries() function. */
2713 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2714 non-const char * filename parameter, even though it will not
2715 modify that string. So we must cast away const-ness here,
2716 which will cause -Wcast-qual to burp. */
2717 if ((ldptr = ldopen ((char *)prog_name, ldptr)) != NULL)
2719 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
2720 fatal ("%s: not a COFF file", prog_name);
2722 if (GCC_CHECK_HDR (ldptr))
2724 sym_count = GCC_SYMBOLS (ldptr);
2725 sym_index = GCC_SYMZERO (ldptr);
2727 #ifdef COLLECT_EXPORT_LIST
2728 /* Is current archive member a shared object? */
2729 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2732 while (sym_index < sym_count)
2736 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2738 sym_index += GCC_SYMINC (symbol);
2740 if (GCC_OK_SYMBOL (symbol))
2744 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2745 continue; /* should never happen */
2747 #ifdef XCOFF_DEBUGGING_INFO
2748 /* All AIX function names have a duplicate entry
2749 beginning with a dot. */
2754 switch (is_ctor_dtor (name))
2758 add_to_list (&constructors, name);
2759 #ifdef COLLECT_EXPORT_LIST
2760 if (which_pass == PASS_OBJ)
2761 add_to_list (&exports, name);
2767 add_to_list (&destructors, name);
2768 #ifdef COLLECT_EXPORT_LIST
2769 if (which_pass == PASS_OBJ)
2770 add_to_list (&exports, name);
2774 #ifdef COLLECT_EXPORT_LIST
2776 #ifndef LD_INIT_SWITCH
2778 add_to_list (&constructors, name);
2783 #ifndef LD_INIT_SWITCH
2785 add_to_list (&destructors, name);
2792 add_to_list (&frame_tables, name);
2793 #ifdef COLLECT_EXPORT_LIST
2794 if (which_pass == PASS_OBJ)
2795 add_to_list (&exports, name);
2799 default: /* not a constructor or destructor */
2800 #ifdef COLLECT_EXPORT_LIST
2801 /* If we are building a shared object on AIX we need
2802 to explicitly export all global symbols. */
2805 if (which_pass == PASS_OBJ && (! export_flag))
2806 add_to_list (&exports, name);
2813 #if !defined(EXTENDED_COFF)
2814 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
2815 symbol.n_scnum, symbol.n_sclass,
2816 (symbol.n_type ? "0" : ""), symbol.n_type,
2820 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
2821 symbol.iss, (long) symbol.value, symbol.index, name);
2826 #ifdef COLLECT_EXPORT_LIST
2829 /* If archive contains both 32-bit and 64-bit objects,
2830 we want to skip objects in other mode so mismatch normal. */
2832 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
2833 prog_name, HEADER (ldptr).f_magic, aix64_flag);
2839 fatal ("%s: cannot open as COFF file", prog_name);
2841 #ifdef COLLECT_EXPORT_LIST
2842 /* On AIX loop continues while there are more members in archive. */
2844 while (ldclose (ldptr) == FAILURE);
2846 /* Otherwise we simply close ldptr. */
2847 (void) ldclose(ldptr);
2852 #ifdef COLLECT_EXPORT_LIST
2853 /* Given a library name without "lib" prefix, this function
2854 returns a full library name including a path. */
2856 resolve_lib_name (name)
2862 for (i = 0; libpaths[i]; i++)
2863 if (libpaths[i]->max_len > l)
2864 l = libpaths[i]->max_len;
2866 lib_buf = xmalloc (l + strlen(name) + 10);
2868 for (i = 0; libpaths[i]; i++)
2870 struct prefix_list *list = libpaths[i]->plist;
2871 for (; list; list = list->next)
2873 /* The following lines are needed because path_prefix list
2874 may contain directories both with trailing '/' and
2877 if (list->prefix[strlen(list->prefix)-1] != '/')
2879 for (j = 0; libexts[j]; j++)
2881 sprintf (lib_buf, "%s%slib%s.%s",
2882 list->prefix, p, name, libexts[j]);
2883 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
2884 if (file_exists (lib_buf))
2886 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
2893 fprintf (stderr, "not found\n");
2895 fatal ("Library lib%s not found", name);
2899 /* Array of standard AIX libraries which should not
2900 be scanned for ctors/dtors. */
2901 static const char *const aix_std_libs[] = {
2909 "/usr/lib/libc_r.a",
2910 "/usr/lib/libm_r.a",
2911 "/usr/lib/threads/libc.a",
2912 "/usr/ccs/lib/libc.a",
2913 "/usr/ccs/lib/libm.a",
2914 "/usr/ccs/lib/libc_r.a",
2915 "/usr/ccs/lib/libm_r.a",
2919 /* This function checks the filename and returns 1
2920 if this name matches the location of a standard AIX library. */
2922 ignore_library (name)
2925 const char *const *p = &aix_std_libs[0];
2926 while (*p++ != NULL)
2927 if (! strcmp (name, *p)) return 1;
2932 #endif /* OBJECT_FORMAT_COFF */
2936 * OSF/rose specific stuff.
2939 #ifdef OBJECT_FORMAT_ROSE
2941 /* Union of the various load commands */
2943 typedef union load_union
2945 ldc_header_t hdr; /* common header */
2946 load_cmd_map_command_t map; /* map indexing other load cmds */
2947 interpreter_command_t iprtr; /* interpreter pathname */
2948 strings_command_t str; /* load commands strings section */
2949 region_command_t region; /* region load command */
2950 reloc_command_t reloc; /* relocation section */
2951 package_command_t pkg; /* package load command */
2952 symbols_command_t sym; /* symbol sections */
2953 entry_command_t ent; /* program start section */
2954 gen_info_command_t info; /* object information */
2955 func_table_command_t func; /* function constructors/destructors */
2958 /* Structure to point to load command and data section in memory. */
2960 typedef struct load_all
2962 load_union_t *load; /* load command */
2963 char *section; /* pointer to section */
2966 /* Structure to contain information about a file mapped into memory. */
2970 char *start; /* start of map */
2971 char *name; /* filename */
2972 long size; /* size of the file */
2973 long rounded_size; /* size rounded to page boundary */
2974 int fd; /* file descriptor */
2975 int rw; /* != 0 if opened read/write */
2976 int use_mmap; /* != 0 if mmap'ed */
2979 extern int decode_mach_o_hdr ();
2980 extern int encode_mach_o_hdr ();
2982 static void add_func_table PARAMS ((mo_header_t *, load_all_t *,
2983 symbol_info_t *, int));
2984 static void print_header PARAMS ((mo_header_t *));
2985 static void print_load_command PARAMS ((load_union_t *, size_t, int));
2986 static void bad_header PARAMS ((int));
2987 static struct file_info *read_file PARAMS ((const char *, int, int));
2988 static void end_file PARAMS ((struct file_info *));
2990 /* OSF/rose specific version to scan the name list of the loaded
2991 program for the symbols g++ uses for static constructors and
2994 The constructor table begins at __CTOR_LIST__ and contains a count
2995 of the number of pointers (or -1 if the constructors are built in a
2996 separate section by the linker), followed by the pointers to the
2997 constructor functions, terminated with a null pointer. The
2998 destructor table has the same format, and begins at __DTOR_LIST__. */
3001 scan_prog_file (prog_name, which_pass)
3002 const char *prog_name;
3003 enum pass which_pass;
3007 load_all_t *load_array;
3008 load_all_t *load_end;
3009 load_all_t *load_cmd;
3010 int symbol_load_cmds;
3016 struct file_info *obj_file;
3018 mo_lcid_t cmd_strings = -1;
3019 symbol_info_t *main_sym = 0;
3020 int rw = (which_pass != PASS_FIRST);
3022 prog_fd = open (prog_name, (rw) ? O_RDWR : O_RDONLY);
3024 fatal_perror ("open %s", prog_name);
3026 obj_file = read_file (prog_name, prog_fd, rw);
3027 obj = obj_file->start;
3029 status = decode_mach_o_hdr (obj, MO_SIZEOF_RAW_HDR, MOH_HEADER_VERSION, &hdr);
3030 if (status != MO_HDR_CONV_SUCCESS)
3031 bad_header (status);
3034 /* Do some basic sanity checks. Note we explicitly use the big endian magic number,
3035 since the hardware will automatically swap bytes for us on loading little endian
3038 #ifndef CROSS_COMPILE
3039 if (hdr.moh_magic != MOH_MAGIC_MSB
3040 || hdr.moh_header_version != MOH_HEADER_VERSION
3041 || hdr.moh_byte_order != OUR_BYTE_ORDER
3042 || hdr.moh_data_rep_id != OUR_DATA_REP_ID
3043 || hdr.moh_cpu_type != OUR_CPU_TYPE
3044 || hdr.moh_cpu_subtype != OUR_CPU_SUBTYPE
3045 || hdr.moh_vendor_type != OUR_VENDOR_TYPE)
3047 fatal ("incompatibilities between object file & expected values");
3052 print_header (&hdr);
3054 offset = hdr.moh_first_cmd_off;
3055 load_end = load_array
3056 = (load_all_t *) xcalloc (sizeof (load_all_t), hdr.moh_n_load_cmds + 2);
3058 /* Build array of load commands, calculating the offsets */
3059 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3061 load_union_t *load_hdr; /* load command header */
3063 load_cmd = load_end++;
3064 load_hdr = (load_union_t *) (obj + offset);
3066 /* If modifying the program file, copy the header. */
3069 load_union_t *ptr = (load_union_t *) xmalloc (load_hdr->hdr.ldci_cmd_size);
3070 memcpy ((char *)ptr, (char *)load_hdr, load_hdr->hdr.ldci_cmd_size);
3073 /* null out old command map, because we will rewrite at the end. */
3074 if (ptr->hdr.ldci_cmd_type == LDC_CMD_MAP)
3076 cmd_strings = ptr->map.lcm_ld_cmd_strings;
3077 ptr->hdr.ldci_cmd_type = LDC_UNDEFINED;
3081 load_cmd->load = load_hdr;
3082 if (load_hdr->hdr.ldci_section_off > 0)
3083 load_cmd->section = obj + load_hdr->hdr.ldci_section_off;
3086 print_load_command (load_hdr, offset, i);
3088 offset += load_hdr->hdr.ldci_cmd_size;
3091 /* If the last command is the load command map and is not undefined,
3092 decrement the count of load commands. */
3093 if (rw && load_end[-1].load->hdr.ldci_cmd_type == LDC_UNDEFINED)
3096 hdr.moh_n_load_cmds--;
3099 /* Go through and process each symbol table section. */
3100 symbol_load_cmds = 0;
3101 for (load_cmd = load_array; load_cmd < load_end; load_cmd++)
3103 load_union_t *load_hdr = load_cmd->load;
3105 if (load_hdr->hdr.ldci_cmd_type == LDC_SYMBOLS)
3111 const char *kind = "unknown";
3113 switch (load_hdr->sym.symc_kind)
3115 case SYMC_IMPORTS: kind = "imports"; break;
3116 case SYMC_DEFINED_SYMBOLS: kind = "defined"; break;
3117 case SYMC_STABS: kind = "stabs"; break;
3120 notice ("\nProcessing symbol table #%d, offset = 0x%.8lx, kind = %s\n",
3121 symbol_load_cmds, load_hdr->hdr.ldci_section_off, kind);
3124 if (load_hdr->sym.symc_kind != SYMC_DEFINED_SYMBOLS)
3127 str_sect = load_array[load_hdr->sym.symc_strings_section].section;
3128 if (str_sect == (char *) 0)
3129 fatal ("string section missing");
3131 if (load_cmd->section == (char *) 0)
3132 fatal ("section pointer missing");
3134 num_syms = load_hdr->sym.symc_nentries;
3135 for (i = 0; i < num_syms; i++)
3137 symbol_info_t *sym = ((symbol_info_t *) load_cmd->section) + i;
3138 char *name = sym->si_name.symbol_name + str_sect;
3145 char *n = name + strlen (name) - strlen (NAME__MAIN);
3147 if ((n - name) < 0 || strcmp (n, NAME__MAIN))
3157 switch (is_ctor_dtor (name))
3160 add_to_list (&constructors, name);
3164 add_to_list (&destructors, name);
3167 default: /* not a constructor or destructor */
3173 fprintf (stderr, "\ttype = 0x%.4x, sc = 0x%.2x, flags = 0x%.8x, name = %.30s\n",
3174 sym->si_type, sym->si_sc_type, sym->si_flags, name);
3179 if (symbol_load_cmds == 0)
3180 fatal ("no symbol table found");
3182 /* Update the program file now, rewrite header and load commands. At present,
3183 we assume that there is enough space after the last load command to insert
3184 one more. Since the first section written out is page aligned, and the
3185 number of load commands is small, this is ok for the present. */
3189 load_union_t *load_map;
3192 if (cmd_strings == -1)
3193 fatal ("no cmd_strings found");
3195 /* Add __main to initializer list.
3196 If we are building a program instead of a shared library, do not
3197 do anything, since in the current version, you cannot do mallocs
3198 and such in the constructors. */
3200 if (main_sym != (symbol_info_t *) 0
3201 && ((hdr.moh_flags & MOH_EXECABLE_F) == 0))
3202 add_func_table (&hdr, load_array, main_sym, FNTC_INITIALIZATION);
3205 notice ("\nUpdating header and load commands.\n\n");
3207 hdr.moh_n_load_cmds++;
3208 size = sizeof (load_cmd_map_command_t) + (sizeof (mo_offset_t) * (hdr.moh_n_load_cmds - 1));
3210 /* Create new load command map. */
3212 notice ("load command map, %d cmds, new size %ld.\n",
3213 (int) hdr.moh_n_load_cmds, (long) size);
3215 load_map = (load_union_t *) xcalloc (1, size);
3216 load_map->map.ldc_header.ldci_cmd_type = LDC_CMD_MAP;
3217 load_map->map.ldc_header.ldci_cmd_size = size;
3218 load_map->map.lcm_ld_cmd_strings = cmd_strings;
3219 load_map->map.lcm_nentries = hdr.moh_n_load_cmds;
3220 load_array[hdr.moh_n_load_cmds-1].load = load_map;
3222 offset = hdr.moh_first_cmd_off;
3223 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3225 load_map->map.lcm_map[i] = offset;
3226 if (load_array[i].load->hdr.ldci_cmd_type == LDC_CMD_MAP)
3227 hdr.moh_load_map_cmd_off = offset;
3229 offset += load_array[i].load->hdr.ldci_cmd_size;
3232 hdr.moh_sizeofcmds = offset - MO_SIZEOF_RAW_HDR;
3235 print_header (&hdr);
3238 status = encode_mach_o_hdr (&hdr, obj, MO_SIZEOF_RAW_HDR);
3239 if (status != MO_HDR_CONV_SUCCESS)
3240 bad_header (status);
3243 notice ("writing load commands.\n\n");
3245 /* Write load commands */
3246 offset = hdr.moh_first_cmd_off;
3247 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3249 load_union_t *load_hdr = load_array[i].load;
3250 size_t size = load_hdr->hdr.ldci_cmd_size;
3253 print_load_command (load_hdr, offset, i);
3255 bcopy ((char *) load_hdr, (char *) (obj + offset), size);
3260 end_file (obj_file);
3262 if (close (prog_fd))
3263 fatal_perror ("close %s", prog_name);
3266 fprintf (stderr, "\n");
3270 /* Add a function table to the load commands to call a function
3271 on initiation or termination of the process. */
3274 add_func_table (hdr_p, load_array, sym, type)
3275 mo_header_t *hdr_p; /* pointer to global header */
3276 load_all_t *load_array; /* array of ptrs to load cmds */
3277 symbol_info_t *sym; /* pointer to symbol entry */
3278 int type; /* fntc_type value */
3280 /* Add a new load command. */
3281 int num_cmds = ++hdr_p->moh_n_load_cmds;
3282 int load_index = num_cmds - 1;
3283 size_t size = sizeof (func_table_command_t) + sizeof (mo_addr_t);
3284 load_union_t *ptr = xcalloc (1, size);
3285 load_all_t *load_cmd;
3288 /* Set the unresolved address bit in the header to force the loader to be
3289 used, since kernel exec does not call the initialization functions. */
3290 hdr_p->moh_flags |= MOH_UNRESOLVED_F;
3292 load_cmd = &load_array[load_index];
3293 load_cmd->load = ptr;
3294 load_cmd->section = (char *) 0;
3296 /* Fill in func table load command. */
3297 ptr->func.ldc_header.ldci_cmd_type = LDC_FUNC_TABLE;
3298 ptr->func.ldc_header.ldci_cmd_size = size;
3299 ptr->func.ldc_header.ldci_section_off = 0;
3300 ptr->func.ldc_header.ldci_section_len = 0;
3301 ptr->func.fntc_type = type;
3302 ptr->func.fntc_nentries = 1;
3304 /* copy address, turn it from abs. address to (region,offset) if necessary. */
3305 /* Is the symbol already expressed as (region, offset)? */
3306 if ((sym->si_flags & SI_ABSOLUTE_VALUE_F) == 0)
3308 ptr->func.fntc_entry_loc[i].adr_lcid = sym->si_value.def_val.adr_lcid;
3309 ptr->func.fntc_entry_loc[i].adr_sctoff = sym->si_value.def_val.adr_sctoff;
3312 /* If not, figure out which region it's in. */
3315 mo_vm_addr_t addr = sym->si_value.abs_val;
3318 for (i = 0; i < load_index; i++)
3320 if (load_array[i].load->hdr.ldci_cmd_type == LDC_REGION)
3322 region_command_t *region_ptr = &load_array[i].load->region;
3324 if ((region_ptr->regc_flags & REG_ABS_ADDR_F) != 0
3325 && addr >= region_ptr->regc_addr.vm_addr
3326 && addr <= region_ptr->regc_addr.vm_addr + region_ptr->regc_vm_size)
3328 ptr->func.fntc_entry_loc[0].adr_lcid = i;
3329 ptr->func.fntc_entry_loc[0].adr_sctoff = addr - region_ptr->regc_addr.vm_addr;
3337 fatal ("could not convert 0x%l.8x into a region", addr);
3341 notice ("%s function, region %d, offset = %ld (0x%.8lx)\n",
3342 type == FNTC_INITIALIZATION ? "init" : "term",
3343 (int) ptr->func.fntc_entry_loc[i].adr_lcid,
3344 (long) ptr->func.fntc_entry_loc[i].adr_sctoff,
3345 (long) ptr->func.fntc_entry_loc[i].adr_sctoff);
3350 /* Print the global header for an OSF/rose object. */
3353 print_header (hdr_ptr)
3354 mo_header_t *hdr_ptr;
3356 fprintf (stderr, "\nglobal header:\n");
3357 fprintf (stderr, "\tmoh_magic = 0x%.8lx\n", hdr_ptr->moh_magic);
3358 fprintf (stderr, "\tmoh_major_version = %d\n", (int)hdr_ptr->moh_major_version);
3359 fprintf (stderr, "\tmoh_minor_version = %d\n", (int)hdr_ptr->moh_minor_version);
3360 fprintf (stderr, "\tmoh_header_version = %d\n", (int)hdr_ptr->moh_header_version);
3361 fprintf (stderr, "\tmoh_max_page_size = %d\n", (int)hdr_ptr->moh_max_page_size);
3362 fprintf (stderr, "\tmoh_byte_order = %d\n", (int)hdr_ptr->moh_byte_order);
3363 fprintf (stderr, "\tmoh_data_rep_id = %d\n", (int)hdr_ptr->moh_data_rep_id);
3364 fprintf (stderr, "\tmoh_cpu_type = %d\n", (int)hdr_ptr->moh_cpu_type);
3365 fprintf (stderr, "\tmoh_cpu_subtype = %d\n", (int)hdr_ptr->moh_cpu_subtype);
3366 fprintf (stderr, "\tmoh_vendor_type = %d\n", (int)hdr_ptr->moh_vendor_type);
3367 fprintf (stderr, "\tmoh_load_map_cmd_off = %d\n", (int)hdr_ptr->moh_load_map_cmd_off);
3368 fprintf (stderr, "\tmoh_first_cmd_off = %d\n", (int)hdr_ptr->moh_first_cmd_off);
3369 fprintf (stderr, "\tmoh_sizeofcmds = %d\n", (int)hdr_ptr->moh_sizeofcmds);
3370 fprintf (stderr, "\tmon_n_load_cmds = %d\n", (int)hdr_ptr->moh_n_load_cmds);
3371 fprintf (stderr, "\tmoh_flags = 0x%.8lx", (long)hdr_ptr->moh_flags);
3373 if (hdr_ptr->moh_flags & MOH_RELOCATABLE_F)
3374 fprintf (stderr, ", relocatable");
3376 if (hdr_ptr->moh_flags & MOH_LINKABLE_F)
3377 fprintf (stderr, ", linkable");
3379 if (hdr_ptr->moh_flags & MOH_EXECABLE_F)
3380 fprintf (stderr, ", execable");
3382 if (hdr_ptr->moh_flags & MOH_EXECUTABLE_F)
3383 fprintf (stderr, ", executable");
3385 if (hdr_ptr->moh_flags & MOH_UNRESOLVED_F)
3386 fprintf (stderr, ", unresolved");
3388 fprintf (stderr, "\n\n");
3393 /* Print a short summary of a load command. */
3396 print_load_command (load_hdr, offset, number)
3397 load_union_t *load_hdr;
3401 mo_long_t type = load_hdr->hdr.ldci_cmd_type;
3402 const char *type_str = (char *) 0;
3406 case LDC_UNDEFINED: type_str = "UNDEFINED"; break;
3407 case LDC_CMD_MAP: type_str = "CMD_MAP"; break;
3408 case LDC_INTERPRETER: type_str = "INTERPRETER"; break;
3409 case LDC_STRINGS: type_str = "STRINGS"; break;
3410 case LDC_REGION: type_str = "REGION"; break;
3411 case LDC_RELOC: type_str = "RELOC"; break;
3412 case LDC_PACKAGE: type_str = "PACKAGE"; break;
3413 case LDC_SYMBOLS: type_str = "SYMBOLS"; break;
3414 case LDC_ENTRY: type_str = "ENTRY"; break;
3415 case LDC_FUNC_TABLE: type_str = "FUNC_TABLE"; break;
3416 case LDC_GEN_INFO: type_str = "GEN_INFO"; break;
3420 "cmd %2d, sz: 0x%.2lx, coff: 0x%.3lx, doff: 0x%.6lx, dlen: 0x%.6lx",
3422 (long) load_hdr->hdr.ldci_cmd_size,
3424 (long) load_hdr->hdr.ldci_section_off,
3425 (long) load_hdr->hdr.ldci_section_len);
3427 if (type_str == (char *) 0)
3428 fprintf (stderr, ", ty: unknown (%ld)\n", (long) type);
3430 else if (type != LDC_REGION)
3431 fprintf (stderr, ", ty: %s\n", type_str);
3435 const char *region = "";
3436 switch (load_hdr->region.regc_usage_type)
3438 case REG_TEXT_T: region = ", .text"; break;
3439 case REG_DATA_T: region = ", .data"; break;
3440 case REG_BSS_T: region = ", .bss"; break;
3441 case REG_GLUE_T: region = ", .glue"; break;
3442 #if defined (REG_RDATA_T) && defined (REG_SDATA_T) && defined (REG_SBSS_T) /*mips*/
3443 case REG_RDATA_T: region = ", .rdata"; break;
3444 case REG_SDATA_T: region = ", .sdata"; break;
3445 case REG_SBSS_T: region = ", .sbss"; break;
3449 fprintf (stderr, ", ty: %s, vaddr: 0x%.8lx, vlen: 0x%.6lx%s\n",
3451 (long) load_hdr->region.regc_vm_addr,
3452 (long) load_hdr->region.regc_vm_size,
3460 /* Fatal error when {en,de}code_mach_o_header fails. */
3468 case MO_ERROR_BAD_MAGIC: fatal ("bad magic number");
3469 case MO_ERROR_BAD_HDR_VERS: fatal ("bad header version");
3470 case MO_ERROR_BAD_RAW_HDR_VERS: fatal ("bad raw header version");
3471 case MO_ERROR_BUF2SML: fatal ("raw header buffer too small");
3472 case MO_ERROR_OLD_RAW_HDR_FILE: fatal ("old raw header file");
3473 case MO_ERROR_UNSUPPORTED_VERS: fatal ("unsupported version");
3475 fatal ("unknown {de,en}code_mach_o_hdr return value %d", status);
3480 /* Read a file into a memory buffer. */
3482 static struct file_info *
3483 read_file (name, fd, rw)
3484 const char *name; /* filename */
3485 int fd; /* file descriptor */
3486 int rw; /* read/write */
3488 struct stat stat_pkt;
3489 struct file_info *p = (struct file_info *) xcalloc (sizeof (struct file_info), 1);
3491 static int page_size;
3494 if (fstat (fd, &stat_pkt) < 0)
3495 fatal_perror ("fstat %s", name);
3498 p->size = stat_pkt.st_size;
3499 p->rounded_size = stat_pkt.st_size;
3505 fprintf (stderr, "mmap %s, %s\n", name, (rw) ? "read/write" : "read-only");
3508 page_size = sysconf (_SC_PAGE_SIZE);
3510 p->rounded_size = ((p->size + page_size - 1) / page_size) * page_size;
3511 p->start = mmap ((caddr_t) 0,
3512 (rw) ? p->rounded_size : p->size,
3513 (rw) ? (PROT_READ | PROT_WRITE) : PROT_READ,
3514 MAP_FILE | MAP_VARIABLE | MAP_SHARED,
3518 if (p->start != (char *) 0 && p->start != (char *) -1)
3522 #endif /* USE_MMAP */
3527 fprintf (stderr, "read %s\n", name);
3530 p->start = xmalloc (p->size);
3531 if (lseek (fd, 0L, SEEK_SET) < 0)
3532 fatal_perror ("lseek %s 0", name);
3534 len = read (fd, p->start, p->size);
3536 fatal_perror ("read %s", name);
3539 fatal ("read %ld bytes, expected %ld, from %s", len, p->size, name);
3545 /* Do anything necessary to write a file back from memory. */
3549 struct file_info *ptr; /* file information block */
3557 fprintf (stderr, "msync %s\n", ptr->name);
3559 if (msync (ptr->start, ptr->rounded_size, MS_ASYNC))
3560 fatal_perror ("msync %s", ptr->name);
3564 fprintf (stderr, "munmap %s\n", ptr->name);
3566 if (munmap (ptr->start, ptr->size))
3567 fatal_perror ("munmap %s", ptr->name);
3570 #endif /* USE_MMAP */
3577 fprintf (stderr, "write %s\n", ptr->name);
3579 if (lseek (ptr->fd, 0L, SEEK_SET) < 0)
3580 fatal_perror ("lseek %s 0", ptr->name);
3582 len = write (ptr->fd, ptr->start, ptr->size);
3584 fatal_perror ("write %s", ptr->name);
3586 if (len != ptr->size)
3587 fatal ("wrote %ld bytes, expected %ld, to %s", len, ptr->size, ptr->name);
3596 #endif /* OBJECT_FORMAT_ROSE */