fix visibility mismatch in dynamic linker stage 2 function definition
authorRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 21:38:54 +0000 (17:38 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 21:38:54 +0000 (17:38 -0400)
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
src/ldso/dynlink.c

index 5ac612d..9be117f 100644 (file)
@@ -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);
index cab3008..8025116 100644 (file)
@@ -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) {