On Mon, May 11, 2015 at 01:48:03PM +0200, Michael Matz wrote: > Hi, > > On Wed, 6 May 2015, Rich Felker wrote: > > > I don't see how this case is improved unless GCC is failing to consider > > strong definitions in the same TU as locally-binding. > > Interposition of non-static non-inline non-weak symbols is supported > independend of if they are defined in the same TU or not (if you're > producing a shared lib, that is). I.e. no, they are not considered > locally-binding (for instance, they aren't automatically inlined). > > > If this is the case, is there a reason for that behavior? > > Because IMHO interposition is orthogonal to TU placement, and hence > shouldn't be influenced by it. There's visibility, inline hints or > static-ness to achieve different effects. (perhaps the real reason is: > because it always worked like that :) ) > > > IMO it's wrong. > > Why? I think it's right.
I see it as an unnecessary pessimization. The ELF shared library semantics for allowing interposition were designed to avoid behavioral regressions versus static linking, and this is not such a case. With an archive-type library, it's possible to cause whole TUs to be omitted when linking as long as whatever symbol(s) may have been needed from them are already defined elsewhere; interposition makes the same possible with dynamic linking. But if symbols A and B were both in the same TU, having A defined prior to searching an archive but B undefined will cause the TU that defines both to be pulled in, and is such a linking error (multiple definitions). So I'm not sure why it's desirable to support this. The "it always worked like that" argument may suffice if people are depending on this behavior now (OTOH I'd rather see it break so they fix their breakage of static linking) but I suspect the historical reason it worked like that is that compilers were not smart enough to process whole TUs at a time but just worked with one function at a time and did not know that a referenced symbol was in the same TU. BTW visibility can't really address the issue except with hacks (hidden aliases) or protected visibility (which is hard to use because it's broken on lots of toolchain versions). Rich