path: root/crt
diff options
authorRich Felker <>2015-10-15 17:38:54 -0400
committerRich Felker <>2015-10-15 17:38:54 -0400
commitbc9b6ea0df6a820878d9ac538b2b852fec367d41 (patch)
tree6f966b7886387368e9c8b72eb8dc074866bd30a0 /crt
parent797899802d5623a6ec05663c997a30e03dc27421 (diff)
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.
Diffstat (limited to 'crt')
1 files changed, 1 insertions, 0 deletions
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(*)());
_Noreturn void __dls2(unsigned char *base, size_t *sp)
__libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0);