openembedded / meta-openembedded

MIT License
402 stars 700 forks source link

libidn: build errors #806

Open amuetzel opened 6 months ago

amuetzel commented 6 months ago

When building libidn (not libidn2!) on nanbield (MACHINE = "qemux86-64"), I am observing two build errors.

No changes to the recipe happened between my state and master, so I do not expect differences w/ respect to the outcome. But if necessary, I'll reproduce the error on scarthgap.

First Error: -Werror=format-security

The first one is related to the -Werror=format-security build option (see log below). I had a look at the history and noticed that the error was previously fixed by a patch that was removed in 910c70a160cca64935035e925c76645f2203ca2f.

The commit message only mentions that the patch is "unneeded", but reintroducing the patch fixes the error for me - so I am wondering what was the reason for the removal of this patch?

Error Message ``` [...] | libtool: compile: x86_64-poky-linux-gcc -m64 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -fstack-protector-strong -Os -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/build/tmp/work/core2-64-poky-linux/libidn/1.41/recipe-sysroot -DHAVE_CONFIG_H -I. -I../../libidn-1.41/src -I.. -I../../libidn-1.41/lib -I../lib -I../../libidn-1.41/gl -I../gl -DLOCALEDIR=\"/usr/share/locale\" -Os -pipe -g -feliminate-unused-debug-types -fcanon-prefix-map -fmacro-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/libidn-1.41=/usr/src/debug/libidn/1.41-r0 -fdebug-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/libidn-1.41=/usr/src/debug/libidn/1.41-r0 -fmacro-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/build=/usr/src/debug/libidn/1.41-r0 -fdebug-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/build=/usr/src/debug/libidn/1.41-r0 -fdebug-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/recipe-sysroot= -fmacro-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/recipe-sysroot= -fdebug-prefix-map=/build/tmp/work/core2-64-poky-linux/libidn/1.41/recipe-sysroot-native= -ffunction-sections -fdata-sections -c ../../libidn-1.41/src/idn_cmd.c -fPIC -DPIC -o .libs/libidn_cmd_la-idn_cmd.o | ../../libidn-1.41/src/idn.c: In function 'usage': | ../../libidn-1.41/src/idn.c:66:14: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 66 | program_name); | | ^~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:69:7: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 69 | printf (_("\ | | ^~~~~~ | In file included from ../../libidn-1.41/src/idn.c:34: | ../../libidn-1.41/src/idn.c: In function 'main': | ../../libidn-1.41/gl/gettext.h:89:25: warning: statement with no effect [-Wunused-value] | 89 | ((void) (Domainname), (const char *) (Dirname)) | | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:137:3: note: in expansion of macro 'bindtextdomain' | 137 | bindtextdomain (PACKAGE, LOCALEDIR); | | ^~~~~~~~~~~~~~ | ../../libidn-1.41/gl/gettext.h:86:34: warning: statement with no effect [-Wunused-value] | 86 | # define textdomain(Domainname) ((const char *) (Domainname)) | | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:138:3: note: in expansion of macro 'textdomain' | 138 | textdomain (PACKAGE); | | ^~~~~~~~~~ | ../../libidn-1.41/src/idn.c:173:14: error: format not a string literal and no format arguments [-Werror=format-security] | 173 | _("only one of -s, -e, -d, -a, -u or -n can be specified")); | | ^ | ../../libidn-1.41/src/idn.c:182:5: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 182 | fprintf (stderr, _("Charset: %s\n"), stringprep_locale_charset ()); | | ^~~~~~~ | ../../libidn-1.41/src/idn.c:186:5: error: format not a string literal and no format arguments [-Werror=format-security] | 186 | fprintf (stderr, _("Type each input string on a line by itself, " | | ^~~~~~~ | ../../libidn-1.41/src/idn.c:198:11: error: format not a string literal and no format arguments [-Werror=format-security] | 198 | error (EXIT_FAILURE, errno, _("input error")); | | ^~~~~ | ../../libidn-1.41/src/idn.c:210:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 210 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:217:22: error: format not a string literal and no format arguments [-Werror=format-security] | 217 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:235:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 235 | stringprep_strerror (rc)); | | ^~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:242:22: error: format not a string literal and no format arguments [-Werror=format-security] | 242 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:258:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 258 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:273:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 273 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:279:20: error: format not a string literal and no format arguments [-Werror=format-security] | 279 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:294:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 294 | punycode_strerror (rc)); | | ^~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:301:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 301 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:322:22: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 322 | punycode_strerror (rc)); | | ^~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:338:20: error: format not a string literal and no format arguments [-Werror=format-security] | 338 | _("could not convert from UCS-4 to UTF-8")); | | ^ | ../../libidn-1.41/src/idn.c:344:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 344 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:356:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 356 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:362:20: error: format not a string literal and no format arguments [-Werror=format-security] | 362 | _("could not convert from UCS-4 to UTF-8")); | | ^ | ../../libidn-1.41/src/idn.c:380:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 380 | idna_strerror (rc)); | | ^~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:394:24: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 394 | idna_strerror (rc)); | | ^~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:408:24: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 408 | (unsigned long) errpos, tld_strerror (rc)); | | ^ | ../../libidn-1.41/src/idn.c:411:24: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 411 | tld_strerror (rc)); | | ^~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:433:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 433 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:440:22: error: format not a string literal and no format arguments [-Werror=format-security] | 440 | _("could not convert from UCS-4 to UTF-8")); | | ^ | ../../libidn-1.41/src/idn.c:460:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 460 | idna_strerror (rc)); | | ^~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:481:26: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 481 | (unsigned long) errpos, tld_strerror (rc)); | | ^ | ../../libidn-1.41/src/idn.c:487:26: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 487 | tld_strerror (rc)); | | ^~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:496:20: error: format not a string literal and no format arguments [-Werror=format-security] | 496 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:502:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 502 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:514:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 514 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ | ../../libidn-1.41/src/idn.c:525:26: error: format not a string literal and no format arguments [-Werror=format-security] | 525 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:538:13: error: format not a string literal and no format arguments [-Werror=format-security] | 538 | error (EXIT_FAILURE, 0, _("could not do NFKC normalization")); | | ^~~~~ | ../../libidn-1.41/src/idn.c:549:26: error: format not a string literal and no format arguments [-Werror=format-security] | 549 | _("could not convert from UTF-8 to UCS-4")); | | ^ | ../../libidn-1.41/src/idn.c:563:20: warning: format not a string literal, argument types not checked [-Wformat-nonliteral] | 563 | stringprep_locale_charset ()); | | ^~~~~~~~~~~~~~~~~~~~~~~~~ [...] ```

Second Error: Documentation Build

If the first error is fixed by re-introducing the patch, the error (see below) occurs. Basically, the Makefile is executing the built idn binary to get the help text for the documentation (idn --help).

This is done without regards to cross-compilation - if the host and target architecture are the same (as is the case in my build), this leads to an error because the executable won't find the library libidn.so.12, which is located next to it and, thus, not in the search path. I haven't tried it on other ARCHes yet, but fully expect a build error here due to differing architectures.

I see two possible solutions:

Error Message ``` [...] | make[2]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/src' | Making all in doc | make[2]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | make all-recursive | make[3]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | Making all in specifications | make[4]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/specifications' | make[4]: Nothing to be done for 'all'. | make[4]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/specifications' | Making all in tld | make[4]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/tld' | make[4]: Nothing to be done for 'all'. | make[4]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/tld' | Making all in java | make[4]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/java' | make[4]: Nothing to be done for 'all'. | make[4]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/java' | Making all in cyclo | make[4]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/cyclo' | make[4]: Nothing to be done for 'all'. | make[4]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc/cyclo' | make[4]: Entering directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | ../src/idn --help | /build/tmp/hosttools/grep '^ *-' > tmp && \ | mv tmp idn-help.texi | ../src/idn: line 117: /build/tmp/work/core2-64-poky-linux/libidn/1.41/build/src/.libs/idn: cannot execute: required file not found | make[4]: *** [Makefile:2282: idn-help.texi] Error 1 | make[4]: *** Waiting for unfinished jobs.... | make[4]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | make[3]: *** [Makefile:1888: all-recursive] Error 1 | make[3]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | make[2]: *** [Makefile:1616: all] Error 2 | make[2]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build/doc' | make[1]: *** [Makefile:1597: all-recursive] Error 1 | make[1]: Leaving directory '/build/tmp/work/core2-64-poky-linux/libidn/1.41/build' | make: *** [Makefile:1523: all] Error 2 | ERROR: oe_runmake failed | WARNING: exit code 1 from a shell command. ERROR: Task (/build/../work/layers/external/meta-openembedded/meta-oe/recipes-extended/libidn/libidn_1.41.bb:do_compile) failed with exit code '1' ```

Fix

For me, re-introducing the patch and disabling the documentation build solves the issues and makes the package build fine. If you think this is a viable fix (and/or the second solution for the doc problem is better), I can prepare a PR.