rust - Integers को गलत तरीके से स्वरूपित किया जाता है जब क्रॉस-कंपाइलिंग को armv5te



cross-compiling (1)

जब मेरे कंप्यूटर पर निम्न प्रोग्राम संकलित करते हैं, तो यह अपेक्षित मान को आउटपुट करता है:

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

संख्या 42 है

जब armv5te के लिए क्रॉस-कंपाइल किया जाता है और लक्ष्य पर चला जाता है, तो यह निम्न परिणाम प्रदर्शित करता है:

संख्या 14 है

मेरा मानना ​​है कि i32 लिए Display के कार्यान्वयन की उम्मीद के अनुरूप काम नहीं कर रहा है। विशेष रूप से, ऐसा लगता है कि मुद्रित पात्रों को गलत इंडेक्स पर निम्न सरणी में लिया गया है ( libcore / fmt / num.rs में पाया गया है):

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

दिखाए गए दो अंक सही जगह की तुलना में 1 बाइट के ऑफसेट पर बाईं ओर तालिका में ले जाते हैं। मैंने कुछ अन्य संख्याओं (10 -> 91, 11 -> 01 उदाहरण के लिए) के साथ परीक्षण करके इस परिकल्पना को सत्यापित किया है।

अन्य स्वरूप ( {:b} , {:o} , {:x} ) सभी मेरे कंप्यूटर और लक्ष्य पर अपेक्षित परिणाम देते हैं।

मैं अपने कंप्यूटर पर सफल परीक्षण और मेरे एआरएम डिवाइस पर असफल होने के लिए रस्ट (1.13.0, 2c6933acc 2016-11-07) के आत्म संकलित संस्करण का उपयोग कर रहा हूं। मेरे द्वारा किए गए संशोधनों में से कुछ भिन्न हैं:

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
 },
 })

अंत में मुझे इस समस्या का समाधान मिला!
समस्या यह थी कि LLVM ठीक से कॉन्फ़िगर नहीं किया गया था और बिना अनारक्षित अभिगम प्रदर्शन कोड उत्पन्न कर रहा था। इसे ठीक करने के लिए, मैंने src / librustc_back / target / arm_unknown_linux_gnueabi.rs में strict-align सुविधा ध्वज जोड़ा है
यहां सभी संशोधनों के साथ अंतिम अंतर है जो मुझे करना था:

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
         },
     })