2

On my MIPS box I'm trying to run a program. I use a cross compiler for mips. When I run my program, I'm getting

Illegal instruction

I pulled of one binary from it, called cputest. It basically prints "hello world" with some delay. Here is what readelf tells about it:

readelf -a ./cputest.mips 
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: 0x4004e0
 Start of program headers: 52 (bytes into file)
 Start of section headers: 1956 (bytes into file)
 Flags: 0x1007, noreorder, pic, cpic, o32, mips1
 Size of this header: 52 (bytes)
 Size of program headers: 32 (bytes)
 Number of program headers: 8
 Size of section headers: 40 (bytes)
 Number of section headers: 20
 Section header string table index: 19
Section Headers:
 [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
 [ 0] NULL 00000000 000000 000000 00 0 0 0
 [ 1] .interp PROGBITS 00400134 000134 000014 00 A 0 0 1
 [ 2] .reginfo MIPS_REGINFO 00400148 000148 000018 18 A 0 0 4
 [ 3] .dynamic DYNAMIC 00400160 000160 0000c8 08 A 6 0 4
 [ 4] .hash HASH 00400228 000228 000058 04 A 5 0 4
 [ 5] .dynsym DYNSYM 00400280 000280 000110 10 A 6 1 4
 [ 6] .dynstr STRTAB 00400390 000390 0000d0 00 A 0 0 1
 [ 7] .init PROGBITS 00400460 000460 000028 00 AX 0 0 4
 [ 8] .text PROGBITS 00400490 000490 0000b0 00 AX 0 0 16
 [ 9] .MIPS.stubs PROGBITS 00400540 000540 000040 00 AX 0 0 4
 [10] .fini PROGBITS 00400580 000580 000028 00 AX 0 0 4
 [11] .rodata PROGBITS 004005a8 0005a8 000010 01 AMS 0 0 4
 [12] .data PROGBITS 004105c0 0005c0 000010 00 WA 0 0 16
 [13] .rld_map PROGBITS 004105d0 0005d0 000004 00 WA 0 0 4
 [14] .got PROGBITS 004105e0 0005e0 000020 04 WAp 0 0 16
 [15] .pdr PROGBITS 00000000 000600 0000c0 00 0 0 4
 [16] .comment PROGBITS 00000000 0006c0 000033 01 MS 0 0 1
 [17] .gnu.attributes LOOS+ffffff5 00000000 0006f3 000010 00 0 0 1
 [18] .mdebug.abi32 PROGBITS 00000010 000703 000000 00 0 0 1
 [19] .shstrtab STRTAB 00000000 000703 0000a1 00 0 0 1
Key to Flags:
 W (write), A (alloc), X (execute), M (merge), S (strings)
 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
 O (extra OS processing required) o (OS specific), p (processor specific)
There are no section groups in this file.
Program Headers:
 Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
 PHDR 0x000034 0x00400034 0x00400034 0x00100 0x00100 R E 0x4
 INTERP 0x000134 0x00400134 0x00400134 0x00014 0x00014 R 0x1
 [Requesting program interpreter: /lib/ld-uClibc.so.0]
 REGINFO 0x000148 0x00400148 0x00400148 0x00018 0x00018 R 0x4
 LOAD 0x000000 0x00400000 0x00400000 0x005b8 0x005b8 R E 0x10000
 LOAD 0x0005c0 0x004105c0 0x004105c0 0x00040 0x00040 RW 0x10000
 DYNAMIC 0x000160 0x00400160 0x00400160 0x000c8 0x000c8 RWE 0x4
 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
 NULL 0x000000 0x00000000 0x00000000 0x00000 0x00000 0x4
 Section to Segment mapping:
 Segment Sections...
 00 
 01 .interp 
 02 .reginfo 
 03 .interp .reginfo .dynamic .hash .dynsym .dynstr .init .text .MIPS.stubs .fini .rodata 
 04 .data .rld_map .got 
 05 .dynamic 
 06 
 07 
Dynamic section at offset 0x160 contains 20 entries:
 Tag Type Name/Value
 0x00000001 (NEEDED) Shared library: [libc.so.0]
 0x0000000f (RPATH) Library rpath: [/home/xia/Builds/H208N_V1.0_Dev/csp/release/tools/uclibc/lib]
 0x0000000c (INIT) 0x400460
 0x0000000d (FINI) 0x400580
 0x00000004 (HASH) 0x400228
 0x00000005 (STRTAB) 0x400390
 0x00000006 (SYMTAB) 0x400280
 0x0000000a (STRSZ) 208 (bytes)
 0x0000000b (SYMENT) 16 (bytes)
 0x70000016 (MIPS_RLD_MAP) 0x4105d0
 0x00000015 (DEBUG) 0x0
 0x00000003 (PLTGOT) 0x4105e0
 0x70000001 (MIPS_RLD_VERSION) 1
 0x70000005 (MIPS_FLAGS) NOTPOT
 0x70000006 (MIPS_BASE_ADDRESS) 0x400000
 0x7000000a (MIPS_LOCAL_GOTNO) 2
 0x70000011 (MIPS_SYMTABNO) 17
 0x70000012 (MIPS_UNREFEXTNO) 19
 0x70000013 (MIPS_GOTSYM) 0xb
 0x00000000 (NULL) 0x0
There are no relocations in this file.
The decoding of unwind sections for machine type MIPS R3000 is not currently supported.
Symbol table '.dynsym' contains 17 entries:
 Num: Value Size Type Bind Vis Ndx Name
 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 
 1: 004105c0 0 NOTYPE GLOBAL DEFAULT 12 _fdata
 2: 00000001 0 SECTION GLOBAL DEFAULT ABS _DYNAMIC_LINKING
 3: 004185d0 0 NOTYPE GLOBAL DEFAULT ABS _gp
 4: 00400490 0 NOTYPE GLOBAL DEFAULT 8 _ftext
 5: 004105d0 0 OBJECT GLOBAL DEFAULT 13 __RLD_MAP
 6: 00410600 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
 7: 00410600 0 NOTYPE GLOBAL DEFAULT ABS _edata
 8: 004105e0 0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
 9: 00410600 0 NOTYPE GLOBAL DEFAULT ABS _end
 10: 00410600 0 NOTYPE GLOBAL DEFAULT ABS _fbss
 11: 00400580 28 FUNC GLOBAL DEFAULT 10 _fini
 12: 00400490 72 FUNC GLOBAL DEFAULT 8 main
 13: 00400560 0 FUNC GLOBAL DEFAULT UND __uClibc_main
 14: 00400460 28 FUNC GLOBAL DEFAULT 7 _init
 15: 00400550 0 FUNC GLOBAL DEFAULT UND sleep
 16: 00400540 0 FUNC GLOBAL DEFAULT UND printf
Histogram for bucket list length (total of 3 buckets):
 Length Number % of total Coverage
 0 0 ( 0.0%)
 1 0 ( 0.0%) 0.0%
 2 0 ( 0.0%) 0.0%
 3 0 ( 0.0%) 0.0%
 4 0 ( 0.0%) 0.0%
 5 2 ( 66.7%) 62.5%
 6 1 ( 33.3%) 100.0%
No version information found in this file.
Attribute Section: gnu
File Attributes
 Tag_GNU_MIPS_ABI_FP: Soft float
Primary GOT:
 Canonical gp value: 004185d0
 Reserved entries:
 Address Access Initial Purpose
 004105e0 -32752(gp) 00000000 Lazy resolver
 004105e4 -32748(gp) 80000000 Module pointer (GNU extension)
 Global entries:
 Address Access Initial Sym.Val. Type Ndx Name
 004105e8 -32744(gp) 00400580 00400580 FUNC 10 _fini
 004105ec -32740(gp) 00400490 00400490 FUNC 8 main
 004105f0 -32736(gp) 00400560 00400560 FUNC UND __uClibc_main
 004105f4 -32732(gp) 00400460 00400460 FUNC 7 _init
 004105f8 -32728(gp) 00400550 00400550 FUNC UND sleep
 004105fc -32724(gp) 00400540 00400540 FUNC UND printf

When I cross compile my program (which just prints "hello world") without the -static flag and try to run it, here is what happens:

# ls
hello.mips
# ./hello.mips
/bin/sh: ./hello.mips: Permission denied
# chmod +x hello.mips 
# ./hello.mips
/bin/sh: ./hello.mips: not found
# ls -la
drwxrwxrwx 2 zhangxia root 0 Aug 8 00:01 .
drwxr-xr-x 3 zhangxia root 0 Aug 7 22:46 ..
-rwsrwsrwx 1 888 root 5743 Aug 8 00:01 hello.mips

Why can't I find it when it's there?

So I compile it with the -static flag and here is the readelf output (because of size limits here I will put just a part)

readelf -a hello.static 
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: 0x400280
 Start of program headers: 52 (bytes into file)
 Start of section headers: 647608 (bytes into file)
 Flags: 0x1007, noreorder, pic, cpic, o32, mips1
 Size of this header: 52 (bytes)
 Size of program headers: 32 (bytes)
 Number of program headers: 6
 Size of section headers: 40 (bytes)
 Number of section headers: 33
 Section header string table index: 30
Section Headers:
 [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
 [ 0] NULL 00000000 000000 000000 00 0 0 0
 [ 1] .note.ABI-tag NOTE 004000f4 0000f4 000020 00 A 0 0 4
 [ 2] .reginfo MIPS_REGINFO 00400114 000114 000018 18 A 0 0 4
 [ 3] .note.gnu.build-i NOTE 0040012c 00012c 000024 00 A 0 0 4
 [ 4] .rel.dyn REL 00400150 000150 000098 08 A 0 0 4
 [ 5] .init PROGBITS 004001e8 0001e8 000098 00 AX 0 0 4
 [ 6] .text PROGBITS 00400280 000280 07b5a0 00 AX 0 0 16
 [ 7] __libc_freeres_fn PROGBITS 0047b820 07b820 0013a8 00 AX 0 0 4
 [ 8] .fini PROGBITS 0047cbc8 07cbc8 000054 00 AX 0 0 4
 [ 9] .rodata PROGBITS 0047cc20 07cc20 015a00 00 A 0 0 16
 [10] .eh_frame PROGBITS 004a2620 092620 0019a4 00 WA 0 0 4
 [11] .gcc_except_table PROGBITS 004a3fc4 093fc4 00014e 00 WA 0 0 1
 [12] .tdata PROGBITS 004a4114 094114 000010 00 WAT 0 0 4
 [13] .tbss NOBITS 004a4124 094124 000018 00 WAT 0 0 4
 [14] .ctors PROGBITS 004a4124 094124 000008 00 WA 0 0 4
 [15] .dtors PROGBITS 004a412c 09412c 00000c 00 WA 0 0 4
 [16] .jcr PROGBITS 004a4138 094138 000004 00 WA 0 0 4
 [17] .data.rel.ro PROGBITS 004a413c 09413c 00259c 00 WA 0 0 4
 [18] .data PROGBITS 004a66e0 0966e0 0007c0 00 WA 0 0 16
 [19] __libc_subfreeres PROGBITS 004a6ea0 096ea0 000030 00 WA 0 0 4
 [20] __libc_atexit PROGBITS 004a6ed0 096ed0 000004 00 WA 0 0 4
 [21] .got PROGBITS 004a6ee0 096ee0 000a48 04 WAp 0 0 16
 [22] .sdata PROGBITS 004a7928 097928 000004 00 WAp 0 0 4
 [23] .sbss NOBITS 004a7930 09792c 0000fc 00 WAp 0 0 8
 [24] .bss NOBITS 004a7a30 09792c 001c10 00 WA 0 0 16
 [25] __libc_freeres_pt NOBITS 004a9640 09792c 000018 00 WA 0 0 4
 [26] .pdr PROGBITS 00000000 09792c 006700 00 0 0 4
 [27] .comment PROGBITS 00000000 09e02c 000039 01 MS 0 0 1
 [28] .gnu.attributes LOOS+ffffff5 00000000 09e065 000010 00 0 0 1
 [29] .mdebug.abi32 PROGBITS 00001320 09e075 000000 00 0 0 1
 [30] .shstrtab STRTAB 00000000 09e075 000140 00 0 0 1
 [31] .symtab SYMTAB 00000000 09e6e0 006d70 10 32 655 4
 [32] .strtab STRTAB 00000000 0a5450 0065f4 00 0 0 1
Key to Flags:
 W (write), A (alloc), X (execute), M (merge), S (strings)
 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
 O (extra OS processing required) o (OS specific), p (processor specific)
There are no section groups in this file.
Program Headers:
 Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
 REGINFO 0x000114 0x00400114 0x00400114 0x00018 0x00018 R 0x4
 LOAD 0x000000 0x00400000 0x00400000 0x92620 0x92620 R E 0x10000
 LOAD 0x092620 0x004a2620 0x004a2620 0x0530c 0x07038 RW 0x10000
 NOTE 0x0000f4 0x004000f4 0x004000f4 0x00020 0x00020 R 0x4
 NOTE 0x00012c 0x0040012c 0x0040012c 0x00024 0x00024 R 0x4
 TLS 0x094114 0x004a4114 0x004a4114 0x00010 0x00028 R 0x4
 Section to Segment mapping:
 Segment Sections...
 00 .reginfo 
 01 .note.ABI-tag .reginfo .note.gnu.build-id .rel.dyn .init .text __libc_freeres_fn .fini .rodata 
 02 .eh_frame .gcc_except_table .tdata .ctors .dtors .jcr .data.rel.ro .data __libc_subfreeres __libc_atexit .got .sdata .sbss .bss __libc_freeres_ptrs 
 03 .note.ABI-tag 
 04 .note.gnu.build-id 
 05 .tdata .tbss 
There is no dynamic section in this file.
Relocation section '.rel.dyn' at offset 0x150 contains 19 entries:
 Offset Info Type Sym.Value Sym. Name
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
00000000 00000000 R_MIPS_NONE 
The decoding of unwind sections for machine type MIPS R3000 is not currently supported.
Symbol table '.symtab' contains 1751 entries:
 Num: Value Size Type Bind Vis Ndx Name
 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 
 1: 004000f4 0 SECTION LOCAL DEFAULT 1 
 2: 00400114 0 SECTION LOCAL DEFAULT 2 
 1747: 004a5d58 36 OBJECT GLOBAL DEFAULT 17 _nl_C_LC_IDENTIFICATION
 1748: 004a9580 76 OBJECT GLOBAL DEFAULT 24 _dl_ns
 1749: 00450f20 3016 FUNC GLOBAL DEFAULT 6 _nl_load_locale_from_arch
 1750: 004380e0 248 FUNC WEAK DEFAULT 6 wctrans
No version information found in this file.
Displaying notes found at file offset 0x000000f4 with length 0x00000020:
 Owner Data size Description
 GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
 OS: Linux, ABI: 2.6.18
Displaying notes found at file offset 0x0000012c with length 0x00000024:
 Owner Data size Description
 GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
 Build ID: a56a4b258e108ec9affb61c4a8ba46527052bca9
Attribute Section: gnu
File Attributes
 Tag_GNU_MIPS_ABI_FP: Hard float (double precision)

Both binaries (static and dynamic) runs just fine in quemu and on my second MIPS box. Any thoughts?

Could "Illegal instruction" be due to different ld-uClibc, libc names/versions?

@Stephen-Kitt Here it is

# ldd ./hello.mips 
/bin/sh: ldd: not found
cat proc/version 
Linux version 2.6.30.9 (xia@njzd) (gcc version 4.4.6 (Realtek RSDK-1.5.6p2) ) #2 Wed Apr 29 18:57:54 CST 2015
# cat proc/cpuinfo 
system type: RTL8672 
processor: 0 
cpu model : 56322 
BogoMIPS: 619.31 
tlb_entries : 64 
mips16 implemented : yes

Im running Ubuntu14.04 basicly

mips-gcc -o hello.mips hello.c
mips-gcc -static -o hello.static hello.c

mips gcc is from Debian rep

$ mips-linux-gnu-gcc -v
Using built-in specs.
Target: mips-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/mips-linux-gnu/include/c++/4.4.5 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --disable-libssp --enable-targets=all --enable-checking=release --program-prefix=mips-linux-gnu- --includedir=/usr/mips-linux-gnu/include --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=mips-linux-gnu --with-headers=/usr/mips-linux-gnu/include --with-libs=/usr/mips-linux-gnu/lib
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)

I obtained it from here http://www.emdebian.org/debian/

asked Aug 8, 2015 at 2:05
8
  • Could you edit your question to add the following information? I'd like to know what OS you're running on the MIPS box, and on the cross-compiler box; it would also help to know how you're cross-compiling. As for your dynamic binary, ldd hello.mips (on your MIPS box) should help explain the "not found" message. Commented Aug 8, 2015 at 13:08
  • There is no much tools available, basically there is striped busybox and few others custom made Commented Aug 8, 2015 at 14:46
  • I totally forgot sorry, that is what I could find, if there is anything else :) Commented Aug 8, 2015 at 15:33
  • Thanks, could you also show the output of mips-gcc -v? What is your second MIPS box? (And I'm curious as to what you mean by "mips gcc is from Debian rep"... Which Debian repository?) Commented Aug 8, 2015 at 15:48
  • I did tried to compile it with march=mips32 and mips32r2 but same deal :) Commented Aug 8, 2015 at 16:00

1 Answer 1

2
# cat proc/cpuinfo 
system type: RTL8672 
processor: 0 
cpu model: 56322 

An RTL8672 is not a full MIPS implementation, but a Lexra. You will need a customized toolchain that knows how to handle this.

Something like this, or for a binary-only toolchain, look for rsdk; e.g., this.

HalosGhost
4,87010 gold badges37 silver badges42 bronze badges
answered Jun 24, 2016 at 22:01

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.