From bc9b6ea0df6a820878d9ac538b2b852fec367d41 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 15 Oct 2015 17:38:54 -0400 Subject: [PATCH] fix visibility mismatch in dynamic linker stage 2 function definition since commits 2907afb8dbd4c1d34825c3c9bd2b41564baca210 and 6fc30c2493fcfedec89e45088bea87766a1e3286, __dls2 is no longer called via symbol lookup, but instead uses relative addressing that needs to be resolved at link time. on some linker versions, and/or if -Bsymbolic-functions is not used, the linker may leave behind a dynamic relocation, which is not suitable for bootstrapping the dynamic linker, if the reference to __dls2 is marked hidden but the definition is not actually hidden. correcting the definition to use hidden visibility fixes the problem. the static-PIE entry point rcrt1 was likewise affected and is also fixed by this patch. --- crt/rcrt1.c | 1 + src/ldso/dynlink.c | 1 + 2 files changed, 2 insertions(+) diff --git a/crt/rcrt1.c b/crt/rcrt1.c index 5ac612db..9be117fd 100644 --- a/crt/rcrt1.c +++ b/crt/rcrt1.c @@ -9,6 +9,7 @@ void _fini() __attribute__((weak)); _Noreturn int __libc_start_main(int (*)(), int, char **, void (*)(), void(*)(), void(*)()); +__attribute__((__visibility__("hidden"))) _Noreturn void __dls2(unsigned char *base, size_t *sp) { __libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0); diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index cab30089..8025116f 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1330,6 +1330,7 @@ static void update_tls_size() * linker itself, but some of the relocations performed may need to be * replaced later due to copy relocations in the main program. */ +__attribute__((__visibility__("hidden"))) void __dls2(unsigned char *base, size_t *sp) { if (DL_FDPIC) { -- 2.25.1