Compilando programas en C para diferentes procesadores desde Ubuntu.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

25 − = 16