最近有运行并调试DD-WRT中程序的需求,最开始想的是从源码编译一个x86 or x86_64下的待调试程序出来直接在本地调,可是DD-WRT的官方文档写的不怎么好,而且光是下载好源码和交叉编译工具就占用了超过55G的空间。后来发现官方其实已经基于最新版源码编译好了适应各种架构/型号的固件,再结合VirtualBox就能将这个最新版的固件跑起来,简直完美!
运行环境搭建
相关工具准备
下载安装virtualbox:
https://download.virtualbox.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-Win.exe
下载VirtualBox Extension Pack:
https://download.virtualbox.org/virtualbox/6.1.4/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack
我这里准备在64位下运行固件,所以下载dd-wrt x86_64 image(可以在官网找到最新编译好的image):
创建VM
首先将dd-wrt x64 image 转换为VDI形式,进入到VirtualBox安装的目录,执行如下代码(需根据自己的情况将其中的路径进行替换):
1 | vboxmanage.exe convertdd "D:\tmp\rm\dd-wrt\dd-wrt_x64_public_vga.image" "D:\tmp\rm\dd-wrt\dd-wrt-64.vdi" |
设置VDI文件的大小:
vboxmanage.exe modifyhd --resize 512 "D:\tmp\rm\dd-wrt\dd-wrt-64.vdi"
接着启动VirtualBox,创建新的VM:
- 类型选择Linux
- 版本选择Other Linux
- 不添加虚拟硬盘
设置存储
然后将设置过大小后的VDI文件拷贝到新建的VM目录下。并设置VM的存储,选择刚刚复制的VDI文件:
设置网络
在设置界面点击网络,选择桥接:
启动vm,在界面的内容不再滚动时,按下回车,并使用root/admin
登录,使用如下命令设置dd-wrt的网络(要和当前主机在同一个网段):
ifconfig br0 192.168.1.144
接着就可以通过浏览器访问该地址,进入dd-wrt后台了
调试环境
要调试dd-wrt里面的程序,需要有对应的静态编译的gdbserver(64位),下载源码:https://ftp.gnu.org/gnu/gdb/
进入到./gdb/gdbserver目录下,执行下列命令(执行./configure之后还需要手动修改Makefile文件以生成静态的gdbserver)1
2
3./configure --host=x86_64-linux --target=x86_64-linux
// modify CC-LD=${CC} to CC-LD=gcc -static
make
编译之前需要下载libinproctrace.so,并把它放到gdbserver目录下。
将编译好的gdbserver上传至DD-WRT中,附加待调试进程即可:
1 | tftp -g -r gdbserver ip_addr |