diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-11-19 20:28:08 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-11-19 22:10:55 -0500 |
commit | 19caa25d0a8e587bb89b79c3f629085548709dd4 (patch) | |
tree | 479d4a303ea7a1a0d0efb511fa09d80730a7e513 /src/exit | |
parent | 4f3a92881aa1fd9a3ebebe2c9940d70c95a7b0e6 (diff) | |
download | musl-19caa25d0a8e587bb89b79c3f629085548709dd4.tar.gz musl-19caa25d0a8e587bb89b79c3f629085548709dd4.tar.xz musl-19caa25d0a8e587bb89b79c3f629085548709dd4.zip |
remove undef weak refs to init/fini array symbols in libc.so
commit ad1cd43a86645ba2d4f7c8747240452a349d6bc1 eliminated preprocessor-level omission of references to the init/fini array symbols from object files going into libc.so. the references are weak, and the intent was that the linker would resolve them to zero in libc.so, but instead it leaves undefined references that could be satisfied at runtime. normally these references would be harmless, since the code using them does not even get executed, but some older binutils versions produce a linking error: when linking a program against libc.so, ld first tries to use the hidden init/fini array symbols produced by the linker script to satisfy the references in libc.so, then produces an error because the definitions are hidden. ideally ld would have already provided definitions of these symbols when linking libc.so, but the linker script for -shared omits them. to avoid this situation, the dynamic linker now provides its own dummy definitions of the init/fini array symbols for libc.so. since they are hidden, everything binds at ld time and no references remain in the dynamic symbol table. with modern binutils and --gc-sections, both the dummy empty array objects and the code referencing them get dropped at link time, anyway. the _init and _fini symbols are also switched back to using weak definitions rather than weak references since the latter behave somewhat problematically in general, and the weak definition approach was known to work well.
Diffstat (limited to 'src/exit')
-rw-r--r-- | src/exit/exit.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/exit/exit.c b/src/exit/exit.c index b391f338..bf7835a1 100644 --- a/src/exit/exit.c +++ b/src/exit/exit.c @@ -10,17 +10,17 @@ static void dummy() * as a consequence of linking either __toread.c or __towrite.c. */ weak_alias(dummy, __funcs_on_exit); weak_alias(dummy, __stdio_exit); +weak_alias(dummy, _fini); -extern void _fini() __attribute__((weak)); -extern void (*const __fini_array_start)() __attribute__((weak)); -extern void (*const __fini_array_end)() __attribute__((weak)); +__attribute__((__weak__, __visibility__("hidden"))) +extern void (*const __fini_array_start)(void), (*const __fini_array_end)(void); static void libc_exit_fini(void) { uintptr_t a = (uintptr_t)&__fini_array_end; for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)())) (*(void (**)())(a-sizeof(void(*)())))(); - if (_fini) _fini(); + _fini(); } weak_alias(libc_exit_fini, __libc_exit_fini); |