linux - 为 OpenWrt 编写和编译程序

标签 linux embedded cross-compiling openwrt

我有一个在 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/

相关文章:

c - 为什么 mmap() 在 1TB 稀疏文件上因 ENOMEM 而失败?

C 无符号模导致编译器警告

rust - 如何在 ARM 嵌入式 Rust 中使用更少的内存进行取模

linux - 在 Linux 中安排输出看起来像表格列

linux - 如何在套接字关闭时唤醒 select()?

c - 定点小数 printf 输出

scala - 使用 sbt 交叉编译 Scala 时如何拥有不同的源代码? (MurmurHash 的变化)

raspberry-pi - 在 Windows 7 上配置 QT Creator(Raspberry pi 是目标)

linux - 如何为 imx6 处理器构建 Qt 应用程序?

linux - ./build.sh inari 尝试为 inari 设备构建 Firefox OS 失败