2019-12-20 23:53:45

by Vitaly Chikunov

[permalink] [raw]
Subject: [PATCH v2] tools lib: Fix builds when glibc contains strlcpy

Disable a couple of compilation warning (which are treated as errors) on
strlcpy definition and declaration, allow users to compile perf and
kernel (objtool).

1. When glibc have strlcpy (such as in ALT Linux since 2004) objtool and
perf build fails with this (in gcc):

In file included from exec-cmd.c:3:
tools/include/linux/string.h:20:15: error: redundant redeclaration of ‘strlcpy’ [-Werror=redundant-decls]
20 | extern size_t strlcpy(char *dest, const char *src, size_t size);

2. Clang ignores `-Wredundant-decls', but produces another warning when
building perf:

CC util/string.o
../lib/string.c:99:8: error: attribute declaration must precede definition [-Werror,-Wignored-attributes]
size_t __weak strlcpy(char *dest, const char *src, size_t size)
../../tools/include/linux/compiler.h:66:34: note: expanded from macro '__weak'
# define __weak __attribute__((weak))
/usr/include/bits/string_fortified.h:151:8: note: previous definition is here
__NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,

Fixes: ce99091 ("perf tools: Move strlcpy() from perf to tools/lib/string.c")
Fixes: 0215d59 ("tools lib: Reinstate strlcpy() header guard with __UCLIBC__")
Signed-off-by: Vitaly Chikunov <[email protected]>
Cc: Dmitry V. Levin <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Vineet Gupta <[email protected]>
Cc: [email protected]
---
tools/include/linux/string.h | 3 +++
tools/lib/string.c | 3 +++
2 files changed, 6 insertions(+)

diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h
index 980cb9266718..99ede7f5dfb8 100644
--- a/tools/include/linux/string.h
+++ b/tools/include/linux/string.h
@@ -17,7 +17,10 @@ int strtobool(const char *s, bool *res);
* However uClibc headers also define __GLIBC__ hence the hack below
*/
#if defined(__GLIBC__) && !defined(__UCLIBC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wredundant-decls"
extern size_t strlcpy(char *dest, const char *src, size_t size);
+#pragma GCC diagnostic pop
#endif

char *str_error_r(int errnum, char *buf, size_t buflen);
diff --git a/tools/lib/string.c b/tools/lib/string.c
index f2ae1b87c719..65b569014446 100644
--- a/tools/lib/string.c
+++ b/tools/lib/string.c
@@ -96,6 +96,8 @@ int strtobool(const char *s, bool *res)
* If libc has strlcpy() then that version will override this
* implementation:
*/
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wignored-attributes"
size_t __weak strlcpy(char *dest, const char *src, size_t size)
{
size_t ret = strlen(src);
@@ -107,6 +109,7 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size)
}
return ret;
}
+#pragma GCC diagnostic pop

/**
* skip_spaces - Removes leading whitespace from @str.
--
2.11.0


2019-12-21 00:34:48

by Dmitry V. Levin

[permalink] [raw]
Subject: Re: [PATCH v2] tools lib: Fix builds when glibc contains strlcpy

On Sat, Dec 21, 2019 at 02:52:39AM +0300, Vitaly Chikunov wrote:
> Disable a couple of compilation warning (which are treated as errors) on
> strlcpy definition and declaration, allow users to compile perf and
> kernel (objtool).
>
> 1. When glibc have strlcpy (such as in ALT Linux since 2004) objtool and
> perf build fails with this (in gcc):
>
> In file included from exec-cmd.c:3:
> tools/include/linux/string.h:20:15: error: redundant redeclaration of ‘strlcpy’ [-Werror=redundant-decls]
> 20 | extern size_t strlcpy(char *dest, const char *src, size_t size);
>
> 2. Clang ignores `-Wredundant-decls', but produces another warning when
> building perf:
>
> CC util/string.o
> ../lib/string.c:99:8: error: attribute declaration must precede definition [-Werror,-Wignored-attributes]
> size_t __weak strlcpy(char *dest, const char *src, size_t size)
> ../../tools/include/linux/compiler.h:66:34: note: expanded from macro '__weak'
> # define __weak __attribute__((weak))
> /usr/include/bits/string_fortified.h:151:8: note: previous definition is here
> __NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,
>
> Fixes: ce99091 ("perf tools: Move strlcpy() from perf to tools/lib/string.c")
> Fixes: 0215d59 ("tools lib: Reinstate strlcpy() header guard with __UCLIBC__")
> Signed-off-by: Vitaly Chikunov <[email protected]>
> Cc: Dmitry V. Levin <[email protected]>
> Cc: Josh Poimboeuf <[email protected]>
> Cc: Vineet Gupta <[email protected]>
> Cc: [email protected]

Resolves: https://bugzilla.kernel.org/show_bug.cgi?id=118481
Reviewed-by: Dmitry V. Levin <[email protected]>


--
ldv

2019-12-24 13:53:27

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v2] tools lib: Fix builds when glibc contains strlcpy

Hi Vitaly,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[cannot apply to v5.5-rc3 next-20191220]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Vitaly-Chikunov/tools-lib-Fix-builds-when-glibc-contains-strlcpy/20191224-065724
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 46cf053efec6a3a5f343fead837777efe8252a46
config: x86_64-randconfig-a002-20191224 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.2-10+deb8u1) 4.9.2
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>

All errors (new ones prefixed by >>):

>> ../lib/string.c:100:9: error: unknown option after '#pragma GCC diagnostic' kind [-Werror=pragmas]
#pragma GCC diagnostic ignored "-Wignored-attributes"
^
cc1: all warnings being treated as errors
mv: cannot stat 'tools/objtool/.libstring.o.tmp': No such file or directory
make[4]: *** [tools/objtool/libstring.o] Error 1
make[4]: Target '__build' not remade because of errors.
make[3]: *** [tools/objtool/objtool-in.o] Error 2
make[3]: Target 'all' not remade because of errors.
make[2]: *** [objtool] Error 2
make[1]: *** [tools/objtool] Error 2
make[1]: Target 'prepare' not remade because of errors.
make: *** [sub-make] Error 2
10 real 22 user 11 sys 310.82% cpu make prepare

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/hyperkitty/list/[email protected] Intel Corporation


Attachments:
(No filename) (1.87 kB)
.config.gz (31.58 kB)
Download all attachments