¿Cómo compilar con un intérprete para mips gcc?

¿Cómo compilar con un intérprete para mips gcc?

Descarté la vieja pregunta que solía estar aquí porque ya no es relevante por las razones que se enumeran a continuación en negrita. La pregunta en sí sigue en pie, es solo que el sistema para el que estaba intentando realizar una compilación cruzada ya no existe. La antigua pregunta ha sido copiada aPastebin.

Descubrí que podía actualizar el firmware para F@ST 2704N desdeOpenWRT.org. Utilicé el enlace con la interfaz web luci y ahora tengo OpenWRT en mi enrutador. Esta pregunta sigue siendo válida porque me gustaría aprender a realizar una compilación cruzada de programas para mi enrutador, pero ahora debería ser más fácil ya que no estoy tratando de trabajar con el firmware incorporado.

¿Cómo puedo compilar mis programas para ejecutarlos en un procesador Mips32 versión 1 que ejecuta OpenWRT?

Utilice el intérprete directamente:

root@OpenWrt:~# /lib/ld-musl-mips-sf.so.1 hello
/lib/ld-musl-mips-sf.so.1: hello: Not a valid dynamic program

root@OpenWrt:~# ./hello
Segmentation fault

INFORMACIÓN DE LA CPU:

root@OpenWrt:~# cat /proc/cpuinfo
system type     : bcm63xx/F@ST2704N (0x6318/0xB0)
machine         : Sagem F@ST2704N
processor       : 0
cpu model       : Broadcom BMIPS3300 V3.3
BogoMIPS        : 332.54
wait instruction    : yes
microsecond timers  : yes
tlb_entries     : 32
extra interrupt vector  : yes
hardware watchpoint : no
isa         : mips1 mips2 mips32r1
ASEs implemented    :
shadow register sets    : 1
kscratch registers  : 0
package         : 0
core            : 0
VCED exceptions     : not available
VCEI exceptions     : not available

Versión de Linux:

root@OpenWrt:~# cat /proc/version
Linux version 4.1.4 (thepeople@viasatpilot) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r46566) ) #1 Fri Aug 7 05:54:20 CEST 2015

Binario integrado:

Alexs-MacBook-Air:hello-world senor$ file ls
ls: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-mips-sf.so.1, stripped

Alexs-MacBook-Air:hello-world senor$ /opt/cross/gcc-mips/bin/mips-netbsd-elf-readelf -h ls
ELF Header:
  Magic:   7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           MIPS R3000
  Version:                           0x1
  Entry point address:               0x403990
  Start of program headers:          52 (bytes into file)
  Start of section headers:          427656 (bytes into file)
  Flags:                             0x50001005, noreorder, cpic, o32, mips32
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         29
  Section header string table index: 28

Mi binario:

Alexs-MacBook-Air:hello-world senor$ file hello
hello: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, with debug_info, not stripped

Alexs-MacBook-Air:hello-world senor$ /opt/cross/gcc-mips/bin/mips-netbsd-elf-readelf -h hello
ELF Header:
  Magic:   7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           MIPS R3000
  Version:                           0x1
  Entry point address:               0xa0020004
  Start of program headers:          52 (bytes into file)
  Start of section headers:          200884 (bytes into file)
  Flags:                             0x50001001, noreorder, o32, mips32
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         29
  Section header string table index: 28

Hola código fuente binario:

#include <stdio.h>
int main() {
  printf("Hello MIPS! \n");
  return 0;
}

El comando que utilicé para compilar el binario hello es /opt/cross/gcc-mips/bin/mips-netbsd-elf-gcc -mips32 -Tidt.ld -static hello.c -o hello.

Intenté compilar el programa usando el comando /opt/cross/gcc-mips/bin/mips-netbsd-elf-gcc -mips32 -Tidt.ld -dynamic-linker=/lib/ld-musl-mips-sf.so.1 -static hello.c -o hello-inter, pero genera muchos archivos y produce el mismo binario que si no hubiera agregado esa nueva opción de vinculación. Creo que necesito vincular el binario desde la fuente, pero podría estar equivocado.

Respuesta1

encontréesta guía en OpenWRT.orglo que me ayudó a aprender cómo instalar buildtools y simplemente modifiqué las instrucciones para que se ajusten a mi versión de OpenWRT.

Revisé git commit70255e3d624cd393612069aae0a859d1acbbeeae (etiqueta: v18.06.1)y configuro la configuración:

system "Broadcom BCM63xx"
subtarget "generic"
profile "Sagem F@ST2704N"

También configuré la variable de entorno PATH path/to/project/source/staging_dir/toolchain-mips_mips32_gcc-7.3.0_musl/biny ejecuté el comando mips-openwrt-linux-gcc hello.c -o hello.

Debo mencionar que tuve que instalar gnu-getopt y gnu-time porque estoy compilando en OSX.

Además, como beneficio adicional, cuando probé la compilación con un programa existente, como BusyBox, pude compilar BusyBox usando el comando LDFLAGS="--static" make CROSS_COMPILE="mips-openwrt-linux-".

Editar:

Para aquellos que estén interesados ​​en saber por qué los archivos ELF tienen intérpretes, el intérprete es necesario para configurar el entorno antes de cargar el programa. La cita proviene de una publicación de blog enLos pensamientos de Christian Aichingerde la sección "Carga de programa en el kernel".

"Los binarios vinculados estáticamente pueden funcionar sin un intérprete; los programas vinculados dinámicamente siempre necesitan /lib/ld-linux.so como intérprete porque incluye código de inicio, carga bibliotecas compartidas que necesita el binario y realiza reubicaciones".

Sospecho que la razón por la que mi programa seguía diciendo "Eliminado" (en el firmware original de Sagemcom) incluso cuando lo vinculé estáticamente es porque el enrutador puede haber sido diseñado para confundir al usuario que intenta ejecutar el programa para evitar una ejecución no autorizada. Descubrí cómo compilar uClibc y lo hice funcionar en el firmware original y en un dispositivo Sagemcom separado (no relacionado con el que se pregunta en esta pregunta).

información relacionada