Operating system rust呼叫失败::未启用着陆垫标志时检查失败

Operating system rust呼叫失败::未启用着陆垫标志时检查失败,operating-system,rust,Operating System,Rust,我一直在尝试用rust编写基本内核,但链接脚本失败,出现以下错误: roost.rs:(.text.kmain+0x12a):未定义对“failure::fail\u bounds\u check::hee3207bbe41f708990v::v0.11.0”的引用。 我使用以下标志编译rust源文件: -O--目标i686未知linux gnu-Z无着陆垫--板条箱类型lib--emit=obj 如果我正确理解了rust编译器,-Z no landing pads选项,那么应该可以阻止编译器生

我一直在尝试用rust编写基本内核,但链接脚本失败,出现以下错误:
roost.rs:(.text.kmain+0x12a):未定义对“failure::fail\u bounds\u check::hee3207bbe41f708990v::v0.11.0”的引用。

我使用以下标志编译rust源文件:

-O--目标i686未知linux gnu-Z无着陆垫--板条箱类型lib--emit=obj

如果我正确理解了rust编译器,-Z no landing pads选项,那么应该可以阻止编译器生成失败函数。从测试中我可以看出,只有当kmain函数调用我的函数io::write_char(c:char)时,才会生成failure函数

这是io::write_char(c:char)的定义

如何阻止rust尝试调用不存在的函数failure::fail\u bounds\u check

编辑:进一步的测试表明vga::place_char_at函数是原因。代码如下:

pub fn place_char_at(c: char, x: u8, y: u8) {
    let tmpx = 
        if x >= VGA_WIDTH {
            VGA_WIDTH - 1
        } else {
            x
        };
    let tmpy = 
        if y >= VGA_HEIGHT {
            VGA_HEIGHT - 1
        } else {
            y
        };
    unsafe {
        (*SCREEN)[(tmpy as uint) * 80 + (tmpx as uint)].char = c as u8;
    }
}
从我所知道的情况来看,问题是rust想要绑定检查我正在执行的数组访问,有没有一种方法可以让编译器确信检查已经完成,或者关闭该函数的功能

Edit2:所以我在工作之后解决了它。在翻遍文档后,我发现rust有一个绕过绑定检查的向量访问功能。为了使用它,我将place\u char\u at函数改为:

pub fn place_char_at(c: char, x: u8, y: u8) {
    let tmpx = 
        if x >= VGA_WIDTH {
            VGA_WIDTH - 1
        } else {
            x
        };
    let tmpy = 
        if y >= VGA_HEIGHT {
            VGA_HEIGHT - 1
        } else {
            y
        };
    unsafe {
        (*SCREEN).unsafe_mut_ref((tmpy as uint) * 80 + (tmpx as uint)).char = c as u8;
    }
}

您没有描述屏幕的类型,但是如果它实现了MutableVector trait,您可能需要使用不安全的_集():

unsafe fn unsafe_集(self,index:uint,val:T)


这不执行边界检查,如果索引大于self的长度,则这是未定义的行为。但是,它确实在索引处运行析构函数。它相当于self[index]=val。

请确保链接到libcore。libcore还有一个依赖项:失败的定义。确保在异常代码中的某个位置标记函数。要求
begin\u unwind
不返回。以我为例

有没有办法。。。关闭该功能的功能

没有。用bstrie的话来说。换句话说,安全是最重要的

pub fn place_char_at(c: char, x: u8, y: u8) {
    let tmpx = 
        if x >= VGA_WIDTH {
            VGA_WIDTH - 1
        } else {
            x
        };
    let tmpy = 
        if y >= VGA_HEIGHT {
            VGA_HEIGHT - 1
        } else {
            y
        };
    unsafe {
        (*SCREEN).unsafe_mut_ref((tmpy as uint) * 80 + (tmpx as uint)).char = c as u8;
    }
}