
Я удалил старый вопрос, который был здесь, поскольку он больше не актуален по причинам, указанным ниже жирным шрифтом. Сам вопрос все еще актуален, просто система, для которой я пытался выполнить кросс-компиляцию, больше не существует. Старый вопрос был скопирован вPastebin.
Я понял, что могу прошить прошивку для F@ST 2704N отOpenWRT.org. Я использовал ссылку с веб-интерфейсом luci, и теперь на моем маршрутизаторе установлен OpenWRT. Этот вопрос все еще актуален, поскольку я хотел бы узнать, как кросс-компилировать программы для моего маршрутизатора, но теперь это должно быть проще, поскольку я не пытаюсь работать со встроенной прошивкой.
Как скомпилировать программы для работы на процессоре Mips32 версии 1, работающем под управлением OpenWRT?
Использовать переводчик напрямую:
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
ИНФОРМАЦИЯ О ЦП:
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:
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
Встроенный двоичный код:
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
Мой двоичный файл:
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
Привет, двоичный исходный код:
#include <stdio.h>
int main() {
printf("Hello MIPS! \n");
return 0;
}
Команда, которую я использовал для компиляции двоичного файла hello, — /opt/cross/gcc-mips/bin/mips-netbsd-elf-gcc -mips32 -Tidt.ld -static hello.c -o hello
.
Я пробовал скомпилировать программу с помощью команды /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
, но она генерирует много файлов и производит тот же двоичный файл, как если бы я не добавлял эту новую опцию компоновщика. Я думаю, мне нужно связать двоичный файл из исходного кода, но я могу ошибаться.
решение1
я нашелэто руководство на OpenWRT.orgчто помогло мне научиться устанавливать buildtools, и я просто изменил инструкции, чтобы они соответствовали моей версии OpenWRT.
Я проверил git commit70255e3d624cd393612069aae0a859d1acbbeeae (тег: v18.06.1)и я установил настройки:
system "Broadcom BCM63xx"
subtarget "generic"
profile "Sagem F@ST2704N"
Я также установил переменную среды PATH path/to/project/source/staging_dir/toolchain-mips_mips32_gcc-7.3.0_musl/bin
и выполнил команду mips-openwrt-linux-gcc hello.c -o hello
.
Должен отметить, что мне пришлось установить gnu-getopt и gnu-time, поскольку я компилирую на OSX.
Кроме того, в качестве дополнительного бонуса, когда я тестировал компиляцию с существующей программой, такой как BusyBox, я смог скомпилировать BusyBox с помощью команды LDFLAGS="--static" make CROSS_COMPILE="mips-openwrt-linux-"
.
Редактировать:
Для тех, кому интересно, почему файлы ELF имеют интерпретаторы, интерпретатор нужен для настройки среды перед загрузкой программы. Цитата взята из записи в блогеМысли Кристиана Айхингераиз раздела «Загрузка программ в ядро».
«Статически скомпонованные двоичные файлы могут обойтись без интерпретатора; динамически скомпонованные программы всегда нуждаются в /lib/ld-linux.so в качестве интерпретатора, поскольку он включает в себя некоторый код запуска, загружает общие библиотеки, необходимые двоичному файлу, и выполняет перемещения».
Я подозреваю, что причина, по которой моя программа продолжала говорить "Killed" (на оригинальной прошивке Sagemcom), даже когда я связал ее статически, заключается в том, что маршрутизатор мог быть разработан так, чтобы сбить с толку пользователя, который пытается запустить программу, чтобы предотвратить несанкционированное выполнение. Я разобрался, как скомпилировать uClibc, и заставил его работать на оригинальной прошивке и отдельном устройстве Sagemcom (не связанном с тем, о котором спрашивалось в этом вопросе).