diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-04-29 11:52:16 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-04-29 11:58:32 -0700 |
commit | 05a96236132e1727a457da1e92da94adcd55528a (patch) | |
tree | 5b223ae16eb61fa612cf0320c0a87fab008ad5a5 | |
parent | 9e6f58a106d7ee875c95d4aba7e5dd7cefd32f45 (diff) | |
download | gcc-hjl/pr65846/gcc-5-branch.tar.gz |
Enable -fsymbolic in LTO if -Bsymbolic is usedhjl/pr65846/gcc-5-branch
When -Bsymbolic is passed to linker, references to global symbols
defined in the shared library are resolved locally. We should pass
-fsymbolic to GCC in this case.
* collect2.c (main): Add -fsymbolic to COLLECT_GCC_OPTIONS if
-Bsymbolic is used.
* doc/invoke.texi: Updated.
-rw-r--r-- | gcc/collect2.c | 51 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 3 |
2 files changed, 51 insertions, 3 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index b53e15189df..c797be0e738 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1044,7 +1044,8 @@ main (int argc, char **argv) #ifndef HAVE_LD_DEMANGLE current_demangling_style = auto_demangling; #endif - p = getenv ("COLLECT_GCC_OPTIONS"); + char *gcc_options = getenv ("COLLECT_GCC_OPTIONS"); + p = gcc_options; while (p && *p) { const char *q = extract_string (&p); @@ -1231,7 +1232,8 @@ main (int argc, char **argv) AIX support needs to know if -shared has been specified before parsing commandline arguments. */ - p = getenv ("COLLECT_GCC_OPTIONS"); + int add_fsymbolic = -1; + p = gcc_options; while (p && *p) { const char *q = extract_string (&p); @@ -1241,6 +1243,9 @@ main (int argc, char **argv) *c_ptr++ = xstrdup (q); if (strcmp (q, "-shared") == 0) shared_obj = 1; + else if (strcmp (q, "-fsymbolic") == 0 + || strcmp (q, "-fno-symbolic") == 0) + add_fsymbolic = 0; if (*q == '-' && q[1] == 'B') { *c_ptr++ = xstrdup (q); @@ -1278,6 +1283,13 @@ main (int argc, char **argv) { switch (arg[1]) { + case 'B': + /* Add -fsymbolic to COLLECT_GCC_OPTIONS if -Bsymbolic is + used. */ + if (add_fsymbolic == -1 && !strcmp (arg + 2, "symbolic")) + add_fsymbolic = 1; + break; + case 'd': if (!strcmp (arg, "-debug")) { @@ -1495,6 +1507,41 @@ main (int argc, char **argv) } } + if (add_fsymbolic > 0) + { + /* Add -fsymbolic to COLLECT_GCC_OPTIONS. */ + size_t sizeof_env = sizeof "COLLECT_GCC_OPTIONS="; + size_t sizeof_fsymbolic = sizeof "\'-fsymbolic\' "; + size_t len = strlen (gcc_options); + size_t next, start; + char *first; + char *options = (char *) xmalloc (sizeof_env + len + + sizeof_fsymbolic - 1); + memcpy (options, "COLLECT_GCC_OPTIONS=", sizeof_env - 1); + first = strchr (gcc_options, '\''); + if (first == NULL) + fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS: %s", + gcc_options); + next = sizeof_env - 1; + if (first != gcc_options) + { + size_t first_len = first - gcc_options; + memcpy (options + next, gcc_options, first_len); + next += first_len; + start = first_len; + } + else + start = 0; + memcpy (options + next, "\'-fsymbolic\' ", sizeof_fsymbolic - 1); + next += sizeof_fsymbolic - 1; + memcpy (options + next, gcc_options + start, len); + next += len; + options[next] = '\0'; + putenv (options); + if (verbose) + fprintf (stderr, "%s\n", options); + } + #ifdef COLLECT_EXPORT_LIST /* This is added only for debugging purposes. */ if (debug) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9d0c3fe30a6..3b523a04aa4 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -23538,7 +23538,8 @@ which controls how references to global symbols are bound. The local definitions and external references globally. This option avoids copy relocations in position-independent executables and optimizes global symbol references in shared library created by -linker option, @option{-Bsymbolic}. +linker option, @option{-Bsymbolic}. This option is enabled by default +with @option{-flto} when @option{-Bsymbolic} is used. @item -fno-ident @opindex fno-ident |