So LWN reports just today on the release of GLIBC 2.17 which solves a security issue and looks like was released mostly to support the new AArch64 architecture – i.e. arm64 – but the last entry in the reported news is possibly going to be a major headache and I’d better post already about it so that we have a reference for it.
I’m referring to this:
The
`clock_*'
suite of functions (declared in<time.h>
) is now available directly in the main C library. Previously it was necessary to link with-lrt
to use these functions. This change has the effect that a single-threaded program that uses a function such as`clock_gettime'
(and is not linked with-lrt
) will no longer implicitly load the pthreads library at runtime and so will not suffer the overheads associated with multi-thread support in other code such as the C++ runtime library.
This is in my opinion the most important change, not only because, as it’s pointed out, C++ software would have quite an improvement not to link to the pthreads library, but also because it’s the only change listed there that I can foresee trouble with already. And why is that? Well, that’s easy. Most of the software out there will do something along these lines to see what library to link to when using clock_gettime
(the -lrt
option was not always a good idea because it’s not existing for most other operating systems out there, including FreeBSD and Mac OS X).
AC_SEARCH_LIB([clock_gettime], [rt])
This is good, because it’ll try either librt, or just without any library at all (“none required”) which means that it’ll work on both old GLIBC systems, new GLIBC systems, FreeBSD, and OS X — there is something else on Solaris if I’m not mistaken, which can be added up there, but I honestly forgot its name. Unfortunately, this can easily end up with more trouble when software is underlinked.
With the old GLIBC, it was possible to link software with just librt and have them use the threading functions. Once librt will be dropped automatically by the configuration, threading libraries will no longer be brought in by it, and it might break quite a few packages. Of course, most of these would already have been failing with gold but as you remembered, I wasn’t able to get to the whole tree with it, and I haven’t set up a tinderbox for it again yet (I should, but it’s trouble enough with two!).
What about --as-needed
in this picture? A full hard-on implementation would fail on the underlinking, where pthreads should have been linked explicitly, but would also make sure to not link librt when it’s not needed, which would make it possible to improve the performance of the code (by skipping over pthreads) even when the configure scripts are not written properly (like for instance if they are using AC_CHECK_LIB
instead of AC_SEARCH_LIB
). But since it’s not the linkage of librt that causes the performance issue, but rather the one for pthreads, it actually works out quite well, even if some packages might keep an extra linkage to librt which is not used.
There is a final note that I need o write about and honestly worries me quite a bit more than all those above. The librt library has not been dropped — only the clock functions have been moved over to the main C library, but the library keeps asynchronous and list-based I/O operation interfaces (AIO and LIO), the POSIX message queues interfaces, the shared memory interfaces, and the timer interfaces. This means that if you’re relying on a clock_gettime
test to bring in librt, you’ll end up with a failing package. Luckily for me, I’ve avoided that situation already on feng (which uses the message queues interface) but as I said I foresee trouble at least for some packages.
Well, I guess I’ll just have to wait for the ebuild for 2.17 to be in the tree, and run a new tinderbox from scratch… we’ll see what gets us there!
I may be the only one who thinks that either all POSIX libraries shoud be combined in one shared object or full split done instead: one shared object per module.. (in ex. libclock.so for clock_*, libtimer.so for timer_*). Moving functions around feels rather random.
I’m not sure why they decided to move only those — definitely splitting them on their own (shared) library is not a good idea (too much overhead), and splitting them on static archives is completely useless (as the linker picks the single object file that is needed). I wonder how much of those interfaces rely on pthread itself — or whether it would make sense to have a libc_r like FreeBSD has/had.At any rate, I don’t take decisions for glibc, I just comment on them.