初步了解
初步了解了一下固件打包,发现一般都是有专门的打包工具。openwrt有一个项目是lede,在Github上面可以看到,先下载来看看。同时也查到一个名为firmware-mod-kit
的项目,看样子好像早期打包的工具。
说明文档里面说了适配早期的OpenWrt,里面也提到了OpenWrt has its Image Builder
。
看了一下使用方法:
尝试编译
尝试一下,新建一个文件夹output,将光猫解包好的rootfs放在rootfs里面。
./build-firmware.sh output/ rootfs/
但是报错
/home/u/Videos/firmware-mod-kit-master/src/uncramfs/uncramfs.c:324: undefined reference to 'minor'
介于这是十年前的代码,现在编译器可能是有改动,在这个确实的文件里面添加一个头文件#include <sys/sysmacros.h>
,这个可以简单的跳过,在cramfs类似的.c文件里面都添加#include <sys/sysmacros.h>
就可以了。
在这个报错
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/lzma/C/7zip/Compress/LZMA_Lib'
g++ -O3 mksquashfs.o read_fs.o sort.o -L../lzma/C/7zip/Compress/LZMA_Lib -llzma -o mksquashfs-lzma
/usr/bin/ld: read_fs.o:(.bss+0x0): multiple definition of `swap'; mksquashfs.o:(.bss+0x132a48): first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:14: mksquashfs-lzma] Error 1
make[1]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/squashfs-2.1-r2'
可能在新的编译器当中将这个swap变量放到别的地方了吧。
改成。
make[2]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/lzma/C/7zip/Compress/LZMA_Lib'
g++ -O3 unsquashfs.o -L../lzma/C/7zip/Compress/LZMA_Lib -llzma -o unsquashfs-lzma
/usr/bin/ld: unsquashfs.o: in function `create_inode':
unsquashfs.c:(.text+0x1058): undefined reference to `makedev'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:24: unsquashfs-lzma] Error 1
make[1]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/squashfs-2.1-r2'
查阅资料得到:
#include <sys/sysmacros.h>
dev_t makedev(unsigned int maj, unsigned int min);
unsigned int major(dev_t dev);
unsigned int minor(dev_t dev);
于是按照相同的思路,添加#include <sys/sysmacros.h>
。一路改下去。
但是出现了一个目前还挺难改的东西。在一个文档中有un
的全局变量声明,但是他就是undefined。
//针对缺少major、minor、makedev添加这个头文件
#include <sys/sysmacros.h>
//对于swap和其他符号未定义的,一般来说添加或者去掉extern即可
int swap, silent = TRUE;
//上文替换成下文
extern int swap;
int silent = TRUE;
是出现了一个目前还挺难改的东西。在一个文档中有un
的全局变量声明,但是他就是undefined。这个问题,在firmware-mod-kit-master/src/others/squashfs-3.2-r2-hg612-lzma/squashfs3.2-r2/squashfs-tools
路径里面的extern struct sqlzma_un un;
的extern去掉即可,然后make clean
一下,再试着编译,中间还会遇到很多上述问题,但是都适用相同的解决方法进行操作。
/usr/bin/ld: mksquashfs.o: in function `scan1_single_readdir':
mksquashfs.c:(.text+0x1bf): undefined reference to `add_dir_entry'
/usr/bin/ld: mksquashfs.o: in function `scan1_encomp_readdir':
mksquashfs.c:(.text+0x79de): undefined reference to `add_dir_entry'
/usr/bin/ld: mksquashfs.o: in function `dir_scan1':
mksquashfs.c:(.text+0x9ceb): undefined reference to `add_dir_entry'
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:17: mksquashfs] Error 1
make[3]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/others/squashfs-3.4-cisco/squashfs-tools'
make[2]: *** [Makefile:4: all] Error 2
make[2]: Leaving directory '/home/u/Videos/firmware-mod-kit-master/src/others/squashfs-3.4-cisco'
这是编译到后面的新的报错,
//把前面的inline去掉即可
void add_dir_entry(char *name, char *pathname, struct dir_info *sub_dir, struct inode_info *inode_info, void *data, struct dir_info *dir)
遇到这个问题直接注释掉就行了。
unsquashfs.c:26:10: fatal error: sys/sysctl.h: No such file or directory
遇到这个问题
/usr/bin/ld: /tmp/cchhufaa.o:/home/u/Videos/firmware-mod-kit-master/src/webcomp-tools/common.h:51: multiple definition of `globals'; common.o:/home/u/Videos/firmware-mod-kit-master/src/webcomp-tools/common.h:51: first defined here
遇到定义和变量的声明放到同一个文件common.h
里面了,这时候将common.h
里面globals
删掉,然后分别在common.c
文件和webdecomp.c
文件里面添加struct global globals
和extern struct global globals
。
基本上到这里可以一遍过。
./build-firmware.sh ./output/ ./rootfs/