My uclibc configs to reproduce the problem:
buildroot config is the original config from buildroot
x86-64 config is the config for general laptop

сб, 17 февр. 2024 г. в 18:43, Dmitry Chestnykh <dm.chestn...@gmail.com>:

> During buildroot compilation with latest uClibc
> I've encoutered linking error due to multiple definition
> of some symbols from DNS code.
> The error happens because the same file resolv.c
> is included inside many other .c files:
> res_comp.c:(.text+0x0): multiple definition of `__GI___dn_expand';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x8a0): first defined here
> res_comp.c:(.text+0x0): multiple definition of `__dn_expand';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x8a0): first defined here
> res_comp.c:(.text+0x34): multiple definition of `__GI___dn_comp';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xc68): first defined here
> res_comp.c:(.text+0x34): multiple definition of `__dn_comp';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xc68): first defined here
> ns_name.c:(.text+0x4c): multiple definition of `__GI___ns_name_ntop';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x4c): first defined here
> ns_name.c:(.text+0x4c): multiple definition of `__ns_name_ntop';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x4c): first defined here
> ns_name.c:(.text+0x1f8): multiple definition of `__GI___ns_name_pton';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x1f8): first defined here
> ns_name.c:(.text+0x1f8): multiple definition of `__ns_name_pton';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x1f8): first defined here
> ns_name.c:(.text+0x624): multiple definition of `__hnbad';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x624): first defined here
> ns_name.c:(.text+0x718): multiple definition of `__GI___ns_name_unpack';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x718): first defined here
> ns_name.c:(.text+0x718): multiple definition of `__ns_name_unpack';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x718): first defined here
> ns_name.c:(.text+0x84c): multiple definition of
> `__GI___ns_name_uncompress';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x84c): first defined here
> ns_name.c:(.text+0x84c): multiple definition of `__ns_name_uncompress';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x84c): first defined here
> ns_name.c:(.text+0x8a0): multiple definition of `__GI___ns_name_pack';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x8d4): first defined here
> ns_name.c:(.text+0x8a0): multiple definition of `__ns_name_pack';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0x8d4): first defined here
> ns_name.c:(.text+0xbe4): multiple definition of `__GI___ns_name_compress';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xc18): first defined here
> ns_name.c:(.text+0xbe4): multiple definition of `__ns_name_compress';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xc18): first defined here
> ns_name.c:(.text+0xc34): multiple definition of `__GI___ns_name_skip';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xcdc): first defined here
> ns_name.c:(.text+0xc34): multiple definition of `__ns_name_skip';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xcdc): first defined here
> ns_name.c:(.text+0xcd4): multiple definition of `__GI___dn_skipname';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xd7c): first defined here
> ns_name.c:(.text+0xcd4): multiple definition of `__dn_skipname';
> libc/libc_so.a(encodeq.os):encodeq.c:(.text+0xd7c): first defined here
> My previous commit that fixes build error of DNS code is okay,
> but there are some 'bottlenecks' in uClibc-ng code, so if
> we don't want to completely rewrite resolv.c we need to make some
> symbols weak to prevent linking errors.
>
> ---
>  libc/inet/resolv.c | 42 +++++++++++++++++++++---------------------
>  1 file changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
> index 37842021c..d7a659a8c 100644
> --- a/libc/inet/resolv.c
> +++ b/libc/inet/resolv.c
> @@ -2809,7 +2809,7 @@ libc_hidden_def(gethostbyaddr)
>   * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
>   * Return size of compressed name or -1 if there was an error.
>   */
> -int dn_expand(const u_char *msg, const u_char *eom, const u_char *src,
> +int weak_function dn_expand(const u_char *msg, const u_char *eom, const
> u_char *src,
>                                 char *dst, int dstsiz)
>  {
>         int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
> @@ -2818,14 +2818,14 @@ int dn_expand(const u_char *msg, const u_char
> *eom, const u_char *src,
>                 dst[0] = '\0';
>         return n;
>  }
> -libc_hidden_def(dn_expand)
> +libc_hidden_weak(dn_expand)
>
>  /*
>   * Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
>   * Return the size of the compressed name or -1.
>   * 'length' is the size of the array pointed to by 'comp_dn'.
>   */
> -int
> +int weak_function
>  dn_comp(const char *src, u_char *dst, int dstsiz,
>                 u_char **dnptrs, u_char **lastdnptr)
>  {
> @@ -2833,7 +2833,7 @@ dn_comp(const char *src, u_char *dst, int dstsiz,
>                         (const u_char **) dnptrs,
>                         (const u_char **) lastdnptr);
>  }
> -libc_hidden_def(dn_comp)
> +libc_hidden_weak(dn_comp)
>  #endif /* L_res_comp */
>
>
> @@ -2873,7 +2873,7 @@ static int special(int ch)
>   * note:
>   *      Root domain returns as "." not "".
>   */
> -int ns_name_uncompress(const u_char *msg, const u_char *eom,
> +int weak_function ns_name_uncompress(const u_char *msg, const u_char *eom,
>                 const u_char *src, char *dst, size_t dstsiz)
>  {
>         u_char tmp[NS_MAXCDNAME];
> @@ -2886,7 +2886,7 @@ int ns_name_uncompress(const u_char *msg, const
> u_char *eom,
>                 return -1;
>         return n;
>  }
> -libc_hidden_def(ns_name_uncompress)
> +libc_hidden_weak(ns_name_uncompress)
>
>  /*
>   * ns_name_ntop(src, dst, dstsiz)
> @@ -2897,7 +2897,7 @@ libc_hidden_def(ns_name_uncompress)
>   *      The root is returned as "."
>   *      All other domains are returned in non absolute form
>   */
> -int ns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
> +int weak_function ns_name_ntop(const u_char *src, char *dst, size_t
> dstsiz)
>  {
>         const u_char *cp;
>         char *dn, *eom;
> @@ -2967,7 +2967,7 @@ int ns_name_ntop(const u_char *src, char *dst,
> size_t dstsiz)
>         *dn++ = '\0';
>         return (dn - dst);
>  }
> -libc_hidden_def(ns_name_ntop)
> +libc_hidden_weak(ns_name_ntop)
>
>  static int encode_bitstring(const char **bp, const char *end,
>                                                         unsigned char
> **labelp,
> @@ -3081,7 +3081,7 @@ static int encode_bitstring(const char **bp, const
> char *end,
>         return 0;
>  }
>
> -int ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
> +int weak_function ns_name_pton(const char *src, u_char *dst, size_t
> dstsiz)
>  {
>         static const char digits[] = "0123456789";
>         u_char *label, *bp, *eom;
> @@ -3202,7 +3202,7 @@ int ns_name_pton(const char *src, u_char *dst,
> size_t dstsiz)
>         errno = EMSGSIZE;
>         return -1;
>  }
> -libc_hidden_def(ns_name_pton)
> +libc_hidden_weak(ns_name_pton)
>
>  /*
>   * __hnbad(dotted)
> @@ -3218,7 +3218,7 @@ libc_hidden_def(ns_name_pton)
>   * return:
>   *     0 if the name is ok
>   */
> -int __hnbad(const char *dotted)
> +int weak_function __hnbad(const char *dotted)
>  {
>         unsigned char c, n, *cp;
>         unsigned char buf[NS_MAXCDNAME];
> @@ -3255,7 +3255,7 @@ int __hnbad(const char *dotted)
>   * return:
>   *      -1 if it fails, or consumed octets if it succeeds.
>   */
> -int ns_name_unpack(const u_char *msg, const u_char *eom, const u_char
> *src,
> +int weak_function ns_name_unpack(const u_char *msg, const u_char *eom,
> const u_char *src,
>                 u_char *dst, size_t dstsiz)
>  {
>         const u_char *srcp, *dstlim;
> @@ -3322,7 +3322,7 @@ int ns_name_unpack(const u_char *msg, const u_char
> *eom, const u_char *src,
>                 len = srcp - src;
>         return len;
>  }
> -libc_hidden_def(ns_name_unpack)
> +libc_hidden_weak(ns_name_unpack)
>
>  static int labellen(const unsigned char *lp)
>  {
> @@ -3416,7 +3416,7 @@ next:
>         return -1;
>  }
>
> -int ns_name_pack(const unsigned char *src,
> +int weak_function ns_name_pack(const unsigned char *src,
>                                  unsigned char *dst, int dstsiz,
>                                  const unsigned char **dnptrs,
>                                  const unsigned char **lastdnptr)
> @@ -3525,9 +3525,9 @@ cleanup:
>
>         return dstp - dst;
>  }
> -libc_hidden_def(ns_name_pack)
> +libc_hidden_weak(ns_name_pack)
>
> -int ns_name_compress(const char *src,
> +int weak_function ns_name_compress(const char *src,
>                                          unsigned char *dst, size_t dstsiz,
>                                          const unsigned char **dnptrs,
>                                          const unsigned char **lastdnptr)
> @@ -3539,9 +3539,9 @@ int ns_name_compress(const char *src,
>
>         return ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr);
>  }
> -libc_hidden_def(ns_name_compress)
> +libc_hidden_weak(ns_name_compress)
>
> -int ns_name_skip(const unsigned char **ptrptr,
> +int weak_function ns_name_skip(const unsigned char **ptrptr,
>                                  const unsigned char *eom)
>  {
>         const unsigned char *cp;
> @@ -3583,9 +3583,9 @@ int ns_name_skip(const unsigned char **ptrptr,
>
>         return 0;
>  }
> -libc_hidden_def(ns_name_skip)
> +libc_hidden_weak(ns_name_skip)
>
> -int dn_skipname(const unsigned char *ptr, const unsigned char *eom)
> +int weak_function dn_skipname(const unsigned char *ptr, const unsigned
> char *eom)
>  {
>         const unsigned char *saveptr = ptr;
>
> @@ -3594,7 +3594,7 @@ int dn_skipname(const unsigned char *ptr, const
> unsigned char *eom)
>
>         return ptr - saveptr;
>  }
> -libc_hidden_def(dn_skipname)
> +libc_hidden_weak(dn_skipname)
>  #endif /* L_ns_name */
>
>
> --
> 2.43.2
>
>

Attachment: uclibc-buildroot-arm-build-fail.config
Description: Binary data

Attachment: uclibc-x86-64-build-fail.config
Description: Binary data

_______________________________________________
devel mailing list -- devel@uclibc-ng.org
To unsubscribe send an email to devel-le...@uclibc-ng.org

Reply via email to