【问题标题】:Value coerced to &str from &&str has null values on bare metal从 &&str 强制到 &str 的值在裸机上具有空值
【发布时间】:2016-09-15 12:31:58
【问题描述】:

这是一个最小的例子:

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 {  }
}

main 函数在 64bit-long 模式下由 qemu-system-x86_64 上的 asm 调用。

&&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}

这里是a full runnable project

【问题讨论】:

  • 这听起来很像未定义的行为...附带说明:如果所有方法都是通过引用实现的,则无需为 &amp;'a str 实现特征,您可以直接为 @ 实现它987654329@
  • 为了准确起见,这些语句(tmp.test() 等...)包含在 main 方法中,对吧?
  • 请发帖minimal reproducible example。目前还不清楚Serialwrite_str 是什么。
  • @starblue 完成。
  • 你能objdump -D &lt;executable&gt; 并粘贴相关的东西(所有的东西)。我怀疑 gdb/dwarf 错误地解释 &amp;str &amp;str 可能是问题,而不是代码本身。您可以尝试将 baz.len() 保存到全局变量以确认。

标签: rust bare-metal


【解决方案1】:

通过编辑链接描述文件解决了这个问题。字符串放在内存中 bss 部分之后。所以 multiboot 用零填充它。

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2019-11-29
    • 2019-08-25
    • 2015-09-30
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2016-04-18
    相关资源
    最近更新 更多