This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 02/10] Finish move of clock_* functions to libc.
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: Florian Weimer <fweimer at redhat dot com>, Zack Weinberg <zackw at panix dot com>
- Cc: libc-alpha at sourceware dot org, Joseph Myers <joseph at codesourcery dot com>, Lukasz Majewski <lukma at denx dot de>, Alistair Francis <alistair23 at gmail dot com>, Stepan Golosunov <stepan at golosunov dot pp dot ru>, Arnd Bergmann <arnd at arndb dot de>, Samuel Thibault <samuel dot thibault at ens-lyon dot org>
- Date: Tue, 3 Sep 2019 10:25:28 -0300
- Subject: Re: [PATCH v2 02/10] Finish move of clock_* functions to libc.
- References: <20190828153236.18229-1-zackw@panix.com> <20190828153236.18229-3-zackw@panix.com> <87h85tu9bp.fsf@oldenburg2.str.redhat.com>
On 03/09/2019 04:29, Florian Weimer wrote:
> * Zack Weinberg:
>
>> diff --git a/rt/Versions b/rt/Versions
>> index 91e3fd2a20..84d1345420 100644
>> --- a/rt/Versions
>> +++ b/rt/Versions
>> @@ -1,15 +1,3 @@
>> -libc {
>> - GLIBC_2.17 {
>> - # c*
>> - clock_getres; clock_gettime; clock_settime; clock_getcpuclockid;
>> - clock_nanosleep;
>> - }
>> - GLIBC_PRIVATE {
>> - __clock_getres; __clock_gettime; __clock_settime; __clock_getcpuclockid;
>> - __clock_nanosleep;
>> - }
>> -}
>
> Sorry, you cannot remove the GLIBC_2.17 symbol version in this way,
> otherwise old binaries will fail to load. You need to leave behind a
> dummy function definition. See __libpthread_version_placeholder for how
> I handled this in the libpthread/vfork case.
Are you sure about it? on x86_64 I am trying to force this issue:
--
$ cat test.c
include <time.h>
#define symbol_version_reference(real, name, version) \
__asm__ (".symver " #real "," #name "@" #version)
symbol_version_reference (clock_gettime, clock_gettime, GLIBC_2.2.5);
int main ()
{
struct timespec ts;
clock_gettime (CLOCK_REALTIME, &ts);
return ts.tv_sec;
}
$ gcc -Wall test.c -o test -lrt
# Check if this indeed links against old librt version
$ readelf -s test | grep clock_gettime
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND clock_gettime@GLIBC_2.2.5 (4)
56: 0000000000000000 0 FUNC GLOBAL DEFAULT UND clock_gettime@@GLIBC_2.2.
# Check if master branch does not fail to load the binary
$ ./x86_64-linux-gnu-master/testrun.sh ./test
# Chec
# librt.so does not have the clock_gettime symbols
$ readelf -s x86_64-linux-gnu-patched/rt/librt.so | grep clock_gettime@
37: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __clock_gettime@GLIBC_PRIVATE (7)
232: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __clock_gettime@@GLIBC_PR
# There are now provided solely by libc.so
$ readelf -s x86_64-linux-gnu-patched/libc.so | grep clock_gettime@
837: 00000000000c0be0 109 FUNC GLOBAL DEFAULT 12 __clock_gettime@@GLIBC_PRIVATE
1744: 00000000000c0be0 109 FUNC GLOBAL DEFAULT 12 clock_gettime@GLIBC_2.2.5
1747: 00000000000c0be0 109 FUNC GLOBAL DEFAULT 12 clock_gettime@@GLIBC_2.17
7580: 00000000000c0be0 109 FUNC GLOBAL DEFAULT 12 clock_gettime@GLIBC_2.2.5
8291: 00000000000c0be0 109 FUNC GLOBAL DEFAULT 12 clock_gettime@@GLIBC_2.17
# And it does not fail
$ ./x86_64-linux-gnu-patched/testrun.sh ./test
--
LD_DEBUG=all indeed shows us the symbol resolution is done as expected:
9832: symbol=clock_gettime; lookup in file=./test [0]
9832: symbol=clock_gettime; lookup in file=./x86_64-linux-gnu-patched/rt/librt.so.1 [0]
9832: symbol=clock_gettime; lookup in file=./x86_64-linux-gnu-patched/libc.so.6 [0]
9832: binding file ./test [0] to ./x86_64-linux-gnu-patched/libc.so.6 [0]: normal symbol `clock_gettime' [GLIBC_2.2.5]
9832:
Do you know how exactly this issue might happen?
>
> I think we need to bring back the file version information in the ABI
> lists because it is part of the ABI, after all.
>
> We have received a bug report that the librt IFUNC resolvers actually
> cause programs not to start:
>
> <https://sourceware.org/bugzilla/show_bug.cgi?id=24959>
>
> I would appreciate if you could mention this bug number in your fix.
Yeah, we need to remove these ifunc redirection hacks.
>
> Thanks,
> Florian
>