firmware-mod-kit Ubuntu22.04编译通过

初步了解

初步了解了一下固件打包,发现一般都是有专门的打包工具。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 globalsextern struct global globals
基本上到这里可以一遍过。

./build-firmware.sh ./output/ ./rootfs/

懒人包

Github懒人包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值