numeros enteros ejemplos definicion decimales rust cross-compiling

rust - ejemplos - numeros enteros



Los enteros tienen un formato incorrecto cuando se compilan cruzados para armarse (1)

Al compilar el siguiente programa en mi computadora, genera el valor esperado:

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

el número es 42

Cuando se compila de forma cruzada para armv5te y se ejecuta en el destino, genera el siguiente resultado:

el número es 14

Creo que la implementación de Display for i32 no está funcionando como se esperaba. En particular, parece que los caracteres impresos se toman con un índice incorrecto en la siguiente matriz (que se encuentra en libcore / fmt / num.rs ):

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

Los dos dígitos que se muestran se toman sobre la mesa con una desviación de 1 byte a la izquierda en comparación con el lugar correcto. Verifiqué esta hipótesis probando con otros números (10 -> 91, 11 -> 01, por ejemplo).

Otros formatos ( {:b} , {:o} , {:x} ) dan el resultado esperado en mi computadora y en el objetivo.

Estoy usando una versión auto compilada de Rust (1.13.0, 2c6933acc 2016-11-07) para la prueba exitosa en mi computadora y la que no tuvo éxito en mi dispositivo ARM. Aquí está la diferencia de las modificaciones que tuve que hacer:

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


¡Finalmente encontré una solución a este problema!
El problema era que LLVM no estaba configurado correctamente y generaba código para realizar accesos no alineados. Para solucionar esto, agregué el indicador de función strict-align en src / librustc_back / target / arm_unknown_linux_gnueabi.rs
Aquí está la diferencia final con todas las modificaciones que tuve que hacer:

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