
On 01/03/2013 11:16 AM, Paul Eggert wrote:
Thanks for fixing that. I'm still puzzled about why the problem happened with libvirt.
Why libvirt, and not detected elsewhere? Probably because libvirt does this at configure time: AH_VERBATIM([FORTIFY_SOURCE], [/* Enable compile-time and run-time bounds-checking, and some warnings, without upsetting newer glibc. */ #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ # define _FORTIFY_SOURCE 2 #endif and the inline in question is only turned on when _FORTIFY_SOURCE is enabled. Packages where no one uses _FORTIFY_SOURCE by default would never hit the issue.
It's better now that stdio doesn't depend on extern-inline, but I worry that whatever bug the libvirt folks were having with stdio and extern inline might crop up when extern inline is used in other include files.
The elided code was not using _GL_EXTERN_INLINE, but _GL_INLINE. They have different semantics, but I'm hard-pressed to say _which_ semantics are right from just those names. If I understand correctly, we _want_ the semantics where the inline function is _always_ inlined and never emitted as a linkable entry point, but I'd have to refer back to C99 and the gcc manual to see which use of inline and possible __attribute__ combinations guarantees that point. I've seen code that uses the name ELIDABLE_INLINE for the specific combination we want used in header files; maybe it's worth adding a name _GL_ELIDABLE_INLINE into m4/extern-inline.m4 to make it easier to use the results.
One minor improvement is that we can limit the workaround to glibc versions that have the problem, so I pushed this further change.
Thanks for that improvement. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org