-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Description
#84148 changed the linker that we use in runtime builds (including when running NativeAOT on our binaries like ILCompiler and crossgen2) to lld. This was motivated by a desire to move to cross-builds (mariner host OS, targeting old linux rootfs). Using lld simplifies the cross-compilation scenarios because it is a cross-linker, so doesn't require a separate bfd linker with appropriate target prefix. We have also been wanting to move away from binutils as a dependency. Note that it doesn't change the default linker for customer NativeAOT scenarios, which still use bfd.
There are a few concerns with this approach - see @am11's comments in #84493 (comment), #84493 (comment), #84148 (comment) for full context. In summary:
- NativeAOT support for
lldwas only added recently and has not been well tested. - NativeAOT uses
bfdby default in user scenarios, so we should be testing this in ci. lldintroduces size regression compared tobfd. Numbers from Write linker script for lld to enable gc-sections #84493 (comment):
# dotnet new console (~2.2 K diff)
- 1496072
+ 1498192
# dotnet new api -aot (~41 K diff)
- 12743672
+ 12785208
@am11 I hope that's a fair summary - please add to this if I missed anything.
So I'm opening this to discuss the choice of linker when building our product. Options are:
- Use
lldas we do with Build on CBL-mariner host with rootfs #84148. - Add
binutilslinker (need separate cross-linker for each supported architecture) to the mariner build images. We will need to pick the right prefixed linker to use based on the target platform.This is not currently supported in NativeAot.(edit: NativeAot will detect and used the right prefixed linker if available).
My preference is to continue using lld, but add separate test legs that validate the customer scenarios using bfd. One challenge is that our NativeAOT tests usually run NativeAOT on the build machine, not on helix - so they are testing a cross-compilation scenario, not the customer scenario. This is simpler than getting all NativeAOT prerequisites onto the target machines to test native compilation. I think it would be worth adding separate tests for NativeAOT compilation that run in an environment that represents customer scenarios (for example, ubuntu with bfd).
I'm opening this issue to continue the discussion and hopefully reach agreement on the approach.
Metadata
Metadata
Assignees
Type
Projects
Status