From 0923f74adaa2827264a0d7cbe51ba287fc0f0c16 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Thu, 25 Mar 2021 11:05:37 +0100 Subject: Support for multiple versions in versioned_symbol, compat_symbol This essentially folds compat_symbol_unique functionality into compat_symbol. This change eliminates the need for intermediate aliases for defining multiple symbol versions, for both compat_symbol and versioned_symbol. Some binutils versions do not suport multiple versions per symbol on some targets, so aliases are automatically introduced, similar to what compat_symbol_unique did. To reduce symbol table sizes, a configure check is added to avoid these aliases if they are not needed. The new mechanism works with data symbols as well as function symbols, due to the way an assembler-level redirect is used. It is not compatible with weak symbols for old binutils versions, which is why the definition of __malloc_initialize_hook had to be changed. This is not a loss of functionality because weak symbols do not matter to dynamic linking. The placeholder symbol needs repeating in nptl/libpthread-compat.c now that compat_symbol is used, but that seems more obvious than introducing yet another macro. A subtle difference was that compat_symbol_unique made the symbol global automatically. compat_symbol does not do this, so static had to be removed from the definition of __libpthread_version_placeholder. Reviewed-by: Adhemerval Zanella --- time/clock_getcpuclockid.c | 3 +-- time/clock_getres.c | 3 +-- time/clock_gettime.c | 3 +-- time/clock_nanosleep.c | 3 +-- time/clock_settime.c | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) (limited to 'time') diff --git a/time/clock_getcpuclockid.c b/time/clock_getcpuclockid.c index c148d96..220e2eb 100644 --- a/time/clock_getcpuclockid.c +++ b/time/clock_getcpuclockid.c @@ -42,6 +42,5 @@ versioned_symbol (libc, __clock_getcpuclockid, clock_getcpuclockid, GLIBC_2_17); /* clock_getcpuclockid moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_getcpuclockid, __clock_getcpuclockid_2); -compat_symbol (libc, __clock_getcpuclockid_2, clock_getcpuclockid, GLIBC_2_2); +compat_symbol (libc, __clock_getcpuclockid, clock_getcpuclockid, GLIBC_2_2); #endif diff --git a/time/clock_getres.c b/time/clock_getres.c index 4b31893..9099b62 100644 --- a/time/clock_getres.c +++ b/time/clock_getres.c @@ -32,8 +32,7 @@ versioned_symbol (libc, __clock_getres, clock_getres, GLIBC_2_17); /* clock_getres moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_getres, __clock_getres_2); -compat_symbol (libc, __clock_getres_2, clock_getres, GLIBC_2_2); +compat_symbol (libc, __clock_getres, clock_getres, GLIBC_2_2); #endif stub_warning (clock_getres) diff --git a/time/clock_gettime.c b/time/clock_gettime.c index fdeaaca..e8e129d 100644 --- a/time/clock_gettime.c +++ b/time/clock_gettime.c @@ -33,8 +33,7 @@ versioned_symbol (libc, __clock_gettime, clock_gettime, GLIBC_2_17); /* clock_gettime moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_gettime, __clock_gettime_2); -compat_symbol (libc, __clock_gettime_2, clock_gettime, GLIBC_2_2); +compat_symbol (libc, __clock_gettime, clock_gettime, GLIBC_2_2); #endif stub_warning (clock_gettime) diff --git a/time/clock_nanosleep.c b/time/clock_nanosleep.c index 7ecb1cf..57b3af2 100644 --- a/time/clock_nanosleep.c +++ b/time/clock_nanosleep.c @@ -38,8 +38,7 @@ versioned_symbol (libc, __clock_nanosleep, clock_nanosleep, GLIBC_2_17); /* clock_nanosleep moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_nanosleep, __clock_nanosleep_2); -compat_symbol (libc, __clock_nanosleep_2, clock_nanosleep, GLIBC_2_2); +compat_symbol (libc, __clock_nanosleep, clock_nanosleep, GLIBC_2_2); #endif stub_warning (clock_nanosleep) diff --git a/time/clock_settime.c b/time/clock_settime.c index 7676aae..4df4ec5 100644 --- a/time/clock_settime.c +++ b/time/clock_settime.c @@ -33,8 +33,7 @@ versioned_symbol (libc, __clock_settime, clock_settime, GLIBC_2_17); /* clock_settime moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_settime, __clock_settime_2); -compat_symbol (libc, __clock_settime_2, clock_settime, GLIBC_2_2); +compat_symbol (libc, __clock_settime, clock_settime, GLIBC_2_2); #endif stub_warning (clock_settime) -- cgit v1.1