Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing and Compiling Program For OpenWrt

I have a embedded device with MIPS arch working under OpenWRT

system type: MediaTek MT7628AN ver:1 eco:2
machine: WRTnode2P processor: 0
cpu model: MIPS 24KEc V5.5

I want to compile compile a small program in C through my computer (ubuntu)

#include <stdio.h>

int main(void){
    printf("HelloWorld");
    return 0;
}

To compile it I use mips-linux-gnu-gcc command

mips-linux-gnu-gcc -march=24kec -mabi=32 hello.c -o hello

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 ")")

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.

Anyone to help me?

Thanks

[UPDATE]

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

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

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

There is two difference ABI version and in flags there is pic

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

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.

like image 580
Black_Syphilis Avatar asked Oct 19 '25 09:10

Black_Syphilis


1 Answers

Try build with mipsle

GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build

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

It fails on the first time,

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 "("

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

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.

like image 192
Farr Parrish Avatar answered Oct 21 '25 22:10

Farr Parrish



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!