编译squashfs和lzma

早年写的笔记,压箱底了,翻出来晒晒

目          录

南瓜文件系统(Squashfs)采用gzip或lamz(更高压缩率)来制作只读的映像文件。LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成,拥有不错的压缩比。Squashfs也可以使用LZMA的算法进行更好的压缩。Squashfs是linux2.6.27之后并入内核的,所以FC6是不能够支持Squashfs文件系统的,但是可以利用应用程序解压和制作Squashfs镜像。

openwrt里的squashfs就是用lzma进行压缩的,openwrt的编译文件夹里就有制作squashfs-lzma和解压的工具。

openwrt里的squashfs-lzma

既然openwrt里面有打包的工具,也应该有解压的工具。使用find命令在整个openwrt编译文件夹查找,找到有几个地方有

[root@localhost kamikaze_8.09]# find ./ |grepunsquashfs

./build_dir/armeb/OpenWrt-SDK-ixp4xx-for-Linux-i686/staging_dir/host/bin/unsquashfs-lzma

./build_dir/armeb/OpenWrt-ImageBuilder-ixp4xx-for-Linux-i686/staging_dir/host/bin/unsquashfs-lzma

./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs.c

./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs-lzma

./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs.o

./staging_dir/host/bin/unsquashfs-lzma

利用openwrt源码编译squashfs-lzma

将kamikaze_8.09/tools/lzma下面的文件和文件夹复制到

/home/linuxuser/squashfs/lzma_open/lzma

kamikaze_8.09/tools/lzma里的文件清单

# ls -Rl

.:

total 8

-rw-rw-rw- 1 501 games 1042 Dec 222008 Makefile

drwxrwxrwx 2 501 games 4096 Jun2 03:21 patches

./patches:

total 16

-rw-rw-rw- 1 501 games 11733 Jun 212006 100-lzma_zlib.patch

-rw-rw-rw- 1 501 games406 Dec 3  2007 110-ranlib.patch

将/kamikaze_8.09/dl/lzma432.tar.bz2解压到/home/linuxuser/squashfs/lzma_open/lzma/lzma432

执行下面两条命令

# patch -d lzma432 -p1 <100-lzma_zlib.patch

#patch -d lzma432 -p1 < 110-ranlib.patch

打印信息如下:

# patch -d lzma432 -p1 < 100-lzma_zlib.patch

patching file C/7zip/Compress/LZMA/LZMADecoder.cpp

patching file C/7zip/Compress/LZMA/LZMADecoder.h

patching file C/7zip/Compress/LZMA_Lib/makefile

patching file C/7zip/Compress/LZMA_Lib/ZLib.cpp

# patch -d lzma432 -p1 < 110-ranlib.patch

patching file C/7zip/Compress/LZMA_Lib/makefile

这样补丁就打好了。

进入/squashfs/lzma_open/lzma/lzma432/C/7zip/Compress/LZMA_Lib,执行make命令即可得到squashfs需要的库文件和源码。

做好的文件已经打包为lzma_forsquash_ryab.tar.gz

找到kamikaze_8.09/tools/squashfs,发现只有一个makefile和100-lzma.patch,并没有源代码。

找到kamikaze_8.09/dl/squashfs3.0.tar.gz,解压到

/home/linuxuser/squashfs/squash3_openwrt/squashfs3.0

现在该目录下文件如下

# ls

100-lzma.patchMakefile  open_make_sq.txt  squashfs3.0 squashfs3.0.tar.gz

执行如下操作

patch -d squashfs3.0 -p1 < 100-lzma.patch

对比打了patch之后的效果。

结果发现只改变了/home/linuxuser/squashfs/squash3_openwrt/squashfs3.0/makefile,红色的为新添加的内容,其他的都没有变化。

lzma的路径需要修改,改后的makefile如下:注意红色部分

INCLUDEDIR = .

#LZMAPATH = ../lzma/SRC/7zip/Compress/LZMA_Lib

LZMAPATH =/home/linuxuser/openwrt/kamikaze_8.09/build_dir/host/lzma-432/lzma/C/7zip/Compress/LZMA_Lib

CFLAGS := -I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64-D_LARGEFILE_SOURCE -O2

all: mksquashfs unsquashfs mksquashfs-lzmaunsquashfs-lzma

mksquashfs: mksquashfs.o read_fs.o sort.o

$(CC)mksquashfs.o read_fs.o sort.o -lz -o $@

mksquashfs-lzma: mksquashfs.o read_fs.o sort.o

$(CXX)mksquashfs.o read_fs.o sort.o -L$(LZMAPATH) -llzma -o $@

mksquashfs.o: mksquashfs.c squashfs_fs.h mksquashfs.hglobal.h sort.h

read_fs.o: read_fs.c squashfs_fs.h read_fs.h global.h

sort.o: sort.c squashfs_fs.h global.h sort.h

unsquashfs: unsquashfs.o

$(CC)unsquashfs.o -lz -o $@

unsquashfs-lzma: unsquashfs.o

$(CXX)unsquashfs.o -L$(LZMAPATH) -llzma -o $@

unsquashfs.o: unsquashfs.c squashfs_fs.h read_fs.hglobal.h

clean:

执行make就可以得到4个文件:mksquashfs unsquashfs mksquashfs-lzma unsquashfs-lzma。

3.4版本的lzma

下载了lzma457.tar.bz2,sqlzma3.4-457.tar.bz2,squashfs3.4.tar.gz之后,通过参看build.sample进行打补丁,修改sqlzma3.4-457.tar.bz2里的makefile已经可以完全编译mksquashfs 和unsquashfs,但是不能正确解压openwrt的文件。

试验了下载的五个压缩包

7z457.tar.bz2

linux-2.6.27.4.tar.bz2

lzma457.tar.bz2

sqlzma3.4-457.tar.bz2

squashfs3.4.tar.gz

其中sqlzma3.4-457.tar.bz2里有一个build.sample。

先解压sqlzma3.4-457.tar.bz2到/home/linuxuser/squashfs/sqlzma3.4-457,然后将五个压缩包全部复制进去,包括sqlzma3.4-457.tar.bz2。执行build.sample。其中build.sample执行到一半的时候,会出现提示

cp .config linux-2.6.27.4

cd linux-2.6.27.4

make oldconfig

make prepare

make scripts

cd -

initialize kernel sources now, by using the commandsmentioned above

and then press ENTER...

这个时候再开一个窗口,cd到/home/linuxuser/squashfs/sqlzma3.4-457,执行红色部分的命令。但是实际上cp .config linux-2.6.27.4会报错没有.config文件。但是没关系,继续执行,中间会有一大堆的选择问题,不用理会,全部直接回车。执行完之后,再切换到执行build.sample的那个窗口回车。最终在/home/linuxuser/squashfs/sqlzma3.4-457/BUILD生成下面五个文件,

mksquashfs

sqlzma.ko

squashfs.ko

unlzma.ko

unsquashfs

但是还是不能解开oepnwrt的squash文件,决定放弃。

链接一个lib,比如liblzma.a,只需要-llzma就可以,不能-llibunlzma.比如:

unsquashfs-lzma: unsquashfs.o

$(CXX)$(LDFLAGS) unsquashfs.o -llibunlzma -lpthread -o $@

linux lzma c语言接口,编译squashfs和lzma相关推荐

  1. Linux上C语言程序编译过程详解

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...

  2. linux上C语言的编译流程

    本文将介绍如何从C/C++文本到二进制可执行文件的过程.该过程需要经过预处理->编译->链接三个步骤,文件内容从普通文本->汇编->二进制的变化. 预处理(Preprocess ...

  3. linux中命令对c文件进行编译,Linux下C语言编译基础及makefile的编写

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...

  4. Linux下C语言程序编写及执行和分步骤编译链接C源代码

    实验一:Linux下C语言程序编写及执行 //hello.c #include <stdio.h> int main(){int x = 1;int y = 2;int sum = x + ...

  5. linux系统c 如何使用教程,基于Linux操作系统的C语言编译和调试方法解析

    摘 要:文章先介绍了GCC编译器相关内容,包括GCC编译程序和GCC编译选项,随后介绍了GDB调试程序相关内容,包括GDB具体操作和GDB基础命令,最后介绍了C语言编写中的注意事项,希望能给相关人士提 ...

  6. 嵌入式linux 网络唤醒,C语言实现wake on lan(网络唤醒...-Windows系统下用命令行编译C/C++...-字符串常量引起的思考_169IT.COM...

    前一段时间在自学linux系统,想模仿linux命令行的方式在Windows下编译C/C++程序,摸索一段时间后总算把这个解决了! (1)先用记事本编写如下所示的代码,并另存为hello.cpp,假设 ...

  7. linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹

    Linux 用C语言判断文件和文件夹 #include #include #include #include int access(const char *pathname, int mode); i ...

  8. linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译

    GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...

  9. C语言的“编译时多态”

    typeof 在 kernel 中的使用 -- C 语言的"编译时多态" C 语言本身没有多态的概念,函数没有重载的概念.然而随着 C 语言编写的软件逐渐庞大,越来越多地需要引入一 ...

最新文章

  1. 二叉树(构造与遍历方法)
  2. STM32F103+UCOS-II 实现临界区不关闭重要中断
  3. Consul入门02 - 运行Consul代理
  4. W3C api 抓取
  5. Lock同步锁--线程同步
  6. SpringBoot的配置文件-通过@ConfigurationProperties映射数据
  7. NodeJs Express 4.x 入门
  8. 使用XFire+Spring构建Web Service(一)——helloWorld篇
  9. 坚实原则:Liskov替代原则
  10. 华为云技术开放日(第三季)活动报道
  11. Python 创建用户界面之 PyQt5 的使用
  12. ASCIIUNICODE编码演化
  13. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错
  14. 10个最常见的 HTML5 面试题及答案
  15. centos6.5 vncserver安装与配置
  16. php 时间转换时间戳_如何实现PHP时间戳与日期的转换
  17. excel导出 服务器运行失败,SolidWorks 插入自制EXCEL明细表 启动服务器应用程序失败:启动excle服务器失败...
  18. 对话 NuCypher:如何安全地存储、共享和管理链上私人数据
  19. 20220529 使用python分割pdf文件
  20. 广域网加速方案--Riverbed

热门文章

  1. python实现千牛客服自动回复语_千牛会用到的回复语有哪些?千牛自动回复短语大全...
  2. bandizip修改压缩文件内容_Bandizip: 压缩和解压缩
  3. 重新安装Windows应用商店
  4. appstore开发者中文名称修改
  5. 微信开发常见问题:自动音乐播放,alert 显示网址
  6. ubuntu下运行.exe程序
  7. 今晚7:30 | 连界、将门、百度、碧桂园创投四位大佬眼中的AI世界,是继续高深还是回归商业本质?...
  8. weka分类器怎么设置样本类别_NeurIPS 2020 | 港中文MMLab自步对比学习: 充分挖掘无监督学习样本...
  9. 图像的 2DPCA 与 2D2DPCA 特征提取
  10. vivo手机html有吗,vivo手机有哪些系列?区别是什么?