From 56010b73e81e2cb1082e418699f98353598fe671 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 13 Nov 2020 15:56:51 +0000 Subject: hurd: break relocation loop between libc.so and lib{mach,hurd}user.so See https://sourceware.org/pipermail/libc-alpha/2020-November/119575.html lib{mach,hurd}user.so gets relocated before libc.so, but its references to strpcpy and memcpy would need an ifunc decision, which e.g. on x86 relies on cpu_features, but libc.so's _rtld_global_ro is not relocated yet. We can however just make lib{mach,hurd}user.so only call non-ifunc functions, which can be relocated before libc.so is relocated. --- sysdeps/mach/include/mach/mig_support.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'sysdeps/mach') diff --git a/sysdeps/mach/include/mach/mig_support.h b/sysdeps/mach/include/mach/mig_support.h index b027237692..1888d481d2 100644 --- a/sysdeps/mach/include/mach/mig_support.h +++ b/sysdeps/mach/include/mach/mig_support.h @@ -4,5 +4,17 @@ libc_hidden_proto (__mig_get_reply_port) libc_hidden_proto (__mig_dealloc_reply_port) libc_hidden_proto (__mig_init) + +#ifdef _LIBC +# include + +# if defined USE_MULTIARCH && (IS_IN (libmachuser) || IS_IN (libhurduser)) +/* Avoid directly calling ifunc-enabled memcpy or strpcpy, + because they would introduce a relocation loop between lib*user and + libc.so. */ +# define memcpy(dest, src, n) __mig_memcpy(dest, src, n) +# endif +#endif + #endif #endif -- cgit v1.2.3-70-g09d2