Message ID | 20190525222209.14372-1-fontaine.fabrice@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [v2,1/1] package/kvm-unit-tests: fix build without ssp on x86_64 | expand |
On 26/05/2019 00:22, Fabrice Fontaine wrote: > Makefile tries to detect stack-protector which will result in build > failure on x86_64 if ssp is not available on host compiler so disable > stack protector through EXTRA_CFLAGS I would like to actually understand the failure though... The error is: /usr/bin/ld: x86/realmode.o: in function `print_serial_u32': .../x86/realmode.c:104: undefined reference to `__stack_chk_fail' However, realmode.c is built with gcc -mno-red-zone -m32 -O1 -g -MMD -MF x86/.realmode.d -Wall -Wwrite-strings -Wclobbered -Wempty-body -Wuninitialized -Wignored-qualifiers -Wunused-but-set-parameter -fno-omit-frame-pointer -Wno-frame-address -fno-pic -no-pie -Wmissing-parameter-type -Wold-style-declaration -Woverride-init -std=gnu99 -ffreestanding -I /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib -I /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib/x86 -I lib -c -o x86/realmode.o x86/realmode.c So, stack-protector is *not* enabled... So what the hell is going on here? It seems to only happen on Xogium's Arch Linux server. Maybe there's something weird going on with that server? Regards, Arnout > > Fixes: > - http://autobuild.buildroot.org/results/e6f767755ffdb5ecc014eb5ad7519814f075a60e > > Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> > --- > Changes v1 -> v2 (after review of Peter Korsgaard): > - Always disable stack-protector on x86_64 as we're using host compiler > > package/kvm-unit-tests/kvm-unit-tests.mk | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk > index 92d67fb34b..72762d21f2 100644 > --- a/package/kvm-unit-tests/kvm-unit-tests.mk > +++ b/package/kvm-unit-tests/kvm-unit-tests.mk > @@ -37,6 +37,8 @@ KVM_UNIT_TESTS_CONF_OPTS =\ > # x86-64 cannot do. > ifneq ($(BR2_x86_64),y) > KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)" > +# Don't force -fstack-protector as we don't know if host compiler supports ssp > +KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector > endif > > define KVM_UNIT_TESTS_CONFIGURE_CMDS > @@ -44,11 +46,12 @@ define KVM_UNIT_TESTS_CONFIGURE_CMDS > endef > > define KVM_UNIT_TESTS_BUILD_CMDS > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) standalone > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > + standalone > endef > > define KVM_UNIT_TESTS_INSTALL_TARGET_CMDS > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \ > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > DESTDIR=$(TARGET_DIR)/usr/share/kvm-unit-tests/ \ > install > endef >
Arnout, All, On 2019-05-26 20:20 +0200, Arnout Vandecappelle spake thusly: > On 26/05/2019 00:22, Fabrice Fontaine wrote: > > Makefile tries to detect stack-protector which will result in build > > failure on x86_64 if ssp is not available on host compiler so disable > > stack protector through EXTRA_CFLAGS > > I would like to actually understand the failure though... The error is: > > /usr/bin/ld: x86/realmode.o: in function `print_serial_u32': > .../x86/realmode.c:104: undefined reference to `__stack_chk_fail' > > However, realmode.c is built with > > gcc -mno-red-zone -m32 -O1 -g -MMD -MF x86/.realmode.d -Wall -Wwrite-strings > -Wclobbered -Wempty-body -Wuninitialized -Wignored-qualifiers > -Wunused-but-set-parameter -fno-omit-frame-pointer -Wno-frame-address > -fno-pic -no-pie -Wmissing-parameter-type -Wold-style-declaration > -Woverride-init -std=gnu99 -ffreestanding -I > /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib > -I > /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib/x86 > -I lib -c -o x86/realmode.o x86/realmode.c > > So, stack-protector is *not* enabled... So what the hell is going on here? > > It seems to only happen on Xogium's Arch Linux server. Maybe there's something > weird going on with that server? That's because: - kvm-unit-tests, on x86_64 target, uses the host compiler to build: https://git.buildroot.org/buildroot/tree/package/kvm-unit-tests/kvm-unit-tests.mk#n34 - Xogium's autobuilder is running Arch Linux, which enables SSP by default, yes. Regards, Yann E. MORIN. > Regards, > Arnout > > > > > Fixes: > > - http://autobuild.buildroot.org/results/e6f767755ffdb5ecc014eb5ad7519814f075a60e > > > > Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> > > --- > > Changes v1 -> v2 (after review of Peter Korsgaard): > > - Always disable stack-protector on x86_64 as we're using host compiler > > > > package/kvm-unit-tests/kvm-unit-tests.mk | 7 +++++-- > > 1 file changed, 5 insertions(+), 2 deletions(-) > > > > diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk > > index 92d67fb34b..72762d21f2 100644 > > --- a/package/kvm-unit-tests/kvm-unit-tests.mk > > +++ b/package/kvm-unit-tests/kvm-unit-tests.mk > > @@ -37,6 +37,8 @@ KVM_UNIT_TESTS_CONF_OPTS =\ > > # x86-64 cannot do. > > ifneq ($(BR2_x86_64),y) > > KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)" > > +# Don't force -fstack-protector as we don't know if host compiler supports ssp > > +KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector > > endif > > > > define KVM_UNIT_TESTS_CONFIGURE_CMDS > > @@ -44,11 +46,12 @@ define KVM_UNIT_TESTS_CONFIGURE_CMDS > > endef > > > > define KVM_UNIT_TESTS_BUILD_CMDS > > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) standalone > > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > > + standalone > > endef > > > > define KVM_UNIT_TESTS_INSTALL_TARGET_CMDS > > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \ > > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > > DESTDIR=$(TARGET_DIR)/usr/share/kvm-unit-tests/ \ > > install > > endef > > > _______________________________________________ > buildroot mailing list > buildroot@busybox.net > http://lists.busybox.net/mailman/listinfo/buildroot
On 01/06/2019 15:34, Yann E. MORIN wrote: > Arnout, All, > > On 2019-05-26 20:20 +0200, Arnout Vandecappelle spake thusly: >> On 26/05/2019 00:22, Fabrice Fontaine wrote: >>> Makefile tries to detect stack-protector which will result in build >>> failure on x86_64 if ssp is not available on host compiler so disable >>> stack protector through EXTRA_CFLAGS >> >> I would like to actually understand the failure though... The error is: >> >> /usr/bin/ld: x86/realmode.o: in function `print_serial_u32': >> .../x86/realmode.c:104: undefined reference to `__stack_chk_fail' >> >> However, realmode.c is built with >> >> gcc -mno-red-zone -m32 -O1 -g -MMD -MF x86/.realmode.d -Wall -Wwrite-strings >> -Wclobbered -Wempty-body -Wuninitialized -Wignored-qualifiers >> -Wunused-but-set-parameter -fno-omit-frame-pointer -Wno-frame-address >> -fno-pic -no-pie -Wmissing-parameter-type -Wold-style-declaration >> -Woverride-init -std=gnu99 -ffreestanding -I >> /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib >> -I >> /data/buildroot/buildroot-test/instance-1/output/build/kvm-unit-tests-kvm-unit-tests-20171020/lib/x86 >> -I lib -c -o x86/realmode.o x86/realmode.c >> >> So, stack-protector is *not* enabled... So what the hell is going on here? >> >> It seems to only happen on Xogium's Arch Linux server. Maybe there's something >> weird going on with that server? > > That's because: > > - kvm-unit-tests, on x86_64 target, uses the host compiler to build: > https://git.buildroot.org/buildroot/tree/package/kvm-unit-tests/kvm-unit-tests.mk#n34 > > - Xogium's autobuilder is running Arch Linux, which enables SSP by > default, yes. ... and it does that in a way that is incompatible with -nostdlib, apparently? Ubuntu also enables stack-protector by default (since 12.10 I think), so why doesn't it happen on Ubuntu? Smells like a broken distro to me... Xogium, could you investigate this? Or someone else with Arch? Regards, Arnout
On 26/05/2019 00:22, Fabrice Fontaine wrote: > Makefile tries to detect stack-protector which will result in build > failure on x86_64 if ssp is not available on host compiler so disable > stack protector through EXTRA_CFLAGS > > Fixes: > - http://autobuild.buildroot.org/results/e6f767755ffdb5ecc014eb5ad7519814f075a60e > > Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> After more testing by Matt, applied to master with an updated commit message: package/kvm-unit-tests: fix build on Arch Linux x86_64 On x86_64, we use the host compiler instead of the target compiler to build kvm-unit-tests, because it is built with -m32 and our target compiler doesn't support that. However, the compiler on Arch Linux is broken: it *always* builds with -fstack-protector, even when -ffreestanding is passed. However, when -fnostdlib is passed at link time (which is normally the case when building with -ffreestanding), it is not linked with the stack-protector library. This leads to a link time error: /usr/bin/ld: x86/realmode.o: in function `print_serial_u32': .../x86/realmode.c:104: undefined reference to `__stack_chk_fail' Since the entire package is built with -ffreestanding, it doesn't support stack-protector at all. Therefore, simply pass -fno-stack-protector explicitly on x86_64 to work around the bug in Arch Linux. Bug reported upstream: https://bugs.archlinux.org/task/64270 Thanks everybody for investigating this. Regards, Arnout > --- > Changes v1 -> v2 (after review of Peter Korsgaard): > - Always disable stack-protector on x86_64 as we're using host compiler > > package/kvm-unit-tests/kvm-unit-tests.mk | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk > index 92d67fb34b..72762d21f2 100644 > --- a/package/kvm-unit-tests/kvm-unit-tests.mk > +++ b/package/kvm-unit-tests/kvm-unit-tests.mk > @@ -37,6 +37,8 @@ KVM_UNIT_TESTS_CONF_OPTS =\ > # x86-64 cannot do. > ifneq ($(BR2_x86_64),y) > KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)" > +# Don't force -fstack-protector as we don't know if host compiler supports ssp > +KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector > endif > > define KVM_UNIT_TESTS_CONFIGURE_CMDS > @@ -44,11 +46,12 @@ define KVM_UNIT_TESTS_CONFIGURE_CMDS > endef > > define KVM_UNIT_TESTS_BUILD_CMDS > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) standalone > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > + standalone > endef > > define KVM_UNIT_TESTS_INSTALL_TARGET_CMDS > - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \ > + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ > DESTDIR=$(TARGET_DIR)/usr/share/kvm-unit-tests/ \ > install > endef >
>>>>> "Arnout" == Arnout Vandecappelle <arnout@mind.be> writes: > On 26/05/2019 00:22, Fabrice Fontaine wrote: >> Makefile tries to detect stack-protector which will result in build >> failure on x86_64 if ssp is not available on host compiler so disable >> stack protector through EXTRA_CFLAGS >> >> Fixes: >> - http://autobuild.buildroot.org/results/e6f767755ffdb5ecc014eb5ad7519814f075a60e >> >> Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> > After more testing by Matt, applied to master with an updated commit message: > package/kvm-unit-tests: fix build on Arch Linux x86_64 > On x86_64, we use the host compiler instead of the target compiler to > build kvm-unit-tests, because it is built with -m32 and our target > compiler doesn't support that. > However, the compiler on Arch Linux is broken: it *always* builds with > -fstack-protector, even when -ffreestanding is passed. However, when > -fnostdlib is passed at link time (which is normally the case when > building with -ffreestanding), it is not linked with the stack-protector > library. This leads to a link time error: > /usr/bin/ld: x86/realmode.o: in function `print_serial_u32': > .../x86/realmode.c:104: undefined reference to `__stack_chk_fail' > Since the entire package is built with -ffreestanding, it doesn't > support stack-protector at all. Therefore, simply pass > -fno-stack-protector explicitly on x86_64 to work around the bug in Arch > Linux. > Bug reported upstream: https://bugs.archlinux.org/task/64270 Committed to 2019.02.x and 2019.08.x, thanks.
diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk index 92d67fb34b..72762d21f2 100644 --- a/package/kvm-unit-tests/kvm-unit-tests.mk +++ b/package/kvm-unit-tests/kvm-unit-tests.mk @@ -37,6 +37,8 @@ KVM_UNIT_TESTS_CONF_OPTS =\ # x86-64 cannot do. ifneq ($(BR2_x86_64),y) KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)" +# Don't force -fstack-protector as we don't know if host compiler supports ssp +KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector endif define KVM_UNIT_TESTS_CONFIGURE_CMDS @@ -44,11 +46,12 @@ define KVM_UNIT_TESTS_CONFIGURE_CMDS endef define KVM_UNIT_TESTS_BUILD_CMDS - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) standalone + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ + standalone endef define KVM_UNIT_TESTS_INSTALL_TARGET_CMDS - $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \ + $(TARGET_MAKE_ENV) $(MAKE) $(KVM_UNIT_TESTS_MAKE_OPTS) -C $(@D) \ DESTDIR=$(TARGET_DIR)/usr/share/kvm-unit-tests/ \ install endef
Makefile tries to detect stack-protector which will result in build failure on x86_64 if ssp is not available on host compiler so disable stack protector through EXTRA_CFLAGS Fixes: - http://autobuild.buildroot.org/results/e6f767755ffdb5ecc014eb5ad7519814f075a60e Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> --- Changes v1 -> v2 (after review of Peter Korsgaard): - Always disable stack-protector on x86_64 as we're using host compiler package/kvm-unit-tests/kvm-unit-tests.mk | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)