OpenWrt的编写和编译程序 [英] Writing and Compiling Program For OpenWrt
问题描述
我有一台具有MIPS架构的嵌入式设备,可在OpenWRT下工作
I have a embedded device with MIPS arch working under OpenWRT
系统类型:联发科技MT7628AN ver:1 eco:2
机器:WRTnode2P
处理器:0
cpu型号:MIPS 24KEc V5.5
system type: MediaTek MT7628AN ver:1 eco:2
machine: WRTnode2P processor: 0
cpu model: MIPS 24KEc V5.5
我想通过计算机(ubuntu)编译C语言中的一个小程序。
I want to compile compile a small program in C through my computer (ubuntu)
#include <stdio.h>
int main(void){
printf("HelloWorld");
return 0;
}
要编译它,我使用了mips-linux-gnu-gcc命令
To compile it I use mips-linux-gnu-gcc command
mips-linux-gnu-gcc -march=24kec -mabi=32 hello.c -o hello
我向您的设备发送hello程序并生成chmod 755
I send hello program to my device and make a chmod 755
chmod 755 hello
当我尝试执行它时出现错误
When I try to execute it I have an error
root@openWrt:/www# ./hello
./hello: line 1: syntax error: unexpected word (expecting ")")
我不知道发生了什么,我尝试了一些其他命令来进行编译就像带有参数:-EB或-EL与否,-static与否,-mabi = 32与否一样,但是我有同样的问题。
I don't understand what's going on, I tried some others command to compile it like with argument: -EB or -EL or not, -static or not, -mabi=32 and not, but I have same problem.
任何人都可以帮助我?
谢谢
[更新]
我向现有文件发送文件命令,结果是
I send a file command to existing file and this is result
fw3: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld., for GNU/Linux 3.2.0, stripped
,所以我用这个编译了程序命令
so I compile my program with this command
mipsel-linux-gnu-gcc -march=24kec -mips32r2 -mips16 hello.c -o hello
现在我有此文件命令结果
now I have this file command result
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
Now I read ELF of my remote program
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命令
and this my hello program readelf command
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版本有两个不同,并且在标记中有图片
There is two difference ABI version and in flags there is pic
如果我尝试启动我的hello程序,但出现此错误
If I try to launch my hello program I have this error
hello: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
我尝试添加-static参数,但是我有启动hello程序时出现错误
I try to add -static argument but I have this error when I launch my hello program
Illegal instruction
我总是被这个问题困扰。
I'm always stuck with this problem.
推荐答案
我也有类似的问题并通过将Architect设置为 mipsle 来解决此问题。我正在使用Go在此设备上为linux / mips构建二进制文件,
I have a similar issue and fixed it by setting architect to mipsle. I'm using Go to build binary for linux/mips on this device,
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 ,不是默认设置大Endia 。因此,我更改了build参数,现在它成功了。
Then I realized the CPU arch is Little-Endian, not the default Big-Endian. So I changed the build parameter and it successes now.
############# Setting GOARCH=mipsle ============
macbook:# GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -o hello
openwrt:# ./hello
hello, mips
您的CPU模型与我的相同只是版本 MIPS 24KEc V5.5
不同,它还必须是杂项(mipsel)。希望对您有所帮助。
Your CPU model is same as mine and only differs in the revision MIPS 24KEc V5.5
, it must also be mipsle (mipsel). Hope it helps.
这篇关于OpenWrt的编写和编译程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!