Skip to content

ch11 build issues: "soft-float", data-layout and rust-lld #122

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

Open
LukasKnuth opened this issue Apr 10, 2025 · 1 comment
Open

ch11 build issues: "soft-float", data-layout and rust-lld #122

LukasKnuth opened this issue Apr 10, 2025 · 1 comment

Comments

@LukasKnuth
Copy link

LukasKnuth commented Apr 10, 2025

I was facing the following issues building ch11-fledgos-0 on my MacBook M1 Pro (2021). I don't think this has anything to do with macos or the ARM architecture, just that tools have changed in the meanwhile.

NOTE: Before anything I applied #88 - I was not able to build the kernel with the current versions of bootloader and x86_64 crates - the serde dependency just does not compile.

Then, the first error I was getting is:

error: failed to run `rustc` to learn about target-specific information

Caused by:
  process didn't exit successfully: `/Users/lukasknuth/.rustup/toolchains/nightly-aarch64-apple-darwin/bin/rustc - --crate-name ___ --print=file-names --target /Users/lukasknuth/hobbies/rust_in_action/chapter11-fledge-os/fledge.json --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=split-debuginfo --print=crate-name --print=cfg -Wwarnings` (exit status: 1)
  --- stderr
  error: error loading target specification: target feature `soft-float` is incompatible with the ABI but gets enabled in target spec
    |
    = help: run `rustc --print target-list` for a list of built-in targets

I found rust-osdev/bootloader#492 which describes that with recent toolchain/compiler changes, one must now also declare "rustc-abi": "x86-softfloat" in the custom target to allow enabling soft-floats.


After making this change, the next error is:

error: data-layout for target `fledge-14973612785232118897`, `e-m:e-i64:64-f80:128-n8:16:32:64-S128`, differs from LLVM target's `x86_64-unknown-none` default layout, `e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128`

Simply taking the expected data-layout from the error message and setting it in fledge.json fixes this error.


The next error is (shortened):

error: unsafe attribute used without unsafe
 --> src/main.rs:9:3
  |
9 | #[no_mangle]
  |   ^^^^^^^^^ usage of unsafe attribute
  |
help: wrap the attribute in `unsafe(...)`
  |
9 | #[unsafe(no_mangle)]
  |   +++++++         +

This is solved as described by switching to #[unsafe(no_mangle)] in the code.


The final error then is:

error: linking with `rust-lld` failed: exit status: 1
  |
  = note:  "rust-lld" "-flavor" "gnu" "/var/folders/01/lvsv345j2m16h2d2ks2w3nw40000gn/T/rustcBjevRz/symbols.o" "<7 object files omitted>" "--as-needed" "-Bstatic" "/Users/lukasknuth/hobbies/rust_in_action/chapter11-fledge-os/target/fledge/debug/deps/{librustc_std_workspace_core-94ce5ca059995fe4.rlib,libcore-a32fa862e11c7483.rlib,libcompiler_builtins-a86ee3a353d6be3b.rlib}.rlib" "-L" "/var/folders/01/lvsv345j2m16h2d2ks2w3nw40000gn/T/rustcBjevRz/raw-dylibs" "-Bdynamic" "--eh-frame-hdr" "-z" "noexecstack" "-o" "/Users/lukasknuth/hobbies/rust_in_action/chapter11-fledge-os/target/fledge/debug/deps/chapter11_fledge_os-5803033311904355" "--gc-sections"
  = note: some arguments are omitted. use `--verbose` to show all linker arguments
  = note: rust-lld: error: undefined symbol: __rustc::rust_begin_unwind
          >>> referenced by panicking.rs:117 (src/panicking.rs:117)
          >>>               core-a32fa862e11c7483.core.865a4b62d07742b3-cgu.12.rcgu.o:(core::panicking::panic_nounwind_fmt::runtime::he4cecbc9d0af3e80) in archive /Users/lukasknuth/hobbies/rust_in_action/chapter11-fledge-os/target/fledge/debug/deps/libcore-a32fa862e11c7483.rlib

This is again due to a recent change in the nightly rust compiler as described by rust-osdev/bootloader#500 - we must drop the #[unsafe(no_mangle)] from the pub fn panic handler.


Now I can build and run the sample again. Here are the full changes again:

Cargo.toml

Same changes as in #88

diff --git a/Cargo.toml b/Cargo.toml
index f442d53..cfdc16f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,6 +8,6 @@ build-command = ["build"]
 run-command = ["qemu-system-x86_64", "-drive", "format=raw,file={}"]
 
 [dependencies]
-bootloader = "0.11.10"
-x86_64 = "0.15.2"
+bootloader = "0.9.22"
+x86_64 = "0.14.10"
 

fledge.json

diff --git a/fledge.json b/fledge.json
index a24b987..7bac1b2 100644
--- a/fledge.json
+++ b/fledge.json
@@ -1,6 +1,6 @@
 {
   "llvm-target": "x86_64-unknown-none",
-  "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
+  "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128",
   "arch": "x86_64",
   "target-endian": "little",
   "target-pointer-width": "64",
@@ -11,5 +11,6 @@
   "executables": true,
   "features": "-mmx,-sse,+soft-float",
   "disable-redzone": true,
-  "panic-strategy": "abort"
+  "panic-strategy": "abort",
+  "rustc-abi": "x86-softfloat"
 }

src/main.rs

diff --git a/src/main.rs b/src/main.rs
index cb31204..db2af4c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,13 +6,12 @@ use core::intrinsics;
 use core::panic::PanicInfo;
 
 #[panic_handler]
-#[no_mangle]
 pub fn panic(_info: &PanicInfo) -> ! {
     // Crash the kernel on panic
     intrinsics::abort();
 }
 
-#[no_mangle]
+#[unsafe(no_mangle)]
 pub extern "C" fn _start() -> ! {
     let framebuffer = 0xb8000 as *mut u8;
 
@LukasKnuth
Copy link
Author

I'm expecting that running this on the newer crate version of bootloader will be a major rewrite because their update documentation specifically mentions that the Framebuffer now works differently: https://github.com/rust-osdev/bootloader/blob/main/docs/migration/v0.9.md

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