在aarch64 Linux编译测试古早的压缩工具arj

ARJ 是一种用于创建和管理.arj 压缩包的工具,以下是网上关于它的详细介绍:

基本介绍
ARJ 是一种流行于 DOS 和 Windows 系统下的文件压缩格式,由 Robert K. Jung 开发。ARJ 压缩工具在 20 世纪 80 年代末到 90 年代初非常流行,常用于将多个文件或目录压缩成一个单独的.arj 文件,以节省存储空间和方便文件传输。
功能特点
高压缩比:ARJ 采用了高效的压缩算法,能够将文件压缩到较小的体积,在当时的压缩工具中,其压缩比相对较高,对于一些文本文件、程序文件等能实现较好的压缩效果。
支持多种操作系统:虽然最初是为 DOS 系统开发的,但后来也有了 Windows 版本,使其可以在不同的操作系统环境下使用,方便了不同用户之间的文件交换和共享。
分卷压缩:可以将一个大的文件或目录压缩成多个较小的分卷文件,每个分卷文件的大小可以根据需要进行设置。这在当时软盘等存储介质容量有限的情况下非常实用,用户可以将分卷文件分别存储在不同的软盘上,便于携带和传输。
加密功能:支持对压缩包中的文件进行加密,用户可以设置密码,只有输入正确的密码才能解压文件,从而保护文件的安全性和隐私性。

虽然 ARJ 在现代的文件压缩领域已经逐渐被 ZIP、RAR 等更先进的压缩格式所取代,但在一些特定的历史场景和旧系统中,仍然可能会遇到.arj 压缩包,了解 ARJ 的基本使用方法和特点,有助于处理这些遗留文件。

这个软件当时是shareware,无意中发现,现在有了开源的版本,位于https://arj.sourceforge.net/。就想在aarch64 Linux上编译试试看。

步骤

  1. 下载源代码 https://arj.sourceforge.net/files/arj-3.10.22.tar.gz
  2. 解压缩到/par/arj-3.10.22
  3. 编译
    按照doc/compile文档的说明,Linux系统执行"cd gnu; autoheader; autoconf; ./configure; cd …"
    但是报错了,而且不知道错在哪步,将上述命令分别执行,知道错在哪一步了。就是最后一步./configure报错
configure.in:160: the top level
checking for a BSD-compatible install... /usr/bin/install -c
checking build system type... Invalid configuration `aarch64-pc-linux-gnu': machine `aarch64-pc' not recognized
configure: error: /bin/bash ./config.sub aarch64-pc-linux-gnu failed

这个错误前不久编译其他库时遇到过,config.sub太旧了,2005年的,不识别当前系统,正好上次下载了最新的config.sub,用它替换旧的,./configure就能顺利完成了
在/par/arj-3.10.22下生成了GNUmakefile,compile文档说要执行gmake,结果系统中没有这个命令,又参考了其他库的安装,用make --makefile GNUmakefile代替。
在编译fardata.c的地方报错如下:

fardata.c:193:12: error: conflicting types for ‘strnlen’
 static int strnlen(const char FAR *s, int count)
            ^
In file included from environ.h:99:0,
                 from arj.h:13,
                 from fardata.c:8:
/usr/include/string.h:413:15: note: previous declaration of ‘strnlen’ was here
 extern size_t strnlen (const char *__string, size_t __maxlen)
               ^
In file included from arj.h:14:0,
                 from fardata.c:8:
fardata.c: In function ‘flush_cbuf’:

与系统库的同名函数冲突了,参数类型和返回值还不一样。在源代码中搜了一下,只有这一处调用这个函数,就把定义和调用都改成arj_strnlen,重新make,虽然还有其他报错,但已经生成了二进制文件,位于linux-gnu/en/rs/arj/arj。
输出的日志最后部分如下

./linux-gnu/en/rs/arj/arj a ./linux-gnu/en/rs/help.arj -+ -t1f -2e -e -jm -jh65535 -jt ./resource/en/arj?.txt
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]

Creating archive  : ./linux-gnu/en/rs/help.arj
Adding    ./resource/en/arjl.txt       37.2%    
Adding    ./resource/en/arjs.txt       47.3%    
Testing                             OK        
Testing                             OK        
     2 file(s)

./linux-gnu/en/rs/tools/join ./linux-gnu/en/rs/arj/arj ./linux-gnu/en/rs/help.arj
JOIN v 1.30  [26/04/2003]  Not a part of any binary package!

Copying . done!
./linux-gnu/en/rs/tools/postproc linux-gnu/en/rs/arj/arj
POSTPROC v 1.30  [17/01/2003]  Not a part of any binary package!

Patch not found
GNUmakefile:347: recipe for target 'linux-gnu/en/rs/arj/arj' failed
make[1]: *** [linux-gnu/en/rs/arj/arj] Error 3
make[1]: Leaving directory '/shujv/par/arj-3.10.22'
GNUmakefile:169: recipe for target 'all' failed
make: *** [all] Error 2

最后一步好像是打补丁,但没找到补丁。
4. 测试
刚才在make过程中,输出的日志中已经包括arj a命令的测试,都PASS了。看起来压缩功能是能用的,但是其他命令,列表,解压等统统出错,我用自己的文件测试也是一样


/shujv/par/arj-3.10.22$ linux-gnu/en/rs/arj/arj l linux-gnu/en/rs/help.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]

Processing archive: linux-gnu/en/rs/help.arj

Exceeded chapter limit of 250

arj-3.10.22/arj a test.arj -jt myzip.c
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]

Creating archive  : test.arj
Adding    myzip.c                      27.3%    
Testing                             OK        
     1 file(s)
arj-3.10.22/arj a test.arj -jt test_arj.txt
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]

Updating archive  : test.arj
Archive created: 2025-09-01 14:11:01, modified: 2025-09-01 14:11:01
Adding    test_arj.txt                 23.8%    
Testing                             OK        
Testing                             OK        
     1 file(s)
     1 comment(s) 
arj-3.10.22/arj l test.arj -jt 
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]

Processing archive: test.arj

Exceeded chapter limit of 250

arj就像个黑洞,只有a命令好使,添加文件都行,但l命令都不行,那个test ok,带有-jt是压缩过程中测试的,并不是测最终生成的文件。报错也莫名其妙,Exceeded chapter limit of 250,都不知是什么意思。
后来我通过注释fardata.c中的strnlen源代码,让它调用系统库函数的方法又试了一次,编译得的二进制文件也是一样的问题,看来问题不在这里。
在网上查找问题,有新发现,这个arj工具可以用apt install arj安装。
我安装了后,用安装的版本测试编译版本生成的压缩包,这次有内容了:

 arj l sheet1.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]

Processing archive: sheet1.arj
Archive created: 2025-09-01 14:30:33, modified: 1970-01-01 08:00:00
Filename       Original Compressed Ratio DateTime modified Attributes/GUA BPMGS
------------ ---------- ---------- ----- ----------------- -------------- -----
              250704975          0 0.000 79-12-31 00:00:00 ---xr--r-- ---   1  

Bad header

它说文件头坏,再看列出的字段也不完整,内容也不对,所以不能用,但依然不理解我编译的版本为什么不输出这个信息。
再用安装版本重新压缩一份,这次列表、解压缩都正确了。

time arj a sheet1a.arj  dknyc/xl/worksheets/sheet1.xml
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]

Creating archive  : sheet1a.arj
Adding    dknyc/xl/worksheets/sheet1.xml   14.6%    
     1 file(s)

real	1m10.861s
user	1m10.100s
sys	0m0.616s
/shujv/par$ arj l sheet1a.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]

Processing archive: sheet1a.arj
Archive created: 2025-09-01 14:47:23, modified: 2025-09-01 14:47:23
Filename       Original Compressed Ratio DateTime modified Attributes/GUA BPMGS
------------ ---------- ---------- ----- ----------------- -------------- -----
sheet1.xml   1717888301  250704975 0.146 79-12-31 00:00:00 -rw-rw-r-- ---  +1  
------------ ---------- ---------- -----
     1 files 1717888301  250704975 0.146 

/shujv/par$ arj e sheet1a.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]

Processing archive: sheet1a.arj
Archive created: 2025-09-01 14:47:23, modified: 2025-09-01 14:47:23
Extracting dknyc/xl/worksheets/sheet1.xml to sheet1.xml                  OK        
     1 file(s)

/shujv/par$ ls -l sheet1.xml
-rw-rw-r-- 1 kylin kylin 1717888301 1231  1979 sheet1.xml

看这个压缩比和压缩时间,确实和现代的其他压缩工具不能比,zstd又快又小,gzip压缩包大小差不多,时间大约只要arj的一半。

time zstd -k dknyc/xl/worksheets/sheet1.xml
dknyc/xl/worksheets/sheet1.xml : 11.52%   (  1.60 GiB =>    189 MiB, dknyc/xl/worksheets/sheet1.xml.zst) 

real	0m4.034s
user	0m8.600s
sys	0m0.868s
time gzip -k dknyc/xl/worksheets/sheet1.xml

real	0m43.089s
user	0m42.392s
sys	0m0.472s
/shujv/par$ ls -l dknyc/xl/worksheets/sheet1.xml.gz

-rw-rw-r-- 1 kylin kylin  249525531 1231  1979 dknyc/xl/worksheets/sheet1.xml.gz

补记:

来自https://github.com/joncampbell123/arj的修改版本源码可以在aarch64 Linux编译成功,包括Kylin Linux和安卓的termux+proot。
奇怪的是,在Kylin Linux上,单独输入arj的路径不能显示使用说明,而在docker容器中却可以。压缩、解压文件在两个环境都可以。

/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]

Can't find linux-gnu/en/rs/arj/arj

Found     1 error(s)!

/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj a ../a2.arj ../test_range2.sql
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]

Creating archive  : ../a2.arj
Adding    ../test_range2.sql           92.3%    
     1 file(s)


/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj e ../sheet1.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]

Processing archive: ../sheet1.arj
Archive created: 2025-09-02 08:17:41, modified: 2025-09-02 08:17:41
Extracting dknyc/xl/worksheets/sheet1.xml to sheet1.xml                  OK        
     1 file(s)
#进入容器
sudo docker exec -it gcc bash
root@66d4e20ec1d7:/# cd /par/arj-master
root@66d4e20ec1d7:/par/arj-master# linux-gnu/en/rs/arj/arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]

Processing archive: linux-gnu/en/rs/arj/arj
Archive created: 2025-09-02 08:04:02, modified: 2025-09-02 08:04:02
  
List of frequently used commands and switches.  Type ARJ -? for more help.

Usage:     ARJ <command> [-<sw> [-<sw>...]] <archive_name> [<file_names>...]
Examples:  ARJ a -e archive, ARJ e archive, ARJ l archive *.doc
CentOS 7.9版本(CentOS-7-aarch64-Everything-2009)适用于ARM64 (aarch64),必须集齐9个文件才能一起解压缩使用,9个文件下载地址: CentOS-7-aarch64-Everything-2009.part09.rar https://download.youkuaiyun.com/download/weixin_43800734/20419195 CentOS-7-aarch64-Everything-2009.part08.rar https://download.youkuaiyun.com/download/weixin_43800734/20419107 CentOS-7-aarch64-Everything-2009.part07.rar https://download.youkuaiyun.com/download/weixin_43800734/20419029 CentOS-7-aarch64-Everything-2009.part06.rar https://download.youkuaiyun.com/download/weixin_43800734/20418995 CentOS-7-aarch64-Everything-2009.part05.rar https://download.youkuaiyun.com/download/weixin_43800734/20418492 CentOS-7-aarch64-Everything-2009.part04.rar https://download.youkuaiyun.com/download/weixin_43800734/20418455 CentOS-7-aarch64-Everything-2009.part03.rar https://download.youkuaiyun.com/download/weixin_43800734/20418366 CentOS-7-aarch64-Everything-2009.part02.rar https://download.youkuaiyun.com/download/weixin_43800734/20418341 CentOS-7-aarch64-Everything-2009.part01.rar https://download.youkuaiyun.com/download/weixin_43800734/20418267 CentOS是免费的、开源的、可以重新分发的开源操作系统,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一。 CentOS Linux发行版是一个稳定的,可预测的,可管理的和可复现的平台,源于Red Hat Enterprise Linux(RHEL)依照开放源代码(大部分是GPL开源协议 )规定释出的源码所编译而成。自2004年3月以来,CentOS Linux一直是社区驱动的开源项目,旨在与RHEL在功能上兼容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值