Kompilując następujący program na moim komputerze, wyprowadza oczekiwaną wartość:Liczby są sformatowane niepoprawnie kiedy cross-kompilacji do armv5te
fn main() {
let number = 42;
println!("number is {}", number);
}
liczba jest 42
Kiedy cross-kompilowany dla armv5te i uruchomić na celu, daje następujący wynik:
numer jest 14
Wierzę, że wdrożenie Display
dla i32
nie działa zgodnie z oczekiwaniami. W szczególności wydaje się, że znaki drukowane są podejmowane w nieodpowiednim indeksem w poniższej tablicy (znaleziono w libcore/fmt/num.rs):
const DEC_DIGITS_LUT: &'static[u8] =
b"0001020304050607080910111213141516171819\
2021222324252627282930313233343536373839\
4041424344454647484950515253545556575859\
6061626364656667686970717273747576777879\
8081828384858687888990919293949596979899";
dwie cyfry wyświetlane są podejmowane na stole z przesunięciem o 1 bajt w lewo w porównaniu z właściwym miejscem. Sprawdziłem tę hipotezę, testując z innymi liczbami (na przykład 10 -> 91, 11 -> 01).
Inne formaty ({:b}
, {:o}
, {:x}
) dają oczekiwany wynik na moim komputerze i na celu.
Używam samodzielne skompilowaną wersję Rust (1.13.0, 2c6933acc 2016-11-07) do udanego testu na moim komputerze i nieudanej jeden na urządzeniu ARM. Oto różnica modyfikacji, które musiałem wykonać:
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
},
})
Czy próbowałeś debugowanie na tarczy? Wkroczenie do kodu formatowania w celu sprawdzenia wskaźnika i indeksu może być bardzo przydatne. –
Zgadzam się z Tobą @MatthieuM. ale jestem nowy na rdzę i nie wiem, jak to zrobić. Co mogę użyć do debugowania kodu na moim celu? –
Rust tworzy normalne pliki binarne, więc używaj zwykłych narzędzi do debugowania, takich jak GDB lub LLDB. – Shepmaster