package/kvm-unit-tests: really fix build on Arch Linux x86_64
diff mbox series

Message ID 20191117184114.1917-1-arnout@mind.be
State Accepted
Headers show
Series
  • package/kvm-unit-tests: really fix build on Arch Linux x86_64
Related show

Commit Message

Arnout Vandecappelle Nov. 17, 2019, 6:41 p.m. UTC
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.

Commit c0ffd16e4 tried to do this, but got the condition wrong:
-fno-stack-protector was passed in all cases *except* for x86_64. This
commit fixes that, by inverting the condition and moving the
--cross-prefix part to the else branch.

Fixes: (no new autobuild failures yet)

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Cc: Matthew Weber <matthew.weber@rockwellcollins.com>
---
 package/kvm-unit-tests/kvm-unit-tests.mk | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Matthew Weber Nov. 18, 2019, 2:45 p.m. UTC | #1
On Sun, Nov 17, 2019 at 12:41 PM Arnout Vandecappelle (Essensium/Mind)
<arnout@mind.be> wrote:
>
> 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.
>
> Commit c0ffd16e4 tried to do this, but got the condition wrong:
> -fno-stack-protector was passed in all cases *except* for x86_64. This
> commit fixes that, by inverting the condition and moving the
> --cross-prefix part to the else branch.
>
> Fixes: (no new autobuild failures yet)
>
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
> Cc: Matthew Weber <matthew.weber@rockwellcollins.com>

Oops, I'm pretty sure I tested this with that condition set
incorrectly.  I wonder if we have something else going on that masked
the problem because of commit c0ffd16e4  addition of
"$(KVM_UNIT_TESTS_MAKE_OPTS)" to the build/install cmds.

Reviewed-by: Matthew Weber <matthew.weber@rockwellcollins.com>

> ---
>  package/kvm-unit-tests/kvm-unit-tests.mk | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk
> index bb08c0603d..2637066701 100644
> --- a/package/kvm-unit-tests/kvm-unit-tests.mk
> +++ b/package/kvm-unit-tests/kvm-unit-tests.mk
> @@ -35,13 +35,14 @@ KVM_UNIT_TESTS_CONF_OPTS =\
>  # compiler. However, for x86-64, we use the host compiler, as
>  # kvm-unit-tests builds 32 bit code, which Buildroot toolchains for
>  # x86-64 cannot do.
> -ifneq ($(BR2_x86_64),y)
> -KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
> +ifeq ($(BR2_x86_64),y)
>  # Arch Linux adds -fstack-protector even when building with -ffreestanding, but
>  # it doesn't link with the stack-protector library when -nostdlib is passed,
>  # which leads to a link error. Therefore, disable it explicitly to work around
>  # this bug in Arch Linux. https://bugs.archlinux.org/task/64270
>  KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector
> +else
> +KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
>  endif
>
>  define KVM_UNIT_TESTS_CONFIGURE_CMDS
> --
> 2.21.0
>
Matthew Weber Nov. 18, 2019, 5:51 p.m. UTC | #2
Arnout,


On Mon, Nov 18, 2019 at 8:45 AM Matthew Weber
<matthew.weber@rockwellcollins.com> wrote:
>
> On Sun, Nov 17, 2019 at 12:41 PM Arnout Vandecappelle (Essensium/Mind)
> <arnout@mind.be> wrote:
> >
> > 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.
> >
> > Commit c0ffd16e4 tried to do this, but got the condition wrong:
> > -fno-stack-protector was passed in all cases *except* for x86_64. This
> > commit fixes that, by inverting the condition and moving the
> > --cross-prefix part to the else branch.
> >
> > Fixes: (no new autobuild failures yet)
> >
> > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> > Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
> > Cc: Matthew Weber <matthew.weber@rockwellcollins.com>
>
> Oops, I'm pretty sure I tested this with that condition set
> incorrectly.  I wonder if we have something else going on that masked
> the problem because of commit c0ffd16e4  addition of
> "$(KVM_UNIT_TESTS_MAKE_OPTS)" to the build/install cmds.

Disregard that statement above about build/install cmds, I did a build
test and it still fails with current master.

I've applied this patch and my Arch Linux build passes.
Tested-by: Matthew Weber <matthew.weber@rockwellcollins.com>

>
> Reviewed
>
> > ---
> >  package/kvm-unit-tests/kvm-unit-tests.mk | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk
> > index bb08c0603d..2637066701 100644
> > --- a/package/kvm-unit-tests/kvm-unit-tests.mk
> > +++ b/package/kvm-unit-tests/kvm-unit-tests.mk
> > @@ -35,13 +35,14 @@ KVM_UNIT_TESTS_CONF_OPTS =\
> >  # compiler. However, for x86-64, we use the host compiler, as
> >  # kvm-unit-tests builds 32 bit code, which Buildroot toolchains for
> >  # x86-64 cannot do.
> > -ifneq ($(BR2_x86_64),y)
> > -KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
> > +ifeq ($(BR2_x86_64),y)
> >  # Arch Linux adds -fstack-protector even when building with -ffreestanding, but
> >  # it doesn't link with the stack-protector library when -nostdlib is passed,
> >  # which leads to a link error. Therefore, disable it explicitly to work around
> >  # this bug in Arch Linux. https://bugs.archlinux.org/task/64270
> >  KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector
> > +else
> > +KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
> >  endif
> >
> >  define KVM_UNIT_TESTS_CONFIGURE_CMDS
> > --
> > 2.21.0
> >
Matthew Weber Nov. 22, 2019, 5:40 p.m. UTC | #3
On Sun, Nov 17, 2019 at 12:41 PM Arnout Vandecappelle (Essensium/Mind)
<arnout@mind.be> wrote:
>
> 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.
>
> Commit c0ffd16e4 tried to do this, but got the condition wrong:
> -fno-stack-protector was passed in all cases *except* for x86_64. This
> commit fixes that, by inverting the condition and moving the
> --cross-prefix part to the else branch.
>
> Fixes: (no new autobuild failures yet)

Fixes:
http://autobuild.buildroot.net/results/ca9576721214ecdce5622f2b7ec4fd4fc3699ac0/

>
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
> Cc: Matthew Weber <matthew.weber@rockwellcollins.com>
> ---
>  package/kvm-unit-tests/kvm-unit-tests.mk | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk
> index bb08c0603d..2637066701 100644
> --- a/package/kvm-unit-tests/kvm-unit-tests.mk
> +++ b/package/kvm-unit-tests/kvm-unit-tests.mk
> @@ -35,13 +35,14 @@ KVM_UNIT_TESTS_CONF_OPTS =\
>  # compiler. However, for x86-64, we use the host compiler, as
>  # kvm-unit-tests builds 32 bit code, which Buildroot toolchains for
>  # x86-64 cannot do.
> -ifneq ($(BR2_x86_64),y)
> -KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
> +ifeq ($(BR2_x86_64),y)
>  # Arch Linux adds -fstack-protector even when building with -ffreestanding, but
>  # it doesn't link with the stack-protector library when -nostdlib is passed,
>  # which leads to a link error. Therefore, disable it explicitly to work around
>  # this bug in Arch Linux. https://bugs.archlinux.org/task/64270
>  KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector
> +else
> +KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
>  endif
>
>  define KVM_UNIT_TESTS_CONFIGURE_CMDS
> --
> 2.21.0
>
Peter Korsgaard Nov. 22, 2019, 10:31 p.m. UTC | #4
>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:

 > 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.

 > Commit c0ffd16e4 tried to do this, but got the condition wrong:
 > -fno-stack-protector was passed in all cases *except* for x86_64. This
 > commit fixes that, by inverting the condition and moving the
 > --cross-prefix part to the else branch.

 > Fixes: (no new autobuild failures yet)

 > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
 > Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
 > Cc: Matthew Weber <matthew.weber@rockwellcollins.com>

Committed, thanks.
Peter Korsgaard Nov. 29, 2019, 3:58 p.m. UTC | #5
>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:

 > 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.

 > Commit c0ffd16e4 tried to do this, but got the condition wrong:
 > -fno-stack-protector was passed in all cases *except* for x86_64. This
 > commit fixes that, by inverting the condition and moving the
 > --cross-prefix part to the else branch.

 > Fixes: (no new autobuild failures yet)

 > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
 > Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com>
 > Cc: Matthew Weber <matthew.weber@rockwellcollins.com>

Committed to 2019.02.x and 2019.08.x, thanks.

Patch
diff mbox series

diff --git a/package/kvm-unit-tests/kvm-unit-tests.mk b/package/kvm-unit-tests/kvm-unit-tests.mk
index bb08c0603d..2637066701 100644
--- a/package/kvm-unit-tests/kvm-unit-tests.mk
+++ b/package/kvm-unit-tests/kvm-unit-tests.mk
@@ -35,13 +35,14 @@  KVM_UNIT_TESTS_CONF_OPTS =\
 # compiler. However, for x86-64, we use the host compiler, as
 # kvm-unit-tests builds 32 bit code, which Buildroot toolchains for
 # x86-64 cannot do.
-ifneq ($(BR2_x86_64),y)
-KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
+ifeq ($(BR2_x86_64),y)
 # Arch Linux adds -fstack-protector even when building with -ffreestanding, but
 # it doesn't link with the stack-protector library when -nostdlib is passed,
 # which leads to a link error. Therefore, disable it explicitly to work around
 # this bug in Arch Linux. https://bugs.archlinux.org/task/64270
 KVM_UNIT_TESTS_MAKE_OPTS += EXTRA_CFLAGS=-fno-stack-protector
+else
+KVM_UNIT_TESTS_CONF_OPTS += --cross-prefix="$(TARGET_CROSS)"
 endif
 
 define KVM_UNIT_TESTS_CONFIGURE_CMDS