1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992, 93-97, 1998 Free Software Foundation, Inc.
4 Contributed by Chris Smith (csmith@convex.com).
5 Heavily modified by Michael Meissner (meissner@cygnus.com),
6 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
8 This file is part of GNU CC.
10 GNU CC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
15 GNU CC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GNU CC; see the file COPYING. If not, write to
22 the Free Software Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
26 /* Build tables of static constructors and destructors and run ld. */
29 #include <sys/types.h>
57 #include "gansidecl.h"
64 extern char *sys_errlist[];
70 /* Obstack allocation and deallocation routines. */
71 #define obstack_chunk_alloc xmalloc
72 #define obstack_chunk_free free
85 #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
88 #define WTERMSIG(S) ((S) & 0x7f)
91 #define WIFEXITED(S) (((S) & 0xff) == 0)
94 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
97 extern char *choose_temp_base ();
99 /* On certain systems, we have code that works by scanning the object file
100 directly. But this code uses system-specific header files and library
101 functions, so turn it off in a cross-compiler. Likewise, the names of
102 the utilities are not correct for a cross-compiler; we have to hope that
103 cross-versions are in the proper directories. */
106 #undef SUNOS4_SHARED_LIBRARIES
107 #undef OBJECT_FORMAT_COFF
108 #undef OBJECT_FORMAT_ROSE
109 #undef MD_EXEC_PREFIX
110 #undef REAL_LD_FILE_NAME
111 #undef REAL_NM_FILE_NAME
112 #undef REAL_STRIP_FILE_NAME
115 /* If we cannot use a special method, use the ordinary one:
116 run nm to find what symbols are present.
117 In a cross-compiler, this means you need a cross nm,
118 but that is not quite as unpleasant as special headers. */
120 #if !defined (OBJECT_FORMAT_COFF) && !defined (OBJECT_FORMAT_ROSE)
121 #define OBJECT_FORMAT_NONE
124 #ifdef OBJECT_FORMAT_COFF
133 /* Many versions of ldfcn.h define these. */
141 /* Some systems have an ISCOFF macro, but others do not. In some cases
142 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
143 that either do not have an ISCOFF macro in /usr/include or for those
144 where it is wrong. */
147 #define MY_ISCOFF(X) ISCOFF (X)
150 #endif /* OBJECT_FORMAT_COFF */
152 #ifdef OBJECT_FORMAT_ROSE
159 #include <sys/mman.h>
163 #include <mach_o_format.h>
164 #include <mach_o_header.h>
165 #include <mach_o_vals.h>
166 #include <mach_o_types.h>
168 #endif /* OBJECT_FORMAT_ROSE */
170 #ifdef OBJECT_FORMAT_NONE
172 /* Default flags to pass to nm. */
174 #define NM_FLAGS "-p"
177 #endif /* OBJECT_FORMAT_NONE */
179 /* Some systems use __main in a way incompatible with its use in gcc, in these
180 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
181 give the same symbol without quotes for an alternative entry point. You
182 must define both, or neither. */
184 #define NAME__MAIN "__main"
185 #define SYMBOL__MAIN __main
188 #if defined (LDD_SUFFIX) || SUNOS4_SHARED_LIBRARIES
189 #define SCAN_LIBRARIES
193 int do_collecting = 1;
195 int do_collecting = 0;
198 /* Linked lists of constructor and destructor names. */
214 /* Enumeration giving which pass this is for scanning the program file. */
217 PASS_FIRST, /* without constructors */
218 PASS_OBJ, /* individual objects */
219 PASS_LIB, /* looking for shared libraries */
220 PASS_SECOND /* with constructors linked in */
223 #ifndef NO_SYS_SIGLIST
224 #ifndef SYS_SIGLIST_DECLARED
225 extern char *sys_siglist[];
228 extern char *version_string;
230 int vflag; /* true if -v */
231 static int rflag; /* true if -r */
232 static int strip_flag; /* true if -s */
233 #ifdef COLLECT_EXPORT_LIST
234 static int export_flag; /* true if -bE */
237 int debug; /* true if -debug */
239 static int shared_obj; /* true if -shared */
241 static int temp_filename_length; /* Length of temp_filename */
242 static char *temp_filename; /* Base of temp filenames */
243 static char *c_file; /* <xxx>.c for constructor/destructor list. */
244 static char *o_file; /* <xxx>.o for constructor/destructor list. */
245 #ifdef COLLECT_EXPORT_LIST
246 static char *export_file; /* <xxx>.x for AIX export list. */
247 static char *import_file; /* <xxx>.p for AIX import list. */
249 char *ldout; /* File for ld errors. */
250 static char *output_file; /* Output file for ld. */
251 static char *nm_file_name; /* pathname of nm */
253 static char *ldd_file_name; /* pathname of ldd (or equivalent) */
255 static char *strip_file_name; /* pathname of strip */
256 char *c_file_name; /* pathname of gcc */
257 static char *initname, *fininame; /* names of init and fini funcs */
259 static struct head constructors; /* list of constructors found */
260 static struct head destructors; /* list of destructors found */
261 #ifdef COLLECT_EXPORT_LIST
262 static struct head exports; /* list of exported symbols */
263 static struct head imports; /* list of imported symbols */
264 static struct head undefined; /* list of undefined symbols */
266 static struct head frame_tables; /* list of frame unwind info tables */
268 struct obstack temporary_obstack;
269 struct obstack permanent_obstack;
270 char * temporary_firstobj;
272 /* Defined in the automatically-generated underscore.c. */
273 extern int prepends_underscore;
275 extern char *getenv ();
276 extern char *mktemp ();
277 extern FILE *fdopen ();
279 /* Structure to hold all the directories in which to search for files to
284 char *prefix; /* String to prepend to the path. */
285 struct prefix_list *next; /* Next in linked list. */
290 struct prefix_list *plist; /* List of prefixes to try */
291 int max_len; /* Max length of a prefix in PLIST */
292 char *name; /* Name of this list (used in config stuff) */
295 #ifdef COLLECT_EXPORT_LIST
296 /* Lists to keep libraries to be scanned for global constructors/destructors. */
297 static struct head libs; /* list of libraries */
298 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
299 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
300 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
301 &libpath_lib_dirs, NULL};
302 static char *libexts[3] = {"a", "so", NULL}; /* possible library extentions */
305 void collect_exit PROTO((int));
306 void collect_execute PROTO((char *, char **, char *));
307 void dump_file PROTO((char *));
308 static void handler PROTO((int));
309 static int is_ctor_dtor PROTO((char *));
310 static int is_in_prefix_list PROTO((struct path_prefix *, char *, int));
311 static char *find_a_file PROTO((struct path_prefix *, char *));
312 static void add_prefix PROTO((struct path_prefix *, char *));
313 static void prefix_from_env PROTO((char *, struct path_prefix *));
314 static void prefix_from_string PROTO((char *, struct path_prefix *));
315 static void do_wait PROTO((char *));
316 static void fork_execute PROTO((char *, char **));
317 static void maybe_unlink PROTO((char *));
318 static void add_to_list PROTO((struct head *, char *));
319 static void write_list PROTO((FILE *, char *, struct id *));
320 static void dump_list PROTO((FILE *, char *, struct id *));
321 static void dump_prefix_list PROTO((FILE *, char *, struct prefix_list *));
322 static int is_in_list PROTO((char *, struct id *));
323 static void write_list_with_asm PROTO((FILE *, char *, struct id *));
324 static void write_c_file PROTO((FILE *, char *));
325 static void scan_prog_file PROTO((char *, enum pass));
326 #ifdef SCAN_LIBRARIES
327 static void scan_libraries PROTO((char *));
329 #ifdef COLLECT_EXPORT_LIST
330 static void write_export_file PROTO((FILE *));
331 static void write_import_file PROTO((FILE *));
332 static char *resolve_lib_name PROTO((char *));
333 static int use_import_list PROTO((char *));
334 static int ignore_library PROTO((char *));
340 #ifdef NEED_DECLARATION_INDEX
341 extern char *index ();
344 #ifdef NEED_DECLARATION_RINDEX
345 extern char *rindex ();
348 #ifdef NEED_DECLARATION_FREE
365 while ((fd = dup (oldfd)) != newfd && fd >= 0) /* good enough for low fd's */
368 close (fdtmp[--fdx]);
384 static char buffer[30];
388 if (e > 0 && e < sys_nerr)
389 return sys_errlist[e];
391 sprintf (buffer, "Unknown error %d", e);
396 /* Delete tempfiles and exit function. */
399 collect_exit (status)
402 if (c_file != 0 && c_file[0])
403 maybe_unlink (c_file);
405 if (o_file != 0 && o_file[0])
406 maybe_unlink (o_file);
408 #ifdef COLLECT_EXPORT_LIST
409 if (export_file != 0 && export_file[0])
410 maybe_unlink (export_file);
412 if (import_file != 0 && import_file[0])
413 maybe_unlink (import_file);
416 if (ldout != 0 && ldout[0])
419 maybe_unlink (ldout);
422 if (status != 0 && output_file != 0 && output_file[0])
423 maybe_unlink (output_file);
429 /* Die when sys call fails. */
432 fatal_perror (string, arg1, arg2, arg3)
433 char *string, *arg1, *arg2, *arg3;
437 fprintf (stderr, "collect2: ");
438 fprintf (stderr, string, arg1, arg2, arg3);
439 fprintf (stderr, ": %s\n", my_strerror (e));
440 collect_exit (FATAL_EXIT_CODE);
446 fatal (string, arg1, arg2, arg3)
447 char *string, *arg1, *arg2, *arg3;
449 fprintf (stderr, "collect2: ");
450 fprintf (stderr, string, arg1, arg2, arg3);
451 fprintf (stderr, "\n");
452 collect_exit (FATAL_EXIT_CODE);
455 /* Write error message. */
458 error (string, arg1, arg2, arg3, arg4)
459 char *string, *arg1, *arg2, *arg3, *arg4;
461 fprintf (stderr, "collect2: ");
462 fprintf (stderr, string, arg1, arg2, arg3, arg4);
463 fprintf (stderr, "\n");
466 /* In case obstack is linked in, and abort is defined to fancy_abort,
467 provide a default entry. */
472 fatal ("internal error");
480 if (c_file != 0 && c_file[0])
481 maybe_unlink (c_file);
483 if (o_file != 0 && o_file[0])
484 maybe_unlink (o_file);
486 if (ldout != 0 && ldout[0])
487 maybe_unlink (ldout);
489 #ifdef COLLECT_EXPORT_LIST
490 if (export_file != 0 && export_file[0])
491 maybe_unlink (export_file);
493 if (import_file != 0 && import_file[0])
494 maybe_unlink (import_file);
497 signal (signo, SIG_DFL);
498 kill (getpid (), signo);
503 xcalloc (size1, size2)
506 char *ptr = (char *) calloc (size1, size2);
510 fatal ("out of memory");
518 char *ptr = (char *) malloc (size);
522 fatal ("out of memory");
531 register char *value = (char *) realloc (ptr, size);
533 fatal ("virtual memory exhausted");
541 return access (name, R_OK) == 0;
544 /* Make a copy of a string INPUT with size SIZE. */
547 savestring (input, size)
551 char *output = (char *) xmalloc (size + 1);
552 bcopy (input, output, size);
557 /* Parse a reasonable subset of shell quoting syntax. */
574 obstack_1grow (&temporary_obstack, c);
575 else if (! inside && c == ' ')
577 else if (! inside && c == '\\')
582 obstack_1grow (&temporary_obstack, c);
585 obstack_1grow (&temporary_obstack, '\0');
587 return obstack_finish (&temporary_obstack);
594 FILE *stream = fopen (name, "r");
595 int no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
602 while (c = getc (stream),
603 c != EOF && (isalnum (c) || c == '_' || c == '$' || c == '.'))
604 obstack_1grow (&temporary_obstack, c);
605 if (obstack_object_size (&temporary_obstack) > 0)
607 char *word, *p, *result;
608 obstack_1grow (&temporary_obstack, '\0');
609 word = obstack_finish (&temporary_obstack);
612 ++word, putc ('.', stderr);
614 if (*p == '_' && prepends_underscore)
620 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI);
625 fputs (result, stderr);
627 diff = strlen (word) - strlen (result);
629 --diff, putc (' ', stderr);
630 while (diff < 0 && c == ' ')
631 ++diff, c = getc (stream);
636 fputs (word, stderr);
639 obstack_free (&temporary_obstack, temporary_firstobj);
648 /* Decide whether the given symbol is:
649 a constructor (1), a destructor (2), or neither (0). */
655 struct names { char *name; int len; int ret; int two_underscores; };
657 register struct names *p;
659 register char *orig_s = s;
661 static struct names special[] = {
662 #ifdef NO_DOLLAR_IN_LABEL
663 #ifdef NO_DOT_IN_LABEL
664 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, 1, 0 },
665 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, 2, 0 },
666 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, 5, 0 },
668 { "GLOBAL_.I.", sizeof ("GLOBAL_.I.")-1, 1, 0 },
669 { "GLOBAL_.D.", sizeof ("GLOBAL_.D.")-1, 2, 0 },
670 { "GLOBAL_.F.", sizeof ("GLOBAL_.F.")-1, 5, 0 },
673 { "GLOBAL_$I$", sizeof ("GLOBAL_$I$")-1, 1, 0 },
674 { "GLOBAL_$D$", sizeof ("GLOBAL_$D$")-1, 2, 0 },
675 { "GLOBAL_$F$", sizeof ("GLOBAL_$F$")-1, 5, 0 },
677 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, 3, 0 },
678 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, 4, 0 },
679 #ifdef CFRONT_LOSSAGE /* Do not collect cfront initialization functions.
680 cfront has its own linker procedure to collect them;
681 if collect2 gets them too, they get collected twice
682 when the cfront procedure is run and the compiler used
683 for linking happens to be GCC. */
684 { "sti__", sizeof ("sti__")-1, 1, 1 },
685 { "std__", sizeof ("std__")-1, 2, 1 },
686 #endif /* CFRONT_LOSSAGE */
690 while ((ch = *s) == '_')
696 for (p = &special[0]; p->len > 0; p++)
699 && (!p->two_underscores || ((s - orig_s) >= 2))
700 && strncmp(s, p->name, p->len) == 0)
708 /* Routine to add variables to the environment. */
716 #ifndef VMS /* nor about VMS */
718 extern char **environ;
719 char **old_environ = environ;
726 while ((ch = *p++) != '\0' && ch != '=')
732 /* Search for replacing an existing environment variable, and
733 count the number of total environment variables. */
734 for (envp = old_environ; *envp; envp++)
737 if (!strncmp (str, *envp, name_len))
744 /* Add a new environment variable */
745 environ = (char **) xmalloc (sizeof (char *) * (num_envs+2));
747 bcopy ((char *) old_environ, (char *) (environ + 1),
748 sizeof (char *) * (num_envs+1));
754 #endif /* HAVE_PUTENV */
756 /* By default, colon separates directories in a path. */
757 #ifndef PATH_SEPARATOR
758 #define PATH_SEPARATOR ':'
761 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
762 and one from the PATH variable. */
764 static struct path_prefix cpath, path;
767 /* This is the name of the target machine. We use it to form the name
768 of the files to execute. */
770 static char *target_machine = TARGET_MACHINE;
773 /* Names under which we were executed. Never return one of those files in our
776 static struct path_prefix our_file_names;
778 /* Determine if STRING is in PPREFIX.
780 This utility is currently only used to look up file names. Prefix lists
781 record directory names. This matters to us because the latter has a
782 trailing slash, so I've added a flag to handle both. */
785 is_in_prefix_list (pprefix, string, filep)
786 struct path_prefix *pprefix;
790 struct prefix_list *pl;
794 int len = strlen (string);
796 for (pl = pprefix->plist; pl; pl = pl->next)
798 if (strncmp (pl->prefix, string, len) == 0
799 && strcmp (pl->prefix + len, "/") == 0)
805 for (pl = pprefix->plist; pl; pl = pl->next)
807 if (strcmp (pl->prefix, string) == 0)
815 /* Search for NAME using prefix list PPREFIX. We only look for executable
818 Return 0 if not found, otherwise return its name, allocated with malloc. */
821 find_a_file (pprefix, name)
822 struct path_prefix *pprefix;
826 struct prefix_list *pl;
827 int len = pprefix->max_len + strlen (name) + 1;
829 #ifdef EXECUTABLE_SUFFIX
830 len += strlen (EXECUTABLE_SUFFIX);
833 temp = xmalloc (len);
835 /* Determine the filename to execute (special case for absolute paths). */
839 if (access (name, X_OK) == 0)
846 for (pl = pprefix->plist; pl; pl = pl->next)
848 strcpy (temp, pl->prefix);
850 if (! is_in_prefix_list (&our_file_names, temp, 1)
851 /* This is a kludge, but there seems no way around it. */
852 && strcmp (temp, "./ld") != 0
853 && access (temp, X_OK) == 0)
856 #ifdef EXECUTABLE_SUFFIX
857 /* Some systems have a suffix for executable files.
858 So try appending that. */
859 strcat (temp, EXECUTABLE_SUFFIX);
860 if (! is_in_prefix_list (&our_file_names, temp, 1)
861 && access (temp, X_OK) == 0)
870 /* Add an entry for PREFIX to prefix list PPREFIX. */
873 add_prefix (pprefix, prefix)
874 struct path_prefix *pprefix;
877 struct prefix_list *pl, **prev;
882 for (pl = pprefix->plist; pl->next; pl = pl->next)
887 prev = &pprefix->plist;
889 /* Keep track of the longest prefix */
891 len = strlen (prefix);
892 if (len > pprefix->max_len)
893 pprefix->max_len = len;
895 pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
896 pl->prefix = savestring (prefix, len);
901 pl->next = (struct prefix_list *) 0;
905 /* Take the value of the environment variable ENV, break it into a path, and
906 add of the entries to PPREFIX. */
909 prefix_from_env (env, pprefix)
911 struct path_prefix *pprefix;
913 char *p = getenv (env);
916 prefix_from_string (p, pprefix);
920 prefix_from_string (p, pprefix)
922 struct path_prefix *pprefix;
925 char *nstore = (char *) xmalloc (strlen (p) + 3);
930 if (*endp == PATH_SEPARATOR || *endp == 0)
932 strncpy (nstore, startp, endp-startp);
935 strcpy (nstore, "./");
937 else if (endp[-1] != '/')
939 nstore[endp-startp] = '/';
940 nstore[endp-startp+1] = 0;
943 nstore[endp-startp] = 0;
945 add_prefix (pprefix, nstore);
948 endp = startp = endp + 1;
962 char *ld_suffix = "ld";
963 char *full_ld_suffix = ld_suffix;
964 char *real_ld_suffix = "real-ld";
965 char *collect_ld_suffix = "collect-ld";
966 char *nm_suffix = "nm";
967 char *full_nm_suffix = nm_suffix;
968 char *gnm_suffix = "gnm";
969 char *full_gnm_suffix = gnm_suffix;
971 char *ldd_suffix = LDD_SUFFIX;
972 char *full_ldd_suffix = ldd_suffix;
974 char *strip_suffix = "strip";
975 char *full_strip_suffix = strip_suffix;
976 char *gstrip_suffix = "gstrip";
977 char *full_gstrip_suffix = gstrip_suffix;
980 #ifdef COLLECT_EXPORT_LIST
990 char **ld1_argv = (char **) xcalloc (sizeof (char *), argc+3);
991 char **ld1 = ld1_argv;
992 char **ld2_argv = (char **) xcalloc (sizeof (char *), argc+6);
993 char **ld2 = ld2_argv;
994 char **object_lst = (char **) xcalloc (sizeof (char *), argc);
995 char **object = object_lst;
997 int num_c_args = argc+7;
1004 #ifndef DEFAULT_A_OUT_NAME
1005 output_file = "a.out";
1007 output_file = DEFAULT_A_OUT_NAME;
1010 obstack_begin (&temporary_obstack, 0);
1011 obstack_begin (&permanent_obstack, 0);
1012 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1013 current_demangling_style = gnu_demangling;
1015 /* We must check that we do not call ourselves in an infinite
1016 recursion loop. We append the name used for us to the COLLECT_NAMES
1017 environment variable.
1019 In practice, collect will rarely invoke itself. This can happen now
1020 that we are no longer called gld. A perfect example is when running
1021 gcc in a build directory that has been installed. When looking for
1022 ld, we will find our installed version and believe that's the real ld. */
1024 /* We must also append COLLECT_NAME to COLLECT_NAMES to watch for the
1025 previous version of collect (the one that used COLLECT_NAME and only
1026 handled two levels of recursion). If we do not we may mutually recurse
1027 forever. This can happen (I think) when bootstrapping the old version
1028 and a new one is installed (rare, but we should handle it).
1029 ??? Hopefully references to COLLECT_NAME can be removed at some point. */
1031 collect_name = (char *) getenv ("COLLECT_NAME");
1032 collect_names = (char *) getenv ("COLLECT_NAMES");
1034 p = (char *) xmalloc (strlen ("COLLECT_NAMES=")
1035 + (collect_name ? strlen (collect_name) + 1 : 0)
1036 + (collect_names ? strlen (collect_names) + 1 : 0)
1037 + strlen (argv[0]) + 1);
1038 strcpy (p, "COLLECT_NAMES=");
1039 if (collect_name != 0)
1040 sprintf (p + strlen (p), "%s%c", collect_name, PATH_SEPARATOR);
1041 if (collect_names != 0)
1042 sprintf (p + strlen (p), "%s%c", collect_names, PATH_SEPARATOR);
1043 strcat (p, argv[0]);
1046 prefix_from_env ("COLLECT_NAMES", &our_file_names);
1048 /* Set environment variable COLLECT_NAME to our name so the previous version
1049 of collect will not find us. If it does we will mutually recurse forever.
1050 This can happen when bootstrapping the new version and an old version is
1052 ??? Hopefully this bit of code can be removed at some point. */
1054 p = xmalloc (strlen ("COLLECT_NAME=") + strlen (argv[0]) + 1);
1055 sprintf (p, "COLLECT_NAME=%s", argv[0]);
1058 p = (char *) getenv ("COLLECT_GCC_OPTIONS");
1061 char *q = extract_string (&p);
1062 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1065 obstack_free (&temporary_obstack, temporary_firstobj);
1068 c_ptr = c_argv = (char **) xcalloc (sizeof (char *), num_c_args);
1071 fatal ("no arguments");
1074 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1075 signal (SIGQUIT, handler);
1077 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1078 signal (SIGINT, handler);
1080 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1081 signal (SIGALRM, handler);
1084 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1085 signal (SIGHUP, handler);
1087 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1088 signal (SIGSEGV, handler);
1090 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1091 signal (SIGBUS, handler);
1094 /* Extract COMPILER_PATH and PATH into our prefix list. */
1095 prefix_from_env ("COMPILER_PATH", &cpath);
1096 prefix_from_env ("PATH", &path);
1098 #ifdef CROSS_COMPILE
1099 /* If we look for a program in the compiler directories, we just use
1100 the short name, since these directories are already system-specific.
1101 But it we look for a took in the system directories, we need to
1102 qualify the program name with the target machine. */
1105 = xcalloc (strlen (ld_suffix) + strlen (target_machine) + 2, 1);
1106 strcpy (full_ld_suffix, target_machine);
1107 strcat (full_ld_suffix, "-");
1108 strcat (full_ld_suffix, ld_suffix);
1112 = xcalloc (strlen (gld_suffix) + strlen (target_machine) + 2, 1);
1113 strcpy (full_gld_suffix, target_machine);
1114 strcat (full_gld_suffix, "-");
1115 strcat (full_gld_suffix, gld_suffix);
1119 = xcalloc (strlen (nm_suffix) + strlen (target_machine) + 2, 1);
1120 strcpy (full_nm_suffix, target_machine);
1121 strcat (full_nm_suffix, "-");
1122 strcat (full_nm_suffix, nm_suffix);
1125 = xcalloc (strlen (gnm_suffix) + strlen (target_machine) + 2, 1);
1126 strcpy (full_gnm_suffix, target_machine);
1127 strcat (full_gnm_suffix, "-");
1128 strcat (full_gnm_suffix, gnm_suffix);
1132 = xcalloc (strlen (ldd_suffix) + strlen (target_machine) + 2, 1);
1133 strcpy (full_ldd_suffix, target_machine);
1134 strcat (full_ldd_suffix, "-");
1135 strcat (full_ldd_suffix, ldd_suffix);
1139 = xcalloc (strlen (strip_suffix) + strlen (target_machine) + 2, 1);
1140 strcpy (full_strip_suffix, target_machine);
1141 strcat (full_strip_suffix, "-");
1142 strcat (full_strip_suffix, strip_suffix);
1145 = xcalloc (strlen (gstrip_suffix) + strlen (target_machine) + 2, 1);
1146 strcpy (full_gstrip_suffix, target_machine);
1147 strcat (full_gstrip_suffix, "-");
1148 strcat (full_gstrip_suffix, gstrip_suffix);
1149 #endif /* CROSS_COMPILE */
1151 /* Try to discover a valid linker/nm/strip to use. */
1153 /* Maybe we know the right file to use (if not cross). */
1154 #ifdef REAL_LD_FILE_NAME
1155 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1156 if (ld_file_name == 0)
1158 /* Search the (target-specific) compiler dirs for ld'. */
1159 ld_file_name = find_a_file (&cpath, real_ld_suffix);
1160 /* Likewise for `collect-ld'. */
1161 if (ld_file_name == 0)
1162 ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1163 /* Search the compiler directories for `ld'. We have protection against
1164 recursive calls in find_a_file. */
1165 if (ld_file_name == 0)
1166 ld_file_name = find_a_file (&cpath, ld_suffix);
1167 /* Search the ordinary system bin directories
1168 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1169 if (ld_file_name == 0)
1170 ld_file_name = find_a_file (&path, full_ld_suffix);
1172 /* If we've invoked ourselves, try again with LD_FILE_NAME. */
1174 if (collect_names != 0)
1176 if (ld_file_name != 0)
1178 argv[0] = ld_file_name;
1179 execvp (argv[0], argv);
1181 fatal ("cannot find `ld'");
1184 #ifdef REAL_NM_FILE_NAME
1185 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1186 if (nm_file_name == 0)
1188 nm_file_name = find_a_file (&cpath, gnm_suffix);
1189 if (nm_file_name == 0)
1190 nm_file_name = find_a_file (&path, full_gnm_suffix);
1191 if (nm_file_name == 0)
1192 nm_file_name = find_a_file (&cpath, nm_suffix);
1193 if (nm_file_name == 0)
1194 nm_file_name = find_a_file (&path, full_nm_suffix);
1197 ldd_file_name = find_a_file (&cpath, ldd_suffix);
1198 if (ldd_file_name == 0)
1199 ldd_file_name = find_a_file (&path, full_ldd_suffix);
1202 #ifdef REAL_STRIP_FILE_NAME
1203 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1204 if (strip_file_name == 0)
1206 strip_file_name = find_a_file (&cpath, gstrip_suffix);
1207 if (strip_file_name == 0)
1208 strip_file_name = find_a_file (&path, full_gstrip_suffix);
1209 if (strip_file_name == 0)
1210 strip_file_name = find_a_file (&cpath, strip_suffix);
1211 if (strip_file_name == 0)
1212 strip_file_name = find_a_file (&path, full_strip_suffix);
1214 /* Determine the full path name of the C compiler to use. */
1215 c_file_name = getenv ("COLLECT_GCC");
1216 if (c_file_name == 0)
1218 #ifdef CROSS_COMPILE
1219 c_file_name = xcalloc (sizeof ("gcc-") + strlen (target_machine) + 1, 1);
1220 strcpy (c_file_name, target_machine);
1221 strcat (c_file_name, "-gcc");
1223 c_file_name = "gcc";
1227 p = find_a_file (&cpath, c_file_name);
1229 /* Here it should be safe to use the system search path since we should have
1230 already qualified the name of the compiler when it is needed. */
1232 p = find_a_file (&path, c_file_name);
1237 *ld1++ = *ld2++ = ld_file_name;
1239 /* Make temp file names. */
1240 temp_filename = choose_temp_base ();
1241 temp_filename_length = strlen (temp_filename);
1242 c_file = xcalloc (temp_filename_length + sizeof (".c"), 1);
1243 o_file = xcalloc (temp_filename_length + sizeof (".o"), 1);
1244 #ifdef COLLECT_EXPORT_LIST
1245 export_file = xmalloc (temp_filename_length + sizeof (".x"));
1246 import_file = xmalloc (temp_filename_length + sizeof (".p"));
1248 ldout = xmalloc (temp_filename_length + sizeof (".ld"));
1249 sprintf (ldout, "%s.ld", temp_filename);
1250 sprintf (c_file, "%s.c", temp_filename);
1251 sprintf (o_file, "%s.o", temp_filename);
1252 #ifdef COLLECT_EXPORT_LIST
1253 sprintf (export_file, "%s.x", temp_filename);
1254 sprintf (import_file, "%s.p", temp_filename);
1256 *c_ptr++ = c_file_name;
1261 #ifdef COLLECT_EXPORT_LIST
1262 /* Generate a list of directories from LIBPATH. */
1263 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1264 /* Add to this list also two standard directories where
1265 AIX loader always searches for libraries. */
1266 add_prefix (&libpath_lib_dirs, "/lib");
1267 add_prefix (&libpath_lib_dirs, "/usr/lib");
1270 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1272 AIX support needs to know if -shared has been specified before
1273 parsing commandline arguments. */
1275 p = (char *) getenv ("COLLECT_GCC_OPTIONS");
1278 char *q = extract_string (&p);
1279 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1280 *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
1281 if (strncmp (q, "-shared", sizeof ("-shared") - 1) == 0)
1284 obstack_free (&temporary_obstack, temporary_firstobj);
1285 *c_ptr++ = "-fno-exceptions";
1287 /* !!! When GCC calls collect2,
1288 it does not know whether it is calling collect2 or ld.
1289 So collect2 cannot meaningfully understand any options
1290 except those ld understands.
1291 If you propose to make GCC pass some other option,
1292 just imagine what will happen if ld is really ld!!! */
1294 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1295 /* After the first file, put in the c++ rt0. */
1298 while ((arg = *++argv) != (char *) 0)
1300 *ld1++ = *ld2++ = arg;
1306 #ifdef COLLECT_EXPORT_LIST
1307 /* We want to disable automatic exports on AIX when user
1308 explicitly puts an export list in command line */
1310 if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1316 if (!strcmp (arg, "-debug"))
1328 /* place o_file BEFORE this argument! */
1334 #ifdef COLLECT_EXPORT_LIST
1336 /* Resolving full library name. */
1337 char *s = resolve_lib_name (arg+2);
1339 /* If we will use an import list for this library,
1340 we should exclude it from ld args. */
1341 if (use_import_list (s))
1347 /* Saving a full library name. */
1348 add_to_list (&libs, s);
1353 #ifdef COLLECT_EXPORT_LIST
1354 /* Saving directories where to search for libraries. */
1356 add_prefix (&cmdline_lib_dirs, arg+2);
1362 output_file = *ld1++ = *ld2++ = *++argv;
1364 output_file = &arg[2];
1373 if (arg[2] == '\0' && do_collecting)
1375 /* We must strip after the nm run, otherwise C++ linking
1376 will not work. Thus we strip in the second ld run, or
1377 else with strip if there is no second ld run. */
1389 else if ((p = rindex (arg, '.')) != (char *) 0
1390 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1391 || strcmp (p, ".so") == 0))
1400 /* place o_file BEFORE this argument! */
1408 #ifdef COLLECT_EXPORT_LIST
1409 /* libraries can be specified directly, i.e. without -l flag. */
1412 /* If we will use an import list for this library,
1413 we should exclude it from ld args. */
1414 if (use_import_list (arg))
1420 /* Saving a full library name. */
1421 add_to_list (&libs, arg);
1427 #ifdef COLLECT_EXPORT_LIST
1428 /* This is added only for debugging purposes. */
1431 fprintf (stderr, "List of libraries:\n");
1432 dump_list (stderr, "\t", libs.first);
1435 /* The AIX linker will discard static constructors in object files if
1436 nothing else in the file is referenced, so look at them first. */
1438 char **export_object_lst = object_lst;
1439 while (export_object_lst < object)
1440 scan_prog_file (*export_object_lst++, PASS_OBJ);
1443 struct id *list = libs.first;
1444 for (; list; list = list->next)
1445 scan_prog_file (list->name, PASS_FIRST);
1448 char *buf1 = alloca (strlen (export_file) + 5);
1449 char *buf2 = alloca (strlen (import_file) + 5);
1450 sprintf (buf1, "-bE:%s", export_file);
1451 sprintf (buf2, "-bI:%s", import_file);
1456 exportf = fopen (export_file, "w");
1457 if (exportf == (FILE *) 0)
1458 fatal_perror ("%s", export_file);
1459 write_export_file (exportf);
1460 if (fclose (exportf))
1461 fatal_perror ("closing %s", export_file);
1462 importf = fopen (import_file, "w");
1463 if (importf == (FILE *) 0)
1464 fatal_perror ("%s", import_file);
1465 write_import_file (importf);
1466 if (fclose (importf))
1467 fatal_perror ("closing %s", import_file);
1472 *object = *c_ptr = *ld1 = (char *) 0;
1476 fprintf (stderr, "collect2 version %s", version_string);
1477 #ifdef TARGET_VERSION
1480 fprintf (stderr, "\n");
1486 fprintf (stderr, "ld_file_name = %s\n",
1487 (ld_file_name ? ld_file_name : "not found"));
1488 fprintf (stderr, "c_file_name = %s\n",
1489 (c_file_name ? c_file_name : "not found"));
1490 fprintf (stderr, "nm_file_name = %s\n",
1491 (nm_file_name ? nm_file_name : "not found"));
1493 fprintf (stderr, "ldd_file_name = %s\n",
1494 (ldd_file_name ? ldd_file_name : "not found"));
1496 fprintf (stderr, "strip_file_name = %s\n",
1497 (strip_file_name ? strip_file_name : "not found"));
1498 fprintf (stderr, "c_file = %s\n",
1499 (c_file ? c_file : "not found"));
1500 fprintf (stderr, "o_file = %s\n",
1501 (o_file ? o_file : "not found"));
1503 ptr = getenv ("COLLECT_NAMES");
1505 fprintf (stderr, "COLLECT_NAMES = %s\n", ptr);
1507 ptr = getenv ("COLLECT_GCC_OPTIONS");
1509 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1511 ptr = getenv ("COLLECT_GCC");
1513 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1515 ptr = getenv ("COMPILER_PATH");
1517 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1519 ptr = getenv ("LIBRARY_PATH");
1521 fprintf (stderr, "LIBRARY_PATH = %s\n", ptr);
1523 fprintf (stderr, "\n");
1526 /* Load the program, searching all libraries and attempting to provide
1527 undefined symbols from repository information. */
1529 /* On AIX we do this later. */
1530 #ifndef COLLECT_EXPORT_LIST
1531 do_tlink (ld1_argv, object_lst);
1534 /* If -r or they will be run via some other method, do not build the
1535 constructor or destructor list, just return now. */
1536 if (rflag || ! do_collecting)
1538 #ifdef COLLECT_EXPORT_LIST
1539 /* But make sure we delete the export file we may have created. */
1540 if (export_file != 0 && export_file[0])
1541 maybe_unlink (export_file);
1542 if (import_file != 0 && import_file[0])
1543 maybe_unlink (import_file);
1548 /* Examine the namelist with nm and search it for static constructors
1549 and destructors to call.
1550 Write the constructor and destructor tables to a .s file and reload. */
1552 /* On AIX we already done scanning for global constructors/destructors. */
1553 #ifndef COLLECT_EXPORT_LIST
1554 scan_prog_file (output_file, PASS_FIRST);
1557 #ifdef SCAN_LIBRARIES
1558 scan_libraries (output_file);
1563 fprintf (stderr, "%d constructor(s) found\n", constructors.number);
1564 fprintf (stderr, "%d destructor(s) found\n", destructors.number);
1567 if (constructors.number == 0 && destructors.number == 0
1568 && frame_tables.number == 0
1569 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1570 /* If we will be running these functions ourselves, we want to emit
1571 stubs into the shared library so that we do not have to relink
1572 dependent programs when we add static objects. */
1577 #ifdef COLLECT_EXPORT_LIST
1578 /* Doing tlink without additional code generation */
1579 do_tlink (ld1_argv, object_lst);
1581 /* Strip now if it was requested on the command line. */
1584 char **strip_argv = (char **) xcalloc (sizeof (char *), 3);
1585 strip_argv[0] = strip_file_name;
1586 strip_argv[1] = output_file;
1587 strip_argv[2] = (char *) 0;
1588 fork_execute ("strip", strip_argv);
1591 #ifdef COLLECT_EXPORT_LIST
1592 maybe_unlink (export_file);
1593 maybe_unlink (import_file);
1598 maybe_unlink(output_file);
1599 outf = fopen (c_file, "w");
1600 if (outf == (FILE *) 0)
1601 fatal_perror ("%s", c_file);
1603 write_c_file (outf, c_file);
1606 fatal_perror ("closing %s", c_file);
1608 /* Tell the linker that we have initializer and finalizer functions. */
1609 #ifdef LD_INIT_SWITCH
1610 *ld2++ = LD_INIT_SWITCH;
1612 *ld2++ = LD_FINI_SWITCH;
1617 #ifdef COLLECT_EXPORT_LIST
1620 add_to_list (&exports, initname);
1621 add_to_list (&exports, fininame);
1622 add_to_list (&exports, "_GLOBAL__DI");
1623 add_to_list (&exports, "_GLOBAL__DD");
1624 exportf = fopen (export_file, "w");
1625 if (exportf == (FILE *) 0)
1626 fatal_perror ("%s", export_file);
1627 write_export_file (exportf);
1628 if (fclose (exportf))
1629 fatal_perror ("closing %s", export_file);
1635 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1636 output_file, c_file);
1637 write_c_file (stderr, "stderr");
1638 fprintf (stderr, "========== end of c_file\n\n");
1639 #ifdef COLLECT_EXPORT_LIST
1640 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1641 write_export_file (stderr);
1642 fprintf (stderr, "========== end of export_file\n\n");
1646 /* Assemble the constructor and destructor tables.
1647 Link the tables in with the rest of the program. */
1649 fork_execute ("gcc", c_argv);
1650 #ifdef COLLECT_EXPORT_LIST
1651 /* On AIX we must call tlink because of possible templates resolution */
1652 do_tlink (ld2_argv, object_lst);
1654 /* Otherwise, simply call ld because tlink is already done */
1655 fork_execute ("ld", ld2_argv);
1657 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1658 constructors/destructors in shared libraries. */
1659 scan_prog_file (output_file, PASS_SECOND);
1662 maybe_unlink (c_file);
1663 maybe_unlink (o_file);
1665 #ifdef COLLECT_EXPORT_LIST
1666 maybe_unlink (export_file);
1667 maybe_unlink (import_file);
1674 /* Wait for a process to finish, and exit if a non-zero status is found. */
1685 if (WIFSIGNALED (status))
1687 int sig = WTERMSIG (status);
1688 #ifdef NO_SYS_SIGLIST
1689 error ("%s terminated with signal %d %s",
1692 (status & 0200) ? ", core dumped" : "");
1694 error ("%s terminated with signal %d [%s]%s",
1698 (status & 0200) ? ", core dumped" : "");
1701 collect_exit (FATAL_EXIT_CODE);
1704 if (WIFEXITED (status))
1705 return WEXITSTATUS (status);
1714 int ret = collect_wait (prog);
1717 error ("%s returned %d exit status", prog, ret);
1723 /* Fork and execute a program, and wait for the reply. */
1726 collect_execute (prog, argv, redir)
1739 fprintf (stderr, "%s", argv[0]);
1741 fprintf (stderr, "[cannot find %s]", prog);
1743 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
1744 fprintf (stderr, " %s", str);
1746 fprintf (stderr, "\n");
1752 /* If we cannot find a program we need, complain error. Do this here
1753 since we might not end up needing something that we could not find. */
1756 fatal ("cannot find `%s'", prog);
1762 fatal_perror ("fork");
1764 fatal_perror ("vfork");
1768 if (pid == 0) /* child context */
1773 if (freopen (redir, "a", stdout) == NULL)
1774 fatal_perror ("redirecting stdout: %s", redir);
1775 if (freopen (redir, "a", stderr) == NULL)
1776 fatal_perror ("redirecting stderr: %s", redir);
1779 execvp (argv[0], argv);
1780 fatal_perror ("executing %s", prog);
1785 fork_execute (prog, argv)
1789 collect_execute (prog, argv, NULL);
1793 /* Unlink a file unless we are debugging. */
1802 fprintf (stderr, "[Leaving %s]\n", file);
1806 /* Add a name to a linked list. */
1809 add_to_list (head_ptr, name)
1810 struct head *head_ptr;
1814 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
1816 static long sequence_number = 0;
1817 strcpy (newid->name, name);
1819 if (head_ptr->first)
1820 head_ptr->last->next = newid;
1822 head_ptr->first = newid;
1824 /* Check for duplicate symbols. */
1825 for (p = head_ptr->first;
1826 strcmp (name, p->name) != 0;
1831 head_ptr->last->next = 0;
1836 newid->sequence = ++sequence_number;
1837 head_ptr->last = newid;
1841 /* Write: `prefix', the names on list LIST, `suffix'. */
1844 write_list (stream, prefix, list)
1851 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
1856 /* This function is really used only on AIX, but may be useful. */
1858 is_in_list (prefix, list)
1864 if (!strcmp (prefix, list->name)) return 1;
1870 /* Added for debugging purpose. */
1872 dump_list (stream, prefix, list)
1879 fprintf (stream, "%s%s,\n", prefix, list->name);
1885 dump_prefix_list (stream, prefix, list)
1888 struct prefix_list *list;
1892 fprintf (stream, "%s%s,\n", prefix, list->prefix);
1898 write_list_with_asm (stream, prefix, list)
1905 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
1906 prefix, list->sequence, list->name);
1911 /* Write out the constructor and destructor tables statically (for a shared
1912 object), along with the functions to execute them. */
1915 write_c_file_stat (stream, name)
1919 char *prefix, *p, *q;
1920 int frames = (frame_tables.number > 0);
1922 /* Figure out name of output_file, stripping off .so version. */
1923 p = rindex (output_file, '/');
1925 p = (char *) output_file;
1939 if (strncmp (q, ".so", 3) == 0)
1948 /* q points to null at end of the string (or . of the .so version) */
1949 prefix = xmalloc (q - p + 1);
1950 strncpy (prefix, p, q - p);
1952 for (q = prefix; *q; q++)
1956 fprintf (stderr, "\nwrite_c_file - output name is %s, prefix is %s\n",
1957 output_file, prefix);
1959 #define INIT_NAME_FORMAT "_GLOBAL__FI_%s"
1960 initname = xmalloc (strlen (prefix) + sizeof (INIT_NAME_FORMAT) - 2);
1961 sprintf (initname, INIT_NAME_FORMAT, prefix);
1963 #define FINI_NAME_FORMAT "_GLOBAL__FD_%s"
1964 fininame = xmalloc (strlen (prefix) + sizeof (FINI_NAME_FORMAT) - 2);
1965 sprintf (fininame, FINI_NAME_FORMAT, prefix);
1969 /* Write the tables as C code */
1971 fprintf (stream, "static int count;\n");
1972 fprintf (stream, "typedef void entry_pt();\n");
1973 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
1977 write_list_with_asm (stream, "extern void *", frame_tables.first);
1979 fprintf (stream, "\tstatic void *frame_table[] = {\n");
1980 write_list (stream, "\t\t&", frame_tables.first);
1981 fprintf (stream, "\t0\n};\n");
1983 /* This must match what's in frame.h. */
1984 fprintf (stream, "struct object {\n");
1985 fprintf (stream, " void *pc_begin;\n");
1986 fprintf (stream, " void *pc_end;\n");
1987 fprintf (stream, " void *fde_begin;\n");
1988 fprintf (stream, " void *fde_array;\n");
1989 fprintf (stream, " __SIZE_TYPE__ count;\n");
1990 fprintf (stream, " struct object *next;\n");
1991 fprintf (stream, "};\n");
1993 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
1994 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
1996 fprintf (stream, "static void reg_frame () {\n");
1997 fprintf (stream, "\tstatic struct object ob;\n");
1998 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
1999 fprintf (stream, "\t}\n");
2001 fprintf (stream, "static void dereg_frame () {\n");
2002 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2003 fprintf (stream, "\t}\n");
2006 fprintf (stream, "void %s() {\n", initname);
2007 if (constructors.number > 0 || frames)
2009 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2010 write_list (stream, "\t\t", constructors.first);
2012 fprintf (stream, "\treg_frame,\n");
2013 fprintf (stream, "\t};\n");
2014 fprintf (stream, "\tentry_pt **p;\n");
2015 fprintf (stream, "\tif (count++ != 0) return;\n");
2016 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2017 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2020 fprintf (stream, "\t++count;\n");
2021 fprintf (stream, "}\n");
2022 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2023 fprintf (stream, "void %s() {\n", fininame);
2024 if (destructors.number > 0 || frames)
2026 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2027 write_list (stream, "\t\t", destructors.first);
2029 fprintf (stream, "\tdereg_frame,\n");
2030 fprintf (stream, "\t};\n");
2031 fprintf (stream, "\tentry_pt **p;\n");
2032 fprintf (stream, "\tif (--count != 0) return;\n");
2033 fprintf (stream, "\tp = dtors;\n");
2034 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2035 destructors.number + frames);
2037 fprintf (stream, "}\n");
2041 fprintf (stream, "void _GLOBAL__DI() {\n\t%s();\n}\n", initname);
2042 fprintf (stream, "void _GLOBAL__DD() {\n\t%s();\n}\n", fininame);
2046 /* Write the constructor/destructor tables. */
2049 write_c_file_glob (stream, name)
2053 /* Write the tables as C code */
2055 int frames = (frame_tables.number > 0);
2057 fprintf (stream, "typedef void entry_pt();\n\n");
2059 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2063 write_list_with_asm (stream, "extern void *", frame_tables.first);
2065 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2066 write_list (stream, "\t\t&", frame_tables.first);
2067 fprintf (stream, "\t0\n};\n");
2069 /* This must match what's in frame.h. */
2070 fprintf (stream, "struct object {\n");
2071 fprintf (stream, " void *pc_begin;\n");
2072 fprintf (stream, " void *pc_end;\n");
2073 fprintf (stream, " void *fde_begin;\n");
2074 fprintf (stream, " void *fde_array;\n");
2075 fprintf (stream, " __SIZE_TYPE__ count;\n");
2076 fprintf (stream, " struct object *next;\n");
2077 fprintf (stream, "};\n");
2079 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2080 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2082 fprintf (stream, "static void reg_frame () {\n");
2083 fprintf (stream, "\tstatic struct object ob;\n");
2084 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2085 fprintf (stream, "\t}\n");
2087 fprintf (stream, "static void dereg_frame () {\n");
2088 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2089 fprintf (stream, "\t}\n");
2092 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2093 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2094 write_list (stream, "\t", constructors.first);
2096 fprintf (stream, "\treg_frame,\n");
2097 fprintf (stream, "\t0\n};\n\n");
2099 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2101 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2102 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2103 write_list (stream, "\t", destructors.first);
2105 fprintf (stream, "\tdereg_frame,\n");
2106 fprintf (stream, "\t0\n};\n\n");
2108 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2109 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2113 write_c_file (stream, name)
2117 fprintf (stream, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
2118 #ifndef LD_INIT_SWITCH
2120 write_c_file_glob (stream, name);
2123 write_c_file_stat (stream, name);
2124 fprintf (stream, "#ifdef __cplusplus\n}\n#endif\n");
2127 #ifdef COLLECT_EXPORT_LIST
2129 write_export_file (stream)
2132 struct id *list = exports.first;
2133 for (; list; list = list->next)
2134 fprintf (stream, "%s\n", list->name);
2138 write_import_file (stream)
2141 struct id *list = imports.first;
2142 fprintf (stream, "%s\n", "#! .");
2143 for (; list; list = list->next)
2144 fprintf (stream, "%s\n", list->name);
2148 #ifdef OBJECT_FORMAT_NONE
2150 /* Generic version to scan the name list of the loaded program for
2151 the symbols g++ uses for static constructors and destructors.
2153 The constructor table begins at __CTOR_LIST__ and contains a count
2154 of the number of pointers (or -1 if the constructors are built in a
2155 separate section by the linker), followed by the pointers to the
2156 constructor functions, terminated with a null pointer. The
2157 destructor table has the same format, and begins at __DTOR_LIST__. */
2160 scan_prog_file (prog_name, which_pass)
2162 enum pass which_pass;
2164 void (*int_handler) ();
2165 void (*quit_handler) ();
2173 if (which_pass == PASS_SECOND)
2176 /* If we do not have an `nm', complain. */
2177 if (nm_file_name == 0)
2178 fatal ("cannot find `nm'");
2180 nm_argv[argc++] = nm_file_name;
2181 if (NM_FLAGS[0] != '\0')
2182 nm_argv[argc++] = NM_FLAGS;
2184 nm_argv[argc++] = prog_name;
2185 nm_argv[argc++] = (char *) 0;
2187 if (pipe (pipe_fd) < 0)
2188 fatal_perror ("pipe");
2190 inf = fdopen (pipe_fd[0], "r");
2191 if (inf == (FILE *) 0)
2192 fatal_perror ("fdopen");
2194 /* Trace if needed. */
2200 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2201 fprintf (stderr, " %s", str);
2203 fprintf (stderr, "\n");
2209 /* Spawn child nm on pipe */
2214 fatal_perror ("fork");
2216 fatal_perror ("vfork");
2220 if (pid == 0) /* child context */
2223 if (dup2 (pipe_fd[1], 1) < 0)
2224 fatal_perror ("dup2 (%d, 1)", pipe_fd[1]);
2226 if (close (pipe_fd[0]) < 0)
2227 fatal_perror ("close (%d)", pipe_fd[0]);
2229 if (close (pipe_fd[1]) < 0)
2230 fatal_perror ("close (%d)", pipe_fd[1]);
2232 execv (nm_file_name, nm_argv);
2233 fatal_perror ("executing %s", nm_file_name);
2236 /* Parent context from here on. */
2237 int_handler = (void (*) ())signal (SIGINT, SIG_IGN);
2239 quit_handler = (void (*) ())signal (SIGQUIT, SIG_IGN);
2242 if (close (pipe_fd[1]) < 0)
2243 fatal_perror ("close (%d)", pipe_fd[1]);
2246 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2248 /* Read each line of nm output. */
2249 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2254 /* If it contains a constructor or destructor name, add the name
2255 to the appropriate list. */
2257 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2258 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2265 /* Find the end of the symbol name.
2266 Do not include `|', because Encore nm can tack that on the end. */
2267 for (end = p; (ch2 = *end) != '\0' && !isspace (ch2) && ch2 != '|';
2273 switch (is_ctor_dtor (name))
2276 if (which_pass != PASS_LIB)
2277 add_to_list (&constructors, name);
2281 if (which_pass != PASS_LIB)
2282 add_to_list (&destructors, name);
2286 if (which_pass != PASS_LIB)
2287 fatal ("init function found in object %s", prog_name);
2288 #ifndef LD_INIT_SWITCH
2289 add_to_list (&constructors, name);
2294 if (which_pass != PASS_LIB)
2295 fatal ("fini function found in object %s", prog_name);
2296 #ifndef LD_FINI_SWITCH
2297 add_to_list (&destructors, name);
2302 if (which_pass != PASS_LIB)
2303 add_to_list (&frame_tables, name);
2305 default: /* not a constructor or destructor */
2310 fprintf (stderr, "\t%s\n", buf);
2314 fprintf (stderr, "\n");
2316 if (fclose (inf) != 0)
2317 fatal_perror ("fclose of pipe");
2319 do_wait (nm_file_name);
2321 signal (SIGINT, int_handler);
2323 signal (SIGQUIT, quit_handler);
2327 #if SUNOS4_SHARED_LIBRARIES
2329 /* Routines to scan the SunOS 4 _DYNAMIC structure to find shared libraries
2330 that the output file depends upon and their initialization/finalization
2331 routines, if any. */
2336 #include <sys/mman.h>
2337 #include <sys/param.h>
2339 #include <sys/dir.h>
2341 /* pointers to the object file */
2342 unsigned object; /* address of memory mapped file */
2343 unsigned objsize; /* size of memory mapped to file */
2344 char * code; /* pointer to code segment */
2345 char * data; /* pointer to data segment */
2346 struct nlist *symtab; /* pointer to symbol table */
2347 struct link_dynamic *ld;
2348 struct link_dynamic_2 *ld_2;
2349 struct head libraries;
2351 /* Map the file indicated by NAME into memory and store its address. */
2359 if ((fp = open (name, O_RDONLY)) == -1)
2360 fatal ("unable to open file '%s'", name);
2361 if (fstat (fp, &s) == -1)
2362 fatal ("unable to stat file '%s'", name);
2364 objsize = s.st_size;
2365 object = (unsigned) mmap (0, objsize, PROT_READ|PROT_WRITE, MAP_PRIVATE,
2368 fatal ("unable to mmap file '%s'", name);
2373 /* Helpers for locatelib. */
2375 static char *libname;
2381 return (strncmp (libname, d->d_name, strlen (libname)) == 0);
2384 /* If one file has an additional numeric extension past LIBNAME, then put
2385 that one first in the sort. If both files have additional numeric
2386 extensions, then put the one with the higher number first in the sort.
2388 We must verify that the extension is numeric, because Sun saves the
2389 original versions of patched libraries with a .FCS extension. Files with
2390 invalid extensions must go last in the sort, so that they will not be used. */
2394 struct direct **d1, **d2;
2396 int i1, i2 = strlen (libname);
2397 char *e1 = (*d1)->d_name + i2;
2398 char *e2 = (*d2)->d_name + i2;
2400 while (*e1 && *e2 && *e1 == '.' && *e2 == '.'
2401 && e1[1] && isdigit (e1[1]) && e2[1] && isdigit (e2[1]))
2405 i1 = strtol (e1, &e1, 10);
2406 i2 = strtol (e2, &e2, 10);
2413 /* It has a valid numeric extension, prefer this one. */
2414 if (*e1 == '.' && e1[1] && isdigit (e1[1]))
2416 /* It has a invalid numeric extension, must prefer the other one. */
2422 /* It has a valid numeric extension, prefer this one. */
2423 if (*e2 == '.' && e2[1] && isdigit (e2[1]))
2425 /* It has a invalid numeric extension, must prefer the other one. */
2433 /* Given the name NAME of a dynamic dependency, find its pathname and add
2434 it to the list of libraries. */
2442 char buf[MAXPATHLEN];
2450 /* counting elements in array, need 1 extra for null */
2452 ld_rules = (char *) (ld_2->ld_rules + code);
2456 for (; *ld_rules != 0; ld_rules++)
2457 if (*ld_rules == ':')
2459 ld_rules = (char *) (ld_2->ld_rules + code);
2460 ldr = (char *) malloc (strlen (ld_rules) + 1);
2461 strcpy (ldr, ld_rules);
2463 p = getenv ("LD_LIBRARY_PATH");
2468 for (q = p ; *q != 0; q++)
2471 q = (char *) malloc (strlen (p) + 1);
2474 l = (char **) malloc ((cnt + 3) * sizeof (char *));
2479 for (; *ldr != 0; ldr++)
2489 for (; *q != 0; q++)
2496 /* built in directories are /lib, /usr/lib, and /usr/local/lib */
2499 *pp++ = "/usr/local/lib";
2503 for (pp = l; *pp != 0 ; pp++)
2505 struct direct **namelist;
2507 if ((entries = scandir (*pp, &namelist, libselect, libcompare)) > 0)
2509 sprintf (buf, "%s/%s", *pp, namelist[entries - 1]->d_name);
2510 add_to_list (&libraries, buf);
2512 fprintf (stderr, "%s\n", buf);
2519 fprintf (stderr, "not found\n");
2521 fatal ("dynamic dependency %s not found", name);
2525 /* Scan the _DYNAMIC structure of the output file to find shared libraries
2526 that it depends upon and any constructors or destructors they contain. */
2529 scan_libraries (prog_name)
2532 struct exec *header;
2534 struct link_object *lo;
2535 char buff[MAXPATHLEN];
2538 mapfile (prog_name);
2539 header = (struct exec *)object;
2540 if (N_BADMAG (*header))
2541 fatal ("bad magic number in file '%s'", prog_name);
2542 if (header->a_dynamic == 0)
2545 code = (char *) (N_TXTOFF (*header) + (long) header);
2546 data = (char *) (N_DATOFF (*header) + (long) header);
2547 symtab = (struct nlist *) (N_SYMOFF (*header) + (long) header);
2549 if (header->a_magic == ZMAGIC && header->a_entry == 0x20)
2552 ld = (struct link_dynamic *) (symtab->n_value + code);
2558 ld = (struct link_dynamic *) data;
2563 fprintf (stderr, "dynamic dependencies.\n");
2565 ld_2 = (struct link_dynamic_2 *) ((long) ld->ld_un.ld_2 + (long)base);
2566 for (lo = (struct link_object *) ld_2->ld_need; lo;
2567 lo = (struct link_object *) lo->lo_next)
2570 lo = (struct link_object *) ((long) lo + code);
2571 name = (char *) (code + lo->lo_name);
2575 fprintf (stderr, "\t-l%s.%d => ", name, lo->lo_major);
2576 sprintf (buff, "lib%s.so.%d.%d", name, lo->lo_major, lo->lo_minor);
2582 fprintf (stderr, "\t%s\n", name);
2583 add_to_list (&libraries, name);
2588 fprintf (stderr, "\n");
2590 /* now iterate through the library list adding their symbols to
2592 for (list = libraries.first; list; list = list->next)
2593 scan_prog_file (list->name, PASS_LIB);
2596 #else /* SUNOS4_SHARED_LIBRARIES */
2599 /* Use the List Dynamic Dependencies program to find shared libraries that
2600 the output file depends upon and their initialization/finalization
2601 routines, if any. */
2604 scan_libraries (prog_name)
2607 static struct head libraries; /* list of shared libraries found */
2609 void (*int_handler) ();
2610 void (*quit_handler) ();
2618 /* If we do not have an `ldd', complain. */
2619 if (ldd_file_name == 0)
2621 error ("cannot find `ldd'");
2625 ldd_argv[argc++] = ldd_file_name;
2626 ldd_argv[argc++] = prog_name;
2627 ldd_argv[argc++] = (char *) 0;
2629 if (pipe (pipe_fd) < 0)
2630 fatal_perror ("pipe");
2632 inf = fdopen (pipe_fd[0], "r");
2633 if (inf == (FILE *) 0)
2634 fatal_perror ("fdopen");
2636 /* Trace if needed. */
2642 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2643 fprintf (stderr, " %s", str);
2645 fprintf (stderr, "\n");
2651 /* Spawn child ldd on pipe */
2656 fatal_perror ("fork");
2658 fatal_perror ("vfork");
2662 if (pid == 0) /* child context */
2665 if (dup2 (pipe_fd[1], 1) < 0)
2666 fatal_perror ("dup2 (%d, 1)", pipe_fd[1]);
2668 if (close (pipe_fd[0]) < 0)
2669 fatal_perror ("close (%d)", pipe_fd[0]);
2671 if (close (pipe_fd[1]) < 0)
2672 fatal_perror ("close (%d)", pipe_fd[1]);
2674 execv (ldd_file_name, ldd_argv);
2675 fatal_perror ("executing %s", ldd_file_name);
2678 /* Parent context from here on. */
2679 int_handler = (void (*) ()) signal (SIGINT, SIG_IGN);
2681 quit_handler = (void (*) ()) signal (SIGQUIT, SIG_IGN);
2684 if (close (pipe_fd[1]) < 0)
2685 fatal_perror ("close (%d)", pipe_fd[1]);
2688 fprintf (stderr, "\nldd output with constructors/destructors.\n");
2690 /* Read each line of ldd output. */
2691 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2694 char *name, *end, *p = buf;
2696 /* Extract names of libraries and add to list. */
2697 PARSE_LDD_OUTPUT (p);
2702 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2703 fatal ("dynamic dependency %s not found", buf);
2705 /* Find the end of the symbol name. */
2707 (ch2 = *end) != '\0' && ch2 != '\n' && !isspace (ch2) && ch2 != '|';
2712 if (access (name, R_OK) == 0)
2713 add_to_list (&libraries, name);
2715 fatal ("unable to open dynamic dependency '%s'", buf);
2718 fprintf (stderr, "\t%s\n", buf);
2721 fprintf (stderr, "\n");
2723 if (fclose (inf) != 0)
2724 fatal_perror ("fclose of pipe");
2726 do_wait (ldd_file_name);
2728 signal (SIGINT, int_handler);
2730 signal (SIGQUIT, quit_handler);
2733 /* now iterate through the library list adding their symbols to
2735 for (list = libraries.first; list; list = list->next)
2736 scan_prog_file (list->name, PASS_LIB);
2739 #endif /* LDD_SUFFIX */
2740 #endif /* SUNOS4_SHARED_LIBRARIES */
2742 #endif /* OBJECT_FORMAT_NONE */
2746 * COFF specific stuff.
2749 #ifdef OBJECT_FORMAT_COFF
2751 #if defined(EXTENDED_COFF)
2752 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2753 # define GCC_SYMENT SYMR
2754 # define GCC_OK_SYMBOL(X) ((X).st == stProc && (X).sc == scText)
2755 # define GCC_SYMINC(X) (1)
2756 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2757 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2759 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2760 # define GCC_SYMENT SYMENT
2761 # define GCC_OK_SYMBOL(X) \
2762 (((X).n_sclass == C_EXT) && \
2763 ((X).n_scnum > N_UNDEF) && \
2764 (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) || \
2765 ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT)))
2766 # define GCC_UNDEF_SYMBOL(X) \
2767 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2768 # define GCC_SYMINC(X) ((X).n_numaux+1)
2769 # define GCC_SYMZERO(X) 0
2770 # define GCC_CHECK_HDR(X) (1)
2773 extern char *ldgetname ();
2775 /* COFF version to scan the name list of the loaded program for
2776 the symbols g++ uses for static constructors and destructors.
2778 The constructor table begins at __CTOR_LIST__ and contains a count
2779 of the number of pointers (or -1 if the constructors are built in a
2780 separate section by the linker), followed by the pointers to the
2781 constructor functions, terminated with a null pointer. The
2782 destructor table has the same format, and begins at __DTOR_LIST__. */
2785 scan_prog_file (prog_name, which_pass)
2787 enum pass which_pass;
2789 LDFILE *ldptr = NULL;
2790 int sym_index, sym_count;
2792 #ifdef COLLECT_EXPORT_LIST
2793 /* Should we generate an import list for given prog_name? */
2794 int import_flag = (which_pass == PASS_OBJ ? 0 : use_import_list (prog_name));
2797 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2800 #ifdef COLLECT_EXPORT_LIST
2801 /* We do not need scanning for some standard C libraries. */
2802 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2805 /* On AIX we have a loop, because there is not much difference
2806 between an object and an archive. This trick allows us to
2807 eliminate scan_libraries() function. */
2811 if ((ldptr = ldopen (prog_name, ldptr)) != NULL)
2814 if (!MY_ISCOFF (HEADER (ldptr).f_magic))
2815 fatal ("%s: not a COFF file", prog_name);
2817 #ifdef COLLECT_EXPORT_LIST
2818 /* Is current archive member a shared object? */
2819 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2821 if (GCC_CHECK_HDR (ldptr))
2823 sym_count = GCC_SYMBOLS (ldptr);
2824 sym_index = GCC_SYMZERO (ldptr);
2825 while (sym_index < sym_count)
2829 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2831 sym_index += GCC_SYMINC (symbol);
2833 if (GCC_OK_SYMBOL (symbol))
2837 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2838 continue; /* should never happen */
2840 #ifdef XCOFF_DEBUGGING_INFO
2841 /* All AIX function names have a duplicate entry
2842 beginning with a dot. */
2847 switch (is_ctor_dtor (name))
2850 if (! is_shared) add_to_list (&constructors, name);
2851 #ifdef COLLECT_EXPORT_LIST
2852 if (which_pass == PASS_OBJ)
2853 add_to_list (&exports, name);
2854 /* If this symbol was undefined and we are building
2855 an import list, we should add a symbol to this
2859 && is_in_list (name, undefined.first))
2860 add_to_list (&imports, name);
2865 if (! is_shared) add_to_list (&destructors, name);
2866 #ifdef COLLECT_EXPORT_LIST
2867 if (which_pass == PASS_OBJ)
2868 add_to_list (&exports, name);
2869 /* If this symbol was undefined and we are building
2870 an import list, we should add a symbol to this
2874 && is_in_list (name, undefined.first))
2875 add_to_list (&imports, name);
2879 #ifdef COLLECT_EXPORT_LIST
2882 add_to_list (&constructors, name);
2887 add_to_list (&destructors, name);
2891 default: /* not a constructor or destructor */
2892 #ifdef COLLECT_EXPORT_LIST
2893 /* If we are building a shared object on AIX we need
2894 to explicitly export all global symbols or add
2895 them to import list. */
2897 if (which_pass == PASS_OBJ && (! export_flag))
2898 add_to_list (&exports, name);
2899 else if (! is_shared && which_pass == PASS_FIRST
2901 && is_in_list(name, undefined.first))
2902 add_to_list (&imports, name);
2907 #if !defined(EXTENDED_COFF)
2909 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
2910 symbol.n_scnum, symbol.n_sclass,
2911 (symbol.n_type ? "0" : ""), symbol.n_type,
2916 "\tiss = %5d, value = %5d, index = %5d, name = %s\n",
2917 symbol.iss, symbol.value, symbol.index, name);
2920 #ifdef COLLECT_EXPORT_LIST
2921 /* If we are building a shared object we should collect
2922 information about undefined symbols for later
2923 import list generation. */
2924 else if (shared_obj && GCC_UNDEF_SYMBOL (symbol))
2928 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2929 continue; /* should never happen */
2931 /* All AIX function names have a duplicate entry
2932 beginning with a dot. */
2935 add_to_list (&undefined, name);
2943 fatal ("%s: cannot open as COFF file", prog_name);
2945 #ifdef COLLECT_EXPORT_LIST
2946 /* On AIX loop continues while there are more members in archive. */
2948 while (ldclose (ldptr) == FAILURE);
2950 /* Otherwise we simply close ldptr. */
2951 (void) ldclose(ldptr);
2956 #ifdef COLLECT_EXPORT_LIST
2958 /* This new function is used to decide whether we should
2959 generate import list for an object or to use it directly. */
2961 use_import_list (prog_name)
2966 /* If we do not build a shared object then import list should not be used. */
2967 if (! shared_obj) return 0;
2969 /* Currently we check only for libgcc, but this can be changed in future. */
2970 p = strstr (prog_name, "libgcc.a");
2971 if (p != 0 && (strlen (p) == sizeof ("libgcc.a") - 1))
2976 /* Given a library name without "lib" prefix, this function
2977 returns a full library name including a path. */
2979 resolve_lib_name (name)
2985 for (i = 0; libpaths[i]; i++)
2986 if (libpaths[i]->max_len > l)
2987 l = libpaths[i]->max_len;
2989 lib_buf = xmalloc (l + strlen(name) + 10);
2991 for (i = 0; libpaths[i]; i++)
2993 struct prefix_list *list = libpaths[i]->plist;
2994 for (; list; list = list->next)
2996 for (j = 0; libexts[j]; j++)
2998 /* The following lines are needed because path_prefix list
2999 may contain directories both with trailing '/' and
3002 if (list->prefix[strlen(list->prefix)-1] != '/')
3004 sprintf (lib_buf, "%s%slib%s.%s",
3005 list->prefix, p, name, libexts[j]);
3006 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3007 if (file_exists (lib_buf))
3009 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3016 fprintf (stderr, "not found\n");
3018 fatal ("Library lib%s not found", name);
3022 /* Array of standard AIX libraries which should not
3023 be scanned for ctors/dtors. */
3024 static char* aix_std_libs[] = {
3029 "/usr/lib/libc_r.a",
3030 "/usr/lib/threads/libc.a",
3031 "/usr/ccs/lib/libc.a",
3032 "/usr/ccs/lib/libc_r.a",
3036 /* This function checks the filename and returns 1
3037 if this name matches the location of a standard AIX library. */
3039 ignore_library (name)
3042 char **p = &aix_std_libs[0];
3043 while (*p++ != NULL)
3044 if (! strcmp (name, *p)) return 1;
3050 #endif /* OBJECT_FORMAT_COFF */
3054 * OSF/rose specific stuff.
3057 #ifdef OBJECT_FORMAT_ROSE
3059 /* Union of the various load commands */
3061 typedef union load_union
3063 ldc_header_t hdr; /* common header */
3064 load_cmd_map_command_t map; /* map indexing other load cmds */
3065 interpreter_command_t iprtr; /* interpreter pathname */
3066 strings_command_t str; /* load commands strings section */
3067 region_command_t region; /* region load command */
3068 reloc_command_t reloc; /* relocation section */
3069 package_command_t pkg; /* package load command */
3070 symbols_command_t sym; /* symbol sections */
3071 entry_command_t ent; /* program start section */
3072 gen_info_command_t info; /* object information */
3073 func_table_command_t func; /* function constructors/destructors */
3076 /* Structure to point to load command and data section in memory. */
3078 typedef struct load_all
3080 load_union_t *load; /* load command */
3081 char *section; /* pointer to section */
3084 /* Structure to contain information about a file mapped into memory. */
3088 char *start; /* start of map */
3089 char *name; /* filename */
3090 long size; /* size of the file */
3091 long rounded_size; /* size rounded to page boundary */
3092 int fd; /* file descriptor */
3093 int rw; /* != 0 if opened read/write */
3094 int use_mmap; /* != 0 if mmap'ed */
3097 extern int decode_mach_o_hdr ();
3098 extern int encode_mach_o_hdr ();
3100 static void add_func_table PROTO((mo_header_t *, load_all_t *,
3101 symbol_info_t *, int));
3102 static void print_header PROTO((mo_header_t *));
3103 static void print_load_command PROTO((load_union_t *, size_t, int));
3104 static void bad_header PROTO((int));
3105 static struct file_info *read_file PROTO((char *, int, int));
3106 static void end_file PROTO((struct file_info *));
3108 /* OSF/rose specific version to scan the name list of the loaded
3109 program for the symbols g++ uses for static constructors and
3112 The constructor table begins at __CTOR_LIST__ and contains a count
3113 of the number of pointers (or -1 if the constructors are built in a
3114 separate section by the linker), followed by the pointers to the
3115 constructor functions, terminated with a null pointer. The
3116 destructor table has the same format, and begins at __DTOR_LIST__. */
3119 scan_prog_file (prog_name, which_pass)
3121 enum pass which_pass;
3125 load_all_t *load_array;
3126 load_all_t *load_end;
3127 load_all_t *load_cmd;
3128 int symbol_load_cmds;
3134 struct file_info *obj_file;
3136 mo_lcid_t cmd_strings = -1;
3137 symbol_info_t *main_sym = 0;
3138 int rw = (which_pass != PASS_FIRST);
3140 prog_fd = open (prog_name, (rw) ? O_RDWR : O_RDONLY);
3142 fatal_perror ("cannot read %s", prog_name);
3144 obj_file = read_file (prog_name, prog_fd, rw);
3145 obj = obj_file->start;
3147 status = decode_mach_o_hdr (obj, MO_SIZEOF_RAW_HDR, MOH_HEADER_VERSION, &hdr);
3148 if (status != MO_HDR_CONV_SUCCESS)
3149 bad_header (status);
3152 /* Do some basic sanity checks. Note we explicitly use the big endian magic number,
3153 since the hardware will automatically swap bytes for us on loading little endian
3156 #ifndef CROSS_COMPILE
3157 if (hdr.moh_magic != MOH_MAGIC_MSB
3158 || hdr.moh_header_version != MOH_HEADER_VERSION
3159 || hdr.moh_byte_order != OUR_BYTE_ORDER
3160 || hdr.moh_data_rep_id != OUR_DATA_REP_ID
3161 || hdr.moh_cpu_type != OUR_CPU_TYPE
3162 || hdr.moh_cpu_subtype != OUR_CPU_SUBTYPE
3163 || hdr.moh_vendor_type != OUR_VENDOR_TYPE)
3165 fatal ("incompatibilities between object file & expected values");
3170 print_header (&hdr);
3172 offset = hdr.moh_first_cmd_off;
3173 load_end = load_array
3174 = (load_all_t *) xcalloc (sizeof (load_all_t), hdr.moh_n_load_cmds + 2);
3176 /* Build array of load commands, calculating the offsets */
3177 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3179 load_union_t *load_hdr; /* load command header */
3181 load_cmd = load_end++;
3182 load_hdr = (load_union_t *) (obj + offset);
3184 /* If modifying the program file, copy the header. */
3187 load_union_t *ptr = (load_union_t *) xmalloc (load_hdr->hdr.ldci_cmd_size);
3188 bcopy ((char *)load_hdr, (char *)ptr, load_hdr->hdr.ldci_cmd_size);
3191 /* null out old command map, because we will rewrite at the end. */
3192 if (ptr->hdr.ldci_cmd_type == LDC_CMD_MAP)
3194 cmd_strings = ptr->map.lcm_ld_cmd_strings;
3195 ptr->hdr.ldci_cmd_type = LDC_UNDEFINED;
3199 load_cmd->load = load_hdr;
3200 if (load_hdr->hdr.ldci_section_off > 0)
3201 load_cmd->section = obj + load_hdr->hdr.ldci_section_off;
3204 print_load_command (load_hdr, offset, i);
3206 offset += load_hdr->hdr.ldci_cmd_size;
3209 /* If the last command is the load command map and is not undefined,
3210 decrement the count of load commands. */
3211 if (rw && load_end[-1].load->hdr.ldci_cmd_type == LDC_UNDEFINED)
3214 hdr.moh_n_load_cmds--;
3217 /* Go through and process each symbol table section. */
3218 symbol_load_cmds = 0;
3219 for (load_cmd = load_array; load_cmd < load_end; load_cmd++)
3221 load_union_t *load_hdr = load_cmd->load;
3223 if (load_hdr->hdr.ldci_cmd_type == LDC_SYMBOLS)
3229 char *kind = "unknown";
3231 switch (load_hdr->sym.symc_kind)
3233 case SYMC_IMPORTS: kind = "imports"; break;
3234 case SYMC_DEFINED_SYMBOLS: kind = "defined"; break;
3235 case SYMC_STABS: kind = "stabs"; break;
3238 fprintf (stderr, "\nProcessing symbol table #%d, offset = 0x%.8lx, kind = %s\n",
3239 symbol_load_cmds, load_hdr->hdr.ldci_section_off, kind);
3242 if (load_hdr->sym.symc_kind != SYMC_DEFINED_SYMBOLS)
3245 str_sect = load_array[load_hdr->sym.symc_strings_section].section;
3246 if (str_sect == (char *) 0)
3247 fatal ("string section missing");
3249 if (load_cmd->section == (char *) 0)
3250 fatal ("section pointer missing");
3252 num_syms = load_hdr->sym.symc_nentries;
3253 for (i = 0; i < num_syms; i++)
3255 symbol_info_t *sym = ((symbol_info_t *) load_cmd->section) + i;
3256 char *name = sym->si_name.symbol_name + str_sect;
3263 char *n = name + strlen (name) - strlen (NAME__MAIN);
3265 if ((n - name) < 0 || strcmp (n, NAME__MAIN))
3275 switch (is_ctor_dtor (name))
3278 add_to_list (&constructors, name);
3282 add_to_list (&destructors, name);
3285 default: /* not a constructor or destructor */
3291 fprintf (stderr, "\ttype = 0x%.4x, sc = 0x%.2x, flags = 0x%.8x, name = %.30s\n",
3292 sym->si_type, sym->si_sc_type, sym->si_flags, name);
3297 if (symbol_load_cmds == 0)
3298 fatal ("no symbol table found");
3300 /* Update the program file now, rewrite header and load commands. At present,
3301 we assume that there is enough space after the last load command to insert
3302 one more. Since the first section written out is page aligned, and the
3303 number of load commands is small, this is ok for the present. */
3307 load_union_t *load_map;
3310 if (cmd_strings == -1)
3311 fatal ("no cmd_strings found");
3313 /* Add __main to initializer list.
3314 If we are building a program instead of a shared library, do not
3315 do anything, since in the current version, you cannot do mallocs
3316 and such in the constructors. */
3318 if (main_sym != (symbol_info_t *) 0
3319 && ((hdr.moh_flags & MOH_EXECABLE_F) == 0))
3320 add_func_table (&hdr, load_array, main_sym, FNTC_INITIALIZATION);
3323 fprintf (stderr, "\nUpdating header and load commands.\n\n");
3325 hdr.moh_n_load_cmds++;
3326 size = sizeof (load_cmd_map_command_t) + (sizeof (mo_offset_t) * (hdr.moh_n_load_cmds - 1));
3328 /* Create new load command map. */
3330 fprintf (stderr, "load command map, %d cmds, new size %ld.\n",
3331 (int)hdr.moh_n_load_cmds, (long)size);
3333 load_map = (load_union_t *) xcalloc (1, size);
3334 load_map->map.ldc_header.ldci_cmd_type = LDC_CMD_MAP;
3335 load_map->map.ldc_header.ldci_cmd_size = size;
3336 load_map->map.lcm_ld_cmd_strings = cmd_strings;
3337 load_map->map.lcm_nentries = hdr.moh_n_load_cmds;
3338 load_array[hdr.moh_n_load_cmds-1].load = load_map;
3340 offset = hdr.moh_first_cmd_off;
3341 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3343 load_map->map.lcm_map[i] = offset;
3344 if (load_array[i].load->hdr.ldci_cmd_type == LDC_CMD_MAP)
3345 hdr.moh_load_map_cmd_off = offset;
3347 offset += load_array[i].load->hdr.ldci_cmd_size;
3350 hdr.moh_sizeofcmds = offset - MO_SIZEOF_RAW_HDR;
3353 print_header (&hdr);
3356 status = encode_mach_o_hdr (&hdr, obj, MO_SIZEOF_RAW_HDR);
3357 if (status != MO_HDR_CONV_SUCCESS)
3358 bad_header (status);
3361 fprintf (stderr, "writing load commands.\n\n");
3363 /* Write load commands */
3364 offset = hdr.moh_first_cmd_off;
3365 for (i = 0; i < hdr.moh_n_load_cmds; i++)
3367 load_union_t *load_hdr = load_array[i].load;
3368 size_t size = load_hdr->hdr.ldci_cmd_size;
3371 print_load_command (load_hdr, offset, i);
3373 bcopy ((char *) load_hdr, (char *) (obj + offset), size);
3378 end_file (obj_file);
3380 if (close (prog_fd))
3381 fatal_perror ("closing %s", prog_name);
3384 fprintf (stderr, "\n");
3388 /* Add a function table to the load commands to call a function
3389 on initiation or termination of the process. */
3392 add_func_table (hdr_p, load_array, sym, type)
3393 mo_header_t *hdr_p; /* pointer to global header */
3394 load_all_t *load_array; /* array of ptrs to load cmds */
3395 symbol_info_t *sym; /* pointer to symbol entry */
3396 int type; /* fntc_type value */
3398 /* Add a new load command. */
3399 int num_cmds = ++hdr_p->moh_n_load_cmds;
3400 int load_index = num_cmds - 1;
3401 size_t size = sizeof (func_table_command_t) + sizeof (mo_addr_t);
3402 load_union_t *ptr = xcalloc (1, size);
3403 load_all_t *load_cmd;
3406 /* Set the unresolved address bit in the header to force the loader to be
3407 used, since kernel exec does not call the initialization functions. */
3408 hdr_p->moh_flags |= MOH_UNRESOLVED_F;
3410 load_cmd = &load_array[load_index];
3411 load_cmd->load = ptr;
3412 load_cmd->section = (char *) 0;
3414 /* Fill in func table load command. */
3415 ptr->func.ldc_header.ldci_cmd_type = LDC_FUNC_TABLE;
3416 ptr->func.ldc_header.ldci_cmd_size = size;
3417 ptr->func.ldc_header.ldci_section_off = 0;
3418 ptr->func.ldc_header.ldci_section_len = 0;
3419 ptr->func.fntc_type = type;
3420 ptr->func.fntc_nentries = 1;
3422 /* copy address, turn it from abs. address to (region,offset) if necessary. */
3423 /* Is the symbol already expressed as (region, offset)? */
3424 if ((sym->si_flags & SI_ABSOLUTE_VALUE_F) == 0)
3426 ptr->func.fntc_entry_loc[i].adr_lcid = sym->si_value.def_val.adr_lcid;
3427 ptr->func.fntc_entry_loc[i].adr_sctoff = sym->si_value.def_val.adr_sctoff;
3430 /* If not, figure out which region it's in. */
3433 mo_vm_addr_t addr = sym->si_value.abs_val;
3436 for (i = 0; i < load_index; i++)
3438 if (load_array[i].load->hdr.ldci_cmd_type == LDC_REGION)
3440 region_command_t *region_ptr = &load_array[i].load->region;
3442 if ((region_ptr->regc_flags & REG_ABS_ADDR_F) != 0
3443 && addr >= region_ptr->regc_addr.vm_addr
3444 && addr <= region_ptr->regc_addr.vm_addr + region_ptr->regc_vm_size)
3446 ptr->func.fntc_entry_loc[0].adr_lcid = i;
3447 ptr->func.fntc_entry_loc[0].adr_sctoff = addr - region_ptr->regc_addr.vm_addr;
3455 fatal ("could not convert 0x%l.8x into a region", addr);
3460 "%s function, region %d, offset = %ld (0x%.8lx)\n",
3461 (type == FNTC_INITIALIZATION) ? "init" : "term",
3462 (int)ptr->func.fntc_entry_loc[i].adr_lcid,
3463 (long)ptr->func.fntc_entry_loc[i].adr_sctoff,
3464 (long)ptr->func.fntc_entry_loc[i].adr_sctoff);
3469 /* Print the global header for an OSF/rose object. */
3472 print_header (hdr_ptr)
3473 mo_header_t *hdr_ptr;
3475 fprintf (stderr, "\nglobal header:\n");
3476 fprintf (stderr, "\tmoh_magic = 0x%.8lx\n", hdr_ptr->moh_magic);
3477 fprintf (stderr, "\tmoh_major_version = %d\n", (int)hdr_ptr->moh_major_version);
3478 fprintf (stderr, "\tmoh_minor_version = %d\n", (int)hdr_ptr->moh_minor_version);
3479 fprintf (stderr, "\tmoh_header_version = %d\n", (int)hdr_ptr->moh_header_version);
3480 fprintf (stderr, "\tmoh_max_page_size = %d\n", (int)hdr_ptr->moh_max_page_size);
3481 fprintf (stderr, "\tmoh_byte_order = %d\n", (int)hdr_ptr->moh_byte_order);
3482 fprintf (stderr, "\tmoh_data_rep_id = %d\n", (int)hdr_ptr->moh_data_rep_id);
3483 fprintf (stderr, "\tmoh_cpu_type = %d\n", (int)hdr_ptr->moh_cpu_type);
3484 fprintf (stderr, "\tmoh_cpu_subtype = %d\n", (int)hdr_ptr->moh_cpu_subtype);
3485 fprintf (stderr, "\tmoh_vendor_type = %d\n", (int)hdr_ptr->moh_vendor_type);
3486 fprintf (stderr, "\tmoh_load_map_cmd_off = %d\n", (int)hdr_ptr->moh_load_map_cmd_off);
3487 fprintf (stderr, "\tmoh_first_cmd_off = %d\n", (int)hdr_ptr->moh_first_cmd_off);
3488 fprintf (stderr, "\tmoh_sizeofcmds = %d\n", (int)hdr_ptr->moh_sizeofcmds);
3489 fprintf (stderr, "\tmon_n_load_cmds = %d\n", (int)hdr_ptr->moh_n_load_cmds);
3490 fprintf (stderr, "\tmoh_flags = 0x%.8lx", (long)hdr_ptr->moh_flags);
3492 if (hdr_ptr->moh_flags & MOH_RELOCATABLE_F)
3493 fprintf (stderr, ", relocatable");
3495 if (hdr_ptr->moh_flags & MOH_LINKABLE_F)
3496 fprintf (stderr, ", linkable");
3498 if (hdr_ptr->moh_flags & MOH_EXECABLE_F)
3499 fprintf (stderr, ", execable");
3501 if (hdr_ptr->moh_flags & MOH_EXECUTABLE_F)
3502 fprintf (stderr, ", executable");
3504 if (hdr_ptr->moh_flags & MOH_UNRESOLVED_F)
3505 fprintf (stderr, ", unresolved");
3507 fprintf (stderr, "\n\n");
3512 /* Print a short summary of a load command. */
3515 print_load_command (load_hdr, offset, number)
3516 load_union_t *load_hdr;
3520 mo_long_t type = load_hdr->hdr.ldci_cmd_type;
3521 char *type_str = (char *) 0;
3525 case LDC_UNDEFINED: type_str = "UNDEFINED"; break;
3526 case LDC_CMD_MAP: type_str = "CMD_MAP"; break;
3527 case LDC_INTERPRETER: type_str = "INTERPRETER"; break;
3528 case LDC_STRINGS: type_str = "STRINGS"; break;
3529 case LDC_REGION: type_str = "REGION"; break;
3530 case LDC_RELOC: type_str = "RELOC"; break;
3531 case LDC_PACKAGE: type_str = "PACKAGE"; break;
3532 case LDC_SYMBOLS: type_str = "SYMBOLS"; break;
3533 case LDC_ENTRY: type_str = "ENTRY"; break;
3534 case LDC_FUNC_TABLE: type_str = "FUNC_TABLE"; break;
3535 case LDC_GEN_INFO: type_str = "GEN_INFO"; break;
3539 "cmd %2d, sz: 0x%.2lx, coff: 0x%.3lx, doff: 0x%.6lx, dlen: 0x%.6lx",
3541 (long) load_hdr->hdr.ldci_cmd_size,
3543 (long) load_hdr->hdr.ldci_section_off,
3544 (long) load_hdr->hdr.ldci_section_len);
3546 if (type_str == (char *) 0)
3547 fprintf (stderr, ", ty: unknown (%ld)\n", (long) type);
3549 else if (type != LDC_REGION)
3550 fprintf (stderr, ", ty: %s\n", type_str);
3555 switch (load_hdr->region.regc_usage_type)
3557 case REG_TEXT_T: region = ", .text"; break;
3558 case REG_DATA_T: region = ", .data"; break;
3559 case REG_BSS_T: region = ", .bss"; break;
3560 case REG_GLUE_T: region = ", .glue"; break;
3561 #if defined (REG_RDATA_T) && defined (REG_SDATA_T) && defined (REG_SBSS_T) /*mips*/
3562 case REG_RDATA_T: region = ", .rdata"; break;
3563 case REG_SDATA_T: region = ", .sdata"; break;
3564 case REG_SBSS_T: region = ", .sbss"; break;
3568 fprintf (stderr, ", ty: %s, vaddr: 0x%.8lx, vlen: 0x%.6lx%s\n",
3570 (long) load_hdr->region.regc_vm_addr,
3571 (long) load_hdr->region.regc_vm_size,
3579 /* Fatal error when {en,de}code_mach_o_header fails. */
3585 char *msg = (char *) 0;
3589 case MO_ERROR_BAD_MAGIC: msg = "bad magic number"; break;
3590 case MO_ERROR_BAD_HDR_VERS: msg = "bad header version"; break;
3591 case MO_ERROR_BAD_RAW_HDR_VERS: msg = "bad raw header version"; break;
3592 case MO_ERROR_BUF2SML: msg = "raw header buffer too small"; break;
3593 case MO_ERROR_OLD_RAW_HDR_FILE: msg = "old raw header file"; break;
3594 case MO_ERROR_UNSUPPORTED_VERS: msg = "unsupported version"; break;
3597 if (msg == (char *) 0)
3598 fatal ("unknown {de,en}code_mach_o_hdr return value %d", status);
3604 /* Read a file into a memory buffer. */
3606 static struct file_info *
3607 read_file (name, fd, rw)
3608 char *name; /* filename */
3609 int fd; /* file descriptor */
3610 int rw; /* read/write */
3612 struct stat stat_pkt;
3613 struct file_info *p = (struct file_info *) xcalloc (sizeof (struct file_info), 1);
3615 static int page_size;
3618 if (fstat (fd, &stat_pkt) < 0)
3619 fatal_perror ("fstat %s", name);
3622 p->size = stat_pkt.st_size;
3623 p->rounded_size = stat_pkt.st_size;
3629 fprintf (stderr, "mmap %s, %s\n", name, (rw) ? "read/write" : "read-only");
3632 page_size = sysconf (_SC_PAGE_SIZE);
3634 p->rounded_size = ((p->size + page_size - 1) / page_size) * page_size;
3635 p->start = mmap ((caddr_t) 0,
3636 (rw) ? p->rounded_size : p->size,
3637 (rw) ? (PROT_READ | PROT_WRITE) : PROT_READ,
3638 MAP_FILE | MAP_VARIABLE | MAP_SHARED,
3642 if (p->start != (char *) 0 && p->start != (char *) -1)
3646 #endif /* USE_MMAP */
3651 fprintf (stderr, "read %s\n", name);
3654 p->start = xmalloc (p->size);
3655 if (lseek (fd, 0L, SEEK_SET) < 0)
3656 fatal_perror ("lseek to 0 on %s", name);
3658 len = read (fd, p->start, p->size);
3660 fatal_perror ("read %s", name);
3663 fatal ("read %ld bytes, expected %ld, from %s", len, p->size, name);
3669 /* Do anything necessary to write a file back from memory. */
3673 struct file_info *ptr; /* file information block */
3681 fprintf (stderr, "msync %s\n", ptr->name);
3683 if (msync (ptr->start, ptr->rounded_size, MS_ASYNC))
3684 fatal_perror ("msync %s", ptr->name);
3688 fprintf (stderr, "munmap %s\n", ptr->name);
3690 if (munmap (ptr->start, ptr->size))
3691 fatal_perror ("munmap %s", ptr->name);
3694 #endif /* USE_MMAP */
3701 fprintf (stderr, "write %s\n", ptr->name);
3703 if (lseek (ptr->fd, 0L, SEEK_SET) < 0)
3704 fatal_perror ("lseek to 0 on %s", ptr->name);
3706 len = write (ptr->fd, ptr->start, ptr->size);
3708 fatal_perror ("write %s", ptr->name);
3710 if (len != ptr->size)
3711 fatal ("wrote %ld bytes, expected %ld, to %s", len, ptr->size, ptr->name);
3720 #endif /* OBJECT_FORMAT_ROSE */