10

我的最终目标是为我的旧 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
4

3 回答 3

9

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

ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV)

这些是我为 Buildroot 的 menuconfig 启用的选项:

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检查它是否启用并更改为您喜欢的。然后make menuconfig去实现它。

于 2011-01-20T20:07:39.100 回答
1

查看:

http://www.kegel.com/crosstool/

它是 GCC 下交叉编译的权威站点。

于 2011-01-20T21:17:48.780 回答
0

请随时查看dockcross项目。他们提供跨工具链作为各种架构的docker容器。

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

MIPS 上的 HelloWorld.c

但是,请查看我的 hello world 编译,了解运行DD-WRT的Netgear N600 wndr3700v2路由器。(我已经链接了 openWRT wiki 页面而不是 dd-wrt,更喜欢这个)。

检查路由器上使用了哪个拱门,请信任 wiki 页面或仅通过 ssh/telnet 连接并运行uname -a命令。

root@DD-WRT:~# uname -a
Linux DD-WRT 3.10.108-d10 #63184 Tue Nov 3 05:20:50 +03 2020 mips DD-WRT

所以我们可以从 dockerhub 拉取 mips 容器:

# pull dockcross container for mips
# repo: dockerhub -> https://hub.docker.com/r/dockcross/linux-mips
user@x86-host:~# docker pull dockcross/linux-mips:latest

# check if everything went correct
user@x86-host:~# docker images
dockcross/linux-mips   latest    cf6e2d5003c8   3 years ago    1.03GB

# create dockcross runner
user@x86-host:~# docker run --rm dockcross/linux-mips > ./dockercross-mips
user@x86-host:~# chmod +x ./dockercross-mips
# this will create a dockercross runner script in the current directory

让我们创建一个名为的简单项目文件夹helloWorld,并在其中添加一些代码。

# helloWorld.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("Hello World from dockercrossMips\n");
    return EXIT_SUCCESS;
}             

现在我们可以用dockcross.

# check if all files exists
user@x86-host:~# ll
total 12K
-rwxr-xr-x 1 user user 5.5K Feb 12 19:22 dockercross-mips
-rw-r--r-- 1 user user  151 Feb 12 18:51 helloWorld.c

# compile source into ELF
user@x86-host:~# ./dockercross-mips bash -c '$CC ./helloWorld.c -o helloWorld'

# check ELF file -> should show the proper type and machine
user@x86-host:~# readelf -h helloWorld 
ELF Header:
  Magic:   7f 45 4c 46 01 02 01 00 01 00 00 00 00 00 00 00 
  Class:                             ELF32
  ...
  OS/ABI:                            UNIX - System V
  ABI Version:                       1
  Type:                              EXEC (Executable file)
  Machine:                           MIPS R3000
  ...

现在我们已准备好传输并运行您的helloWorld可执行文件。

# copy via scp, use your favorite method 
user@x86-host:~# scp helloWorld root@192.168.0.2:/tmp/root/

# run it
root@DD-WRT:~# ./helloWorld 
# if you get some error like this one: -sh: ./helloWorld: not found
# please just start it via your loader
root@DD-WRT:~# /lib/ld-musl-mips-sf.so.1 helloWorld 
# and you should see the desire output.
Hello World from dockercrossMips

In case you do not know where your loader is located, please use file command. In case the command is not available, please checkout entware project. Here would be the official dd-wrt install tut here

于 2021-02-12T18:35:20.300 回答