From: https://dev.openwrt.org/ticket/11929 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -3580,35 +3580,6 @@ } #endif -/* This needs to be after the use of _res in res_init, above. */ -#undef _res - -#ifndef __UCLIBC_HAS_THREADS__ -/* The resolver state for use by single-threaded programs. - This differs from plain `struct __res_state _res;' in that it doesn't - create a common definition, but a plain symbol that resides in .bss, - which can have an alias. */ -struct __res_state _res __attribute__((section (".bss"))); -struct __res_state *__resp = &_res; -#else /* __UCLIBC_HAS_THREADS__ */ -struct __res_state _res __attribute__((section (".bss"))) attribute_hidden; - -# if defined __UCLIBC_HAS_TLS__ -# undef __resp -__thread struct __res_state *__resp = &_res; -/* - * FIXME: Add usage of hidden attribute for this when used in the shared - * library. It currently crashes the linker when doing section - * relocations. - */ -extern __thread struct __res_state *__libc_resp - __attribute__ ((alias ("__resp"))) attribute_hidden; -# else -# undef __resp -struct __res_state *__resp = &_res; -# endif -#endif /* !__UCLIBC_HAS_THREADS__ */ - static unsigned int res_randomid(void) { @@ -3664,6 +3635,36 @@ } libc_hidden_def(res_init) +/* This needs to be after the use of _res in res_init, above. */ +#undef _res + +#ifndef __UCLIBC_HAS_THREADS__ +/* The resolver state for use by single-threaded programs. + This differs from plain `struct __res_state _res;' in that it doesn't + create a common definition, but a plain symbol that resides in .bss, + which can have an alias. */ +struct __res_state _res __attribute__((section (".bss"))); +struct __res_state *__resp = &_res; +#else /* __UCLIBC_HAS_THREADS__ */ +struct __res_state _res __attribute__((section (".bss"))) attribute_hidden; + +# if defined __UCLIBC_HAS_TLS__ +# undef __resp +__thread struct __res_state *__resp = &_res; +/* + * FIXME: Add usage of hidden attribute for this when used in the shared + * library. It currently crashes the linker when doing section + * relocations. + */ +extern __thread struct __res_state *__libc_resp + __attribute__ ((alias ("__resp"))) attribute_hidden; +# else +# undef __resp +struct __res_state *__resp = &_res; +# endif +#endif /* !__UCLIBC_HAS_THREADS__ */ + + /* * Set up default settings. If the configuration file exist, the values * there will have precedence. Otherwise, the server address is set to