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?