re PR fortran/55618 (Failures with ISO_Varying_String test suite)
[gcc.git] / gcc / collect2.c
1 /* Collect static initialization info into data structures that can be
2 traversed by C++ initialization and finalization routines.
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012
5 Free Software Foundation, Inc.
6 Contributed by Chris Smith (csmith@convex.com).
7 Heavily modified by Michael Meissner (meissner@cygnus.com),
8 Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com).
9
10 This file is part of GCC.
11
12 GCC is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 3, or (at your option) any later
15 version.
16
17 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
18 WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3. If not see
24 <http://www.gnu.org/licenses/>. */
25
26
27 /* Build tables of static constructors and destructors and run ld. */
28
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include "filenames.h"
34 #include "file-find.h"
35
36 /* TARGET_64BIT may be defined to use driver specific functionality. */
37 #undef TARGET_64BIT
38 #define TARGET_64BIT TARGET_64BIT_DEFAULT
39
40 #ifndef LIBRARY_PATH_ENV
41 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
42 #endif
43
44 #define COLLECT
45
46 #include "collect2.h"
47 #include "collect2-aix.h"
48 #include "diagnostic.h"
49 #include "demangle.h"
50 #include "obstack.h"
51 #include "intl.h"
52 #include "version.h"
53 \f
54 /* On certain systems, we have code that works by scanning the object file
55 directly. But this code uses system-specific header files and library
56 functions, so turn it off in a cross-compiler. Likewise, the names of
57 the utilities are not correct for a cross-compiler; we have to hope that
58 cross-versions are in the proper directories. */
59
60 #ifdef CROSS_DIRECTORY_STRUCTURE
61 #ifndef CROSS_AIX_SUPPORT
62 #undef OBJECT_FORMAT_COFF
63 #endif
64 #undef MD_EXEC_PREFIX
65 #undef REAL_LD_FILE_NAME
66 #undef REAL_NM_FILE_NAME
67 #undef REAL_STRIP_FILE_NAME
68 #endif
69
70 /* If we cannot use a special method, use the ordinary one:
71 run nm to find what symbols are present.
72 In a cross-compiler, this means you need a cross nm,
73 but that is not quite as unpleasant as special headers. */
74
75 #if !defined (OBJECT_FORMAT_COFF)
76 #define OBJECT_FORMAT_NONE
77 #endif
78
79 #ifdef OBJECT_FORMAT_COFF
80
81 #ifndef CROSS_DIRECTORY_STRUCTURE
82 #include <a.out.h>
83 #include <ar.h>
84
85 #ifdef UMAX
86 #include <sgs.h>
87 #endif
88
89 /* Many versions of ldfcn.h define these. */
90 #ifdef FREAD
91 #undef FREAD
92 #undef FWRITE
93 #endif
94
95 #include <ldfcn.h>
96 #endif
97
98 /* Some systems have an ISCOFF macro, but others do not. In some cases
99 the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines
100 that either do not have an ISCOFF macro in /usr/include or for those
101 where it is wrong. */
102
103 #ifndef MY_ISCOFF
104 #define MY_ISCOFF(X) ISCOFF (X)
105 #endif
106
107 #endif /* OBJECT_FORMAT_COFF */
108
109 #ifdef OBJECT_FORMAT_NONE
110
111 /* Default flags to pass to nm. */
112 #ifndef NM_FLAGS
113 #define NM_FLAGS "-n"
114 #endif
115
116 #endif /* OBJECT_FORMAT_NONE */
117
118 /* Some systems use __main in a way incompatible with its use in gcc, in these
119 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
120 give the same symbol without quotes for an alternative entry point. */
121 #ifndef NAME__MAIN
122 #define NAME__MAIN "__main"
123 #endif
124
125 /* This must match tree.h. */
126 #define DEFAULT_INIT_PRIORITY 65535
127
128 #ifndef COLLECT_SHARED_INIT_FUNC
129 #define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
130 fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
131 #endif
132 #ifndef COLLECT_SHARED_FINI_FUNC
133 #define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
134 fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
135 #endif
136
137 #ifdef LDD_SUFFIX
138 #define SCAN_LIBRARIES
139 #endif
140
141 #ifndef SHLIB_SUFFIX
142 #define SHLIB_SUFFIX ".so"
143 #endif
144
145 #ifdef USE_COLLECT2
146 int do_collecting = 1;
147 #else
148 int do_collecting = 0;
149 #endif
150
151 /* Cook up an always defined indication of whether we proceed the
152 "EXPORT_LIST" way. */
153
154 #ifdef COLLECT_EXPORT_LIST
155 #define DO_COLLECT_EXPORT_LIST 1
156 #else
157 #define DO_COLLECT_EXPORT_LIST 0
158 #endif
159
160 /* Nonzero if we should suppress the automatic demangling of identifiers
161 in linker error messages. Set from COLLECT_NO_DEMANGLE. */
162 int no_demangle;
163 \f
164 /* Linked lists of constructor and destructor names. */
165
166 struct id
167 {
168 struct id *next;
169 int sequence;
170 char name[1];
171 };
172
173 struct head
174 {
175 struct id *first;
176 struct id *last;
177 int number;
178 };
179
180 bool vflag; /* true if -v or --version */
181 static int rflag; /* true if -r */
182 static int strip_flag; /* true if -s */
183 #ifdef COLLECT_EXPORT_LIST
184 static int export_flag; /* true if -bE */
185 static int aix64_flag; /* true if -b64 */
186 static int aixrtl_flag; /* true if -brtl */
187 #endif
188
189 enum lto_mode_d {
190 LTO_MODE_NONE, /* Not doing LTO. */
191 LTO_MODE_LTO, /* Normal LTO. */
192 LTO_MODE_WHOPR /* WHOPR. */
193 };
194
195 /* Current LTO mode. */
196 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
197
198 bool debug; /* true if -debug */
199 bool helpflag; /* true if --help */
200
201 static int shared_obj; /* true if -shared */
202
203 static const char *c_file; /* <xxx>.c for constructor/destructor list. */
204 static const char *o_file; /* <xxx>.o for constructor/destructor list. */
205 #ifdef COLLECT_EXPORT_LIST
206 static const char *export_file; /* <xxx>.x for AIX export list. */
207 #endif
208 static char **lto_o_files; /* Output files for LTO. */
209 const char *ldout; /* File for ld stdout. */
210 const char *lderrout; /* File for ld stderr. */
211 static const char *output_file; /* Output file for ld. */
212 static const char *nm_file_name; /* pathname of nm */
213 #ifdef LDD_SUFFIX
214 static const char *ldd_file_name; /* pathname of ldd (or equivalent) */
215 #endif
216 static const char *strip_file_name; /* pathname of strip */
217 const char *c_file_name; /* pathname of gcc */
218 static char *initname, *fininame; /* names of init and fini funcs */
219
220 static struct head constructors; /* list of constructors found */
221 static struct head destructors; /* list of destructors found */
222 #ifdef COLLECT_EXPORT_LIST
223 static struct head exports; /* list of exported symbols */
224 #endif
225 static struct head frame_tables; /* list of frame unwind info tables */
226
227 static bool at_file_supplied; /* Whether to use @file arguments */
228 static char *response_file; /* Name of any current response file */
229
230 struct obstack temporary_obstack;
231 char * temporary_firstobj;
232
233 /* A string that must be prepended to a target OS path in order to find
234 it on the host system. */
235 #ifdef TARGET_SYSTEM_ROOT
236 static const char *target_system_root = TARGET_SYSTEM_ROOT;
237 #else
238 static const char *target_system_root = "";
239 #endif
240
241 /* Whether we may unlink the output file, which should be set as soon as we
242 know we have successfully produced it. This is typically useful to prevent
243 blindly attempting to unlink a read-only output that the target linker
244 would leave untouched. */
245 bool may_unlink_output_file = false;
246
247 #ifdef COLLECT_EXPORT_LIST
248 /* Lists to keep libraries to be scanned for global constructors/destructors. */
249 static struct head libs; /* list of libraries */
250 static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */
251 static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */
252 static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs,
253 &libpath_lib_dirs, NULL};
254 #endif
255
256 /* List of names of object files containing LTO information.
257 These are a subset of the object file names appearing on the
258 command line, and must be identical, in the sense of pointer
259 equality, with the names passed to maybe_run_lto_and_relink(). */
260
261 struct lto_object
262 {
263 const char *name; /* Name of object file. */
264 struct lto_object *next; /* Next in linked list. */
265 };
266
267 struct lto_object_list
268 {
269 struct lto_object *first; /* First list element. */
270 struct lto_object *last; /* Last list element. */
271 };
272
273 static struct lto_object_list lto_objects;
274
275 /* Special kinds of symbols that a name may denote. */
276
277 typedef enum {
278 SYM_REGULAR = 0, /* nothing special */
279
280 SYM_CTOR = 1, /* constructor */
281 SYM_DTOR = 2, /* destructor */
282 SYM_INIT = 3, /* shared object routine that calls all the ctors */
283 SYM_FINI = 4, /* shared object routine that calls all the dtors */
284 SYM_DWEH = 5 /* DWARF exception handling table */
285 } symkind;
286
287 static symkind is_ctor_dtor (const char *);
288
289 static void handler (int);
290 static void do_wait (const char *, struct pex_obj *);
291 static void fork_execute (const char *, char **);
292 static void maybe_unlink (const char *);
293 static void maybe_unlink_list (char **);
294 static void add_to_list (struct head *, const char *);
295 static int extract_init_priority (const char *);
296 static void sort_ids (struct head *);
297 static void write_list (FILE *, const char *, struct id *);
298 #ifdef COLLECT_EXPORT_LIST
299 static void dump_list (FILE *, const char *, struct id *);
300 #endif
301 #if 0
302 static void dump_prefix_list (FILE *, const char *, struct prefix_list *);
303 #endif
304 static void write_list_with_asm (FILE *, const char *, struct id *);
305 static void write_c_file (FILE *, const char *);
306 static void write_c_file_stat (FILE *, const char *);
307 #ifndef LD_INIT_SWITCH
308 static void write_c_file_glob (FILE *, const char *);
309 #endif
310 #ifdef SCAN_LIBRARIES
311 static void scan_libraries (const char *);
312 #endif
313 #ifdef COLLECT_EXPORT_LIST
314 #if 0
315 static int is_in_list (const char *, struct id *);
316 #endif
317 static void write_aix_file (FILE *, struct id *);
318 static char *resolve_lib_name (const char *);
319 #endif
320 static char *extract_string (const char **);
321 static void post_ld_pass (bool);
322 static void process_args (int *argcp, char **argv);
323
324 /* Enumerations describing which pass this is for scanning the
325 program file ... */
326
327 typedef enum {
328 PASS_FIRST, /* without constructors */
329 PASS_OBJ, /* individual objects */
330 PASS_LIB, /* looking for shared libraries */
331 PASS_SECOND, /* with constructors linked in */
332 PASS_LTOINFO /* looking for objects with LTO info */
333 } scanpass;
334
335 /* ... and which kinds of symbols are to be considered. */
336
337 enum scanfilter_masks {
338 SCAN_NOTHING = 0,
339
340 SCAN_CTOR = 1 << SYM_CTOR,
341 SCAN_DTOR = 1 << SYM_DTOR,
342 SCAN_INIT = 1 << SYM_INIT,
343 SCAN_FINI = 1 << SYM_FINI,
344 SCAN_DWEH = 1 << SYM_DWEH,
345 SCAN_ALL = ~0
346 };
347
348 /* This type is used for parameters and variables which hold
349 combinations of the flags in enum scanfilter_masks. */
350 typedef int scanfilter;
351
352 /* Scan the name list of the loaded program for the symbols g++ uses for
353 static constructors and destructors.
354
355 The SCANPASS argument tells which collect processing pass this is for and
356 the SCANFILTER argument tells which kinds of symbols to consider in this
357 pass. Symbols of a special kind not in the filter mask are considered as
358 regular ones.
359
360 The constructor table begins at __CTOR_LIST__ and contains a count of the
361 number of pointers (or -1 if the constructors are built in a separate
362 section by the linker), followed by the pointers to the constructor
363 functions, terminated with a null pointer. The destructor table has the
364 same format, and begins at __DTOR_LIST__. */
365
366 static void scan_prog_file (const char *, scanpass, scanfilter);
367
368 \f
369 /* Delete tempfiles and exit function. */
370
371 void
372 collect_exit (int status)
373 {
374 if (c_file != 0 && c_file[0])
375 maybe_unlink (c_file);
376
377 if (o_file != 0 && o_file[0])
378 maybe_unlink (o_file);
379
380 #ifdef COLLECT_EXPORT_LIST
381 if (export_file != 0 && export_file[0])
382 maybe_unlink (export_file);
383 #endif
384
385 if (lto_o_files)
386 maybe_unlink_list (lto_o_files);
387
388 if (ldout != 0 && ldout[0])
389 {
390 dump_ld_file (ldout, stdout);
391 maybe_unlink (ldout);
392 }
393
394 if (lderrout != 0 && lderrout[0])
395 {
396 dump_ld_file (lderrout, stderr);
397 maybe_unlink (lderrout);
398 }
399
400 if (status != 0 && output_file != 0 && output_file[0])
401 maybe_unlink (output_file);
402
403 if (response_file)
404 maybe_unlink (response_file);
405
406 exit (status);
407 }
408
409 \f
410 /* Notify user of a non-error. */
411 void
412 notice (const char *cmsgid, ...)
413 {
414 va_list ap;
415
416 va_start (ap, cmsgid);
417 vfprintf (stderr, _(cmsgid), ap);
418 va_end (ap);
419 }
420
421 /* Notify user of a non-error, without translating the format string. */
422 void
423 notice_translated (const char *cmsgid, ...)
424 {
425 va_list ap;
426
427 va_start (ap, cmsgid);
428 vfprintf (stderr, cmsgid, ap);
429 va_end (ap);
430 }
431 \f
432 static void
433 handler (int signo)
434 {
435 if (c_file != 0 && c_file[0])
436 maybe_unlink (c_file);
437
438 if (o_file != 0 && o_file[0])
439 maybe_unlink (o_file);
440
441 if (ldout != 0 && ldout[0])
442 maybe_unlink (ldout);
443
444 if (lderrout != 0 && lderrout[0])
445 maybe_unlink (lderrout);
446
447 #ifdef COLLECT_EXPORT_LIST
448 if (export_file != 0 && export_file[0])
449 maybe_unlink (export_file);
450 #endif
451
452 if (lto_o_files)
453 maybe_unlink_list (lto_o_files);
454
455 if (response_file)
456 maybe_unlink (response_file);
457
458 signal (signo, SIG_DFL);
459 raise (signo);
460 }
461
462 \f
463 int
464 file_exists (const char *name)
465 {
466 return access (name, R_OK) == 0;
467 }
468
469 /* Parse a reasonable subset of shell quoting syntax. */
470
471 static char *
472 extract_string (const char **pp)
473 {
474 const char *p = *pp;
475 int backquote = 0;
476 int inside = 0;
477
478 for (;;)
479 {
480 char c = *p;
481 if (c == '\0')
482 break;
483 ++p;
484 if (backquote)
485 obstack_1grow (&temporary_obstack, c);
486 else if (! inside && c == ' ')
487 break;
488 else if (! inside && c == '\\')
489 backquote = 1;
490 else if (c == '\'')
491 inside = !inside;
492 else
493 obstack_1grow (&temporary_obstack, c);
494 }
495
496 obstack_1grow (&temporary_obstack, '\0');
497 *pp = p;
498 return XOBFINISH (&temporary_obstack, char *);
499 }
500 \f
501 void
502 dump_ld_file (const char *name, FILE *to)
503 {
504 FILE *stream = fopen (name, "r");
505
506 if (stream == 0)
507 return;
508 while (1)
509 {
510 int c;
511 while (c = getc (stream),
512 c != EOF && (ISIDNUM (c) || c == '$' || c == '.'))
513 obstack_1grow (&temporary_obstack, c);
514 if (obstack_object_size (&temporary_obstack) > 0)
515 {
516 const char *word, *p;
517 char *result;
518 obstack_1grow (&temporary_obstack, '\0');
519 word = XOBFINISH (&temporary_obstack, const char *);
520
521 if (*word == '.')
522 ++word, putc ('.', to);
523 p = word;
524 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
525 p += strlen (USER_LABEL_PREFIX);
526
527 #ifdef HAVE_LD_DEMANGLE
528 result = 0;
529 #else
530 if (no_demangle)
531 result = 0;
532 else
533 result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
534 #endif
535
536 if (result)
537 {
538 int diff;
539 fputs (result, to);
540
541 diff = strlen (word) - strlen (result);
542 while (diff > 0 && c == ' ')
543 --diff, putc (' ', to);
544 if (diff < 0 && c == ' ')
545 {
546 while (diff < 0 && c == ' ')
547 ++diff, c = getc (stream);
548 if (!ISSPACE (c))
549 {
550 /* Make sure we output at least one space, or
551 the demangled symbol name will run into
552 whatever text follows. */
553 putc (' ', to);
554 }
555 }
556
557 free (result);
558 }
559 else
560 fputs (word, to);
561
562 fflush (to);
563 obstack_free (&temporary_obstack, temporary_firstobj);
564 }
565 if (c == EOF)
566 break;
567 putc (c, to);
568 }
569 fclose (stream);
570 }
571 \f
572 /* Return the kind of symbol denoted by name S. */
573
574 static symkind
575 is_ctor_dtor (const char *s)
576 {
577 struct names { const char *const name; const int len; symkind ret;
578 const int two_underscores; };
579
580 const struct names *p;
581 int ch;
582 const char *orig_s = s;
583
584 static const struct names special[] = {
585 #ifndef NO_DOLLAR_IN_LABEL
586 { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 },
587 { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 },
588 #else
589 #ifndef NO_DOT_IN_LABEL
590 { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 },
591 { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 },
592 #endif /* NO_DOT_IN_LABEL */
593 #endif /* NO_DOLLAR_IN_LABEL */
594 { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 },
595 { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 },
596 { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 },
597 { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 },
598 { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 },
599 { NULL, 0, SYM_REGULAR, 0 }
600 };
601
602 while ((ch = *s) == '_')
603 ++s;
604
605 if (s == orig_s)
606 return SYM_REGULAR;
607
608 for (p = &special[0]; p->len > 0; p++)
609 {
610 if (ch == p->name[0]
611 && (!p->two_underscores || ((s - orig_s) >= 2))
612 && strncmp(s, p->name, p->len) == 0)
613 {
614 return p->ret;
615 }
616 }
617 return SYM_REGULAR;
618 }
619 \f
620 /* We maintain two prefix lists: one from COMPILER_PATH environment variable
621 and one from the PATH variable. */
622
623 static struct path_prefix cpath, path;
624
625 #ifdef CROSS_DIRECTORY_STRUCTURE
626 /* This is the name of the target machine. We use it to form the name
627 of the files to execute. */
628
629 static const char *const target_machine = TARGET_MACHINE;
630 #endif
631
632 /* Search for NAME using prefix list PPREFIX. We only look for executable
633 files.
634
635 Return 0 if not found, otherwise return its name, allocated with malloc. */
636
637 #ifdef OBJECT_FORMAT_NONE
638
639 /* Add an entry for the object file NAME to object file list LIST.
640 New entries are added at the end of the list. The original pointer
641 value of NAME is preserved, i.e., no string copy is performed. */
642
643 static void
644 add_lto_object (struct lto_object_list *list, const char *name)
645 {
646 struct lto_object *n = XNEW (struct lto_object);
647 n->name = name;
648 n->next = NULL;
649
650 if (list->last)
651 list->last->next = n;
652 else
653 list->first = n;
654
655 list->last = n;
656 }
657 #endif /* OBJECT_FORMAT_NONE */
658
659
660 /* Perform a link-time recompilation and relink if any of the object
661 files contain LTO info. The linker command line LTO_LD_ARGV
662 represents the linker command that would produce a final executable
663 without the use of LTO. OBJECT_LST is a vector of object file names
664 appearing in LTO_LD_ARGV that are to be considered for link-time
665 recompilation, where OBJECT is a pointer to the last valid element.
666 (This awkward convention avoids an impedance mismatch with the
667 usage of similarly-named variables in main().) The elements of
668 OBJECT_LST must be identical, i.e., pointer equal, to the
669 corresponding arguments in LTO_LD_ARGV.
670
671 Upon entry, at least one linker run has been performed without the
672 use of any LTO info that might be present. Any recompilations
673 necessary for template instantiations have been performed, and
674 initializer/finalizer tables have been created if needed and
675 included in the linker command line LTO_LD_ARGV. If any of the
676 object files contain LTO info, we run the LTO back end on all such
677 files, and perform the final link with the LTO back end output
678 substituted for the LTO-optimized files. In some cases, a final
679 link with all link-time generated code has already been performed,
680 so there is no need to relink if no LTO info is found. In other
681 cases, our caller has not produced the final executable, and is
682 relying on us to perform the required link whether LTO info is
683 present or not. In that case, the FORCE argument should be true.
684 Note that the linker command line argument LTO_LD_ARGV passed into
685 this function may be modified in place. */
686
687 static void
688 maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst,
689 const char **object, bool force)
690 {
691 const char **object_file = CONST_CAST2 (const char **, char **, object_lst);
692
693 int num_lto_c_args = 1; /* Allow space for the terminating NULL. */
694
695 while (object_file < object)
696 {
697 /* If file contains LTO info, add it to the list of LTO objects. */
698 scan_prog_file (*object_file++, PASS_LTOINFO, SCAN_ALL);
699
700 /* Increment the argument count by the number of object file arguments
701 we will add. An upper bound suffices, so just count all of the
702 object files regardless of whether they contain LTO info. */
703 num_lto_c_args++;
704 }
705
706 if (lto_objects.first)
707 {
708 char **lto_c_argv;
709 const char **lto_c_ptr;
710 char **p;
711 char **lto_o_ptr;
712 struct lto_object *list;
713 char *lto_wrapper = getenv ("COLLECT_LTO_WRAPPER");
714 struct pex_obj *pex;
715 const char *prog = "lto-wrapper";
716 int lto_ld_argv_size = 0;
717 char **out_lto_ld_argv;
718 int out_lto_ld_argv_size;
719 size_t num_files;
720
721 if (!lto_wrapper)
722 fatal_error ("COLLECT_LTO_WRAPPER must be set");
723
724 num_lto_c_args++;
725
726 /* There is at least one object file containing LTO info,
727 so we need to run the LTO back end and relink.
728
729 To do so we build updated ld arguments with first
730 LTO object replaced by all partitions and other LTO
731 objects removed. */
732
733 lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args);
734 lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv);
735
736 *lto_c_ptr++ = lto_wrapper;
737
738 /* Add LTO objects to the wrapper command line. */
739 for (list = lto_objects.first; list; list = list->next)
740 *lto_c_ptr++ = list->name;
741
742 *lto_c_ptr = NULL;
743
744 /* Run the LTO back end. */
745 pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH);
746 {
747 int c;
748 FILE *stream;
749 size_t i;
750 char *start, *end;
751
752 stream = pex_read_output (pex, 0);
753 gcc_assert (stream);
754
755 num_files = 0;
756 while ((c = getc (stream)) != EOF)
757 {
758 obstack_1grow (&temporary_obstack, c);
759 if (c == '\n')
760 ++num_files;
761 }
762
763 lto_o_files = XNEWVEC (char *, num_files + 1);
764 lto_o_files[num_files] = NULL;
765 start = XOBFINISH (&temporary_obstack, char *);
766 for (i = 0; i < num_files; ++i)
767 {
768 end = start;
769 while (*end != '\n')
770 ++end;
771 *end = '\0';
772
773 lto_o_files[i] = xstrdup (start);
774
775 start = end + 1;
776 }
777
778 obstack_free (&temporary_obstack, temporary_firstobj);
779 }
780 do_wait (prog, pex);
781 pex = NULL;
782
783 /* Compute memory needed for new LD arguments. At most number of original arguemtns
784 plus number of partitions. */
785 for (lto_ld_argv_size = 0; lto_ld_argv[lto_ld_argv_size]; lto_ld_argv_size++)
786 ;
787 out_lto_ld_argv = XCNEWVEC(char *, num_files + lto_ld_argv_size + 1);
788 out_lto_ld_argv_size = 0;
789
790 /* After running the LTO back end, we will relink, substituting
791 the LTO output for the object files that we submitted to the
792 LTO. Here, we modify the linker command line for the relink. */
793
794 /* Copy all arguments until we find first LTO file. */
795 p = lto_ld_argv;
796 while (*p != NULL)
797 {
798 for (list = lto_objects.first; list; list = list->next)
799 if (*p == list->name) /* Note test for pointer equality! */
800 break;
801 if (list)
802 break;
803 out_lto_ld_argv[out_lto_ld_argv_size++] = *p++;
804 }
805
806 /* Now insert all LTO partitions. */
807 lto_o_ptr = lto_o_files;
808 while (*lto_o_ptr)
809 out_lto_ld_argv[out_lto_ld_argv_size++] = *lto_o_ptr++;
810
811 /* ... and copy the rest. */
812 while (*p != NULL)
813 {
814 for (list = lto_objects.first; list; list = list->next)
815 if (*p == list->name) /* Note test for pointer equality! */
816 break;
817 if (!list)
818 out_lto_ld_argv[out_lto_ld_argv_size++] = *p;
819 p++;
820 }
821 out_lto_ld_argv[out_lto_ld_argv_size++] = 0;
822
823 /* Run the linker again, this time replacing the object files
824 optimized by the LTO with the temporary file generated by the LTO. */
825 fork_execute ("ld", out_lto_ld_argv);
826 post_ld_pass (true);
827 free (lto_ld_argv);
828
829 maybe_unlink_list (lto_o_files);
830 }
831 else if (force)
832 {
833 /* Our caller is relying on us to do the link
834 even though there is no LTO back end work to be done. */
835 fork_execute ("ld", lto_ld_argv);
836 post_ld_pass (false);
837 }
838 }
839 \f
840 /* Main program. */
841
842 int
843 main (int argc, char **argv)
844 {
845 enum linker_select
846 {
847 USE_DEFAULT_LD,
848 USE_PLUGIN_LD,
849 USE_GOLD_LD,
850 USE_BFD_LD,
851 USE_LD_MAX
852 } selected_linker = USE_DEFAULT_LD;
853 static const char *const ld_suffixes[USE_LD_MAX] =
854 {
855 "ld",
856 PLUGIN_LD_SUFFIX,
857 "ld.gold",
858 "ld.bfd"
859 };
860 static const char *const real_ld_suffix = "real-ld";
861 static const char *const collect_ld_suffix = "collect-ld";
862 static const char *const nm_suffix = "nm";
863 static const char *const gnm_suffix = "gnm";
864 #ifdef LDD_SUFFIX
865 static const char *const ldd_suffix = LDD_SUFFIX;
866 #endif
867 static const char *const strip_suffix = "strip";
868 static const char *const gstrip_suffix = "gstrip";
869
870 const char *full_ld_suffixes[USE_LD_MAX];
871 #ifdef CROSS_DIRECTORY_STRUCTURE
872 /* If we look for a program in the compiler directories, we just use
873 the short name, since these directories are already system-specific.
874 But it we look for a program in the system directories, we need to
875 qualify the program name with the target machine. */
876
877 const char *const full_nm_suffix =
878 concat (target_machine, "-", nm_suffix, NULL);
879 const char *const full_gnm_suffix =
880 concat (target_machine, "-", gnm_suffix, NULL);
881 #ifdef LDD_SUFFIX
882 const char *const full_ldd_suffix =
883 concat (target_machine, "-", ldd_suffix, NULL);
884 #endif
885 const char *const full_strip_suffix =
886 concat (target_machine, "-", strip_suffix, NULL);
887 const char *const full_gstrip_suffix =
888 concat (target_machine, "-", gstrip_suffix, NULL);
889 #else
890 #ifdef LDD_SUFFIX
891 const char *const full_ldd_suffix = ldd_suffix;
892 #endif
893 const char *const full_nm_suffix = nm_suffix;
894 const char *const full_gnm_suffix = gnm_suffix;
895 const char *const full_strip_suffix = strip_suffix;
896 const char *const full_gstrip_suffix = gstrip_suffix;
897 #endif /* CROSS_DIRECTORY_STRUCTURE */
898
899 const char *arg;
900 FILE *outf;
901 #ifdef COLLECT_EXPORT_LIST
902 FILE *exportf;
903 #endif
904 const char *ld_file_name;
905 const char *p;
906 char **c_argv;
907 const char **c_ptr;
908 char **ld1_argv;
909 const char **ld1;
910 bool use_plugin = false;
911 bool use_collect_ld = false;
912
913 /* The kinds of symbols we will have to consider when scanning the
914 outcome of a first pass link. This is ALL to start with, then might
915 be adjusted before getting to the first pass link per se, typically on
916 AIX where we perform an early scan of objects and libraries to fetch
917 the list of global ctors/dtors and make sure they are not garbage
918 collected. */
919 scanfilter ld1_filter = SCAN_ALL;
920
921 char **ld2_argv;
922 const char **ld2;
923 char **object_lst;
924 const char **object;
925 #ifdef TARGET_AIX_VERSION
926 int object_nbr = argc;
927 #endif
928 int first_file;
929 int num_c_args;
930 char **old_argv;
931 int i;
932
933 for (i = 0; i < USE_LD_MAX; i++)
934 full_ld_suffixes[i]
935 #ifdef CROSS_DIRECTORY_STRUCTURE
936 = concat (target_machine, "-", ld_suffixes[i], NULL);
937 #else
938 = ld_suffixes[i];
939 #endif
940
941 p = argv[0] + strlen (argv[0]);
942 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
943 --p;
944 progname = p;
945
946 xmalloc_set_program_name (progname);
947
948 old_argv = argv;
949 expandargv (&argc, &argv);
950 if (argv != old_argv)
951 at_file_supplied = 1;
952
953 process_args (&argc, argv);
954
955 num_c_args = argc + 9;
956
957 #ifndef HAVE_LD_DEMANGLE
958 no_demangle = !! getenv ("COLLECT_NO_DEMANGLE");
959
960 /* Suppress demangling by the real linker, which may be broken. */
961 putenv (xstrdup ("COLLECT_NO_DEMANGLE=1"));
962 #endif
963
964 #if defined (COLLECT2_HOST_INITIALIZATION)
965 /* Perform system dependent initialization, if necessary. */
966 COLLECT2_HOST_INITIALIZATION;
967 #endif
968
969 #ifdef SIGCHLD
970 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
971 receive the signal. A different setting is inheritable */
972 signal (SIGCHLD, SIG_DFL);
973 #endif
974
975 /* Unlock the stdio streams. */
976 unlock_std_streams ();
977
978 gcc_init_libintl ();
979
980 diagnostic_initialize (global_dc, 0);
981
982 /* Do not invoke xcalloc before this point, since locale needs to be
983 set first, in case a diagnostic is issued. */
984
985 ld1_argv = XCNEWVEC (char *, argc + 4);
986 ld1 = CONST_CAST2 (const char **, char **, ld1_argv);
987 ld2_argv = XCNEWVEC (char *, argc + 11);
988 ld2 = CONST_CAST2 (const char **, char **, ld2_argv);
989 object_lst = XCNEWVEC (char *, argc);
990 object = CONST_CAST2 (const char **, char **, object_lst);
991
992 #ifdef DEBUG
993 debug = 1;
994 #endif
995
996 /* Parse command line early for instances of -debug. This allows
997 the debug flag to be set before functions like find_a_file()
998 are called. We also look for the -flto or -flto-partition=none flag to know
999 what LTO mode we are in. */
1000 {
1001 bool no_partition = false;
1002
1003 for (i = 1; argv[i] != NULL; i ++)
1004 {
1005 if (! strcmp (argv[i], "-debug"))
1006 debug = true;
1007 else if (! strcmp (argv[i], "-flto-partition=none"))
1008 no_partition = true;
1009 else if ((! strncmp (argv[i], "-flto=", 6)
1010 || ! strcmp (argv[i], "-flto")) && ! use_plugin)
1011 lto_mode = LTO_MODE_WHOPR;
1012 else if (!strncmp (argv[i], "-fno-lto", 8))
1013 lto_mode = LTO_MODE_NONE;
1014 else if (! strcmp (argv[i], "-plugin"))
1015 {
1016 use_plugin = true;
1017 lto_mode = LTO_MODE_NONE;
1018 if (selected_linker == USE_DEFAULT_LD)
1019 selected_linker = USE_PLUGIN_LD;
1020 }
1021 else if (strcmp (argv[i], "-fuse-ld=bfd") == 0)
1022 selected_linker = USE_BFD_LD;
1023 else if (strcmp (argv[i], "-fuse-ld=gold") == 0)
1024 selected_linker = USE_GOLD_LD;
1025
1026 #ifdef COLLECT_EXPORT_LIST
1027 /* since -brtl, -bexport, -b64 are not position dependent
1028 also check for them here */
1029 if ((argv[i][0] == '-') && (argv[i][1] == 'b'))
1030 {
1031 arg = argv[i];
1032 /* We want to disable automatic exports on AIX when user
1033 explicitly puts an export list in command line */
1034 if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
1035 export_flag = 1;
1036 else if (arg[2] == '6' && arg[3] == '4')
1037 aix64_flag = 1;
1038 else if (arg[2] == 'r' && arg[3] == 't' && arg[4] == 'l')
1039 aixrtl_flag = 1;
1040 }
1041 #endif
1042 }
1043 vflag = debug;
1044 find_file_set_debug (debug);
1045 if (no_partition && lto_mode == LTO_MODE_WHOPR)
1046 lto_mode = LTO_MODE_LTO;
1047 }
1048
1049 #ifndef DEFAULT_A_OUT_NAME
1050 output_file = "a.out";
1051 #else
1052 output_file = DEFAULT_A_OUT_NAME;
1053 #endif
1054
1055 obstack_begin (&temporary_obstack, 0);
1056 temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0);
1057
1058 #ifndef HAVE_LD_DEMANGLE
1059 current_demangling_style = auto_demangling;
1060 #endif
1061 p = getenv ("COLLECT_GCC_OPTIONS");
1062 while (p && *p)
1063 {
1064 const char *q = extract_string (&p);
1065 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1066 num_c_args++;
1067 }
1068 obstack_free (&temporary_obstack, temporary_firstobj);
1069
1070 /* -fno-profile-arcs -fno-test-coverage -fno-branch-probabilities
1071 -fno-exceptions -w -fno-whole-program */
1072 num_c_args += 6;
1073
1074 c_argv = XCNEWVEC (char *, num_c_args);
1075 c_ptr = CONST_CAST2 (const char **, char **, c_argv);
1076
1077 if (argc < 2)
1078 fatal_error ("no arguments");
1079
1080 #ifdef SIGQUIT
1081 if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1082 signal (SIGQUIT, handler);
1083 #endif
1084 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1085 signal (SIGINT, handler);
1086 #ifdef SIGALRM
1087 if (signal (SIGALRM, SIG_IGN) != SIG_IGN)
1088 signal (SIGALRM, handler);
1089 #endif
1090 #ifdef SIGHUP
1091 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1092 signal (SIGHUP, handler);
1093 #endif
1094 if (signal (SIGSEGV, SIG_IGN) != SIG_IGN)
1095 signal (SIGSEGV, handler);
1096 #ifdef SIGBUS
1097 if (signal (SIGBUS, SIG_IGN) != SIG_IGN)
1098 signal (SIGBUS, handler);
1099 #endif
1100
1101 /* Extract COMPILER_PATH and PATH into our prefix list. */
1102 prefix_from_env ("COMPILER_PATH", &cpath);
1103 prefix_from_env ("PATH", &path);
1104
1105 /* Try to discover a valid linker/nm/strip to use. */
1106
1107 /* Maybe we know the right file to use (if not cross). */
1108 ld_file_name = 0;
1109 #ifdef DEFAULT_LINKER
1110 if (access (DEFAULT_LINKER, X_OK) == 0)
1111 ld_file_name = DEFAULT_LINKER;
1112 if (ld_file_name == 0)
1113 #endif
1114 #ifdef REAL_LD_FILE_NAME
1115 ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
1116 if (ld_file_name == 0)
1117 #endif
1118 /* Search the (target-specific) compiler dirs for ld'. */
1119 ld_file_name = find_a_file (&cpath, real_ld_suffix);
1120 /* Likewise for `collect-ld'. */
1121 if (ld_file_name == 0)
1122 {
1123 ld_file_name = find_a_file (&cpath, collect_ld_suffix);
1124 use_collect_ld = ld_file_name != 0;
1125 }
1126 /* Search the compiler directories for `ld'. We have protection against
1127 recursive calls in find_a_file. */
1128 if (ld_file_name == 0)
1129 ld_file_name = find_a_file (&cpath, ld_suffixes[selected_linker]);
1130 /* Search the ordinary system bin directories
1131 for `ld' (if native linking) or `TARGET-ld' (if cross). */
1132 if (ld_file_name == 0)
1133 ld_file_name = find_a_file (&path, full_ld_suffixes[selected_linker]);
1134
1135 #ifdef REAL_NM_FILE_NAME
1136 nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
1137 if (nm_file_name == 0)
1138 #endif
1139 nm_file_name = find_a_file (&cpath, gnm_suffix);
1140 if (nm_file_name == 0)
1141 nm_file_name = find_a_file (&path, full_gnm_suffix);
1142 if (nm_file_name == 0)
1143 nm_file_name = find_a_file (&cpath, nm_suffix);
1144 if (nm_file_name == 0)
1145 nm_file_name = find_a_file (&path, full_nm_suffix);
1146
1147 #ifdef LDD_SUFFIX
1148 ldd_file_name = find_a_file (&cpath, ldd_suffix);
1149 if (ldd_file_name == 0)
1150 ldd_file_name = find_a_file (&path, full_ldd_suffix);
1151 #endif
1152
1153 #ifdef REAL_STRIP_FILE_NAME
1154 strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME);
1155 if (strip_file_name == 0)
1156 #endif
1157 strip_file_name = find_a_file (&cpath, gstrip_suffix);
1158 if (strip_file_name == 0)
1159 strip_file_name = find_a_file (&path, full_gstrip_suffix);
1160 if (strip_file_name == 0)
1161 strip_file_name = find_a_file (&cpath, strip_suffix);
1162 if (strip_file_name == 0)
1163 strip_file_name = find_a_file (&path, full_strip_suffix);
1164
1165 /* Determine the full path name of the C compiler to use. */
1166 c_file_name = getenv ("COLLECT_GCC");
1167 if (c_file_name == 0)
1168 {
1169 #ifdef CROSS_DIRECTORY_STRUCTURE
1170 c_file_name = concat (target_machine, "-gcc", NULL);
1171 #else
1172 c_file_name = "gcc";
1173 #endif
1174 }
1175
1176 p = find_a_file (&cpath, c_file_name);
1177
1178 /* Here it should be safe to use the system search path since we should have
1179 already qualified the name of the compiler when it is needed. */
1180 if (p == 0)
1181 p = find_a_file (&path, c_file_name);
1182
1183 if (p)
1184 c_file_name = p;
1185
1186 *ld1++ = *ld2++ = ld_file_name;
1187
1188 /* Make temp file names. */
1189 c_file = make_temp_file (".c");
1190 o_file = make_temp_file (".o");
1191 #ifdef COLLECT_EXPORT_LIST
1192 export_file = make_temp_file (".x");
1193 #endif
1194 ldout = make_temp_file (".ld");
1195 lderrout = make_temp_file (".le");
1196 *c_ptr++ = c_file_name;
1197 *c_ptr++ = "-x";
1198 *c_ptr++ = "c";
1199 *c_ptr++ = "-c";
1200 *c_ptr++ = "-o";
1201 *c_ptr++ = o_file;
1202
1203 #ifdef COLLECT_EXPORT_LIST
1204 /* Generate a list of directories from LIBPATH. */
1205 prefix_from_env ("LIBPATH", &libpath_lib_dirs);
1206 /* Add to this list also two standard directories where
1207 AIX loader always searches for libraries. */
1208 add_prefix (&libpath_lib_dirs, "/lib");
1209 add_prefix (&libpath_lib_dirs, "/usr/lib");
1210 #endif
1211
1212 /* Get any options that the upper GCC wants to pass to the sub-GCC.
1213
1214 AIX support needs to know if -shared has been specified before
1215 parsing commandline arguments. */
1216
1217 p = getenv ("COLLECT_GCC_OPTIONS");
1218 while (p && *p)
1219 {
1220 const char *q = extract_string (&p);
1221 if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
1222 *c_ptr++ = xstrdup (q);
1223 if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0)
1224 *c_ptr++ = xstrdup (q);
1225 if (strcmp (q, "-shared") == 0)
1226 shared_obj = 1;
1227 if (*q == '-' && q[1] == 'B')
1228 {
1229 *c_ptr++ = xstrdup (q);
1230 if (q[2] == 0)
1231 {
1232 q = extract_string (&p);
1233 *c_ptr++ = xstrdup (q);
1234 }
1235 }
1236 }
1237 obstack_free (&temporary_obstack, temporary_firstobj);
1238 *c_ptr++ = "-fno-profile-arcs";
1239 *c_ptr++ = "-fno-test-coverage";
1240 *c_ptr++ = "-fno-branch-probabilities";
1241 *c_ptr++ = "-fno-exceptions";
1242 *c_ptr++ = "-w";
1243 *c_ptr++ = "-fno-whole-program";
1244
1245 /* !!! When GCC calls collect2,
1246 it does not know whether it is calling collect2 or ld.
1247 So collect2 cannot meaningfully understand any options
1248 except those ld understands.
1249 If you propose to make GCC pass some other option,
1250 just imagine what will happen if ld is really ld!!! */
1251
1252 /* Parse arguments. Remember output file spec, pass the rest to ld. */
1253 /* After the first file, put in the c++ rt0. */
1254
1255 first_file = 1;
1256 while ((arg = *++argv) != (char *) 0)
1257 {
1258 *ld1++ = *ld2++ = arg;
1259
1260 if (arg[0] == '-')
1261 {
1262 switch (arg[1])
1263 {
1264 case 'd':
1265 if (!strcmp (arg, "-debug"))
1266 {
1267 /* Already parsed. */
1268 ld1--;
1269 ld2--;
1270 }
1271 if (!strcmp (arg, "-dynamic-linker") && argv[1])
1272 {
1273 ++argv;
1274 *ld1++ = *ld2++ = *argv;
1275 }
1276 break;
1277
1278 case 'f':
1279 if (strncmp (arg, "-flto", 5) == 0)
1280 {
1281 #ifdef ENABLE_LTO
1282 /* Do not pass LTO flag to the linker. */
1283 ld1--;
1284 ld2--;
1285 #else
1286 error ("LTO support has not been enabled in this "
1287 "configuration");
1288 #endif
1289 }
1290 else if (!use_collect_ld
1291 && strncmp (arg, "-fuse-ld=", 9) == 0)
1292 {
1293 /* Do not pass -fuse-ld={bfd|gold} to the linker. */
1294 ld1--;
1295 ld2--;
1296 }
1297 #ifdef TARGET_AIX_VERSION
1298 else
1299 {
1300 /* File containing a list of input files to process. */
1301
1302 FILE *stream;
1303 char buf[MAXPATHLEN + 2];
1304 /* Number of additionnal object files. */
1305 int add_nbr = 0;
1306 /* Maximum of additionnal object files before vector
1307 expansion. */
1308 int add_max = 0;
1309 const char *list_filename = arg + 2;
1310
1311 /* Accept -fFILENAME and -f FILENAME. */
1312 if (*list_filename == '\0' && argv[1])
1313 {
1314 ++argv;
1315 list_filename = *argv;
1316 *ld1++ = *ld2++ = *argv;
1317 }
1318
1319 stream = fopen (list_filename, "r");
1320 if (stream == NULL)
1321 fatal_error ("can't open %s: %m", list_filename);
1322
1323 while (fgets (buf, sizeof buf, stream) != NULL)
1324 {
1325 /* Remove end of line. */
1326 int len = strlen (buf);
1327 if (len >= 1 && buf[len - 1] =='\n')
1328 buf[len - 1] = '\0';
1329
1330 /* Put on object vector.
1331 Note: we only expanse vector here, so we must keep
1332 extra space for remaining arguments. */
1333 if (add_nbr >= add_max)
1334 {
1335 int pos =
1336 object - CONST_CAST2 (const char **, char **,
1337 object_lst);
1338 add_max = (add_max == 0) ? 16 : add_max * 2;
1339 object_lst = XRESIZEVEC (char *, object_lst,
1340 object_nbr + add_max);
1341 object = CONST_CAST2 (const char **, char **,
1342 object_lst) + pos;
1343 object_nbr += add_max;
1344 }
1345 *object++ = xstrdup (buf);
1346 add_nbr++;
1347 }
1348 fclose (stream);
1349 }
1350 #endif
1351 break;
1352
1353 case 'l':
1354 if (first_file)
1355 {
1356 /* place o_file BEFORE this argument! */
1357 first_file = 0;
1358 ld2--;
1359 *ld2++ = o_file;
1360 *ld2++ = arg;
1361 }
1362 #ifdef COLLECT_EXPORT_LIST
1363 {
1364 /* Resolving full library name. */
1365 const char *s = resolve_lib_name (arg+2);
1366
1367 /* Saving a full library name. */
1368 add_to_list (&libs, s);
1369 }
1370 #endif
1371 break;
1372
1373 #ifdef COLLECT_EXPORT_LIST
1374 /* Saving directories where to search for libraries. */
1375 case 'L':
1376 add_prefix (&cmdline_lib_dirs, arg+2);
1377 break;
1378 #endif
1379
1380 case 'o':
1381 if (arg[2] == '\0')
1382 output_file = *ld1++ = *ld2++ = *++argv;
1383 else
1384 output_file = &arg[2];
1385 break;
1386
1387 case 'r':
1388 if (arg[2] == '\0')
1389 rflag = 1;
1390 break;
1391
1392 case 's':
1393 if (arg[2] == '\0' && do_collecting)
1394 {
1395 /* We must strip after the nm run, otherwise C++ linking
1396 will not work. Thus we strip in the second ld run, or
1397 else with strip if there is no second ld run. */
1398 strip_flag = 1;
1399 ld1--;
1400 }
1401 break;
1402
1403 case 'v':
1404 if (arg[2] == '\0')
1405 vflag = true;
1406 break;
1407
1408 case '-':
1409 if (strcmp (arg, "--no-demangle") == 0)
1410 {
1411 #ifndef HAVE_LD_DEMANGLE
1412 no_demangle = 1;
1413 ld1--;
1414 ld2--;
1415 #endif
1416 }
1417 else if (strncmp (arg, "--demangle", 10) == 0)
1418 {
1419 #ifndef HAVE_LD_DEMANGLE
1420 no_demangle = 0;
1421 if (arg[10] == '=')
1422 {
1423 enum demangling_styles style
1424 = cplus_demangle_name_to_style (arg+11);
1425 if (style == unknown_demangling)
1426 error ("unknown demangling style '%s'", arg+11);
1427 else
1428 current_demangling_style = style;
1429 }
1430 ld1--;
1431 ld2--;
1432 #endif
1433 }
1434 else if (strncmp (arg, "--sysroot=", 10) == 0)
1435 target_system_root = arg + 10;
1436 else if (strcmp (arg, "--version") == 0)
1437 vflag = true;
1438 else if (strcmp (arg, "--help") == 0)
1439 helpflag = true;
1440 break;
1441 }
1442 }
1443 else if ((p = strrchr (arg, '.')) != (char *) 0
1444 && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
1445 || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
1446 || strcmp (p, ".obj") == 0))
1447 {
1448 if (first_file)
1449 {
1450 first_file = 0;
1451 if (p[1] == 'o')
1452 *ld2++ = o_file;
1453 else
1454 {
1455 /* place o_file BEFORE this argument! */
1456 ld2--;
1457 *ld2++ = o_file;
1458 *ld2++ = arg;
1459 }
1460 }
1461 if (p[1] == 'o' || p[1] == 'l')
1462 *object++ = arg;
1463 #ifdef COLLECT_EXPORT_LIST
1464 /* libraries can be specified directly, i.e. without -l flag. */
1465 else
1466 {
1467 /* Saving a full library name. */
1468 add_to_list (&libs, arg);
1469 }
1470 #endif
1471 }
1472 }
1473
1474 #ifdef COLLECT_EXPORT_LIST
1475 /* This is added only for debugging purposes. */
1476 if (debug)
1477 {
1478 fprintf (stderr, "List of libraries:\n");
1479 dump_list (stderr, "\t", libs.first);
1480 }
1481
1482 /* The AIX linker will discard static constructors in object files if
1483 nothing else in the file is referenced, so look at them first. Unless
1484 we are building a shared object, ignore the eh frame tables, as we
1485 would otherwise reference them all, hence drag all the corresponding
1486 objects even if nothing else is referenced. */
1487 {
1488 const char **export_object_lst
1489 = CONST_CAST2 (const char **, char **, object_lst);
1490
1491 struct id *list = libs.first;
1492
1493 /* Compute the filter to use from the current one, do scan, then adjust
1494 the "current" filter to remove what we just included here. This will
1495 control whether we need a first pass link later on or not, and what
1496 will remain to be scanned there. */
1497
1498 scanfilter this_filter = ld1_filter;
1499 #if HAVE_AS_REF
1500 if (!shared_obj)
1501 this_filter &= ~SCAN_DWEH;
1502 #endif
1503
1504 while (export_object_lst < object)
1505 scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
1506
1507 for (; list; list = list->next)
1508 scan_prog_file (list->name, PASS_FIRST, this_filter);
1509
1510 ld1_filter = ld1_filter & ~this_filter;
1511 }
1512
1513 if (exports.first)
1514 {
1515 char *buf = concat ("-bE:", export_file, NULL);
1516
1517 *ld1++ = buf;
1518 *ld2++ = buf;
1519
1520 exportf = fopen (export_file, "w");
1521 if (exportf == (FILE *) 0)
1522 fatal_error ("fopen %s: %m", export_file);
1523 write_aix_file (exportf, exports.first);
1524 if (fclose (exportf))
1525 fatal_error ("fclose %s: %m", export_file);
1526 }
1527 #endif
1528
1529 *c_ptr++ = c_file;
1530 *c_ptr = *ld1 = *object = (char *) 0;
1531
1532 if (vflag)
1533 notice ("collect2 version %s\n", version_string);
1534
1535 if (helpflag)
1536 {
1537 printf ("Usage: collect2 [options]\n");
1538 printf (" Wrap linker and generate constructor code if needed.\n");
1539 printf (" Options:\n");
1540 printf (" -debug Enable debug output\n");
1541 printf (" --help Display this information\n");
1542 printf (" -v, --version Display this program's version number\n");
1543 printf ("\n");
1544 printf ("Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n");
1545 printf ("Report bugs: %s\n", bug_report_url);
1546 printf ("\n");
1547 }
1548
1549 if (debug)
1550 {
1551 const char *ptr;
1552 fprintf (stderr, "ld_file_name = %s\n",
1553 (ld_file_name ? ld_file_name : "not found"));
1554 fprintf (stderr, "c_file_name = %s\n",
1555 (c_file_name ? c_file_name : "not found"));
1556 fprintf (stderr, "nm_file_name = %s\n",
1557 (nm_file_name ? nm_file_name : "not found"));
1558 #ifdef LDD_SUFFIX
1559 fprintf (stderr, "ldd_file_name = %s\n",
1560 (ldd_file_name ? ldd_file_name : "not found"));
1561 #endif
1562 fprintf (stderr, "strip_file_name = %s\n",
1563 (strip_file_name ? strip_file_name : "not found"));
1564 fprintf (stderr, "c_file = %s\n",
1565 (c_file ? c_file : "not found"));
1566 fprintf (stderr, "o_file = %s\n",
1567 (o_file ? o_file : "not found"));
1568
1569 ptr = getenv ("COLLECT_GCC_OPTIONS");
1570 if (ptr)
1571 fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr);
1572
1573 ptr = getenv ("COLLECT_GCC");
1574 if (ptr)
1575 fprintf (stderr, "COLLECT_GCC = %s\n", ptr);
1576
1577 ptr = getenv ("COMPILER_PATH");
1578 if (ptr)
1579 fprintf (stderr, "COMPILER_PATH = %s\n", ptr);
1580
1581 ptr = getenv (LIBRARY_PATH_ENV);
1582 if (ptr)
1583 fprintf (stderr, "%-20s= %s\n", LIBRARY_PATH_ENV, ptr);
1584
1585 fprintf (stderr, "\n");
1586 }
1587
1588 /* Load the program, searching all libraries and attempting to provide
1589 undefined symbols from repository information.
1590
1591 If -r or they will be run via some other method, do not build the
1592 constructor or destructor list, just return now. */
1593 {
1594 bool early_exit
1595 = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
1596
1597 /* Perform the first pass link now, if we're about to exit or if we need
1598 to scan for things we haven't collected yet before pursuing further.
1599
1600 On AIX, the latter typically includes nothing for shared objects or
1601 frame tables for an executable, out of what the required early scan on
1602 objects and libraries has performed above. In the !shared_obj case, we
1603 expect the relevant tables to be dragged together with their associated
1604 functions from precise cross reference insertions by the compiler. */
1605
1606 if (early_exit || ld1_filter != SCAN_NOTHING)
1607 do_tlink (ld1_argv, object_lst);
1608
1609 if (early_exit)
1610 {
1611 #ifdef COLLECT_EXPORT_LIST
1612 /* Make sure we delete the export file we may have created. */
1613 if (export_file != 0 && export_file[0])
1614 maybe_unlink (export_file);
1615 #endif
1616 if (lto_mode != LTO_MODE_NONE)
1617 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1618 else
1619 post_ld_pass (false);
1620
1621 maybe_unlink (c_file);
1622 maybe_unlink (o_file);
1623 return 0;
1624 }
1625 }
1626
1627 /* Unless we have done it all already, examine the namelist and search for
1628 static constructors and destructors to call. Write the constructor and
1629 destructor tables to a .s file and reload. */
1630
1631 if (ld1_filter != SCAN_NOTHING)
1632 scan_prog_file (output_file, PASS_FIRST, ld1_filter);
1633
1634 #ifdef SCAN_LIBRARIES
1635 scan_libraries (output_file);
1636 #endif
1637
1638 if (debug)
1639 {
1640 notice_translated (ngettext ("%d constructor found\n",
1641 "%d constructors found\n",
1642 constructors.number),
1643 constructors.number);
1644 notice_translated (ngettext ("%d destructor found\n",
1645 "%d destructors found\n",
1646 destructors.number),
1647 destructors.number);
1648 notice_translated (ngettext("%d frame table found\n",
1649 "%d frame tables found\n",
1650 frame_tables.number),
1651 frame_tables.number);
1652 }
1653
1654 /* If the scan exposed nothing of special interest, there's no need to
1655 generate the glue code and relink so return now. */
1656
1657 if (constructors.number == 0 && destructors.number == 0
1658 && frame_tables.number == 0
1659 #if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST)
1660 /* If we will be running these functions ourselves, we want to emit
1661 stubs into the shared library so that we do not have to relink
1662 dependent programs when we add static objects. */
1663 && ! shared_obj
1664 #endif
1665 )
1666 {
1667 /* Do tlink without additional code generation now if we didn't
1668 do it earlier for scanning purposes. */
1669 if (ld1_filter == SCAN_NOTHING)
1670 do_tlink (ld1_argv, object_lst);
1671
1672 if (lto_mode)
1673 maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
1674
1675 /* Strip now if it was requested on the command line. */
1676 if (strip_flag)
1677 {
1678 char **real_strip_argv = XCNEWVEC (char *, 3);
1679 const char ** strip_argv = CONST_CAST2 (const char **, char **,
1680 real_strip_argv);
1681
1682 strip_argv[0] = strip_file_name;
1683 strip_argv[1] = output_file;
1684 strip_argv[2] = (char *) 0;
1685 fork_execute ("strip", real_strip_argv);
1686 }
1687
1688 #ifdef COLLECT_EXPORT_LIST
1689 maybe_unlink (export_file);
1690 #endif
1691 post_ld_pass (false);
1692
1693 maybe_unlink (c_file);
1694 maybe_unlink (o_file);
1695 return 0;
1696 }
1697
1698 /* Sort ctor and dtor lists by priority. */
1699 sort_ids (&constructors);
1700 sort_ids (&destructors);
1701
1702 maybe_unlink(output_file);
1703 outf = fopen (c_file, "w");
1704 if (outf == (FILE *) 0)
1705 fatal_error ("fopen %s: %m", c_file);
1706
1707 write_c_file (outf, c_file);
1708
1709 if (fclose (outf))
1710 fatal_error ("fclose %s: %m", c_file);
1711
1712 /* Tell the linker that we have initializer and finalizer functions. */
1713 #ifdef LD_INIT_SWITCH
1714 #ifdef COLLECT_EXPORT_LIST
1715 *ld2++ = concat (LD_INIT_SWITCH, ":", initname, ":", fininame, NULL);
1716 #else
1717 *ld2++ = LD_INIT_SWITCH;
1718 *ld2++ = initname;
1719 *ld2++ = LD_FINI_SWITCH;
1720 *ld2++ = fininame;
1721 #endif
1722 #endif
1723
1724 #ifdef COLLECT_EXPORT_LIST
1725 if (shared_obj)
1726 {
1727 /* If we did not add export flag to link arguments before, add it to
1728 second link phase now. No new exports should have been added. */
1729 if (! exports.first)
1730 *ld2++ = concat ("-bE:", export_file, NULL);
1731
1732 #ifndef LD_INIT_SWITCH
1733 add_to_list (&exports, initname);
1734 add_to_list (&exports, fininame);
1735 add_to_list (&exports, "_GLOBAL__DI");
1736 add_to_list (&exports, "_GLOBAL__DD");
1737 #endif
1738 exportf = fopen (export_file, "w");
1739 if (exportf == (FILE *) 0)
1740 fatal_error ("fopen %s: %m", export_file);
1741 write_aix_file (exportf, exports.first);
1742 if (fclose (exportf))
1743 fatal_error ("fclose %s: %m", export_file);
1744 }
1745 #endif
1746
1747 /* End of arguments to second link phase. */
1748 *ld2 = (char*) 0;
1749
1750 if (debug)
1751 {
1752 fprintf (stderr, "\n========== output_file = %s, c_file = %s\n",
1753 output_file, c_file);
1754 write_c_file (stderr, "stderr");
1755 fprintf (stderr, "========== end of c_file\n\n");
1756 #ifdef COLLECT_EXPORT_LIST
1757 fprintf (stderr, "\n========== export_file = %s\n", export_file);
1758 write_aix_file (stderr, exports.first);
1759 fprintf (stderr, "========== end of export_file\n\n");
1760 #endif
1761 }
1762
1763 /* Assemble the constructor and destructor tables.
1764 Link the tables in with the rest of the program. */
1765
1766 fork_execute ("gcc", c_argv);
1767 #ifdef COLLECT_EXPORT_LIST
1768 /* On AIX we must call tlink because of possible templates resolution. */
1769 do_tlink (ld2_argv, object_lst);
1770
1771 if (lto_mode)
1772 maybe_run_lto_and_relink (ld2_argv, object_lst, object, false);
1773 #else
1774 /* Otherwise, simply call ld because tlink is already done. */
1775 if (lto_mode)
1776 maybe_run_lto_and_relink (ld2_argv, object_lst, object, true);
1777 else
1778 {
1779 fork_execute ("ld", ld2_argv);
1780 post_ld_pass (false);
1781 }
1782
1783 /* Let scan_prog_file do any final mods (OSF/rose needs this for
1784 constructors/destructors in shared libraries. */
1785 scan_prog_file (output_file, PASS_SECOND, SCAN_ALL);
1786 #endif
1787
1788 maybe_unlink (c_file);
1789 maybe_unlink (o_file);
1790
1791 #ifdef COLLECT_EXPORT_LIST
1792 maybe_unlink (export_file);
1793 #endif
1794
1795 return 0;
1796 }
1797
1798 \f
1799 /* Wait for a process to finish, and exit if a nonzero status is found. */
1800
1801 int
1802 collect_wait (const char *prog, struct pex_obj *pex)
1803 {
1804 int status;
1805
1806 if (!pex_get_status (pex, 1, &status))
1807 fatal_error ("can't get program status: %m");
1808 pex_free (pex);
1809
1810 if (status)
1811 {
1812 if (WIFSIGNALED (status))
1813 {
1814 int sig = WTERMSIG (status);
1815 error ("%s terminated with signal %d [%s]%s",
1816 prog, sig, strsignal(sig),
1817 WCOREDUMP(status) ? ", core dumped" : "");
1818 collect_exit (FATAL_EXIT_CODE);
1819 }
1820
1821 if (WIFEXITED (status))
1822 return WEXITSTATUS (status);
1823 }
1824 return 0;
1825 }
1826
1827 static void
1828 do_wait (const char *prog, struct pex_obj *pex)
1829 {
1830 int ret = collect_wait (prog, pex);
1831 if (ret != 0)
1832 {
1833 error ("%s returned %d exit status", prog, ret);
1834 collect_exit (ret);
1835 }
1836
1837 if (response_file)
1838 {
1839 unlink (response_file);
1840 response_file = NULL;
1841 }
1842 }
1843
1844 \f
1845 /* Execute a program, and wait for the reply. */
1846
1847 struct pex_obj *
1848 collect_execute (const char *prog, char **argv, const char *outname,
1849 const char *errname, int flags)
1850 {
1851 struct pex_obj *pex;
1852 const char *errmsg;
1853 int err;
1854 char *response_arg = NULL;
1855 char *response_argv[3] ATTRIBUTE_UNUSED;
1856
1857 if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL)
1858 {
1859 /* If using @file arguments, create a temporary file and put the
1860 contents of argv into it. Then change argv to an array corresponding
1861 to a single argument @FILE, where FILE is the temporary filename. */
1862
1863 char **current_argv = argv + 1;
1864 char *argv0 = argv[0];
1865 int status;
1866 FILE *f;
1867
1868 /* Note: we assume argv contains at least one element; this is
1869 checked above. */
1870
1871 response_file = make_temp_file ("");
1872
1873 f = fopen (response_file, "w");
1874
1875 if (f == NULL)
1876 fatal_error ("could not open response file %s", response_file);
1877
1878 status = writeargv (current_argv, f);
1879
1880 if (status)
1881 fatal_error ("could not write to response file %s", response_file);
1882
1883 status = fclose (f);
1884
1885 if (EOF == status)
1886 fatal_error ("could not close response file %s", response_file);
1887
1888 response_arg = concat ("@", response_file, NULL);
1889 response_argv[0] = argv0;
1890 response_argv[1] = response_arg;
1891 response_argv[2] = NULL;
1892
1893 argv = response_argv;
1894 }
1895
1896 if (vflag || debug)
1897 {
1898 char **p_argv;
1899 const char *str;
1900
1901 if (argv[0])
1902 fprintf (stderr, "%s", argv[0]);
1903 else
1904 notice ("[cannot find %s]", prog);
1905
1906 for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++)
1907 fprintf (stderr, " %s", str);
1908
1909 fprintf (stderr, "\n");
1910 }
1911
1912 fflush (stdout);
1913 fflush (stderr);
1914
1915 /* If we cannot find a program we need, complain error. Do this here
1916 since we might not end up needing something that we could not find. */
1917
1918 if (argv[0] == 0)
1919 fatal_error ("cannot find '%s'", prog);
1920
1921 pex = pex_init (0, "collect2", NULL);
1922 if (pex == NULL)
1923 fatal_error ("pex_init failed: %m");
1924
1925 errmsg = pex_run (pex, flags, argv[0], argv, outname,
1926 errname, &err);
1927 if (errmsg != NULL)
1928 {
1929 if (err != 0)
1930 {
1931 errno = err;
1932 fatal_error ("%s: %m", _(errmsg));
1933 }
1934 else
1935 fatal_error (errmsg);
1936 }
1937
1938 free (response_arg);
1939
1940 return pex;
1941 }
1942
1943 static void
1944 fork_execute (const char *prog, char **argv)
1945 {
1946 struct pex_obj *pex;
1947
1948 pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
1949 do_wait (prog, pex);
1950 }
1951 \f
1952 /* Unlink FILE unless we are debugging or this is the output_file
1953 and we may not unlink it. */
1954
1955 static void
1956 maybe_unlink (const char *file)
1957 {
1958 if (debug)
1959 {
1960 notice ("[Leaving %s]\n", file);
1961 return;
1962 }
1963
1964 if (file == output_file && !may_unlink_output_file)
1965 return;
1966
1967 unlink_if_ordinary (file);
1968 }
1969
1970 /* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
1971
1972 static void
1973 maybe_unlink_list (char **file_list)
1974 {
1975 char **tmp = file_list;
1976
1977 while (*tmp)
1978 maybe_unlink (*(tmp++));
1979 }
1980
1981 \f
1982 static long sequence_number = 0;
1983
1984 /* Add a name to a linked list. */
1985
1986 static void
1987 add_to_list (struct head *head_ptr, const char *name)
1988 {
1989 struct id *newid
1990 = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1);
1991 struct id *p;
1992 strcpy (newid->name, name);
1993
1994 if (head_ptr->first)
1995 head_ptr->last->next = newid;
1996 else
1997 head_ptr->first = newid;
1998
1999 /* Check for duplicate symbols. */
2000 for (p = head_ptr->first;
2001 strcmp (name, p->name) != 0;
2002 p = p->next)
2003 ;
2004 if (p != newid)
2005 {
2006 head_ptr->last->next = 0;
2007 free (newid);
2008 return;
2009 }
2010
2011 newid->sequence = ++sequence_number;
2012 head_ptr->last = newid;
2013 head_ptr->number++;
2014 }
2015
2016 /* Grab the init priority number from an init function name that
2017 looks like "_GLOBAL_.I.12345.foo". */
2018
2019 static int
2020 extract_init_priority (const char *name)
2021 {
2022 int pos = 0, pri;
2023
2024 while (name[pos] == '_')
2025 ++pos;
2026 pos += 10; /* strlen ("GLOBAL__X_") */
2027
2028 /* Extract init_p number from ctor/dtor name. */
2029 pri = atoi (name + pos);
2030 return pri ? pri : DEFAULT_INIT_PRIORITY;
2031 }
2032
2033 /* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order.
2034 ctors will be run from right to left, dtors from left to right. */
2035
2036 static void
2037 sort_ids (struct head *head_ptr)
2038 {
2039 /* id holds the current element to insert. id_next holds the next
2040 element to insert. id_ptr iterates through the already sorted elements
2041 looking for the place to insert id. */
2042 struct id *id, *id_next, **id_ptr;
2043
2044 id = head_ptr->first;
2045
2046 /* We don't have any sorted elements yet. */
2047 head_ptr->first = NULL;
2048
2049 for (; id; id = id_next)
2050 {
2051 id_next = id->next;
2052 id->sequence = extract_init_priority (id->name);
2053
2054 for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next))
2055 if (*id_ptr == NULL
2056 /* If the sequence numbers are the same, we put the id from the
2057 file later on the command line later in the list. */
2058 || id->sequence > (*id_ptr)->sequence
2059 /* Hack: do lexical compare, too.
2060 || (id->sequence == (*id_ptr)->sequence
2061 && strcmp (id->name, (*id_ptr)->name) > 0) */
2062 )
2063 {
2064 id->next = *id_ptr;
2065 *id_ptr = id;
2066 break;
2067 }
2068 }
2069
2070 /* Now set the sequence numbers properly so write_c_file works. */
2071 for (id = head_ptr->first; id; id = id->next)
2072 id->sequence = ++sequence_number;
2073 }
2074
2075 /* Write: `prefix', the names on list LIST, `suffix'. */
2076
2077 static void
2078 write_list (FILE *stream, const char *prefix, struct id *list)
2079 {
2080 while (list)
2081 {
2082 fprintf (stream, "%sx%d,\n", prefix, list->sequence);
2083 list = list->next;
2084 }
2085 }
2086
2087 #ifdef COLLECT_EXPORT_LIST
2088 /* This function is really used only on AIX, but may be useful. */
2089 #if 0
2090 static int
2091 is_in_list (const char *prefix, struct id *list)
2092 {
2093 while (list)
2094 {
2095 if (!strcmp (prefix, list->name)) return 1;
2096 list = list->next;
2097 }
2098 return 0;
2099 }
2100 #endif
2101 #endif /* COLLECT_EXPORT_LIST */
2102
2103 /* Added for debugging purpose. */
2104 #ifdef COLLECT_EXPORT_LIST
2105 static void
2106 dump_list (FILE *stream, const char *prefix, struct id *list)
2107 {
2108 while (list)
2109 {
2110 fprintf (stream, "%s%s,\n", prefix, list->name);
2111 list = list->next;
2112 }
2113 }
2114 #endif
2115
2116 #if 0
2117 static void
2118 dump_prefix_list (FILE *stream, const char *prefix, struct prefix_list *list)
2119 {
2120 while (list)
2121 {
2122 fprintf (stream, "%s%s,\n", prefix, list->prefix);
2123 list = list->next;
2124 }
2125 }
2126 #endif
2127
2128 static void
2129 write_list_with_asm (FILE *stream, const char *prefix, struct id *list)
2130 {
2131 while (list)
2132 {
2133 fprintf (stream, "%sx%d __asm__ (\"%s\");\n",
2134 prefix, list->sequence, list->name);
2135 list = list->next;
2136 }
2137 }
2138
2139 /* Write out the constructor and destructor tables statically (for a shared
2140 object), along with the functions to execute them. */
2141
2142 static void
2143 write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2144 {
2145 const char *p, *q;
2146 char *prefix, *r;
2147 int frames = (frame_tables.number > 0);
2148
2149 /* Figure out name of output_file, stripping off .so version. */
2150 q = p = lbasename (output_file);
2151
2152 while (q)
2153 {
2154 q = strchr (q,'.');
2155 if (q == 0)
2156 {
2157 q = p + strlen (p);
2158 break;
2159 }
2160 else
2161 {
2162 if (filename_ncmp (q, SHLIB_SUFFIX, strlen (SHLIB_SUFFIX)) == 0)
2163 {
2164 q += strlen (SHLIB_SUFFIX);
2165 break;
2166 }
2167 else
2168 q++;
2169 }
2170 }
2171 /* q points to null at end of the string (or . of the .so version) */
2172 prefix = XNEWVEC (char, q - p + 1);
2173 strncpy (prefix, p, q - p);
2174 prefix[q - p] = 0;
2175 for (r = prefix; *r; r++)
2176 if (!ISALNUM ((unsigned char)*r))
2177 *r = '_';
2178 if (debug)
2179 notice ("\nwrite_c_file - output name is %s, prefix is %s\n",
2180 output_file, prefix);
2181
2182 initname = concat ("_GLOBAL__FI_", prefix, NULL);
2183 fininame = concat ("_GLOBAL__FD_", prefix, NULL);
2184
2185 free (prefix);
2186
2187 /* Write the tables as C code. */
2188
2189 fprintf (stream, "static int count;\n");
2190 fprintf (stream, "typedef void entry_pt();\n");
2191 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2192
2193 if (frames)
2194 {
2195 write_list_with_asm (stream, "extern void *", frame_tables.first);
2196
2197 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2198 write_list (stream, "\t\t&", frame_tables.first);
2199 fprintf (stream, "\t0\n};\n");
2200
2201 /* This must match what's in frame.h. */
2202 fprintf (stream, "struct object {\n");
2203 fprintf (stream, " void *pc_begin;\n");
2204 fprintf (stream, " void *pc_end;\n");
2205 fprintf (stream, " void *fde_begin;\n");
2206 fprintf (stream, " void *fde_array;\n");
2207 fprintf (stream, " __SIZE_TYPE__ count;\n");
2208 fprintf (stream, " struct object *next;\n");
2209 fprintf (stream, "};\n");
2210
2211 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2212 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2213
2214 fprintf (stream, "static void reg_frame () {\n");
2215 fprintf (stream, "\tstatic struct object ob;\n");
2216 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2217 fprintf (stream, "\t}\n");
2218
2219 fprintf (stream, "static void dereg_frame () {\n");
2220 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2221 fprintf (stream, "\t}\n");
2222 }
2223
2224 fprintf (stream, "void %s() {\n", initname);
2225 if (constructors.number > 0 || frames)
2226 {
2227 fprintf (stream, "\tstatic entry_pt *ctors[] = {\n");
2228 write_list (stream, "\t\t", constructors.first);
2229 if (frames)
2230 fprintf (stream, "\treg_frame,\n");
2231 fprintf (stream, "\t};\n");
2232 fprintf (stream, "\tentry_pt **p;\n");
2233 fprintf (stream, "\tif (count++ != 0) return;\n");
2234 fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames);
2235 fprintf (stream, "\twhile (p > ctors) (*--p)();\n");
2236 }
2237 else
2238 fprintf (stream, "\t++count;\n");
2239 fprintf (stream, "}\n");
2240 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2241 fprintf (stream, "void %s() {\n", fininame);
2242 if (destructors.number > 0 || frames)
2243 {
2244 fprintf (stream, "\tstatic entry_pt *dtors[] = {\n");
2245 write_list (stream, "\t\t", destructors.first);
2246 if (frames)
2247 fprintf (stream, "\tdereg_frame,\n");
2248 fprintf (stream, "\t};\n");
2249 fprintf (stream, "\tentry_pt **p;\n");
2250 fprintf (stream, "\tif (--count != 0) return;\n");
2251 fprintf (stream, "\tp = dtors;\n");
2252 fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n",
2253 destructors.number + frames);
2254 }
2255 fprintf (stream, "}\n");
2256
2257 if (shared_obj)
2258 {
2259 COLLECT_SHARED_INIT_FUNC(stream, initname);
2260 COLLECT_SHARED_FINI_FUNC(stream, fininame);
2261 }
2262 }
2263
2264 /* Write the constructor/destructor tables. */
2265
2266 #ifndef LD_INIT_SWITCH
2267 static void
2268 write_c_file_glob (FILE *stream, const char *name ATTRIBUTE_UNUSED)
2269 {
2270 /* Write the tables as C code. */
2271
2272 int frames = (frame_tables.number > 0);
2273
2274 fprintf (stream, "typedef void entry_pt();\n\n");
2275
2276 write_list_with_asm (stream, "extern entry_pt ", constructors.first);
2277
2278 if (frames)
2279 {
2280 write_list_with_asm (stream, "extern void *", frame_tables.first);
2281
2282 fprintf (stream, "\tstatic void *frame_table[] = {\n");
2283 write_list (stream, "\t\t&", frame_tables.first);
2284 fprintf (stream, "\t0\n};\n");
2285
2286 /* This must match what's in frame.h. */
2287 fprintf (stream, "struct object {\n");
2288 fprintf (stream, " void *pc_begin;\n");
2289 fprintf (stream, " void *pc_end;\n");
2290 fprintf (stream, " void *fde_begin;\n");
2291 fprintf (stream, " void *fde_array;\n");
2292 fprintf (stream, " __SIZE_TYPE__ count;\n");
2293 fprintf (stream, " struct object *next;\n");
2294 fprintf (stream, "};\n");
2295
2296 fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
2297 fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
2298
2299 fprintf (stream, "static void reg_frame () {\n");
2300 fprintf (stream, "\tstatic struct object ob;\n");
2301 fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
2302 fprintf (stream, "\t}\n");
2303
2304 fprintf (stream, "static void dereg_frame () {\n");
2305 fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
2306 fprintf (stream, "\t}\n");
2307 }
2308
2309 fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n");
2310 fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames);
2311 write_list (stream, "\t", constructors.first);
2312 if (frames)
2313 fprintf (stream, "\treg_frame,\n");
2314 fprintf (stream, "\t0\n};\n\n");
2315
2316 write_list_with_asm (stream, "extern entry_pt ", destructors.first);
2317
2318 fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n");
2319 fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames);
2320 write_list (stream, "\t", destructors.first);
2321 if (frames)
2322 fprintf (stream, "\tdereg_frame,\n");
2323 fprintf (stream, "\t0\n};\n\n");
2324
2325 fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN);
2326 fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN);
2327 }
2328 #endif /* ! LD_INIT_SWITCH */
2329
2330 static void
2331 write_c_file (FILE *stream, const char *name)
2332 {
2333 #ifndef LD_INIT_SWITCH
2334 if (! shared_obj)
2335 write_c_file_glob (stream, name);
2336 else
2337 #endif
2338 write_c_file_stat (stream, name);
2339 }
2340
2341 #ifdef COLLECT_EXPORT_LIST
2342 static void
2343 write_aix_file (FILE *stream, struct id *list)
2344 {
2345 for (; list; list = list->next)
2346 {
2347 fputs (list->name, stream);
2348 putc ('\n', stream);
2349 }
2350 }
2351 #endif
2352 \f
2353 #ifdef OBJECT_FORMAT_NONE
2354
2355 /* Check to make sure the file is an LTO object file. */
2356
2357 static bool
2358 maybe_lto_object_file (const char *prog_name)
2359 {
2360 FILE *f;
2361 unsigned char buf[4];
2362 int i;
2363
2364 static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
2365 static unsigned char coffmagic[2] = { 0x4c, 0x01 };
2366 static unsigned char coffmagic_x64[2] = { 0x64, 0x86 };
2367 static unsigned char machomagic[4][4] = {
2368 { 0xcf, 0xfa, 0xed, 0xfe },
2369 { 0xce, 0xfa, 0xed, 0xfe },
2370 { 0xfe, 0xed, 0xfa, 0xcf },
2371 { 0xfe, 0xed, 0xfa, 0xce }
2372 };
2373
2374 f = fopen (prog_name, "rb");
2375 if (f == NULL)
2376 return false;
2377 if (fread (buf, sizeof (buf), 1, f) != 1)
2378 buf[0] = 0;
2379 fclose (f);
2380
2381 if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
2382 || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0
2383 || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0)
2384 return true;
2385 for (i = 0; i < 4; i++)
2386 if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
2387 return true;
2388
2389 return false;
2390 }
2391
2392 /* Generic version to scan the name list of the loaded program for
2393 the symbols g++ uses for static constructors and destructors. */
2394
2395 static void
2396 scan_prog_file (const char *prog_name, scanpass which_pass,
2397 scanfilter filter)
2398 {
2399 void (*int_handler) (int);
2400 #ifdef SIGQUIT
2401 void (*quit_handler) (int);
2402 #endif
2403 char *real_nm_argv[4];
2404 const char **nm_argv = CONST_CAST2 (const char **, char**, real_nm_argv);
2405 int argc = 0;
2406 struct pex_obj *pex;
2407 const char *errmsg;
2408 int err;
2409 char *p, buf[1024];
2410 FILE *inf;
2411 int found_lto = 0;
2412
2413 if (which_pass == PASS_SECOND)
2414 return;
2415
2416 /* LTO objects must be in a known format. This check prevents
2417 us from accepting an archive containing LTO objects, which
2418 gcc cannot currently handle. */
2419 if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
2420 return;
2421
2422 /* If we do not have an `nm', complain. */
2423 if (nm_file_name == 0)
2424 fatal_error ("cannot find 'nm'");
2425
2426 nm_argv[argc++] = nm_file_name;
2427 if (NM_FLAGS[0] != '\0')
2428 nm_argv[argc++] = NM_FLAGS;
2429
2430 nm_argv[argc++] = prog_name;
2431 nm_argv[argc++] = (char *) 0;
2432
2433 /* Trace if needed. */
2434 if (vflag)
2435 {
2436 const char **p_argv;
2437 const char *str;
2438
2439 for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2440 fprintf (stderr, " %s", str);
2441
2442 fprintf (stderr, "\n");
2443 }
2444
2445 fflush (stdout);
2446 fflush (stderr);
2447
2448 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2449 if (pex == NULL)
2450 fatal_error ("pex_init failed: %m");
2451
2452 errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET,
2453 &err);
2454 if (errmsg != NULL)
2455 {
2456 if (err != 0)
2457 {
2458 errno = err;
2459 fatal_error ("%s: %m", _(errmsg));
2460 }
2461 else
2462 fatal_error (errmsg);
2463 }
2464
2465 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2466 #ifdef SIGQUIT
2467 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2468 #endif
2469
2470 inf = pex_read_output (pex, 0);
2471 if (inf == NULL)
2472 fatal_error ("can't open nm output: %m");
2473
2474 if (debug)
2475 {
2476 if (which_pass == PASS_LTOINFO)
2477 fprintf (stderr, "\nnm output with LTO info marker symbol.\n");
2478 else
2479 fprintf (stderr, "\nnm output with constructors/destructors.\n");
2480 }
2481
2482 /* Read each line of nm output. */
2483 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2484 {
2485 int ch, ch2;
2486 char *name, *end;
2487
2488 if (debug)
2489 fprintf (stderr, "\t%s\n", buf);
2490
2491 if (which_pass == PASS_LTOINFO)
2492 {
2493 if (found_lto)
2494 continue;
2495
2496 /* Look for the LTO info marker symbol, and add filename to
2497 the LTO objects list if found. */
2498 for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
2499 if (ch == ' ' && p[1] == '_' && p[2] == '_'
2500 && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
2501 && ISSPACE (p[p[3] == '_' ? 14 : 13]))
2502 {
2503 add_lto_object (&lto_objects, prog_name);
2504
2505 /* We need to read all the input, so we can't just
2506 return here. But we can avoid useless work. */
2507 found_lto = 1;
2508
2509 break;
2510 }
2511
2512 continue;
2513 }
2514
2515 /* If it contains a constructor or destructor name, add the name
2516 to the appropriate list unless this is a kind of symbol we're
2517 not supposed to even consider. */
2518
2519 for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++)
2520 if (ch == ' ' && p[1] == 'U' && p[2] == ' ')
2521 break;
2522
2523 if (ch != '_')
2524 continue;
2525
2526 name = p;
2527 /* Find the end of the symbol name.
2528 Do not include `|', because Encore nm can tack that on the end. */
2529 for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|';
2530 end++)
2531 continue;
2532
2533
2534 *end = '\0';
2535 switch (is_ctor_dtor (name))
2536 {
2537 case SYM_CTOR:
2538 if (! (filter & SCAN_CTOR))
2539 break;
2540 if (which_pass != PASS_LIB)
2541 add_to_list (&constructors, name);
2542 break;
2543
2544 case SYM_DTOR:
2545 if (! (filter & SCAN_DTOR))
2546 break;
2547 if (which_pass != PASS_LIB)
2548 add_to_list (&destructors, name);
2549 break;
2550
2551 case SYM_INIT:
2552 if (! (filter & SCAN_INIT))
2553 break;
2554 if (which_pass != PASS_LIB)
2555 fatal_error ("init function found in object %s", prog_name);
2556 #ifndef LD_INIT_SWITCH
2557 add_to_list (&constructors, name);
2558 #endif
2559 break;
2560
2561 case SYM_FINI:
2562 if (! (filter & SCAN_FINI))
2563 break;
2564 if (which_pass != PASS_LIB)
2565 fatal_error ("fini function found in object %s", prog_name);
2566 #ifndef LD_FINI_SWITCH
2567 add_to_list (&destructors, name);
2568 #endif
2569 break;
2570
2571 case SYM_DWEH:
2572 if (! (filter & SCAN_DWEH))
2573 break;
2574 if (which_pass != PASS_LIB)
2575 add_to_list (&frame_tables, name);
2576 break;
2577
2578 default: /* not a constructor or destructor */
2579 continue;
2580 }
2581 }
2582
2583 if (debug)
2584 fprintf (stderr, "\n");
2585
2586 do_wait (nm_file_name, pex);
2587
2588 signal (SIGINT, int_handler);
2589 #ifdef SIGQUIT
2590 signal (SIGQUIT, quit_handler);
2591 #endif
2592 }
2593
2594 #ifdef LDD_SUFFIX
2595
2596 /* Use the List Dynamic Dependencies program to find shared libraries that
2597 the output file depends upon and their initialization/finalization
2598 routines, if any. */
2599
2600 static void
2601 scan_libraries (const char *prog_name)
2602 {
2603 static struct head libraries; /* list of shared libraries found */
2604 struct id *list;
2605 void (*int_handler) (int);
2606 #ifdef SIGQUIT
2607 void (*quit_handler) (int);
2608 #endif
2609 char *real_ldd_argv[4];
2610 const char **ldd_argv = CONST_CAST2 (const char **, char **, real_ldd_argv);
2611 int argc = 0;
2612 struct pex_obj *pex;
2613 const char *errmsg;
2614 int err;
2615 char buf[1024];
2616 FILE *inf;
2617
2618 /* If we do not have an `ldd', complain. */
2619 if (ldd_file_name == 0)
2620 {
2621 error ("cannot find 'ldd'");
2622 return;
2623 }
2624
2625 ldd_argv[argc++] = ldd_file_name;
2626 ldd_argv[argc++] = prog_name;
2627 ldd_argv[argc++] = (char *) 0;
2628
2629 /* Trace if needed. */
2630 if (vflag)
2631 {
2632 const char **p_argv;
2633 const char *str;
2634
2635 for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++)
2636 fprintf (stderr, " %s", str);
2637
2638 fprintf (stderr, "\n");
2639 }
2640
2641 fflush (stdout);
2642 fflush (stderr);
2643
2644 pex = pex_init (PEX_USE_PIPES, "collect2", NULL);
2645 if (pex == NULL)
2646 fatal_error ("pex_init failed: %m");
2647
2648 errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err);
2649 if (errmsg != NULL)
2650 {
2651 if (err != 0)
2652 {
2653 errno = err;
2654 fatal_error ("%s: %m", _(errmsg));
2655 }
2656 else
2657 fatal_error (errmsg);
2658 }
2659
2660 int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN);
2661 #ifdef SIGQUIT
2662 quit_handler = (void (*) (int)) signal (SIGQUIT, SIG_IGN);
2663 #endif
2664
2665 inf = pex_read_output (pex, 0);
2666 if (inf == NULL)
2667 fatal_error ("can't open ldd output: %m");
2668
2669 if (debug)
2670 notice ("\nldd output with constructors/destructors.\n");
2671
2672 /* Read each line of ldd output. */
2673 while (fgets (buf, sizeof buf, inf) != (char *) 0)
2674 {
2675 int ch2;
2676 char *name, *end, *p = buf;
2677
2678 /* Extract names of libraries and add to list. */
2679 PARSE_LDD_OUTPUT (p);
2680 if (p == 0)
2681 continue;
2682
2683 name = p;
2684 if (strncmp (name, "not found", sizeof ("not found") - 1) == 0)
2685 fatal_error ("dynamic dependency %s not found", buf);
2686
2687 /* Find the end of the symbol name. */
2688 for (end = p;
2689 (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|';
2690 end++)
2691 continue;
2692 *end = '\0';
2693
2694 if (access (name, R_OK) == 0)
2695 add_to_list (&libraries, name);
2696 else
2697 fatal_error ("unable to open dynamic dependency '%s'", buf);
2698
2699 if (debug)
2700 fprintf (stderr, "\t%s\n", buf);
2701 }
2702 if (debug)
2703 fprintf (stderr, "\n");
2704
2705 do_wait (ldd_file_name, pex);
2706
2707 signal (SIGINT, int_handler);
2708 #ifdef SIGQUIT
2709 signal (SIGQUIT, quit_handler);
2710 #endif
2711
2712 /* Now iterate through the library list adding their symbols to
2713 the list. */
2714 for (list = libraries.first; list; list = list->next)
2715 scan_prog_file (list->name, PASS_LIB, SCAN_ALL);
2716 }
2717
2718 #endif /* LDD_SUFFIX */
2719
2720 #endif /* OBJECT_FORMAT_NONE */
2721
2722 \f
2723 /*
2724 * COFF specific stuff.
2725 */
2726
2727 #ifdef OBJECT_FORMAT_COFF
2728
2729 #if defined (EXTENDED_COFF)
2730
2731 # define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
2732 # define GCC_SYMENT SYMR
2733 # define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
2734 # define GCC_SYMINC(X) (1)
2735 # define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
2736 # define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
2737
2738 #else
2739
2740 # define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
2741 # define GCC_SYMENT SYMENT
2742 # if defined (C_WEAKEXT)
2743 # define GCC_OK_SYMBOL(X) \
2744 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2745 ((X).n_scnum > N_UNDEF) && \
2746 (aix64_flag \
2747 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2748 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2749 # define GCC_UNDEF_SYMBOL(X) \
2750 (((X).n_sclass == C_EXT || (X).n_sclass == C_WEAKEXT) && \
2751 ((X).n_scnum == N_UNDEF))
2752 # else
2753 # define GCC_OK_SYMBOL(X) \
2754 (((X).n_sclass == C_EXT) && \
2755 ((X).n_scnum > N_UNDEF) && \
2756 (aix64_flag \
2757 || (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) \
2758 || ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))))
2759 # define GCC_UNDEF_SYMBOL(X) \
2760 (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
2761 # endif
2762 # define GCC_SYMINC(X) ((X).n_numaux+1)
2763 # define GCC_SYMZERO(X) 0
2764
2765 /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
2766 #if TARGET_AIX_VERSION >= 51
2767 # define GCC_CHECK_HDR(X) \
2768 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2769 || (HEADER (X).f_magic == 0767 && aix64_flag))
2770 #else
2771 # define GCC_CHECK_HDR(X) \
2772 ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
2773 || (HEADER (X).f_magic == 0757 && aix64_flag))
2774 #endif
2775
2776 #endif
2777
2778 #ifdef COLLECT_EXPORT_LIST
2779 /* Array of standard AIX libraries which should not
2780 be scanned for ctors/dtors. */
2781 static const char *const aix_std_libs[] = {
2782 "/unix",
2783 "/lib/libc.a",
2784 "/lib/libm.a",
2785 "/lib/libc_r.a",
2786 "/lib/libm_r.a",
2787 "/usr/lib/libc.a",
2788 "/usr/lib/libm.a",
2789 "/usr/lib/libc_r.a",
2790 "/usr/lib/libm_r.a",
2791 "/usr/lib/threads/libc.a",
2792 "/usr/ccs/lib/libc.a",
2793 "/usr/ccs/lib/libm.a",
2794 "/usr/ccs/lib/libc_r.a",
2795 "/usr/ccs/lib/libm_r.a",
2796 NULL
2797 };
2798
2799 /* This function checks the filename and returns 1
2800 if this name matches the location of a standard AIX library. */
2801 static int ignore_library (const char *);
2802 static int
2803 ignore_library (const char *name)
2804 {
2805 const char *const *p;
2806 size_t length;
2807
2808 if (target_system_root[0] != '\0')
2809 {
2810 length = strlen (target_system_root);
2811 if (strncmp (name, target_system_root, length) != 0)
2812 return 0;
2813 name += length;
2814 }
2815 for (p = &aix_std_libs[0]; *p != NULL; ++p)
2816 if (strcmp (name, *p) == 0)
2817 return 1;
2818 return 0;
2819 }
2820 #endif /* COLLECT_EXPORT_LIST */
2821
2822 #if defined (HAVE_DECL_LDGETNAME) && !HAVE_DECL_LDGETNAME
2823 extern char *ldgetname (LDFILE *, GCC_SYMENT *);
2824 #endif
2825
2826 /* COFF version to scan the name list of the loaded program for
2827 the symbols g++ uses for static constructors and destructors. */
2828
2829 static void
2830 scan_prog_file (const char *prog_name, scanpass which_pass,
2831 scanfilter filter)
2832 {
2833 LDFILE *ldptr = NULL;
2834 int sym_index, sym_count;
2835 int is_shared = 0;
2836
2837 if (which_pass != PASS_FIRST && which_pass != PASS_OBJ)
2838 return;
2839
2840 #ifdef COLLECT_EXPORT_LIST
2841 /* We do not need scanning for some standard C libraries. */
2842 if (which_pass == PASS_FIRST && ignore_library (prog_name))
2843 return;
2844
2845 /* On AIX we have a loop, because there is not much difference
2846 between an object and an archive. This trick allows us to
2847 eliminate scan_libraries() function. */
2848 do
2849 {
2850 #endif
2851 /* Some platforms (e.g. OSF4) declare ldopen as taking a
2852 non-const char * filename parameter, even though it will not
2853 modify that string. So we must cast away const-ness here,
2854 using CONST_CAST to prevent complaints from -Wcast-qual. */
2855 if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL)
2856 {
2857 if (! MY_ISCOFF (HEADER (ldptr).f_magic))
2858 fatal_error ("%s: not a COFF file", prog_name);
2859
2860 if (GCC_CHECK_HDR (ldptr))
2861 {
2862 sym_count = GCC_SYMBOLS (ldptr);
2863 sym_index = GCC_SYMZERO (ldptr);
2864
2865 #ifdef COLLECT_EXPORT_LIST
2866 /* Is current archive member a shared object? */
2867 is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
2868 #endif
2869
2870 while (sym_index < sym_count)
2871 {
2872 GCC_SYMENT symbol;
2873
2874 if (ldtbread (ldptr, sym_index, &symbol) <= 0)
2875 break;
2876 sym_index += GCC_SYMINC (symbol);
2877
2878 if (GCC_OK_SYMBOL (symbol))
2879 {
2880 char *name;
2881
2882 if ((name = ldgetname (ldptr, &symbol)) == NULL)
2883 continue; /* Should never happen. */
2884
2885 #ifdef XCOFF_DEBUGGING_INFO
2886 /* All AIX function names have a duplicate entry
2887 beginning with a dot. */
2888 if (*name == '.')
2889 ++name;
2890 #endif
2891
2892 switch (is_ctor_dtor (name))
2893 {
2894 case SYM_CTOR:
2895 if (! (filter & SCAN_CTOR))
2896 break;
2897 if (! is_shared)
2898 add_to_list (&constructors, name);
2899 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2900 if (which_pass == PASS_OBJ)
2901 add_to_list (&exports, name);
2902 #endif
2903 break;
2904
2905 case SYM_DTOR:
2906 if (! (filter & SCAN_DTOR))
2907 break;
2908 if (! is_shared)
2909 add_to_list (&destructors, name);
2910 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2911 if (which_pass == PASS_OBJ)
2912 add_to_list (&exports, name);
2913 #endif
2914 break;
2915
2916 #ifdef COLLECT_EXPORT_LIST
2917 case SYM_INIT:
2918 if (! (filter & SCAN_INIT))
2919 break;
2920 #ifndef LD_INIT_SWITCH
2921 if (is_shared)
2922 add_to_list (&constructors, name);
2923 #endif
2924 break;
2925
2926 case SYM_FINI:
2927 if (! (filter & SCAN_FINI))
2928 break;
2929 #ifndef LD_INIT_SWITCH
2930 if (is_shared)
2931 add_to_list (&destructors, name);
2932 #endif
2933 break;
2934 #endif
2935
2936 case SYM_DWEH:
2937 if (! (filter & SCAN_DWEH))
2938 break;
2939 if (! is_shared)
2940 add_to_list (&frame_tables, name);
2941 #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
2942 if (which_pass == PASS_OBJ)
2943 add_to_list (&exports, name);
2944 #endif
2945 break;
2946
2947 default: /* not a constructor or destructor */
2948 #ifdef COLLECT_EXPORT_LIST
2949 /* Explicitly export all global symbols when
2950 building a shared object on AIX, but do not
2951 re-export symbols from another shared object
2952 and do not export symbols if the user
2953 provides an explicit export list. */
2954 if (shared_obj && !is_shared
2955 && which_pass == PASS_OBJ && !export_flag)
2956 add_to_list (&exports, name);
2957 #endif
2958 continue;
2959 }
2960
2961 if (debug)
2962 #if !defined(EXTENDED_COFF)
2963 fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n",
2964 symbol.n_scnum, symbol.n_sclass,
2965 (symbol.n_type ? "0" : ""), symbol.n_type,
2966 name);
2967 #else
2968 fprintf (stderr,
2969 "\tiss = %5d, value = %5ld, index = %5d, name = %s\n",
2970 symbol.iss, (long) symbol.value, symbol.index, name);
2971 #endif
2972 }
2973 }
2974 }
2975 #ifdef COLLECT_EXPORT_LIST
2976 else
2977 {
2978 /* If archive contains both 32-bit and 64-bit objects,
2979 we want to skip objects in other mode so mismatch normal. */
2980 if (debug)
2981 fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
2982 prog_name, HEADER (ldptr).f_magic, aix64_flag);
2983 }
2984 #endif
2985 }
2986 else
2987 {
2988 fatal_error ("%s: cannot open as COFF file", prog_name);
2989 }
2990 #ifdef COLLECT_EXPORT_LIST
2991 /* On AIX loop continues while there are more members in archive. */
2992 }
2993 while (ldclose (ldptr) == FAILURE);
2994 #else
2995 /* Otherwise we simply close ldptr. */
2996 (void) ldclose(ldptr);
2997 #endif
2998 }
2999 #endif /* OBJECT_FORMAT_COFF */
3000
3001 #ifdef COLLECT_EXPORT_LIST
3002 /* Given a library name without "lib" prefix, this function
3003 returns a full library name including a path. */
3004 static char *
3005 resolve_lib_name (const char *name)
3006 {
3007 char *lib_buf;
3008 int i, j, l = 0;
3009 /* Library extensions for AIX dynamic linking. */
3010 const char * const libexts[2] = {"a", "so"};
3011
3012 for (i = 0; libpaths[i]; i++)
3013 if (libpaths[i]->max_len > l)
3014 l = libpaths[i]->max_len;
3015
3016 lib_buf = XNEWVEC (char, l + strlen(name) + 10);
3017
3018 for (i = 0; libpaths[i]; i++)
3019 {
3020 struct prefix_list *list = libpaths[i]->plist;
3021 for (; list; list = list->next)
3022 {
3023 /* The following lines are needed because path_prefix list
3024 may contain directories both with trailing DIR_SEPARATOR and
3025 without it. */
3026 const char *p = "";
3027 if (!IS_DIR_SEPARATOR (list->prefix[strlen(list->prefix)-1]))
3028 p = "/";
3029 for (j = 0; j < 2; j++)
3030 {
3031 sprintf (lib_buf, "%s%slib%s.%s",
3032 list->prefix, p, name,
3033 libexts[(j + aixrtl_flag) % 2]);
3034 if (debug) fprintf (stderr, "searching for: %s\n", lib_buf);
3035 if (file_exists (lib_buf))
3036 {
3037 if (debug) fprintf (stderr, "found: %s\n", lib_buf);
3038 return (lib_buf);
3039 }
3040 }
3041 }
3042 }
3043 if (debug)
3044 fprintf (stderr, "not found\n");
3045 else
3046 fatal_error ("library lib%s not found", name);
3047 return (NULL);
3048 }
3049 #endif /* COLLECT_EXPORT_LIST */
3050
3051 #ifdef COLLECT_RUN_DSYMUTIL
3052 static int flag_dsym = false;
3053 static int flag_idsym = false;
3054
3055 static void
3056 process_args (int *argcp, char **argv) {
3057 int i, j;
3058 int argc = *argcp;
3059 for (i=0; i<argc; ++i)
3060 {
3061 if (strcmp (argv[i], "-dsym") == 0)
3062 {
3063 flag_dsym = true;
3064 /* Remove the flag, as we handle all processing for it. */
3065 j = i;
3066 do
3067 argv[j] = argv[j+1];
3068 while (++j < argc);
3069 --i;
3070 argc = --(*argcp);
3071 }
3072 else if (strcmp (argv[i], "-idsym") == 0)
3073 {
3074 flag_idsym = true;
3075 /* Remove the flag, as we handle all processing for it. */
3076 j = i;
3077 do
3078 argv[j] = argv[j+1];
3079 while (++j < argc);
3080 --i;
3081 argc = --(*argcp);
3082 }
3083 }
3084 }
3085
3086 static void
3087 do_dsymutil (const char *output_file) {
3088 const char *dsymutil = DSYMUTIL + 1;
3089 struct pex_obj *pex;
3090 char **real_argv = XCNEWVEC (char *, 3);
3091 const char ** argv = CONST_CAST2 (const char **, char **,
3092 real_argv);
3093
3094 argv[0] = dsymutil;
3095 argv[1] = output_file;
3096 argv[2] = (char *) 0;
3097
3098 pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH);
3099 do_wait (dsymutil, pex);
3100 }
3101
3102 static void
3103 post_ld_pass (bool temp_file) {
3104 if (!(temp_file && flag_idsym) && !flag_dsym)
3105 return;
3106
3107 do_dsymutil (output_file);
3108 }
3109 #else
3110 static void
3111 process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { }
3112 static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { }
3113 #endif