2016-12-28 2 views
11

При составлении следующей программы на моем компьютере, он выдает ожидаемое значение:Целые неправильно отформатированы при кроссе-компиляции для armv5te

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

числа является 42

Когда кросс-скомпилирован для armv5te и запускается на цель, он выдает следующий результат:

номер 14

Я считаю, что реализация Display для i32 не работает должным образом. В частности, представляется, что символы, напечатанные, берутся в неправильном индексе в следующем массиве (найден в libcore/fmt/num.rs):

const DEC_DIGITS_LUT: &'static[u8] = 
    b"0001020304050607080910111213141516171819\ 
     2021222324252627282930313233343536373839\ 
     4041424344454647484950515253545556575859\ 
     6061626364656667686970717273747576777879\ 
     8081828384858687888990919293949596979899"; 

две цифры отображаются взяты на столе при смещении 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 := -Darm -mfloat-abi=soft $(CFLAGS) -march=armv6 -marm 
-CFG_GCCISH_CFLAGS_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-stack-protector -march=armv5te -mtune=arm926ej-s 
+CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -Darm -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..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 { 
target_vendor: "unknown".to_string(), 

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

Вы пробовали отладки на цели? Вхождение кода форматирования для проверки указателя и индекса может быть очень информативным. –

+0

Я согласен с тобой @MatthieuM. но я новичок в ржавчине, и я не знаю, как я могу это сделать. Что я могу использовать для отладки кода на моей цели? –

+1

Rust создает нормальные двоичные файлы, поэтому используйте обычные инструменты для отладки, такие как GDB или LLDB. – Shepmaster

ответ

5

Я, наконец, нашел решение этой проблемы!
Проблема заключалась в том, что LLVM не был правильно настроен и генерировал код, выполняющий неравномерные обращения. Чтобы это исправить, я добавил флаг в strict-align функции в SRC/librustc_back/цели/arm_unknown_linux_gnueabi.rs
Вот окончательный дифференциал со всеми изменениями, которые я должен был сделать:

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 
     }, 
    }) 
Смежные вопросы