아래에 굵게 표시된 이유 때문에 더 이상 관련이 없기 때문에 여기에 있던 오래된 질문을 버렸습니다. 문제 자체는 여전히 존재합니다. 단지 제가 크로스 컴파일하려는 시스템이 더 이상 존재하지 않는다는 것뿐입니다. 이전 질문이 다음 위치에 복사되었습니다.붙여넣기 상자.
F@ST 2704N의 펌웨어를 플래시할 수 있다는 것을 알았습니다.OpenWRT.org. 나는 luci 웹 인터페이스에 대한 링크를 사용했고 이제 내 라우터에 OpenWRT가 있습니다. 내 라우터용 프로그램을 크로스 컴파일하는 방법을 배우고 싶기 때문에 이 질문은 여전히 유효하지만 내장 펌웨어에 대해 작업을 시도하지 않으므로 이제는 더 쉬워질 것입니다.
OpenWRT를 실행하는 Mips32 버전 1 프로세서에서 실행되도록 내 프로그램을 어떻게 컴파일합니까?
통역사를 직접 사용하십시오.
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 정보:
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
리눅스 버전:
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의 이 가이드이는 빌드 도구를 설치하는 방법을 배우는 데 도움이 되었으며 내 OpenWRT 버전에 맞게 지침을 수정했습니다.
git commit을 확인해보니70255e3d624cd393612069aae0a859d1acbbeeae(태그: v18.06.1)나는 설정을 지정했습니다 :
system "Broadcom BCM63xx"
subtarget "generic"
profile "Sagem F@ST2704N"
path/to/project/source/staging_dir/toolchain-mips_mips32_gcc-7.3.0_musl/bin
또한 명령을 갖고 실행하도록 PATH 환경 변수를 설정했습니다 mips-openwrt-linux-gcc hello.c -o hello
.
OSX에서 컴파일한 이후로 gnu-getopt와 gnu-time을 설치해야 했다는 점을 언급하고 싶습니다.
또한 추가 보너스로 BusyBox와 같은 기존 프로그램에 대해 컴파일을 테스트했을 때 LDFLAGS="--static" make CROSS_COMPILE="mips-openwrt-linux-"
.
편집하다:
ELF 파일에 인터프리터가 필요한 이유에 관심이 있는 분들을 위해 인터프리터는 프로그램이 로드되기 전에 환경을 설정합니다. 블로그 게시물에서 인용크리스티안 아이징거의 생각"커널에서 프로그램 로딩" 섹션에서.
"정적으로 링크된 바이너리에는 인터프리터가 필요하지 않을 수 있습니다. 동적으로 링크된 프로그램에는 일부 시작 코드가 포함되어 있고 바이너리에 필요한 공유 라이브러리를 로드하며 재실행 위치를 수행하기 때문에 항상 인터프리터로 /lib/ld-linux.so가 필요합니다."
내 프로그램을 정적으로 연결했는데도 원래 Sagemcom 펌웨어에서 계속 "Killed"가 표시되는 이유는 아마도 라우터가 무단 액세스 실행을 방지하기 위해 프로그램을 실행하려는 사용자를 혼란스럽게 하도록 설계되었기 때문일 것입니다. 나는 uClibc를 컴파일하고 원래 펌웨어와 별도의 Sagemcom 장치(이 질문에서 질문한 장치와 관련 없음)에서 작동하도록 하는 방법을 알아냈습니다.