emux 使用笔记

准备工作

官网的安装教程很详细了,这里就不说了

该项目的端口映射配置在run-emux-docker文件中,默认的端口映射如下

host emux
20080 80
20443 443
28080 8080
24433 4433
9999 9999

模拟新固件

准备文件

这部分官网教程说的也差不多了

需要注意的是,一定得把固件根目录打包成tar.bz2格式的压缩包

1
tar -vcjf squashfs-root.tar.bz2 ./squashfs-root/

最后文件层次结构如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/emux/files/emux/RT-AC68U# tree
.
├── config
├── kernel
│   └── zImage-2.6.39.4-vexpress -> ../../template/kernel/zImage-2.6.39.4-vexpress
├── mtdparts
├── nvram.ini
├── preload
│   └── libnvram-armx.so
└── squashfs-root.tar.bz2

再重新构建并启动即可

1
2
./build-emux-volume
./run-emux-docker

nvram 修复

有时候,调用 nvram 的函数构成也不一样,厂家多会自己 DIY 这部分内容

这时我们就需要反汇编固件中管理 nvram API 的库

emux 也有这部分的源码仓库地址,如下

构建 emux 程序的交叉编译工具包

step 1:修复交叉编译工具

首先把交叉编译工具包解压出来,因为该工具链不是本地编译的

所以对于一些工具会有错误的动态链接,我们需要修改其中 cc1 工具的动态链接库

路径如下

1
/emux-buildroot-toolchains/arm-unknown-linux/usr/libexec/gcc/arm-unknown-linux-uclibcgnueabi/4.3.6

起初 cc1 和 cc1plus 工具的动态链接库均有损坏,这里就只对 cc1 作出改动

1
2
3
4
5
6
# ldd ./cc1
    linux-vdso.so.1 (0x00007fffc8af2000)
    libmpfr.so.4 => not found
    libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f65e1373000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f65e1181000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f65e1418000)

能看到该工具是找的本机的动态链接库,我们需要利用 patchelf 修改一下

1
2
3
patchelf --set-rpath \
         /emux-buildroot-toolchains/arm-unknown-linux/usr/lib \
         ./cc1

之后就能正常使用了

1
2
3
4
5
6
# ldd ./cc1
    linux-vdso.so.1 (0x00007ffca8dd9000)
    libmpfr.so.4 => /emux-buildroot-toolchains/arm-unknown-linux/usr/lib/libmpfr.so.4 (0x00007fa480ee7000)
    libgmp.so.10 => /emux-buildroot-toolchains/arm-unknown-linux/usr/lib/libgmp.so.10 (0x00007fa480c79000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa480a68000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa481145000)

step2:编译自定义的 nvram 库文件

从 custom_nvram 项目中选一个 C 文件作为模板,本文用的是custom_nvram_r6250.c

该文件中虽然也写了如何对其进行编译,但是没有对 undefined 的符号做出约束

可能会导致使用的人无法注意到没有链接到 dl 库,所以我们这里做一下补充

在其中加上对libdl.so的链接即可

1
2
3
4
5
/emux-buildroot-toolchains/arm-unknown-linux/usr/bin/arm-linux-gcc \
-shared \
-fPIC \
-ldl \
-o libnvram.so custom_nvram_r6250.c