| If we link against a newer glibc 2.34 and then try and our LD_PRELOAD is run against a |
| binary on a host with an older libc, we see symbol errors since in glibc 2.34, pthread |
| and dl are merged into libc itself. |
| |
| We need to use the older form of linking so use glibc binaries from an older release |
| to force this. We only use minimal symbols from these anyway. |
| |
| pthread_atfork is problematic, particularly on arm so use the internal glibc routine |
| it maps too. This was always present in the main libc from 2.3.2 onwards. |
| |
| Yes this is horrible. Better solutions welcome. |
| |
| There is more info in the bug: [YOCTO #14521] |
| |
| Upstream-Status: Inappropriate [this patch is native and nativesdk] |
| Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> |
| |
| Tweak library search order, make prebuilt lib ahead of recipe lib |
| Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| --- |
| Makefile.in | 2 +- |
| pseudo_wrappers.c | 5 ++++- |
| 2 files changed, 5 insertions(+), 2 deletions(-) |
| |
| diff --git a/Makefile.in b/Makefile.in |
| --- a/Makefile.in |
| +++ b/Makefile.in |
| @@ -120,7 +120,7 @@ $(PSEUDODB): pseudodb.o $(SHOBJS) $(DBOBJS) pseudo_ipc.o | $(BIN) |
| libpseudo: $(LIBPSEUDO) |
| |
| $(LIBPSEUDO): $(WRAPOBJS) pseudo_client.o pseudo_ipc.o $(SHOBJS) | $(LIB) |
| - $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \ |
| + $(CC) $(CFLAGS) -Lprebuilt/$(shell uname -m)-linux/lib/ $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \ |
| pseudo_client.o pseudo_ipc.o \ |
| $(WRAPOBJS) $(SHOBJS) $(LDFLAGS) $(CLIENT_LDFLAGS) |
| |
| diff --git a/pseudo_wrappers.c b/pseudo_wrappers.c |
| --- a/pseudo_wrappers.c |
| +++ b/pseudo_wrappers.c |
| @@ -100,10 +100,13 @@ static void libpseudo_atfork_child(void) |
| pseudo_mutex_holder = 0; |
| } |
| |
| +extern void *__dso_handle; |
| +extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *); |
| + |
| static void |
| _libpseudo_init(void) { |
| if (!_libpseudo_initted) |
| - pthread_atfork(NULL, NULL, libpseudo_atfork_child); |
| + __register_atfork (NULL, NULL, libpseudo_atfork_child, &__dso_handle == NULL ? NULL : __dso_handle); |
| |
| pseudo_getlock(); |
| pseudo_antimagic(); |
| -- |
| 2.27.0 |
| |