On Thu, 23 Mar 2023 at 10:04, Ard Biesheuvel <a...@kernel.org> wrote:
>
> On Thu, 23 Mar 2023 at 02:30, Rebecca Cran <rebe...@bsdio.com> wrote:
> >
> > On 3/22/23 5:49 AM, Ard Biesheuvel wrote:
> >
> > >
> > > The reason I added CLANG3x support for ARM in the past is to ensure
> > > compatibility with the ARM proprietary, Clang based toolchain. At the
> > > time, we went with GNU ld, but I would actually prefer if we could
> > > make this work with LLD as well.
> >
> > Just to confirm, I'll keep lld for X64 and IA32, but I won't add
> > -fuse-ld=lld for ARM or AARCH64 since none of the toolchain definitions
> > currently do so.
> >
> >
> > The problem with trying to use lld for aarch64 is the following error:
> >
> >
> > GenFw: ERROR 3000: Invalid
> >    WriteSections64():
> > /home/bcran/uefi/edk2/Build/ArmVirtQemu-AARCH64/RELEASE_CLANGDWARF/AARCH64/ArmVirtPkg/MemoryInitPei/MemoryInitPeim/DEBUG/MemoryInit.dll
> > due to its size (> 1 MB), this module requires 4 KB section alignment.
> >
>
> That seems to be a false positive error in GenFw.
>
> It looks like LLD turns
>
> ADRP
> ADD
>
> into
>
> NOP
> ADR
>
> if the target is within -/+ 1 MiB but it doesn't update the
> relocations, so GenFw goes off into the weeds. I.e..
>
>  304:   d503201f        nop
>                         304: R_AARCH64_ADR_PREL_PG_HI21 .data
>  308:   100015c1        adr     x1, 5c0 <gArmMpCoreInfoPpiGuid>
>                         308: R_AARCH64_ADD_ABS_LO12_NC  .data
>
> This is just another indication that using --emit-relocs is a bad
> idea, and we should really be building PIE executables and converting
> those based on the dynamic relocation instead.
>
> Adding -Wl,--no-relax to the DLINK flags should help with this,
> although I notice that there are other LLD related issues, in the ID
> map code I added to ArmVirtQemu a while ago, so ArmVirtQemu.dsc still
> does not build.

So I played around with this a bit more, also on ARM, and it seems to
me that simply disabling PIE linking is the best approach here - the
PE/COFF conversion essentially turns it into a relocatable binary
already, and so PIE linking does not actually add anything useful
here, and on ARM, the resulting ELF binary triggers an assert in GenFw

So adding

 -fuse-ld=lld -Wl,--no-relax,--no-pie

to both CLANG38_AARCH64_DLINK_FLAGS and CLANG38_ARM_DLINK_FLAGS works
for me locally, i.e., builds complete without errors and can boot
successfully.

We will also be able to drop the GccLto plugin pass through libraries,
which is rather nice as well.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#101678): https://edk2.groups.io/g/devel/message/101678
Mute This Topic: https://groups.io/mt/97769546/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to