Como compilar em um intérprete para mips gcc?

Como compilar em um intérprete para mips gcc?

Joguei fora a velha pergunta que costumava estar aqui, pois ela não é mais relevante pelos motivos listados abaixo em negrito. A questão em si ainda permanece, é apenas o sistema para o qual eu estava tentando compilar cruzadamente que não existe mais. A pergunta antiga foi copiada paraPastebin.

Eu descobri que poderia atualizar o firmware para F@ST 2704N deOpenWRT.org. Usei o link com a interface web do luci e agora tenho OpenWRT no meu roteador. Esta questão ainda é válida porque eu gostaria de aprender como compilar programas cruzados para o meu roteador, mas agora deve ser mais fácil, pois não estou tentando trabalhar com o firmware integrado.

Como posso compilar meus programas para rodar no processador Mips32 versão 1 que executa o OpenWRT?

Use o intérprete diretamente:

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

INFORMAÇÕES DA 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

Versão 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

Binário 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

Meu binário:

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

Olá código-fonte binário:

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

O comando que usei para compilar o binário hello é /opt/cross/gcc-mips/bin/mips-netbsd-elf-gcc -mips32 -Tidt.ld -static hello.c -o hello.

Tentei compilar o programa usando o 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, mas ele gera muitos arquivos e produz o mesmo binário como se eu não tivesse adicionado aquela nova opção de vinculador. Acho que preciso vincular o binário da fonte, mas posso estar errado.

Responder1

eu encontreieste guia em OpenWRT.orgo que me ajudou a aprender como instalar buildtools e acabei de modificar as instruções para se adequar à minha versão do OpenWRT.

Eu verifiquei o git commit70255e3d624cd393612069aae0a859d1acbbeeae (tag: v18.06.1)e eu defino as configurações:

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

Também configurei a variável de ambiente PATH para ter path/to/project/source/staging_dir/toolchain-mips_mips32_gcc-7.3.0_musl/bine executei o comando mips-openwrt-linux-gcc hello.c -o hello.

Devo mencionar que tive que instalar o gnu-getopt e o gnu-time porque estou compilando no OSX.

Além disso, como um bônus adicional, quando testei a compilação em um programa existente, como o BusyBox, consegui compilar o BusyBox usando o comando LDFLAGS="--static" make CROSS_COMPILE="mips-openwrt-linux-".

Editar:

Para aqueles que estão interessados ​​em saber por que os arquivos ELF possuem intérpretes, o intérprete é necessário para configurar o ambiente antes do programa ser carregado. A citação vem de uma postagem no blog emOs pensamentos de Christian Aichingerda seção "Carregamento de programas no kernel".

"Binários vinculados estaticamente podem funcionar sem um intérprete; programas vinculados dinamicamente sempre precisam de /lib/ld-linux.so como intérprete porque inclui algum código de inicialização, carrega bibliotecas compartilhadas necessárias ao binário e executa realocações."

Suspeito que o motivo pelo qual meu programa continuou dizendo "Morto" (no firmware original do Sagemcom), mesmo quando o vinculei estaticamente, é porque o roteador pode ter sido projetado para confundir o usuário que está tentando executar o programa para evitar a execução não autorizada. Eu descobri como compilar o uClibc e fazê-lo funcionar no firmware original e em um dispositivo Sagemcom separado (não relacionado ao perguntado nesta pergunta).

informação relacionada