On Wed, May 6, 2015 at 12:17 PM, Rich Felker <dal...@libc.org> wrote: > 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.
-Bsymbolic breaks copy relocations, independent of compiler. However, we can pass -fsymbolic when building PIE to avoid copy relocation. With -fsymbolic -fPIE -pie -flto, we can generate direct reference for locally defined symbol. >> 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. glob_a is a strong definition. If you have another strong definition, you will get a linker error. -- H.J.