我有一个在 OpenWRT 下运行的具有 MIPS 架构的嵌入式设备
system type: MediaTek MT7628AN ver:1 eco:2
machine: WRTnode2P processor: 0
cpu model: MIPS 24KEc V5.5
我想通过我的电脑(ubuntu)编译一个C语言的小程序
#include <stdio.h>
int main(void){
printf("HelloWorld");
return 0;
}
为了编译它,我使用 mips-linux-gnu-gcc 命令
mips-linux-gnu-gcc -march=24kec -mabi=32 hello.c -o hello
我将 hello 程序发送到我的设备并创建 chmod 755
chmod 755 hello
当我尝试执行它时出现错误
root@openWrt:/www# ./hello
./hello: line 1: syntax error: unexpected word (expecting ")")
我不明白发生了什么,我尝试了一些其他命令来编译它,就像带参数一样:-EB或-EL或不,-static或不,-mabi=32而不是,但我有同样的问题。
有人能帮帮我吗?
谢谢
[更新]
我向现有文件发送一个文件命令,这就是结果
fw3: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld., for GNU/Linux 3.2.0, stripped
所以我用这个命令编译我的程序
mipsel-linux-gnu-gcc -march=24kec -mips32r2 -mips16 hello.c -o hello
现在我有了这个文件命令结果
hello: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld., for GNU/Linux 3.2.0, BuildID[sha1]=cd12319441c530606d52d96478719b06a7b215a7, not stripped
现在我读取远程程序的 ELF
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 01 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 1
Type: EXEC (Executable file)
Machine: MIPS R3000
Version: 0x1
Entry point address: 0x402c40
Start of program headers: 52 (bytes into file)
Start of section headers: 78592 (bytes into file)
Flags: 0x74001005, noreorder, cpic, o32, mips16, mips32r2
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 10
Size of section headers: 40 (bytes)
Number of section headers: 31
Section header string table index: 30
这是我的 hello 程序 readelf 命令
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: MIPS R3000
Version: 0x1
Entry point address: 0x4005c0
Start of program headers: 52 (bytes into file)
Start of section headers: 6700 (bytes into file)
Flags: 0x74001007, noreorder, pic, cpic, o32, mips16, mips32r2
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 11
Size of section headers: 40 (bytes)
Number of section headers: 33
Section header string table index: 30
有两个不同的 ABI 版本,并且在标志中有图片
如果我尝试启动我的 hello 程序,则会出现此错误
hello: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
我尝试添加 -static 参数,但启动 hello 程序时出现此错误
Illegal instruction
我一直被这个问题困扰。
最佳答案
尝试使用 mipsle 构建
GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build
我有一个类似的问题,并通过将架构师设置为mipsle来解决它。我正在使用 Go 在此设备上为 linux/mips 构建二进制文件,
system type : MediaTek MT7620A ver:2 eco:6
cpu model : MIPS 24KEc V5.0
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16 dsp
第一次就失败了,
macbook:# cat main.go
package main
import (
"fmt"
)
func main() {
fmt.Println("hello, mips")
}
#### Setting GOARCH=mips
macbook:# GOOS=linux GOARCH=mips GOMIPS=softfloat go build -o hello-mips
openwrt:# ./hello-mips
./hello-mips: line 1: syntax error: unexpected "("
然后我意识到CPU架构是Little-Endian ,不是默认的 Big-Endian。所以我改变了构建参数,现在成功了。
#### Setting GOARCH=mipsle
macbook:# GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -o hello
openwrt:# ./hello
hello, mips
您的CPU型号与我的相同,仅版本不同MIPS 24KEc V5.5
,它也必须是mipsle(mipsel)。希望对您有所帮助。
关于linux - 为 OpenWrt 编写和编译程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55878437/