Wie kompiliert man gegen einen Interpreter für MIPS GCC?

Wie kompiliert man gegen einen Interpreter für MIPS GCC?

Ich habe die alte Frage, die hier stand, weggeworfen, da sie aus den unten fettgedruckten Gründen nicht mehr relevant ist. Die Frage selbst steht noch, nur das System, für das ich eine Cross-Compilierung durchführen wollte, existiert nicht mehr. Die alte Frage wurde kopiert nachPastebin.

Ich fand heraus, dass ich die Firmware für F@ST 2704N flashen konnte vonOpenWRT.org. Ich habe den Link mit der Luci-Weboberfläche verwendet und habe jetzt OpenWRT auf meinem Router. Diese Frage ist immer noch gültig, da ich lernen möchte, wie ich Programme für meinen Router plattformübergreifend kompiliere, aber jetzt sollte es einfacher sein, da ich nicht versuche, gegen die integrierte Firmware zu arbeiten.

Wie kann ich meine Programme so kompilieren, dass sie auf einem Mips32-Prozessor der Version 1 laufen, auf dem OpenWRT läuft?

Interpreter direkt verwenden:

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

CPU-INFO:

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

Linux-Version:

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

Onboard-Binärdatei:

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

Meine Binärdatei:

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

Hallo Binärer Quellcode:

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

Der Befehl, den ich zum Kompilieren der Hello-Binärdatei verwendet habe, ist /opt/cross/gcc-mips/bin/mips-netbsd-elf-gcc -mips32 -Tidt.ld -static hello.c -o hello.

Ich habe versucht, das Programm mit dem Befehl zu kompilieren /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, aber es generiert viele Dateien und erzeugt dieselbe Binärdatei, als hätte ich diese neue Linker-Option nicht hinzugefügt. Ich denke, ich muss die Binärdatei aus der Quelle verknüpfen, aber ich könnte mich irren.

Antwort1

ich fanddieser Leitfaden auf OpenWRT.orgDadurch habe ich gelernt, wie man Buildtools installiert, und ich habe die Anweisungen einfach so geändert, dass sie zu meiner Version von OpenWRT passen.

Ich habe Git Commit überprüft70255e3d624cd393612069aae0a859d1acbbeeae (Tag: v18.06.1)und ich habe die Einstellungen vorgenommen:

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

Ich habe außerdem die Umgebungsvariable PATH auf have gesetzt path/to/project/source/staging_dir/toolchain-mips_mips32_gcc-7.3.0_musl/binund den Befehl ausgeführt mips-openwrt-linux-gcc hello.c -o hello.

Ich sollte erwähnen, dass ich gnu-getopt und gnu-time installieren musste, weil ich unter OSX kompiliere.

Als zusätzlicher Bonus konnte ich BusyBox mit dem Befehl kompilieren, als ich die Kompilierung mit einem vorhandenen Programm wie BusyBox testete LDFLAGS="--static" make CROSS_COMPILE="mips-openwrt-linux-".

Bearbeiten:

Für diejenigen, die wissen möchten, warum ELF-Dateien Interpreter haben: Der Interpreter wird benötigt, um die Umgebung einzurichten, bevor das Programm geladen wird. Das Zitat stammt aus einem Blog-Beitrag unterChristian Aichingers Gedankenaus dem Abschnitt „Programmladen im Kernel“.

„Statisch verknüpfte Binärdateien kommen ohne Interpreter aus; dynamisch verknüpfte Programme benötigen immer /lib/ld-linux.so als Interpreter, da es Startcode einschließt, von der Binärdatei benötigte gemeinsam genutzte Bibliotheken lädt und Umlagerungen durchführt.“

Ich vermute, der Grund, warum mein Programm immer wieder „Killed“ anzeigte (auf der ursprünglichen Sagemcom-Firmware), selbst wenn ich es statisch verknüpfte, liegt darin, dass der Router möglicherweise so konzipiert wurde, dass er den Benutzer, der versucht, das Programm auszuführen, verwirrt, um eine unbefugte Ausführung zu verhindern. Ich habe herausgefunden, wie man uClibc kompiliert, und es auf der ursprünglichen Firmware und einem separaten Sagemcom-Gerät (nicht verwandt mit dem in dieser Frage gestellten) zum Laufen gebracht.

verwandte Informationen