On Wed, May 06, 2015 at 12:05:20PM -0700, H.J. Lu wrote:
> >> -Bsymbolic will bind all references to local definitions in shared
> >> libraries,
> >> with and without visibility, weak or non-weak. Compiler can use it
> >> in binds_tls_local_p and we can generate much better codes in shared
> >> libraries.
> >
> > Yes, I'm aware of what it does. But at compile-time the compiler can't
> > know whether the referenced symbol will be defined in the same DSO
> > unless this is visibility annotation telling it. Even when linking a
> > shared library using -Bsymbolic, the library code can still make calls
> > (or data references) to symbols in other DSOs.
>
> Even without LTO, -fsymbolic -fPIC will generate better codes for
>
> ---
> int glob_a = 1;
>
> int foo ()
> {
> return glob_a;
> }
> ---
I see how this case is improved, but it depends on the dubious (and
undocumented?) behavior of -Bsymbolic breaking copy relocations.
> and
>
> ---
> int glob_a (void)
> {
> return -1;
> }
>
> int foo ()
> {
> return glob_a ();
> }
> ---
I don't see how this case is improved unless GCC is failing to
consider strong definitions in the same TU as locally-binding. If this
is the case, is there a reason for that behavior? IMO it's wrong.
Rich