Linux 从x86交叉编译MIPS路由器

Linux 从x86交叉编译MIPS路由器,linux,gcc,embedded,mips,uclibc,Linux,Gcc,Embedded,Mips,Uclibc,我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网网桥。目前,它的无线功能(似乎)由管理大部分web界面的同一个二进制文件控制,但它们似乎使用了无线工具库内部使用的至少部分功能 我以前从未为不同的CPU体系结构进行过交叉编译,也不知道如何完全确定我需要做什么。我尝试使用uClibc,因为它似乎在系统的其余部分中使用,但我不确定如何为调制解调器环境配置buildroot。我根据下面proc中的信息对配置进行了详细说明,但由于一个只返回0的简单C应用程

我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网网桥。目前,它的无线功能(似乎)由管理大部分web界面的同一个二进制文件控制,但它们似乎使用了无线工具库内部使用的至少部分功能

我以前从未为不同的CPU体系结构进行过交叉编译,也不知道如何完全确定我需要做什么。我尝试使用uClibc,因为它似乎在系统的其余部分中使用,但我不确定如何为调制解调器环境配置buildroot。我根据下面proc中的信息对配置进行了详细说明,但由于一个只返回0的简单C应用程序无法正常运行,因此出现了一些错误

# cat /proc/version 
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@localhost.localdomain) (gcc version 2.95.3 20010315 (release/MontaVista)) #1 Thu Apr 21 18:04:37 PDT 2005
# cat /proc/cpuinfo 
processor               : 0
cpu model               : MIPS 4KEc V4.8
BogoMIPS                : 149.91
wait instruction        : no
microsecond timers      : yes
extra interrupt vector  : yes
hardware watchpoint     : yes
VCED exceptions         : not available
VCEI exceptions         : not available

您是对的,您需要一个合适的mips工具链来交叉编译您的应用程序,并且可以做到这一点。但是您可能需要调整buildroot的menuconfig选项。 根据
文件的输出,您的选项可能会更改。在我的系统上,二进制应用程序通知以下内容:

ELF 32位MSB可执行文件,MIPS,MIPS32 rel2版本1(SYSV)

以下是我为Buildroot菜单配置启用的选项:

Target Architecture (mips)  ---> 
Target Architecture Variant (mips 32r2)  --->                                                            
Target ABI (o32)  --->                                                                                   
Target options  --->                                                                                     
Build options  --->   
    (/opt/cross-mips-buildroot) Toolchain and header file location?                                                                                   
Toolchain  --->        
    Toolchain type (Buildroot toolchain)  ---> 
    Kernel Headers (Linux 2.6.34.x kernel headers)  --->
    uClibc C library Version (uClibc 0.9.31.x)  ---> 
    [*] Build/install a shared libgcc?
    [*] Enable compiler tls support       
    [*] Build gdb debugger for the Target
    [*] Build gdb server for the Target
    [*] Build gdb for the Host
        GDB debugger Version (gdb 6.8)  --->
    [*] Enable large file (files > 2 GB) support?
    [*] Enable WCHAR support
    [*] Use software floating point by default
    [*] Enable stack protection support
    [*] Build/install c++ compiler and libstdc++?
    [*] Include target utils in cross toolchain  
Package Selection for the target  --->   
    [*] BusyBox
    [*]   Run BusyBox's own full installation
    Libraries  ---> 
        Networking  ---> 
            [*] libcurl
        Text and terminal handling  ---> 
            [*] icu
            -*- ncurses    
Target filesystem options  --->                                                                          
Bootloaders  --->                                                                                        
Kernel  --->
工具链本身安装在/opt/cross-mips buildroot上。您可以在/opt/cross-mips buildroot/usr/bin/

试着编译一个简单的hello world应用程序,看看是否可以在mips系统中运行它

<强>注释:此配置将不生成C++编译器。如果您需要它,您可以

grep LIBSTDCPP.config
检查它是否启用,并根据您的喜好进行更改。然后
进行菜单配置
以实现此目的。

请查看:


这是GCC下交叉编译的权威网站。

请随时查看该项目。它们提供跨工具链作为各种体系结构的容器

就个人而言,我更喜欢保持我的主机系统尽可能干净,所以这对我来说是一个完美的匹配。 要启动并运行一个简单的hello world示例,请按照以下步骤操作

MIPS上的HelloWorld.c 但是,请检查我的hello world编译以获得正在运行的路由器。(我链接了openWRT wiki页面而不是dd wrt,更喜欢这个页面)

检查路由器上使用的是哪个arch,请信任wiki页面,或者通过ssh/telnet连接并运行命令

root@DD-警告:~#uname-a
Linux DD-WRT 3.10.108-d10#63184 11月3日星期二05:20:50+03 2020 mips DD-WRT
因此,我们可以从dockerhub中提取mips容器:

#拉动mips的dockcross容器
#回购:dockerhub->https://hub.docker.com/r/dockcross/linux-mips
user@x86-主机:~#docker pull dockcross/linux mips:最新
#检查是否一切正常
user@x86-主持人:~#docker images
dockcross/linux mips最新的cf6e2d5003c8 3年前的1.03GB
#创建dockcross runner
user@x86-主机:~#docker运行--rm dockcross/linux mips>/dockercross mips
user@x86-主机:~#chmod+x./dockercross mips
#这将在当前目录中创建dockercross runner脚本
让我们创建一个名为
helloWorld
的简单项目文件夹,并在其中插入一些代码

#helloWorld.c
#包括
#包括
int main(int argc,char*argv[])
{
printf(“dockercrossMips中的Hello World\n”);
返回退出成功;
}             
现在我们可以用
dockcross
编译它

#检查是否存在所有文件
user@x86-主持人:~#ll
总数12千
-rwxr-xr-x 1用户5.5K二月12日19:22 dockercross mips
-rw-r--r--1用户151二月12日18:51 helloWorld.c
#将源代码编译为ELF
user@x86-主持人:~#./dockercross mips bash-c'$CC./helloWorld.c-o helloWorld'
#检查ELF文件->应显示正确的类型和机器
user@x86-主持人:~#readelf-h helloWorld
ELF标头:
魔术:7f 45 4c 46 01 02 01 00 00 00
类别:ELF32
...
OS/ABI:UNIX-SystemV
ABI版本:1
类型:EXEC(可执行文件)
机器:MIPS R3000
...
现在,我们准备传输并运行您的
helloWorld
可执行文件

#通过scp复制,使用您喜欢的方法
user@x86-主持人:~#scp helloWorldroot@192.168.0.2:/tmp/root/
#运行它
root@DD-警告:~#/helloWorld
#如果出现如下错误:-sh:./helloWorld:未找到
#请通过你的加载器启动它
root@DD-警告:~#/lib/ld musl mips sf.so.1 helloWorld
#你应该看到欲望的输出。
dockercrossMips的Hello World
如果您不知道加载程序的位置,请使用命令。如果命令不可用,请签出项目。
这里是官方的dd wrt install tut

在mips系统上定位任何二进制应用程序并在其上执行文件,并与usAlright共享输出。系统可执行文件的输出为:ELF 32位LSB可执行文件,mips,mips-I版本1(SYSV),动态链接(使用共享libs),感谢您迄今为止的所有帮助。可能与@nightfly19重复您可能希望更改目标体系结构变体,因为您的版本是第1版,而不是第2版。谢谢!!你为我提供了使工具链正常工作所需的全部帮助。我的配置也被证明是little endian,对于下面的任何类似情况的问题,所以架构需要是mipsel。