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()
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() > > >
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()
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
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()
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() > >
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.
© 2016 - 2024 Red Hat, Inc.