1

I want to use rust-mbedtls in my no-std rust project. But, in no_std without libc, I need to provide my own version of the standard C function calloc()/free() Therefore, I wrote my rust version calloc()/free() as showed in the following so that the rust-mbedtls can use it as C calloc and free :

const ALIGNMENT: usize = 16;
#[no_mangle]
pub extern "C" fn calloc(number_of_elements: core::ffi::c_ulong, element_size: core::ffi::c_ulong) -> *mut core::ffi::c_void {


    // TODO: CHECK number_of_elements or element_size is null
    // 0 as *mut c_void;
    //core::mem::transmute(0) as *mut c_void
    if number_of_elements == 0 || element_size == 0 {
        return core::ptr::null_mut() as *mut core::ffi::c_void;
    }

    let total_size = number_of_elements * element_size;
    let layout = Layout::from_size_align(total_size as usize, ALIGNMENT).unwrap();

    let ptr;
    unsafe {
        ptr = alloc(layout);
    }

    let pointer_addr = ptr.addr();

    {
        let mut allocator_tracker = ALLCATOR_RECODER.write();
        allocator_tracker.memory_layout_records.insert(pointer_addr, layout.clone());
    }

    ptr as *mut core::ffi::c_void
}

#[no_mangle]
pub extern "C" fn free(ptr: *mut core::ffi::c_void) {
    if ptr.is_null() { return }

    let ptr = ptr as *mut u8;

    let ptr_addr = ptr.addr();

    let layout;
    {
        let allocator_tracker = ALLCATOR_RECODER.write();
        layout = match allocator_tracker.memory_layout_records.get(&ptr_addr) {
            Some(e) => e.clone(),
            None => return,
        };
    }

    unsafe{
        dealloc(ptr, layout);
    }
}

But I got a compilation error when I tried to link my rust calloc and free to mbedtls:

ld: failed to convert GOTPCREL relocation; relink with --no-relax
make[1]: *** [makefile:20: ../build/qkernel.bin] Error 1
make[1]: Leaving directory '/home/yaoxin/master-thesis-quark/qkernel'
make: *** [makefile:5: release] Error 2

Do you have any idea what should I do?

I also tried to add the --no-relax flag, but it doesn't work, see Failed to add linker flag to rust project

x86_64-qkernel.json:

{
  "llvm-target": "x86_64-unknown-none",
  "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128",
  "linker-flavor": "gcc",
  "target-endian": "little",
  "target-pointer-width": "64",
  "target-c-int-width": "32",
  "arch": "x86_64",
  "os": "none",
  "disable-redzone": true,
  "features": "-mmx,-avx,-sse,+soft-float",
  "frame-pointer": "always"
}

How I compile the project:

RUSTFLAGS="--cfg aes_force_soft --cfg polyval_force_soft -Clink-args=-Wl,--no-relax" CARGO_TARGET_DIR=../target cargo xbuild --target x86_64-qkernel.json  --verbose

The output:

  Running `rustc --crate-name qkernel src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type staticlib --emit=dep-info,link -C opt-level=3 -C panic=abort -C lto -C codegen-units=1 -C debuginfo=0 -C metadata=97ea9ce0f16c5783 -C extra-filename=-97ea9ce0f16c5783 --out-dir /home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps --target /home/yaoxin/master-thesis-quark/qkernel/x86_64-qkernel.json -L dependency=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps -L dependency=/home/yaoxin/master-thesis-quark/qkernel/../target/release/deps --extern aes_gcm=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libaes_gcm-717643e861007e33.rlib --extern aes_gcm_siv=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libaes_gcm_siv-6f995755fa597bbe.rlib --extern base64ct=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libbase64ct-5496b92f22bd80b8.rlib --extern bit_field=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libbit_field-edd6bdbd617b1f8f.rlib --extern bitflags=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libbitflags-ac365e5f42b95894.rlib --extern cache_padded=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libcache_padded-4f6ef68df93e90d0.rlib --extern enum_dispatch=/home/yaoxin/master-thesis-quark/qkernel/../target/release/deps/libenum_dispatch-671ddf5618cdf268.so --extern getrandom=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libgetrandom-13f5719ebfa51caa.rlib --extern hex_literal=/home/yaoxin/master-thesis-quark/qkernel/../target/release/deps/libhex_literal-2bb5f3d83aaee4c8.so --extern hmac=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libhmac-2655769827370b4b.rlib --extern httparse=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libhttparse-5bed1f6ea6993fbf.rlib --extern lazy_static=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/liblazy_static-94dc823d8024600b.rlib --extern mbedtls=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libmbedtls-24156e7768130449.rlib --extern mbedtls_sys=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libmbedtls_sys-ff2dc58ff93490e8.rlib --extern modular_bitfield=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libmodular_bitfield-03c5fd99465e3eaf.rlib --extern postcard=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libpostcard-9eda30e977dc625d.rlib --extern rand=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/librand-92d7b15db76a3fe4.rlib --extern scopeguard=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libscopeguard-cbe5443c11ade540.rlib --extern serde=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libserde-36089da064e8c146.rlib --extern serde_derive=/home/yaoxin/master-thesis-quark/qkernel/../target/release/deps/libserde_derive-fd9f7691d8feac18.so --extern serde_json=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libserde_json-ec6207dfb10065b9.rlib --extern sha2=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libsha2-bd36cfb2ea89f366.rlib --extern spin=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libspin-f3efecb2ec9af5e5.rlib --extern x86_64=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libx86_64-4f8fad8682003e13.rlib --extern xmas_elf=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/deps/libxmas_elf-674d0e0c9e007595.rlib --cfg aes_force_soft --cfg polyval_force_soft -Clink-args=-Wl,--no-relax --sysroot /home/yaoxin/master-thesis-quark/qkernel/../target/sysroot -L native=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/build/mbedtls-c08fa7036f067dee/out -L native=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/build/mbedtls-sys-auto-32089ec779500d3b/out/build/library -L native=/home/yaoxin/master-thesis-quark/qkernel/../target/x86_64-qkernel/release/build/mbedtls-sys-auto-32089ec779500d3b/out/build/crypto/library`

The compilation error:

    Finished release [optimized] target(s) in 1m 05s
ld: failed to convert GOTPCREL relocation; relink with --no-relax
make: *** [makefile:20: ../build/qkernel.bin] Error 1

Could you please give me some help?

yaoxin jing
  • 55
  • 1
  • 4

0 Answers0