A veces necesitamos pequeños programas que encontramos por Internet cuyo ejecutable sólo está para X86-64 (procesador de PC). Vamos a ver como hacerlo para otros procesadores. Esto se le llama en inglés cross compiling.
Lo que haremos será explicar como instalar las herramientas y como compilar para diferentes procesadores. Una vez compilado, pasaremos el ejecutable al dispositivo, le daremos permisos de ejecución y lo ejecutaremos a ver si funciona.
1- Detectando el procesador que tiene el dispositivo
Si el dispositivo corre Linux lo haremos de la siguiente manera:
uname -m
Veremos algunos resultados:
# PC normal
$ uname -m
x86_64
# Orange Pi Zero
$ uname -m
armv7l
# Router Xiaomi 3G
$ uname -m
mips
# QNAP TS-332X
# uname -m
aarch64
Con esto hemos visto la familia del procesador. Para ser más concreto podremos hacer:
cat /proc/cpuinfo
Algunos ejemplos:
# Orange Pi Zero
cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 48.00
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5
...
# QNAP TS-332X
cat /proc/cpuinfo
processor : 0
model name : Annapurna Labs Alpine AL324 Quad-core ARM Cortex-A57 CPU @ 1.70GHz
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd07
CPU revision : 3
...
# Router Xiaomi 3G
cat /proc/cpuinfo
system type : MediaTek MT7621 ver:1 eco:3
machine : Xiaomi Mi Router 3G
processor : 0
cpu model : MIPS 1004Kc V2.15
BogoMIPS : 584.90
wait instruction : yes
microsecond timers : yes
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16 dsp mt
...
2- Instalando lo necesario para compilar
Si queremos compilar para arm de 32 bits. Por ejemplo armv7l instalamos lo siguiente:
sudo apt install gcc make gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi
Si queremos compilar para arm de 64 bits tal como aarch64 instalamos lo siguiente:
sudo apt install gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
Para Openwrt lo veremos luego.
3- Compilando para arm
Vamos a descargar el siguiente programa: BARCODE.C
Sirve para capturar los eventos de por ejemplo lector de código de barras, lector de RFID usb, etc…
Si queremos compilar para arm de 32 bits.
arm-linux-gnueabi-gcc barcode.c -o barcode -static
Si queremos compilar para arm de 64 bits (aarch64).
aarch64-linux-gnueabi-gcc barcode.c -o barcode -static
Pasaremos el archivo llamado barcode al dispositivo arm, lo hacemos ejecutable con chmod +x barcode
y lo ejecutamos.
3- Compilar un paquete suelto para Openwrt
Vamos a seguir primero los pasos que nos dice la página de Openwrt: https://openwrt.org/docs/guide-developer/toolchain/using_the_sdk
Tenemos que preparar el PC instalando los paquetes necesarios. Como yo uso Linux Mint que usa Ubuntu, instal lo siguiente: https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem#debianubuntu
Una vex preparado el sistema, descargamos el sdk necesario dependiendo del modelo de router que tengamos. En mi caso es un ramips-mt7621 que es un Xiaomi 3G. Tú tienes que buscar el tuyo.
Para buscarlo puedes ir a la página de Openwrt y localizar el modelo en la página dedicada a dicho router, lo importante es el SoC.
Ejemplos:
En mi caso to me descargo el SDK de la versión de Openwrt que actualmente tiene mi router del siguiente enlace: https://downloads.openwrt.org/releases/19.07.10/targets/ramips/mt7621/openwrt-sdk-19.07.10-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64.tar.xz. He puesto en negrita la el SoC.
Descomprimimos, entramos dentro de la carpeta descomprimida y editamos el fichero de feeds:
tar -Jxvf openwrt-sdk-19.07.10-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64.tar.xz cd openwrt-sdk-19.07.10-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64 nano feeds.conf.default
Añadimos el git de la aplicación barcode dentro del fichero feeds.conf.default
src-git master https://github.com/ZigFisher/Glutinium/
Luego hacemos:
./scripts/feeds update -a
./scripts/feeds install barcode
Este programa añade siempre un retorno de carro al final. Como nuestro lector de código de barras ya emite dicho código, entraremos en el código fuente que se encuentra en
feeds/master/barcode/src/barcode.c
y anularemos la línea siguiente:
putchar('\n');
comentándola así:
// putchar('\n');
Guardamos y pasamos al siguiente paso.
make menuconfig
Elegimos el paquete o paquetes a compilar. En nuestro caso está dentro de Utitlities.
Compilamos con:
make -j 5 V=cs
Al terminar encontraremos el paquete listo para ser instalado en cualquier dispositivo con chipset mt7621 dentro de la carpeta bin/packages/mipsel_24kc/master/
El paquete será barcode_2_mips_mips32.ipk.
Lo instalaremos en el router con:
opkg install barcode_2_mips_mips32.ipk