我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网桥。目前它的无线功能(看似)由管理大部分Web界面的相同二进制文件控制,但看起来他们使用库内无线工具在内部使用至少一些功能。
我从来没有为不同的CPU架构交叉编译,也不确定如何完全识别我需要做的事情。我正在尝试使用uClibc,因为它似乎在系统的其余部分使用,但我不知道如何为调制解调器环境配置buildroot。我根据来自下面的proc的信息在配置应该是best guess,但有些错误,因为一个简单的C应用程序只返回0编译它无法正常运行。
# 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
答案 0 :(得分: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
来实现它。
答案 1 :(得分:1)
答案 2 :(得分:0)
请随时查看 dockcross 项目。他们为各种架构提供交叉工具链作为 docker 容器。
就我个人而言,我更喜欢保持我的主机系统尽可能干净,所以这对我来说是完美的搭配。 要启动并运行一个简单的 hello world 示例,请按照 README.rst 中的步骤操作。
但是,请查看我对运行 Netgear N600 wndr3700v2 的 DD-WRT 路由器的 hello world 编译。 (我已经链接了 openWRT wiki 页面而不是 dd-wrt,更喜欢这个)。
检查路由器上使用的是哪个 arch,请信任 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
如果您不知道加载程序的位置,请使用 file 命令。如果命令不可用,请检查 entware 项目。 这将是官方的 dd-wrt 安装 tut here