This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 2/5] Enable -fsymbolic in LTO if -Bsymbolic is used
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 23 Oct 2015 10:52:15 +0200
- Subject: Re: [PATCH 2/5] Enable -fsymbolic in LTO if -Bsymbolic is used
- Authentication-results: sourceware.org; auth=none
- References: <1445533745-19016-1-git-send-email-hjl dot tools at gmail dot com> <1445533745-19016-3-git-send-email-hjl dot tools at gmail dot com>
On Thu, Oct 22, 2015 at 7:09 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> 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.
Hmm, I think this info should come via the linker plugin, otherwise it
won't work
with using plain 'ld' for linking and plugin auto-loading for example. Maybe
a special symbol resultion can be used for this?
Richard.
> * collect2.c (main): Add -fsymbolic to COLLECT_GCC_OPTIONS if
> -Bsymbolic is used.
> * doc/invoke.texi: Updated.
> ---
> gcc/collect2.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
> gcc/doc/invoke.texi | 3 ++-
> 2 files changed, 51 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/collect2.c b/gcc/collect2.c
> index 20c2533..ccbf4c3 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 5293a25..47baaa3 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -23952,7 +23952,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
> --
> 2.4.3
>