Project

General

Profile

Actions

Bug #20506

closed

YJIT build error on aarch64 with Rust 1.78.0

Added by schneems (Richard Schneeman) about 1 month ago. Updated 20 days ago.

Status:
Third Party's Issue
Assignee:
Target version:
-
[ruby-core:118003]

Description

I was unable to compile Ruby 3.4.0-preview1 on Ubuntu 24.04 via Github Actions. As the logs are not retained indefinitely here's a link to the compilation failure: https://gist.github.com/schneems/bc6bdd6fba08ff6bfdd1bce8d76c457d

The relevant errors seem to be in linking yjit:

touch yjit/target/release/libyjit.a
partial linking yjit/target/release/libyjit.a into yjit/target/release/libyjit.o
linking miniruby
/usr/bin/ld: yjit/target/release/libyjit.o: in function `__multc3':
/cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:33:(.text.__multc3+0x30c): undefined reference to `__builtin_copysignq'
/usr/bin/ld: /cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:34:(.text.__multc3+0x394): undefined reference to `__builtin_copysignq'
/usr/bin/ld: /cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:42:(.text.__multc3+0x7f4): undefined reference to `__builtin_copysignq'
/usr/bin/ld: /cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:43:(.text.__multc3+0x864): undefined reference to `__builtin_copysignq'
/usr/bin/ld: /cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:47:(.text.__multc3+0x8c4): undefined reference to `__builtin_copysignq'
/usr/bin/ld: yjit/target/release/libyjit.o:/cargo/registry/src/index.crates.io-6f17d22bba15001f/compiler_builtins-0.1.108/./lib/builtins/multc3.c:38: more undefined references to `__builtin_copysignq' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:298: miniruby] Error 1
/tmp/lib/build_script.rb:118:in `pipe': Command failed debugflags="-g" ./configure --disable-install-doc --prefix /tmp/d20240524-1-bdq0bj/prefix --enable-load-relative --enable-shared --enable-yjit && make -j16 && make install (RuntimeError)
	from /tmp/lib/build_script.rb:158:in `block in build'
	from /tmp/lib/build_script.rb:152:in `chdir'
	from /tmp/lib/build_script.rb:152:in `build'
	from /tmp/lib/build_script.rb:65:in `block in run_build_script'
	from /usr/lib/ruby/3.2.0/tmpdir.rb:94:in `mktmpdir'
	from /tmp/lib/build_script.rb:61:in `run_build_script'
	from /tmp/build.rb:8:in `<main>'

Here's the GHA link: https://github.com/heroku/docker-heroku-ruby-builder/actions/runs/9225538149/job/25383247191. This is the Dockerfile for Ubuntu 24.04 https://github.com/heroku/docker-heroku-ruby-builder/blob/73bdda974811717baccc05ea3e23f607817fbc8a/dockerfiles/Dockerfile.heroku-24.

I'm able to reproduce the failure locally:

$ git clone https://github.com/heroku/docker-heroku-ruby-builder
$ cd docker-heroku-ruby-builder
$ export DOCKER_DEFAULT_PLATFORM=linux/arm64
$ bin/activate_docker heroku-24
$ bin/build_ruby heroku-24 3.4.0-preview1
# Fails

Full output https://gist.github.com/schneems/cfa21847228d48e6bbe27463deae6745.

I'm also seeing failures when using ruby-install on my mac (ARM), the error message is different so I'm not sure if it's the same problem or unrelated: https://gist.github.com/schneems/12af87e967126c7bfa319645b00015b3

Updated by k0kubun (Takashi Kokubun) about 1 month ago

  • Status changed from Open to Assigned
  • Assignee set to yjit

Updated by eileencodes (Eileen Uchitelle) about 1 month ago

The macos one is https://bugs.ruby-lang.org/issues/20495. Until https://github.com/ruby/ruby/pull/10699 is merged, you can run git checkout coroutine/arm64/Context.S and then make again. I added the git checkout to my build script in the mean time.

Updated by alanwu (Alan Wu) about 1 month ago

This seems to happen with Rust 1.78.0, so as a temporary solution please try any other >=1.58.0 versions.
__builtin_copysignq seems to be an x86 specific intrinsic but rust 1.78.0 is putting it in the ARM archive for some reason.

Updated by schneems (Richard Schneeman) about 1 month ago

Thanks for the fast responses. I was able to get it working on Ubuntu by downgrading rust in my dockerfile (nothing special about 1.75, I randomly picked a version):

RUN rustup install 1.75 && rustup default 1.75

It also looks like other Ruby versions fail to compile with the latest Rust version: It fails with Ruby 3.3.1 on Ubuntu 24.04 with the latest rust (1.78) in addition to Ruby 3.4.0-preview1.

Updated by alanwu (Alan Wu) 20 days ago

  • Subject changed from Failure compiling Ruby 3.4.0-preview1 on aarch64 on a mac and linux (Ubuntu 24.04) to YJIT build error on aarch64 with Rust 1.78.0
  • Status changed from Assigned to Third Party's Issue

This is a Rust regression and I've filed an issue upstream.
I've worked with upstream to hopefully have a fix ship with 1.81.0,
but that will still leave a couple versions unusable.

If you install using rustup, avoid these versions by using e.g.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
    sh -s -- --default-toolchain=1.77.0 --profile=minimal -y --no-modify-path

in your Dockerfile. Another option is to install rustc through
your Linux distribution's package manager, e.g. apt-get install rustc.
That should also avoid this issue.

Actions

Also available in: Atom PDF

Like0
Like0Like1Like1Like0Like0