bazelbuild / bazelbuild/rules_rust

Wrong linker being used when trying to cross compile for aarch64

Open
#1,603 1 comment 0 reactions 0 assignees View on GitHub
needs-triage
Dominant language
Starlark
Stars
843
Forks
651
Avg merge
2d 18h
Merged PRs (30d)
15

Description

Hello,
I tried to cross compile a simple hello world program for aarch64 on a x86_64 host. I set up a cc_toolchain for aarch64 (mostly by removing the things I don't need from [https://github.com/bazelbuild/rules_cc/blob/main/cc/private/toolchain/cc_toolchain_config.bzl](https://github.com/bazelbuild/rules_cc/blob/main/cc/private/toolchain/cc_toolchain_config.bzl)), and when I tried to compile the program, I got my first error:

```
= note: collect2: fatal error: cannot find 'ld'
compilation terminated.
```

Having a look at #1114, I added `-B/usr/bin` to the default linker flags, which then threw this error:

```
INFO: Analyzed target //src:main_rs (1 packages loaded, 19 targets configured).
INFO: Found 1 target...
ERROR: /d/Projects/workbench/bazel-rust/src/BUILD:3:12: Compiling Rust bin main_rs (1 files) failed: (Exit 1): process_wrapper failed: error executing command bazel-out/k8-opt-exec-2B5CBBC6/bin/external/rules_rust/util/process_wrapper/process_wrapper --subst 'pwd=${pwd}' -- ... (remaining 18 arguments skipped)

Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
error: linking with `/usr/bin/aarch64-linux-gnu-gcc` failed: exit status: 1
|
= note: "/usr/bin/aarch64-linux-gnu-gcc" "/tmp/rustcaiNPVK/symbols.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.0.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.1.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.2.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.3.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.4.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.5.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.6.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.main_rs.40eb420e-cgu.7.rcgu.o" "bazel-out/k8-fastbuild/bin/src/main_rs.35hed8b2xtzt0wis.rcgu.o" "-Wl,--as-needed" "-L" "bazel-out/k8-fastbuild/bin/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/rust_toolchain/lib/rustlib/aarch64-unknown-linux-gnu/lib" "-L" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libstd-768f64e43b4091ca.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libpanic_unwind-e452821b696c9b27.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libobject-a7446c7f96188bd3.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libmemchr-c5a6ebfc774c23da.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libaddr2line-52a5740c11b991fe.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libgimli-b254c2999cf1d000.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/librustc_demangle-c967233557e70d8b.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libstd_detect-9bc99a923ffc9ef0.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libhashbrown-9e5758314f8e4741.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libminiz_oxide-c4df43510a6a6193.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libadler-7dac3bc9fba03bba.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-b4e4bff40f511247.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libunwind-4664da76290c7f3e.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libcfg_if-a0fa5affe9eeb5ca.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/liblibc-0af00d708e07f561.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/liballoc-f1846029b2b380e6.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/librustc_std_workspace_core-25593227eb86a313.rlib" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libcore-5def185726e092ba.rlib" "-Wl,--end-group" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib/libcompiler_builtins-8cbeb5ac4095b356.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/firekind/.cache/bazel/_bazel_firekind/e925cabe2fc76940c1a41fe446b92daf/external/rust_linux_x86_64__aarch64-unknown-linux-gnu_tools/lib/rustlib/aarch64-unknown-linux-gnu/lib" "-o" "bazel-out/k8-fastbuild/bin/src/main_rs" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs" "-lstdc++" "-Wl,-z,relro,-z,now" "-no-canonical-prefixes" "-pass-exit-codes" "-B/usr/bin"
= note: /usr/bin/ld: unrecognised emulation mode: aarch64linux
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386pep i386pe elf64bpf
collect2: error: ld returned 1 exit status
```
So for some reason gcc is picking up the wrong linker, even after specifying aarch64-linux-gnu-ld as the linker to use in tool_paths in the cc toolchain. I assumed it might be because both the system ld and aarch64-linux-gnu-ld are in /usr/bin, so i symlinked aarch64-linux-gnu-ld to /tmp/thecorrectld/ld and changed the default linker flag for aarch64 only to `-B/tmp/thecorrectld` to test things out, and it worked. But this requires a symlink to be made to the correct linker, and it has to be placed in a separate folder. Is there any other way to solve this issue? Or am i missing something in the cc_toolchain? I am new to toolchain configuration in bazel.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.