Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 交叉编译到armv5te时,整数的格式不正确_Rust_Cross Compiling - Fatal编程技术网

Rust 交叉编译到armv5te时,整数的格式不正确

Rust 交叉编译到armv5te时,整数的格式不正确,rust,cross-compiling,Rust,Cross Compiling,在我的计算机上编译以下程序时,它会输出预期值: fn main() { let number = 42; println!("number is {}", number); } 号码是42 当为armv5te交叉编译并在目标上运行时,它会输出以下结果: 号码是14 我相信i32的Display的实现没有按预期工作。特别是,打印的字符似乎在以下数组中的错误索引处(在中找到): 显示的两位数字在表格上的左侧偏移量为1字节,而右侧偏移量为1字节。我用其他一些数字(例如10->91,1

在我的计算机上编译以下程序时,它会输出预期值:

fn main() {
    let number = 42;
    println!("number is {}", number);
}
号码是42

当为armv5te交叉编译并在目标上运行时,它会输出以下结果:

号码是14

我相信
i32
Display
的实现没有按预期工作。特别是,打印的字符似乎在以下数组中的错误索引处(在中找到):

显示的两位数字在表格上的左侧偏移量为1字节,而右侧偏移量为1字节。我用其他一些数字(例如10->91,11->01)验证了这个假设

其他格式(
{:b}
{:o}
{:x}
)都给出了我的计算机和目标上的预期结果


我正在使用Rust的自编版本(1.13.0,2c6933acc 2016-11-07)在我的计算机上进行成功的测试,在我的ARM设备上进行失败的测试。以下是我必须进行的修改的差异:

diff --git a/mk/cfg/arm-unknown-linux-gnueabi.mk b/mk/cfg/arm-unknown-linux-gnueabi.mk
index f66ad04..b9e4157 100644
--- a/mk/cfg/arm-unknown-linux-gnueabi.mk
+++ b/mk/cfg/arm-unknown-linux-gnueabi.mk
@@ -1,5 +1,5 @@
 # arm-unknown-linux-gnueabi configuration
-CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-linux-gnueabi-
+CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-unknown-linux-uclibcgnueabi-
 CC_arm-unknown-linux-gnueabi=gcc
 CXX_arm-unknown-linux-gnueabi=g++
 CPP_arm-unknown-linux-gnueabi=gcc -E
@@ -8,8 +8,8 @@ CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).a
 CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
-CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfloat-abi=soft $(CFLAGS) -march=armv6 -marm
-CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfloat-abi=soft $(CFLAGS) -march=armv6 -marm
+CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfloat-abi=soft $(CFLAGS) -fno-stack-protector -march=armv5te -mtune=arm926ej-s
+CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfloat-abi=soft $(CFLAGS) -fno-stack-protector -march=armv5te -mtune=arm926ej-s
 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti $(CXXFLAGS)
 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
diff --git a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
index e666a84..551bba0 100644
--- a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
+++ b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
@@ -24,7 +24,7 @@ pub fn target() -> TargetResult {
         target_vendor: "unknown".to_string(),

         options: TargetOptions {
-            features: "+v6".to_string(),
+            features: "+v5te,+strict-align".to_string(),
             .. base
         },
     })
diff--git a/mk/cfg/arm-unknown-linux-gnueabi.mk b/mk/cfg/arm-unknown-linux-gnueabi.mk
索引f66ad04..b9e4157 100644
---a/mk/cfg/arm-unknown-linux-gnueabi.mk
+++b/mk/cfg/arm-unknown-linux-gnueabi.mk
@@ -1,5 +1,5 @@
#arm未知linux gnueabi配置
-交叉前缀\u arm-unknown-linux-gnueabi=arm-linux-gnueabi-
+CROSS_PREFIX_arm-unknown-linux-gnueabi=arm unknown linux uclibcgnueabi-
CC_arm-unknown-linux-gnueabi=gcc
CXX_arm-unknown-linux-gnueabi=g++
CPP_arm-unknown-linux-gnueabi=gcc-E
@@-8,8+8,8@@CFG_LIB_NAME_arm-unknown-linux-gnueabi=LIB$(1)。那么
CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=LIB$(1).a
CFG_LIB_GLOB_arm-unknown-linux-gnueabi=LIB$(1)-*.so
CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=LIB$(1)-*.dylib.DSYM
-CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi:=-Darm-mfloat abi=soft$(CFLAGS)-march=armv6-marm
-CFG\u GCCISH\u CFLAGS\u arm-unknown-linux-gnueabi:=-Wall-g-fPIC-Darm-mfloat abi=soft$(CFLAGS)-march=armv6-marm
+CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi:=-Darm-mfloat abi=soft$(CFLAGS)-fno堆栈保护器-march=armv5te-mtune=arm926ej-s
+CFG\u GCCISH\u CFLAGS\u arm-unknown-linux-gnueabi:=-Wall-g-fPIC-Darm-mfloat abi=soft$(CFLAGS)-fno堆栈保护器-march=armv5te-mtune=arm926ej-s
CFG\u GCCISH\u cxflags\u arm-unknown-linux-gnueabi:=-fno rtti$(cxflags)
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi:=-shared-fPIC-g
CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi:=-Wl,--导出动态,--动态列表=
diff——git a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
索引e666a84..8af2596 100644
---a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
+++b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
@@-24,7+24,7@@pub fn target()->TargetResult{
目标供应商:“未知”。到字符串(),
选项:目标选项{
-功能:“+v6”。至_字符串(),
+功能:“+v5te”。至_字符串(),
基础
},
})

我终于找到了这个问题的解决方案
问题是LLVM配置不正确,正在生成代码执行未对齐的访问。为了解决这个问题,我在src/librustc\u back/target/arm\u unknown\u linux\u gnueabi.rs中添加了
strict align
feature标志
以下是我必须进行的所有修改的最终差异:

diff --git a/mk/cfg/arm-unknown-linux-gnueabi.mk b/mk/cfg/arm-unknown-linux-gnueabi.mk
index f66ad04..b9e4157 100644
--- a/mk/cfg/arm-unknown-linux-gnueabi.mk
+++ b/mk/cfg/arm-unknown-linux-gnueabi.mk
@@ -1,5 +1,5 @@
 # arm-unknown-linux-gnueabi configuration
-CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-linux-gnueabi-
+CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-unknown-linux-uclibcgnueabi-
 CC_arm-unknown-linux-gnueabi=gcc
 CXX_arm-unknown-linux-gnueabi=g++
 CPP_arm-unknown-linux-gnueabi=gcc -E
@@ -8,8 +8,8 @@ CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).a
 CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
-CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfloat-abi=soft $(CFLAGS) -march=armv6 -marm
-CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfloat-abi=soft $(CFLAGS) -march=armv6 -marm
+CFG_JEMALLOC_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfloat-abi=soft $(CFLAGS) -fno-stack-protector -march=armv5te -mtune=arm926ej-s
+CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfloat-abi=soft $(CFLAGS) -fno-stack-protector -march=armv5te -mtune=arm926ej-s
 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti $(CXXFLAGS)
 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
diff --git a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
index e666a84..551bba0 100644
--- a/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
+++ b/src/librustc_back/target/arm_unknown_linux_gnueabi.rs
@@ -24,7 +24,7 @@ pub fn target() -> TargetResult {
         target_vendor: "unknown".to_string(),

         options: TargetOptions {
-            features: "+v6".to_string(),
+            features: "+v5te,+strict-align".to_string(),
             .. base
         },
     })

你试过在目标上调试吗?进入格式化代码检查指针和索引可能非常有用。我同意@MatthieuM。但我对生锈还不熟悉,我不知道怎么才能做到。我可以用什么来调试我的目标上的代码?Rust会创建普通的二进制文件,所以可以使用普通的调试工具,如GDB或LLDB。可能是对齐吗?如果数组从奇数地址开始读取16位值,则在读取时可以忽略最后一个地址位,也就是说,它将从比奇数地址低一位的偶数地址读取。这是否适用于LEGO Mindstorms EV3?