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

no_std | rust-lld: error: undefined symbol: fmod #204

Closed
senseiod opened this issue Feb 18, 2021 · 5 comments
Closed

no_std | rust-lld: error: undefined symbol: fmod #204

senseiod opened this issue Feb 18, 2021 · 5 comments

Comments

@senseiod
Copy link

The following error occurred when I compiled. I used [no_std]

error: linking with rust-lld failed: exit code: 1
|
= note: "rust-lld" "-flavor" "gnu" "--script=kernel/.cargo/linker-amd64.ld" "--eh-frame-hdr" "-L" "/Users/moyan/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-unknown-none/lib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.0.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.1.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.10.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.11.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.12.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.13.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.14.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.15.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.2.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.3.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.4.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.5.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.6.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.7.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.8.rcgu.o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.9.rcgu.o" "-o" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.55q3sd5wjw65l95x.rcgu.o" "--gc-sections" "-L" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps" "-L" "/Users/moyan/Desktop/Nitrogen/target/release/deps" "-L" "/Users/moyan/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-unknown-none/lib" "-Bstatic" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libx86_smpboot-8e81c0d798b60932.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbuddy_system_allocator-f8b66032220abdc5.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbitmap_allocator-af9b094d1a519536.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libfatpart-0727f15f7734052e.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libuart_16550-e2cf326f1958c62e.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libpc_keyboard-b739eda1d27e408b.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libcrossbeam_queue-a14c63777446712d.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libcrossbeam_utils-87694ca9ab9c652e.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/librcore_console-ffc729f7eb5b9cfe.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libvte-a8eccd6610fff71b.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libutf8parse-91de4d4412f850a4.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libarrayvec-e93cb97575e4608a.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libembedded_graphics-e840ebe5eadc83a7.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbyteorder-a4e730b8cfbf0f3d.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libpci-972d6dc714e5b900.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libisomorphic_drivers-96d5970aa9609774.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libvolatile-1c4fbe3073bb0b5c.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libchrono-496d2cef901a62cd.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libnum_integer-0a904a802b3d5592.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libnum_traits-8ec2c0f81f480d93.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/liblibm-29ba16972c9545ab.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libapic-a723727ea4151acd.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libx86-6f96f44b6c430612.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libraw_cpuid-05a4c6f5e8dcf87f.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libspin-80c7ddac49bf0f46.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/liblazy_static-87454fbe3a37561d.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libspin-1e6619332c8da860.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbootlib-5858c658c3bdfbd3.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libxmas_elf-060ce72ae41a618e.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libzero-cfd2e85cd7004aa9.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libuefi-8c54833f0be43ca1.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libucs2-b0c3f8b296a258ad.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libacpi-7c1e8da1b95f9305.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbit_field-7fe43b8b59f50498.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libx86_64-0067b45b8d99ac1c.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbitflags-88049f10c38d6614.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libbit_field-4784ed1f0f9b9c61.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/liblog-99364cdc9ec59178.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libcfg_if-e421a2c73879a02a.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/liballoc-1ef765c4ad8ae6df.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/librustc_std_workspace_core-cc550d870d19b846.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libcore-456e8934ceb2165f.rlib" "/Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/libcompiler_builtins-e4104c4a6d948d19.rlib" "-Bdynamic"
= note: rust-lld: error: undefined symbol: fmod
>>> referenced by kernel.cqsbvbmg-cgu.8
>>> /Users/moyan/Desktop/Nitrogen/target/x86_64-unknown-none/release/deps/kernel-14f138026edce7e1.kernel.cqsbvbmg-cgu.8.rcgu.o:(kernel::formats::format_size::h3751f48305e53fa9)

Display:= note: rust-lld: error: undefined symbol: fmod. I don't know what's going on

@cuviper
Copy link
Member

cuviper commented Feb 19, 2021

Is kernel::formats::format_size using floating-point? Does your target allow that?

@senseiod
Copy link
Author

Yes, I use floating-point numbers

@senseiod
Copy link
Author

senseiod commented Feb 19, 2021

This is my code

use alloc::format;
use alloc::string::String;
use num_traits::float::FloatCore;

const KB: f64 = 1024.0;
const MB: f64 = 1024.0 * KB;
const GB: f64 = 1024.0 * MB;

pub fn format_size(size: f64) -> String {
    let a = size.trunc();
    if size < KB {
        format!("{} B", size as usize)
    } else if size < MB {
        format!("{} KB", (size / KB) as usize)
    } else if size < GB {
        format!("{} MB", (size / MB) as usize)
    } else {
        format!("{} GB", (size / GB) as usize)
    }
}

The problem is let a= size.trunc ();
In [no_std] The compiler recommends that I use num-traits crate

@cuviper
Copy link
Member

cuviper commented Feb 19, 2021

Is your target set for +soft-float? Kernels usually are, so they don't have to save and restore the userspace floating point state. I would avoid all floating point if possible in such contexts, and it seems to me that you could write that function with integers.

The normal std version of f64::trunc() uses intrinsics::truncf64(), which maps to llvm.trunc.f64. For targets that don't have native instructions for this (like soft-float!), that may generate an external call to the C libm or some compiler-builtin function.

FloatCore implements trunc() using fract(), and that's implemented using self % Self::one(). For a soft-float target, LLVM translates that to an external call to the C libm function fmod, which is what you're seeing.

I do have pull request #196 to use the Rust libm crate for parts of FloatCore, including trunc() and fract(). I'm not sure if that will work in your kernel context, but you could try that with a dependency like this:

[dependencies.num-traits]
git = "https://github.com/cuviper/num-traits"
branch = "more-libm"
default-features = false
features = ["libm"]

@senseiod
Copy link
Author

senseiod commented Feb 21, 2021

Is your target set for +soft-float? Kernels usually are, so they don't have to save and restore the userspace floating point state. I would avoid all floating point if possible in such contexts, and it seems to me that you could write that function with integers.

The normal std version of f64::trunc() uses intrinsics::truncf64(), which maps to llvm.trunc.f64. For targets that don't have native instructions for this (like soft-float!), that may generate an external call to the C libm or some compiler-builtin function.

FloatCore implements trunc() using fract(), and that's implemented using self % Self::one(). For a soft-float target, LLVM translates that to an external call to the C libm function fmod, which is what you're seeing.

I do have pull request #196 to use the Rust libm crate for parts of FloatCore, including trunc() and fract(). I'm not sure if that will work in your kernel context, but you could try that with a dependency like this:

[dependencies.num-traits]
git = "https://github.com/cuviper/num-traits"
branch = "more-libm"
default-features = false
features = ["libm"]

oh Thank you. It's normal now. Thank you for answering my questions

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

2 participants