12.11.2023 20:03, Paolo Bonzini пишет:


Il sab 11 nov 2023, 03:40 Michael Tokarev <m...@tls.msk.ru 
<mailto:m...@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()



Reply via email to