This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2 02/10] Finish move of clock_* functions to libc.



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
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]