繁体   English   中英

从&& str强制为&str的值在裸机上具有空值

[英]Value coerced to &str from &&str has null values on bare metal

这是一个最小的示例:

lib.rs:

#![feature(lang_items)]
#![no_std]

extern crate rlibc;
extern crate libc;

use libc::{c_int, c_char};

#[no_mangle] // just for easier llvm-ir reading
fn foo(baz: &str) -> usize {
    baz.len()
}

#[no_mangle]
pub extern fn main(_argc: c_int, _argv: *const *const c_char) -> c_int {
    let gdb_wait = true; // for debugging with gdb
    while unsafe { core::ptr::read_volatile(&gdb_wait) } {}

    assert_eq!(foo(&"bar_fail"), 0);
    assert_eq!(foo("bar_ok"), 6);

    loop {}
}

// just some functions to run on bare metal.

#[lang = "panic_fmt"]
#[no_mangle]
pub extern fn rust_begin_panic(_msg: core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
    loop {}
}

#[lang = "eh_personality"]
pub extern fn eh_personality() { loop {} }

#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn _Unwind_Resume() -> ! { loop {} }

#[no_mangle]
pub extern fn fmod(_: f64, _: f64) {
    loop {  }
}

#[no_mangle]
pub extern fn fmodf(_: f32, _: f32) {
    loop {  }
}

主函数由qemu-system-x86_64上的asm以64位长模式调用。

传递&&str时,第一个调用的GDB输出。 这不起作用:

(gdb) print baz
$1 = {data_ptr = 0x0, length = 0}

传递&str时,第二个调用的GDB输出。 这工作正常:

(gdb) print baz
$2 = {data_ptr = 0xffffffff80133460 <str4498> "bar_oksrc/lib.rsassertion failed: `(left == right)` (left: ``, right: ``)\001gdb_load_rust_pretty_printers.py", length = 6}

这是一个完整的可运行项目

通过编辑链接描述文件可以解决该问题。 将字符串放在内存中的bss节之后。 因此multiboot用零填充了它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM