disable-pie build

Michael Tokarev posted 1 patch 1 year ago
Failed in applying to current master (apply log)
disable-pie build
Posted by Michael Tokarev 1 year ago
Hi!

It looks like --disable-pie configure, which uses -fno-pie -no-pie flags
for the compiler, is broken: it does not not tell the *linker* about the
option, so the link fails (at least on debian bookworm):

/usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with 
-fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value

This is failing for *all* executables, including tests, qemu-img, etc.

The following change fixes it:

diff --git a/meson.build b/meson.build
index a9c4f28247..0b7ca45d48 100644
--- a/meson.build
+++ b/meson.build
@@ -278,7 +278,8 @@ endif
  # tries to build an executable instead of a shared library and fails.  So
  # don't add -no-pie anywhere and cross fingers. :(
  if not get_option('b_pie')
-  qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
+  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
+  qemu_ldflags += cc.get_supported_arguments('-no-pie')
  endif

  if not get_option('stack_protector').disabled()
Re: disable-pie build
Posted by Paolo Bonzini 1 year ago
Il sab 11 nov 2023, 03:40 Michael Tokarev <mjt@tls.msk.ru> ha scritto:

> Hi!
>
> It looks like --disable-pie configure, which uses -fno-pie -no-pie flags
> for the compiler, is broken: it does not not tell the *linker* about the
> option, so the link fails (at least on debian bookworm):
>
> /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32
> against `.rodata' can not be used when making a PIE object; recompile with
> -fPIE
> /usr/bin/ld: failed to set dynamic section sizes: bad value
>
> This is failing for *all* executables, including tests, qemu-img, etc.
>

Is this new in bookworm? And also can you compare 8.0, 8.1 and 8.2?

Paolo

The following change fixes it:
>
> diff --git a/meson.build b/meson.build
> index a9c4f28247..0b7ca45d48 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -278,7 +278,8 @@ endif
>   # tries to build an executable instead of a shared library and fails.  So
>   # don't add -no-pie anywhere and cross fingers. :(
>   if not get_option('b_pie')
> -  qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
> +  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
> +  qemu_ldflags += cc.get_supported_arguments('-no-pie')
>   endif
>
>   if not get_option('stack_protector').disabled()
>
>
>
Re: disable-pie build
Posted by Michael Tokarev 1 year ago
12.11.2023 20:03, Paolo Bonzini пишет:
> 
> 
> Il sab 11 nov 2023, 03:40 Michael Tokarev <mjt@tls.msk.ru <mailto:mjt@tls.msk.ru>> ha scritto:
> 
>     Hi!
> 
>     It looks like --disable-pie configure, which uses -fno-pie -no-pie flags
>     for the compiler, is broken: it does not not tell the *linker* about the
>     option, so the link fails (at least on debian bookworm):
> 
>     /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with
>     -fPIE
>     /usr/bin/ld: failed to set dynamic section sizes: bad value
> 
>     This is failing for *all* executables, including tests, qemu-img, etc.
> 
> 
> Is this new in bookworm? And also can you compare 8.0, 8.1 and 8.2?

First I observed this with 7.2, but the same happens with 8.1 and current master
(8.2-tobe).

cc -m64 -mcx16  -o subprojects/libvhost-user/link-test subprojects/libvhost-user/link-test.p/link-test.c.o -Wl,--as-needed -Wl,--no-undefined 
-Wl,--whole-archive -Wl,--start-group subprojects/libvhost-user/libvhost-user.a -Wl,--end-group -Wl,--no-whole-archive -fstack-protector-strong 
-Wl,-z,relro -Wl,-z,now -Wl,--warn-common -pthread
/usr/bin/ld: subprojects/libvhost-user/link-test.p/link-test.c.o: relocation R_X86_64_32 against `.text.unlikely' can not be used when making a PIE 
object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value

Note: there's no -no-pie in there.  With the change to add -no-pie to qemu_ldflags,
it is there and the link succeeds:

cc -m64 -mcx16  -o subprojects/libvhost-user/link-test subprojects/libvhost-user/link-test.p/link-test.c.o -Wl,--as-needed -Wl,--no-undefined 
-Wl,--whole-archive -Wl,--start-group subprojects/libvhost-user/libvhost-user.a -Wl,--end-group -Wl,--no-whole-archive -no-pie 
-fstack-protector-strong -Wl,-z,relro -Wl,-z,now -Wl,--warn-common -pthread


And nope, this is not new in bookworm, -- it fails to build on bullseye
exactly the same way.  And it succeeds with the same change applied,
adding -no-pie to qemu_ldflags.

It looks like debian enabled pie by default in around 2018 or so.

I stumbled across this issue (with qemu can't be built on debian with --disable-pie)
several times just because I tried to run one or another CI test to reproduce some
issue, and it happened the test used --disable-pie (and most of that is executed on
redhat).

/mjt


>     diff --git a/meson.build b/meson.build
>     index a9c4f28247..0b7ca45d48 100644
>     --- a/meson.build
>     +++ b/meson.build
>     @@ -278,7 +278,8 @@ endif
>        # tries to build an executable instead of a shared library and fails.  So
>        # don't add -no-pie anywhere and cross fingers. :(
>        if not get_option('b_pie')
>     -  qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
>     +  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
>     +  qemu_ldflags += cc.get_supported_arguments('-no-pie')
>        endif
> 
>        if not get_option('stack_protector').disabled()



Re: disable-pie build
Posted by Paolo Bonzini 1 year ago
On Sat, Nov 11, 2023 at 3:40 AM Michael Tokarev <mjt@tls.msk.ru> wrote:
>
> Hi!
>
> It looks like --disable-pie configure, which uses -fno-pie -no-pie flags
> for the compiler, is broken: it does not not tell the *linker* about the
> option, so the link fails (at least on debian bookworm):

Looks good, if you can send a patch perhaps Stefan can apply it (or
someone else can handle it in my stead, because I'm away next week).

Paolo

> /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with
> -fPIE
> /usr/bin/ld: failed to set dynamic section sizes: bad value
>
> This is failing for *all* executables, including tests, qemu-img, etc.
>
> The following change fixes it:
>
> diff --git a/meson.build b/meson.build
> index a9c4f28247..0b7ca45d48 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -278,7 +278,8 @@ endif
>   # tries to build an executable instead of a shared library and fails.  So
>   # don't add -no-pie anywhere and cross fingers. :(
>   if not get_option('b_pie')
> -  qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
> +  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
> +  qemu_ldflags += cc.get_supported_arguments('-no-pie')
>   endif
>
>   if not get_option('stack_protector').disabled()
>
>C
Re: disable-pie build
Posted by Volker Rümelin 1 year ago
Am 11.11.23 um 17:09 schrieb Paolo Bonzini:
> On Sat, Nov 11, 2023 at 3:40 AM Michael Tokarev <mjt@tls.msk.ru> wrote:
>> Hi!
>>
>> It looks like --disable-pie configure, which uses -fno-pie -no-pie flags
>> for the compiler, is broken: it does not not tell the *linker* about the
>> option, so the link fails (at least on debian bookworm):
> Looks good, if you can send a patch perhaps Stefan can apply it (or
> someone else can handle it in my stead, because I'm away next week).
>
> Paolo

No, this doesn't look good. This patch again breaks the native Windows
build with MSYS2 and mingw64 cross compile probably too.

See

https://gitlab.com/qemu-project/qemu/-/issues/1664

https://lore.kernel.org/qemu-devel/20230522080816.66320-1-pbonzini@redhat.com/
https://lore.kernel.org/qemu-devel/20230523073029.19549-1-pbonzini@redhat.com/

and the big comment above the changed lines in meson.build.

With best regards,
Volker

>> /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with
>> -fPIE
>> /usr/bin/ld: failed to set dynamic section sizes: bad value
>>
>> This is failing for *all* executables, including tests, qemu-img, etc.
>>
>> The following change fixes it:
>>
>> diff --git a/meson.build b/meson.build
>> index a9c4f28247..0b7ca45d48 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -278,7 +278,8 @@ endif
>>   # tries to build an executable instead of a shared library and fails.  So
>>   # don't add -no-pie anywhere and cross fingers. :(
>>   if not get_option('b_pie')
>> -  qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
>> +  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
>> +  qemu_ldflags += cc.get_supported_arguments('-no-pie')
>>   endif
>>
>>   if not get_option('stack_protector').disabled()

Re: disable-pie build
Posted by Paolo Bonzini 1 year ago
Il sab 11 nov 2023, 21:09 Volker Rümelin <vr_qemu@t-online.de> ha scritto:

> No, this doesn't look good. This patch again breaks the native Windows
> build with MSYS2 and mingw64 cross compile probably too.
>

Doh, you're right of course (
https://lists.nongnu.org/archive/html/qemu-devel/2023-05/msg05486.html). We
need to add qemu_ldflags by hand to all executable.

I will look into adding no-pie support to Meson natively.

Paolo


> See
>
> https://gitlab.com/qemu-project/qemu/-/issues/1664
>
>
> https://lore.kernel.org/qemu-devel/20230522080816.66320-1-pbonzini@redhat.com/
>
> https://lore.kernel.org/qemu-devel/20230523073029.19549-1-pbonzini@redhat.com/
>
> and the big comment above the changed lines in meson.build.
>
> With best regards,
> Volker
>
> >> /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation
> R_X86_64_32 against `.rodata' can not be used when making a PIE object;
> recompile with
> >> -fPIE
> >> /usr/bin/ld: failed to set dynamic section sizes: bad value
> >>
> >> This is failing for *all* executables, including tests, qemu-img, etc.
> >>
> >> The following change fixes it:
> >>
> >> diff --git a/meson.build b/meson.build
> >> index a9c4f28247..0b7ca45d48 100644
> >> --- a/meson.build
> >> +++ b/meson.build
> >> @@ -278,7 +278,8 @@ endif
> >>   # tries to build an executable instead of a shared library and
> fails.  So
> >>   # don't add -no-pie anywhere and cross fingers. :(
> >>   if not get_option('b_pie')
> >> -  qemu_common_flags += cc.get_supported_arguments('-fno-pie',
> '-no-pie')
> >> +  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
> >> +  qemu_ldflags += cc.get_supported_arguments('-no-pie')
> >>   endif
> >>
> >>   if not get_option('stack_protector').disabled()
>
>
Re: disable-pie build
Posted by Michael Tokarev 1 year ago
On 12.11.2023 12:13, Paolo Bonzini wrote:
> 
> 
> Il sab 11 nov 2023, 21:09 Volker Rümelin <vr_qemu@t-online.de <mailto:vr_qemu@t-online.de>> ha scritto:
> 
>     No, this doesn't look good. This patch again breaks the native Windows
>     build with MSYS2 and mingw64 cross compile probably too.
> 
> 
> Doh, you're right of course (https://lists.nongnu.org/archive/html/qemu-devel/2023-05/msg05486.html <https://lists.nongnu.org/archive/html/qemu-devel/2023-05/msg05486.html>). We need to add qemu_ldflags by hand to all executable.

Hmm?  With the change I mentioned, it builds fine on linux, - *all* executables are being
built fine.  Without the qemu_ldflags+= part, all executables fail to build with the
same error.  I'm not sure what's going on here...

I haven't tried win32 build though.

Also, it all builds fine on fedora without any change, which puzzles me.

/mjt

>      >> /usr/bin/ld: libcommon.fa.p/hw_core_cpu-common.c.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with
>      >> -fPIE
>      >> /usr/bin/ld: failed to set dynamic section sizes: bad value
>      >>
>      >> This is failing for *all* executables, including tests, qemu-img, etc.