Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failure to cross compile for aarch64-unknown-linux-gnu from x86_64 linux #737

Open
wjones127 opened this issue Mar 14, 2025 · 1 comment

Comments

@wjones127
Copy link

Problem:

We attempt to cross compile to the aarch64-unknown-linux-gnu from a x86_64 image. I found this for our Node bindings to our rust project, which uses the napi-rs framework. Their suggested build images use cross compilation.

To reproduce, run in this image:

docker run -it ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 bash

And run the following commands

cargo new --lib my_crate
cd my_crate
cargo add aws-lc-rs@1.12.6
cargo build

This produces the following output:

thread 'main' panicked at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/aws-lc-sys-0.27.1/builder/cc_builder.rs:455:9:
  COMPILER: clangARGS: ["-O0", "-ffunction-sections", "-fdata-sections", "-fPIC", "-gdwarf-4", "-fno-omit-frame-pointer", "--target=aarch64-unknown-linux-gnu", "--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot", "/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/aws-lc-sys-0.27.1/aws-lc/tests/compiler_features_tests/memcmp_invalid_stripped_check.c", "-Wno-unused-parameter", "-o", "/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/memcmp_invalid_stripped_check"]EXECUTED: trueERROR: /usr/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ld.bfd: cannot find crtbeginS.o: No such file or directory
  /usr/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ld.bfd: cannot find -lgcc
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  OUTPUT: Failed to compile memcmp_invalid_stripped_check
              
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Relevant details

Version: 1.12.6

Full build log

The following warnings were emitted during compilation:

warning: aws-lc-sys@0.27.1: Building with: CC
warning: aws-lc-sys@0.27.1: Symbol Prefix: Some("aws_lc_0_27_1")
warning: aws-lc-sys@0.27.1: Compilation of 'c11.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-c11/7dfda64fdf5a526c-c11.o"]).
warning: aws-lc-sys@0.27.1: CC environment variable set: clang
warning: aws-lc-sys@0.27.1: CXX environment variable set: clang++
warning: aws-lc-sys@0.27.1: Compilation of 'stdalign_check.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-stdalign_check/7dfda64fdf5a526c-stdalign_check.o"]).
warning: aws-lc-sys@0.27.1: Compilation of 'builtin_swap_check.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-builtin_swap_check/7dfda64fdf5a526c-builtin_swap_check.o"]).

error: failed to run custom build command for `aws-lc-sys v0.27.1`

Caused by:
  process didn't exit successfully: `/my_crate/target/debug/build/aws-lc-sys-f1465acac2abf3d1/build-script-main` (exit status: 101)
  --- stdout
  cargo:rerun-if-env-changed=AWS_LC_SYS_NO_PREFIX
  cargo:rerun-if-env-changed=AWS_LC_SYS_PREGENERATING_BINDINGS
  cargo:rerun-if-env-changed=AWS_LC_SYS_EXTERNAL_BINDGEN
  cargo:rerun-if-env-changed=AWS_LC_SYS_NO_ASM
  cargo:rerun-if-env-changed=AWS_LC_SYS_CFLAGS
  cargo:rerun-if-env-changed=AWS_LC_SYS_PREBUILT_NASM
  cargo:rerun-if-env-changed=AWS_LC_SYS_C_STD
  cargo:rustc-cfg=aarch64_unknown_linux_gnu
  cargo:rerun-if-env-changed=AWS_LC_SYS_CMAKE_BUILDER
  cargo:rerun-if-env-changed=AWS_LC_SYS_STATIC
  default_for Target: 'aarch64-unknown-linux-gnu'
  cargo:rerun-if-env-changed=CARGO_FEATURE_SSL
  cargo:warning=Building with: CC
  cargo:warning=Symbol Prefix: Some("aws_lc_0_27_1")
  default_for Target: 'aarch64-unknown-linux-gnu'
  cargo:rerun-if-env-changed=CARGO_FEATURE_SSL
  cargo:root=/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out
  default_for Target: 'aarch64-unknown-linux-gnu'
  OPT_LEVEL = Some(0)
  OUT_DIR = Some(/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out)
  TARGET = Some(aarch64-unknown-linux-gnu)
  HOST = Some(x86_64-unknown-linux-gnu)
  cargo:rerun-if-env-changed=CC_aarch64-unknown-linux-gnu
  CC_aarch64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_aarch64_unknown_linux_gnu
  CC_aarch64_unknown_linux_gnu = Some(clang)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = Some(--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64_unknown_linux_gnu
  CFLAGS_aarch64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64-unknown-linux-gnu
  CFLAGS_aarch64-unknown-linux-gnu = None
  CARGO_ENCODED_RUSTFLAGS = Some()
  OPT_LEVEL = Some(0)
  TARGET = Some(aarch64-unknown-linux-gnu)
  HOST = Some(x86_64-unknown-linux-gnu)
  cargo:rerun-if-env-changed=CC_aarch64-unknown-linux-gnu
  CC_aarch64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_aarch64_unknown_linux_gnu
  CC_aarch64_unknown_linux_gnu = Some(clang)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = Some(--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64_unknown_linux_gnu
  CFLAGS_aarch64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64-unknown-linux-gnu
  CFLAGS_aarch64-unknown-linux-gnu = None
  CARGO_ENCODED_RUSTFLAGS = Some()
  cargo:warning=Compilation of 'c11.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-c11/7dfda64fdf5a526c-c11.o"]).
  cargo:rerun-if-env-changed=CC
  cargo:warning=CC environment variable set: clang
  cargo:rerun-if-env-changed=CXX
  cargo:warning=CXX environment variable set: clang++
  OPT_LEVEL = Some(0)
  TARGET = Some(aarch64-unknown-linux-gnu)
  HOST = Some(x86_64-unknown-linux-gnu)
  cargo:rerun-if-env-changed=CC_aarch64-unknown-linux-gnu
  CC_aarch64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_aarch64_unknown_linux_gnu
  CC_aarch64_unknown_linux_gnu = Some(clang)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = Some(--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64_unknown_linux_gnu
  CFLAGS_aarch64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64-unknown-linux-gnu
  CFLAGS_aarch64-unknown-linux-gnu = None
  CARGO_ENCODED_RUSTFLAGS = Some()
  cargo:warning=Compilation of 'stdalign_check.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-stdalign_check/7dfda64fdf5a526c-stdalign_check.o"]).
  OPT_LEVEL = Some(0)
  TARGET = Some(aarch64-unknown-linux-gnu)
  HOST = Some(x86_64-unknown-linux-gnu)
  cargo:rerun-if-env-changed=CC_aarch64-unknown-linux-gnu
  CC_aarch64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_aarch64_unknown_linux_gnu
  CC_aarch64_unknown_linux_gnu = Some(clang)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = Some(--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64_unknown_linux_gnu
  CFLAGS_aarch64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64-unknown-linux-gnu
  CFLAGS_aarch64-unknown-linux-gnu = None
  CARGO_ENCODED_RUSTFLAGS = Some()
  cargo:warning=Compilation of 'builtin_swap_check.c' succeeded - Ok(["/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/out-builtin_swap_check/7dfda64fdf5a526c-builtin_swap_check.o"]).
  OPT_LEVEL = Some(0)
  OUT_DIR = Some(/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out)
  TARGET = Some(aarch64-unknown-linux-gnu)
  HOST = Some(x86_64-unknown-linux-gnu)
  cargo:rerun-if-env-changed=CC_aarch64-unknown-linux-gnu
  CC_aarch64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_aarch64_unknown_linux_gnu
  CC_aarch64_unknown_linux_gnu = Some(clang)
  cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
  CC_KNOWN_WRAPPER_CUSTOM = None
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(true)
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = Some(--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot)
  cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
  CC_SHELL_ESCAPED_FLAGS = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64_unknown_linux_gnu
  CFLAGS_aarch64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=CFLAGS_aarch64-unknown-linux-gnu
  CFLAGS_aarch64-unknown-linux-gnu = None
  CARGO_ENCODED_RUSTFLAGS = Some()

  --- stderr
  thread 'main' panicked at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/aws-lc-sys-0.27.1/builder/cc_builder.rs:455:9:
  COMPILER: clangARGS: ["-O0", "-ffunction-sections", "-fdata-sections", "-fPIC", "-gdwarf-4", "-fno-omit-frame-pointer", "--target=aarch64-unknown-linux-gnu", "--sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot", "/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/aws-lc-sys-0.27.1/aws-lc/tests/compiler_features_tests/memcmp_invalid_stripped_check.c", "-Wno-unused-parameter", "-o", "/my_crate/target/aarch64-unknown-linux-gnu/debug/build/aws-lc-sys-965464ebe9020711/out/memcmp_invalid_stripped_check"]EXECUTED: trueERROR: /usr/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ld.bfd: cannot find crtbeginS.o: No such file or directory
  /usr/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ld.bfd: cannot find -lgcc
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  OUTPUT: Failed to compile memcmp_invalid_stripped_check
              
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

@wjones127
Copy link
Author

It's unclear to me whether this is a valid solution, but I was able to eliminate the build errors in that repro by doing:

ln -s /usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5/crtbeginS.o /usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot/usr/lib/crtbeginS.o

ln -s /usr/aarch64-unknown-linux-gnu/lib/gcc /usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot/usr/lib/gcc
Details

I found the crtbeginS.o file by searching here:

find /usr/aarch64-unknown-linux-gnu/ -name 'crtbeginS.o'

The path I symlinked it to is the sysroot path I saw in the compiler build commands.

Similarly, I found the gcc library with:

find /usr/aarch64-unknown-linux-gnu/ -name gcc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant