diff options
author | Tony Reix <tony.reix@atos.com> | 2018-06-19 19:17:46 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2018-06-19 15:17:46 -0400 |
commit | 6a513e2a1b446a2aa7accec36ac055935e9d6491 (patch) | |
tree | f6bc3a864ce42a09da3c879ff54da190e22eafe4 | |
parent | e8c487163ac2988dc7d90774e068d9c043193a3d (diff) | |
download | gcc-6a513e2a1b446a2aa7accec36ac055935e9d6491.zip gcc-6a513e2a1b446a2aa7accec36ac055935e9d6491.tar.gz gcc-6a513e2a1b446a2aa7accec36ac055935e9d6491.tar.bz2 |
collect2.c (static_obj): New variable.
2018-06-19 Tony Reix <tony.reix@atos.com>
Damien Bergamini <damien.bergamini@atos.com>
David Edelsohn <dje.gcc@gmail.com>
* collect2.c (static_obj): New variable.
(static_libs): New variable.
(is_in_list): Uncomment declaration.
(main): Track AIX libraries linked statically.
(is_in_list): Uncomment definition.
(scan_prog_file): Don't add AIX shared libraries initializer
to constructor list if linking statically.
Co-Authored-By: Damien Bergamini <damien.bergamini@atos.com>
Co-Authored-By: David Edelsohn <dje.gcc@gmail.com>
From-SVN: r261759
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/collect2.c | 37 |
2 files changed, 44 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7e93801..bf2a823 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2018-06-19 Tony Reix <tony.reix@atos.com> + Damien Bergamini <damien.bergamini@atos.com> + David Edelsohn <dje.gcc@gmail.com> + + * collect2.c (static_obj): New variable. + (static_libs): New variable. + (is_in_list): Uncomment declaration. + (main): Track AIX libraries linked statically. + (is_in_list): Uncomment definition. + (scan_prog_file): Don't add AIX shared libraries initializer + to constructor list if linking statically. + 2018-06-19 Max Filippov <jcmvbkbc@gmail.com> * config/xtensa/xtensa.md (UNSPEC_FRAME_BLOCKAGE): New unspec diff --git a/gcc/collect2.c b/gcc/collect2.c index f26bc59..783dce8 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -201,6 +201,7 @@ static enum lto_mode_d lto_mode = LTO_MODE_NONE; bool helpflag; /* true if --help */ static int shared_obj; /* true if -shared */ +static int static_obj; /* true if -static */ static const char *c_file; /* <xxx>.c for constructor/destructor list. */ static const char *o_file; /* <xxx>.o for constructor/destructor list. */ @@ -255,6 +256,7 @@ bool may_unlink_output_file = false; #ifdef COLLECT_EXPORT_LIST /* Lists to keep libraries to be scanned for global constructors/destructors. */ static struct head libs; /* list of libraries */ +static struct head static_libs; /* list of statically linked libraries */ static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */ static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */ static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs, @@ -320,9 +322,7 @@ static void write_c_file_glob (FILE *, const char *); static void scan_libraries (const char *); #endif #ifdef COLLECT_EXPORT_LIST -#if 0 static int is_in_list (const char *, struct id *); -#endif static void write_aix_file (FILE *, struct id *); static char *resolve_lib_name (const char *); #endif @@ -911,6 +911,7 @@ main (int argc, char **argv) int first_file; int num_c_args; char **old_argv; + bool is_static = false; int i; for (i = 0; i < USE_LD_MAX; i++) @@ -1241,6 +1242,8 @@ main (int argc, char **argv) *c_ptr++ = xstrdup (q); if (strcmp (q, "-shared") == 0) shared_obj = 1; + if (strcmp (q, "-static") == 0) + static_obj = 1; if (*q == '-' && q[1] == 'B') { *c_ptr++ = xstrdup (q); @@ -1269,6 +1272,7 @@ main (int argc, char **argv) /* Parse arguments. Remember output file spec, pass the rest to ld. */ /* After the first file, put in the c++ rt0. */ + is_static = static_obj; first_file = 1; while ((arg = *++argv) != (char *) 0) { @@ -1374,6 +1378,18 @@ main (int argc, char **argv) #endif break; +#ifdef COLLECT_EXPORT_LIST + case 'b': + if (!strcmp (arg, "-bstatic")) + { + is_static = true; + } + else if (!strcmp (arg, "-bdynamic") || !strcmp (arg, "-bshared")) + { + is_static = false; + } + break; +#endif case 'l': if (first_file) { @@ -1390,6 +1406,8 @@ main (int argc, char **argv) /* Saving a full library name. */ add_to_list (&libs, s); + if (is_static) + add_to_list (&static_libs, s); } #endif break; @@ -1490,6 +1508,8 @@ main (int argc, char **argv) { /* Saving a full library name. */ add_to_list (&libs, arg); + if (is_static) + add_to_list (&static_libs, arg); } #endif } @@ -1501,6 +1521,8 @@ main (int argc, char **argv) { fprintf (stderr, "List of libraries:\n"); dump_list (stderr, "\t", libs.first); + fprintf (stderr, "List of statically linked libraries:\n"); + dump_list (stderr, "\t", static_libs.first); } /* The AIX linker will discard static constructors in object files if @@ -1525,9 +1547,11 @@ main (int argc, char **argv) this_filter &= ~SCAN_DWEH; #endif + /* Scan object files. */ while (export_object_lst < object) scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter); + /* Scan libraries. */ for (; list; list = list->next) scan_prog_file (list->name, PASS_FIRST, this_filter); @@ -1975,7 +1999,6 @@ write_list (FILE *stream, const char *prefix, struct id *list) #ifdef COLLECT_EXPORT_LIST /* This function is really used only on AIX, but may be useful. */ -#if 0 static int is_in_list (const char *prefix, struct id *list) { @@ -1986,7 +2009,6 @@ is_in_list (const char *prefix, struct id *list) } return 0; } -#endif #endif /* COLLECT_EXPORT_LIST */ /* Added for debugging purpose. */ @@ -2818,7 +2840,12 @@ scan_prog_file (const char *prog_name, scanpass which_pass, case SYM_AIXI: if (! (filter & SCAN_CTOR)) break; - if (is_shared && !aixlazy_flag) + if (is_shared && !aixlazy_flag +#ifdef COLLECT_EXPORT_LIST + && ! static_obj + && ! is_in_list (prog_name, static_libs.first) +#endif + ) add_to_list (&constructors, name); break; |