diff --git a/.github/workflows/build_test.sh b/.github/workflows/build_test.sh index a718b6f37a5..96f532ab22e 100755 --- a/.github/workflows/build_test.sh +++ b/.github/workflows/build_test.sh @@ -62,6 +62,7 @@ PACKAGES=( ) COMPILER="${COMPILER:?}" COMPILER_VERSION="${COMPILER_VERSION:?}" +LINKER="${LINKER:?}" RELEASE="$(lsb_release -cs)" bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ $RELEASE main restricted universe multiverse' >>/etc/apt/sources.list" @@ -117,7 +118,12 @@ for args in "${ARGS[@]}"; do info "Checking build with $args" # shellcheck disable=SC2086 - if ! AR="$AR" CC="$CC" CXX="$CXX" CFLAGS="-Werror" CXXFLAGS="-Werror" meson -Dtests=unsafe -Dslow-tests=true -Dfuzz-tests=true --werror $args build; then + if ! AR="$AR" \ + CC="$CC" CC_LD="$LINKER" CFLAGS="-Werror" \ + CXX="$CXX" CXX_LD="$LINKER" CXXFLAGS="-Werror" \ + meson -Dtests=unsafe -Dslow-tests=true -Dfuzz-tests=true --werror \ + $args build; then + fatal "meson failed with $args" fi diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 887dfabf055..69487fa594c 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -19,20 +19,20 @@ jobs: build: runs-on: ubuntu-20.04 concurrency: - group: ${{ github.workflow }}-${{ matrix.env.COMPILER }}-${{ matrix.env.COMPILER_VERSION }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ matrix.env.COMPILER }}-${{ matrix.env.COMPILER_VERSION }}-${{ matrix.env.LINKER }}-${{ github.ref }} cancel-in-progress: true strategy: fail-fast: false matrix: env: - - { COMPILER: "gcc", COMPILER_VERSION: "10" } - - { COMPILER: "gcc", COMPILER_VERSION: "11" } - - { COMPILER: "clang", COMPILER_VERSION: "11" } - - { COMPILER: "clang", COMPILER_VERSION: "12" } - - { COMPILER: "clang", COMPILER_VERSION: "13" } + - { COMPILER: "gcc", COMPILER_VERSION: "10", LINKER: "bfd" } + - { COMPILER: "gcc", COMPILER_VERSION: "11", LINKER: "gold" } + - { COMPILER: "clang", COMPILER_VERSION: "11", LINKER: "bfd" } + - { COMPILER: "clang", COMPILER_VERSION: "12", LINKER: "gold" } + - { COMPILER: "clang", COMPILER_VERSION: "13", LINKER: "lld" } env: ${{ matrix.env }} steps: - name: Repository checkout uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - - name: Build check (${{ env.COMPILER }}-${{ env.COMPILER_VERSION }}) + - name: Build check (${{ env.COMPILER }}-${{ env.COMPILER_VERSION }}-${{ env.LINKER }}) run: sudo -E .github/workflows/build_test.sh diff --git a/meson.build b/meson.build index bc7a8f76e8d..4c0dd6f8c99 100644 --- a/meson.build +++ b/meson.build @@ -3912,6 +3912,7 @@ if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_GNU_EFI') == 1 summary({ 'EFI machine type' : efi_arch[0], 'EFI CC' : '@0@'.format(' '.join(efi_cc)), + 'EFI LD' : efi_ld, 'EFI lds' : efi_lds, 'EFI crt0' : efi_crt0, 'EFI include directory' : efi_incdir}, diff --git a/meson_options.txt b/meson_options.txt index 914434e37c4..4d406b3e505 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -415,7 +415,7 @@ option('efi-cc', type : 'array', description : 'the compiler to use for EFI modules') # Note that LLD does not support PE/COFF relocations # https://lists.llvm.org/pipermail/llvm-dev/2021-March/149234.html -option('efi-ld', type : 'combo', choices : ['bfd', 'gold'], +option('efi-ld', type : 'combo', choices : ['auto', 'bfd', 'gold'], description : 'the linker to use for EFI modules') option('efi-libdir', type : 'string', description : 'path to the EFI lib directory') diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build index c095512bfb4..d92fe0e5ec9 100644 --- a/src/boot/efi/meson.build +++ b/src/boot/efi/meson.build @@ -48,6 +48,15 @@ if efi_cc.length() == 0 efi_cc = cc.cmd_array() endif +efi_ld = get_option('efi-ld') +if efi_ld == 'auto' + efi_ld = cc.get_linker_id().split('.')[1] + if efi_ld not in ['bfd', 'gold'] + warning('Not using @0@ as efi-ld, falling back to bfd'.format(efi_ld)) + efi_ld = 'bfd' + endif +endif + efi_libdir = '' foreach dir : [get_option('efi-libdir'), '/usr/lib/gnuefi' / efi_arch[0], @@ -256,7 +265,7 @@ foreach arg : get_option('c_args') endforeach efi_ldflags = [ - '-fuse-ld=' + get_option('efi-ld'), + '-fuse-ld=' + efi_ld, '-L', efi_libdir, '-nostdlib', '-T', efi_lds, @@ -276,7 +285,7 @@ if efi_arch[1] in ['aarch64', 'arm', 'riscv64'] efi_format = ['-O', 'binary'] else efi_ldflags += ['-pie'] - if get_option('efi-ld') == 'bfd' + if efi_ld == 'bfd' efi_ldflags += '-Wl,--no-dynamic-linker' endif efi_format = ['--target=efi-app-@0@'.format(efi_arch[1])]