
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/bin
e 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).