[PATCH] Fix duplicate symbol error on MacOS build

Tanish Desai posted 1 patch 2 weeks ago
hw/vmapple/Kconfig | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH] Fix duplicate symbol error on MacOS build
Posted by Tanish Desai 2 weeks ago
The issue started after commit https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4

Reproduction:
  1. In the build directory on MacOS (haven't tried on other OS), run:
       ../configure --enable-rust --target-list=aarch64-softmmu
  2. Then run either:
       ninja -C .
       OR
       make
  3. At the end, you will encounter the error:
       duplicate symbol '_pl011_create' in:
           /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o
           librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o)
       ld: 1 duplicate symbols

Root cause:
  Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and Rust to produce the same object.
  This is due to the commit above where 'select PL011' forces a true condition instead of checking if HAVE_RUST is true.
  If HAVE_RUST is true, X_PL011_RUST should be selected instead of CONFIG_PL011.

Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
---
 hw/vmapple/Kconfig | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig
index 2382b297672..01bcbf40e00 100644
--- a/hw/vmapple/Kconfig
+++ b/hw/vmapple/Kconfig
@@ -22,7 +22,8 @@ config VMAPPLE
     select PLATFORM_BUS
     select PCI_EXPRESS
     select PCI_EXPRESS_GENERIC_BRIDGE
-    select PL011 # UART
+    select PL011 if !HAVE_RUST # UART
+    select X_PL011_RUST if HAVE_RUST # UART
     select PL031 # RTC
     select PL061 # GPIO
     select GPIO_PWR
-- 
2.48.1
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Philippe Mathieu-Daudé 1 week, 6 days ago
Cc'ing CI maintainers.

On 19/3/25 03:30, Tanish Desai wrote:
> The issue started after commit https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4
> 
> Reproduction:
>    1. In the build directory on MacOS (haven't tried on other OS), run:
>         ../configure --enable-rust --target-list=aarch64-softmmu

This config isn't covered on our CI, we only test --enable-rust on
Linux. Should we also test it for all non-Linux hosts? I'd rather not...

>    2. Then run either:
>         ninja -C .
>         OR
>         make
>    3. At the end, you will encounter the error:
>         duplicate symbol '_pl011_create' in:
>             /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o
>             librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o)
>         ld: 1 duplicate symbols
> 
> Root cause:
>    Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and Rust to produce the same object.
>    This is due to the commit above where 'select PL011' forces a true condition instead of checking if HAVE_RUST is true.
>    If HAVE_RUST is true, X_PL011_RUST should be selected instead of CONFIG_PL011.
> 
> Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
> ---
>   hw/vmapple/Kconfig | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig
> index 2382b297672..01bcbf40e00 100644
> --- a/hw/vmapple/Kconfig
> +++ b/hw/vmapple/Kconfig
> @@ -22,7 +22,8 @@ config VMAPPLE
>       select PLATFORM_BUS
>       select PCI_EXPRESS
>       select PCI_EXPRESS_GENERIC_BRIDGE
> -    select PL011 # UART
> +    select PL011 if !HAVE_RUST # UART
> +    select X_PL011_RUST if HAVE_RUST # UART
>       select PL031 # RTC
>       select PL061 # GPIO
>       select GPIO_PWR
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Daniel P. Berrangé 1 week, 6 days ago
On Wed, Mar 19, 2025 at 02:52:43PM +0100, Philippe Mathieu-Daudé wrote:
> Cc'ing CI maintainers.
> 
> On 19/3/25 03:30, Tanish Desai wrote:
> > The issue started after commit https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4
> > 
> > Reproduction:
> >    1. In the build directory on MacOS (haven't tried on other OS), run:
> >         ../configure --enable-rust --target-list=aarch64-softmmu
> 
> This config isn't covered on our CI, we only test --enable-rust on
> Linux. Should we also test it for all non-Linux hosts? I'd rather not...

Bear in mind that Rust is still an experimental feature. If it is
broken in some build scenarios & not exhaustively tested, so be it,
that's what it means to be "experimental".

When we make Rust an on-by-default feature, then we'll get
coverage across all CI scenarios automatically. Of course we then
have the reverse question of CI testing of "rust disabled" scenarios,
Ideally we make Rust mandatory and thus avoid those non-Rust scenarios.

So I agree we don't need to expand CI coverage currently, just
fix bugs when they're pointed out.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Peter Maydell 1 week, 6 days ago
On Wed, 19 Mar 2025 at 12:53, Tanish Desai <tanishdesai37@gmail.com> wrote:
>
> The issue started after commit https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4
>
> Reproduction:
>   1. In the build directory on MacOS (haven't tried on other OS), run:
>        ../configure --enable-rust --target-list=aarch64-softmmu
>   2. Then run either:
>        ninja -C .
>        OR
>        make
>   3. At the end, you will encounter the error:
>        duplicate symbol '_pl011_create' in:
>            /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o
>            librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o)
>        ld: 1 duplicate symbols
>
> Root cause:
>   Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and Rust to produce the same object.
>   This is due to the commit above where 'select PL011' forces a true condition instead of checking if HAVE_RUST is true.
>   If HAVE_RUST is true, X_PL011_RUST should be selected instead of CONFIG_PL011.
>
> Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
> ---
>  hw/vmapple/Kconfig | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig
> index 2382b297672..01bcbf40e00 100644
> --- a/hw/vmapple/Kconfig
> +++ b/hw/vmapple/Kconfig
> @@ -22,7 +22,8 @@ config VMAPPLE
>      select PLATFORM_BUS
>      select PCI_EXPRESS
>      select PCI_EXPRESS_GENERIC_BRIDGE
> -    select PL011 # UART
> +    select PL011 if !HAVE_RUST # UART
> +    select X_PL011_RUST if HAVE_RUST # UART
>      select PL031 # RTC
>      select PL061 # GPIO
>      select GPIO_PWR

Paolo: we seem to have quite a lot of this

    select PL011 if !HAVE_RUST # UART
    select X_PL011_RUST if HAVE_RUST # UART

duplicated for every PL011-using machine. Can we factor this out
in Kconfig? e.g.

config PL011
    select X_PL011_RUST if HAVE_RUST
    select PL011_C if !HAVE_RUST

(and update hw/char/meson.build to use CONFIG_PL011_C for pl011.c).
Then all the machines can go back to plain "select PL011" and
don't need to care whether it's the Rust or C version.

Or does that not work?

thanks
-- PMM
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Paolo Bonzini 1 week, 6 days ago
On 3/19/25 14:44, Peter Maydell wrote:
>> -    select PL011 # UART
>> +    select PL011 if !HAVE_RUST # UART
>> +    select X_PL011_RUST if HAVE_RUST # UART
>>       select PL031 # RTC
>>       select PL061 # GPIO
>>       select GPIO_PWR
> 
> Paolo: we seem to have quite a lot of this
> 
>      select PL011 if !HAVE_RUST # UART
>      select X_PL011_RUST if HAVE_RUST # UART
> 
> duplicated for every PL011-using machine. Can we factor this out
> in Kconfig? e.g.
> 
> config PL011
>      select X_PL011_RUST if HAVE_RUST
>      select PL011_C if !HAVE_RUST
> 
> (and update hw/char/meson.build to use CONFIG_PL011_C for pl011.c).
> Then all the machines can go back to plain "select PL011" and
> don't need to care whether it's the Rust or C version.
> 
> Or does that not work?

Yes, it works.

Paolo
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Philippe Mathieu-Daudé 1 week, 6 days ago
On 19/3/25 14:44, Peter Maydell wrote:
> On Wed, 19 Mar 2025 at 12:53, Tanish Desai <tanishdesai37@gmail.com> wrote:
>>
>> The issue started after commit https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4
>>
>> Reproduction:
>>    1. In the build directory on MacOS (haven't tried on other OS), run:
>>         ../configure --enable-rust --target-list=aarch64-softmmu
>>    2. Then run either:
>>         ninja -C .
>>         OR
>>         make
>>    3. At the end, you will encounter the error:
>>         duplicate symbol '_pl011_create' in:
>>             /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o
>>             librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o)
>>         ld: 1 duplicate symbols
>>
>> Root cause:
>>    Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and Rust to produce the same object.
>>    This is due to the commit above where 'select PL011' forces a true condition instead of checking if HAVE_RUST is true.
>>    If HAVE_RUST is true, X_PL011_RUST should be selected instead of CONFIG_PL011.
>>
>> Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
>> ---
>>   hw/vmapple/Kconfig | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig
>> index 2382b297672..01bcbf40e00 100644
>> --- a/hw/vmapple/Kconfig
>> +++ b/hw/vmapple/Kconfig
>> @@ -22,7 +22,8 @@ config VMAPPLE
>>       select PLATFORM_BUS
>>       select PCI_EXPRESS
>>       select PCI_EXPRESS_GENERIC_BRIDGE
>> -    select PL011 # UART
>> +    select PL011 if !HAVE_RUST # UART
>> +    select X_PL011_RUST if HAVE_RUST # UART
>>       select PL031 # RTC
>>       select PL061 # GPIO
>>       select GPIO_PWR
> 
> Paolo: we seem to have quite a lot of this
> 
>      select PL011 if !HAVE_RUST # UART
>      select X_PL011_RUST if HAVE_RUST # UART
> 
> duplicated for every PL011-using machine. Can we factor this out
> in Kconfig? e.g.
> 
> config PL011
>      select X_PL011_RUST if HAVE_RUST
>      select PL011_C if !HAVE_RUST
> 
> (and update hw/char/meson.build to use CONFIG_PL011_C for pl011.c).
> Then all the machines can go back to plain "select PL011" and
> don't need to care whether it's the Rust or C version.
> 
> Or does that not work?

This should work.
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Tanish Desai 1 week, 6 days ago
It will work for PL011 but there are other devices using the same method
for selecting rust or c++ file like HPET in timer.
You can check this:-
https://github.com/qemu/qemu/blob/master/hw/timer/Kconfig
Wouldn’t it create inconsistencies in code if we change only for PL011?

On Wed, 19 Mar 2025 at 7:19 PM, Philippe Mathieu-Daudé <philmd@linaro.org>
wrote:

> On 19/3/25 14:44, Peter Maydell wrote:
> > On Wed, 19 Mar 2025 at 12:53, Tanish Desai <tanishdesai37@gmail.com>
> wrote:
> >>
> >> The issue started after commit
> https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4
> >>
> >> Reproduction:
> >>    1. In the build directory on MacOS (haven't tried on other OS), run:
> >>         ../configure --enable-rust --target-list=aarch64-softmmu
> >>    2. Then run either:
> >>         ninja -C .
> >>         OR
> >>         make
> >>    3. At the end, you will encounter the error:
> >>         duplicate symbol '_pl011_create' in:
> >>
>  /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o
> >>
>  librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o)
> >>         ld: 1 duplicate symbols
> >>
> >> Root cause:
> >>    Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and
> Rust to produce the same object.
> >>    This is due to the commit above where 'select PL011' forces a true
> condition instead of checking if HAVE_RUST is true.
> >>    If HAVE_RUST is true, X_PL011_RUST should be selected instead of
> CONFIG_PL011.
> >>
> >> Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
> >> ---
> >>   hw/vmapple/Kconfig | 3 ++-
> >>   1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig
> >> index 2382b297672..01bcbf40e00 100644
> >> --- a/hw/vmapple/Kconfig
> >> +++ b/hw/vmapple/Kconfig
> >> @@ -22,7 +22,8 @@ config VMAPPLE
> >>       select PLATFORM_BUS
> >>       select PCI_EXPRESS
> >>       select PCI_EXPRESS_GENERIC_BRIDGE
> >> -    select PL011 # UART
> >> +    select PL011 if !HAVE_RUST # UART
> >> +    select X_PL011_RUST if HAVE_RUST # UART
> >>       select PL031 # RTC
> >>       select PL061 # GPIO
> >>       select GPIO_PWR
> >
> > Paolo: we seem to have quite a lot of this
> >
> >      select PL011 if !HAVE_RUST # UART
> >      select X_PL011_RUST if HAVE_RUST # UART
> >
> > duplicated for every PL011-using machine. Can we factor this out
> > in Kconfig? e.g.
> >
> > config PL011
> >      select X_PL011_RUST if HAVE_RUST
> >      select PL011_C if !HAVE_RUST
> >
> > (and update hw/char/meson.build to use CONFIG_PL011_C for pl011.c).
> > Then all the machines can go back to plain "select PL011" and
> > don't need to care whether it's the Rust or C version.
> >
> > Or does that not work?
>
> This should work.
>
>
Re: [PATCH] Fix duplicate symbol error on MacOS build
Posted by Peter Maydell 1 week, 6 days ago
On Wed, 19 Mar 2025 at 14:02, Tanish Desai <tanishdesai37@gmail.com> wrote:
>
> It will work for PL011 but there are other devices using the same method for selecting rust or c++ file like HPET in timer.
> You can check this:-
> https://github.com/qemu/qemu/blob/master/hw/timer/Kconfig
> Wouldn’t it create inconsistencies in code if we change only for PL011?

Yes, we should do the same thing for all the devices we have
dual implementations of (currently only pl011 and hpet).
I have some patches which I'm just testing to do that.

thanks
-- PMM