![静态 MIPS 二进制文件上的“非法指令”](https://linux22.com/image/70589/%E9%9D%99%E6%80%81%20MIPS%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E4%B8%8A%E7%9A%84%E2%80%9C%E9%9D%9E%E6%B3%95%E6%8C%87%E4%BB%A4%E2%80%9D.png)
我正在尝试在我的 MIPS 机器上运行一个程序。我使用 mips 的交叉编译器。当我运行我的程序时,我得到
Illegal instruction
我从中提取了一个二进制文件,名为cputest
.它基本上打印“hello world”,但有一些延迟。以下是readelf
有关它的内容:
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
当我在没有标志的情况下交叉编译我的程序(仅打印“hello world”)-static
并尝试运行它时,会发生以下情况:
# 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
为什么我找不到它?
所以我用标志编译它-static
,这是readelf
输出(由于这里的大小限制,我只放一部分)
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)
两个二进制文件(静态和动态)在 quemu 和我的第二个 MIPS 机器上运行得很好。有什么想法吗?
“非法指令”是否是由于不同的ld-uClibc
libc 名称/版本造成的?
@Stephen-Kitt 这是
# 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
我基本上运行Ubuntu14.04
mips-gcc -o hello.mips hello.c
mips-gcc -static -o hello.static hello.c
mips gcc 来自 Debian 代表
$ 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)