実行ファイルを圧縮(自作)


アニメ『A.I.C.O. -Incarnation-』

本物のようで本物でない。前回からやってるa.outファイルのようです。ELFのようでELFでない。
今回は前回の続きで、圧縮実行ファイルを自作してみます。
プログラムはこれです。ビルドしておきます。

takk@deb9:~$ cat t.c
#include <stdio.h>
int main()
{
	puts("Hello");
}
takk@deb9:~$ gcc t.c
takk@deb9:~$ ls -l
合計 16
-rwxr-xr-x 1 takk takk 8624  3月 10 19:55 a.out
-rw-r--r-- 1 takk takk   50  3月 10 18:13 t.c
takk@deb9:~$ 

どの圧縮コマンドを使いましょうか。ファイルサイズを比較するため圧縮前実行ファイルを複写しておきます。

takk@deb9:~$ cp a.out b.out
takk@deb9:~$ cp a.out c.out
takk@deb9:~$ ls -l
合計 40
-rwxr-xr-x 1 takk takk 8624  3月 10 19:55 a.out
-rwxr-xr-x 1 takk takk 8624  3月 10 19:56 b.out
-rwxr-xr-x 1 takk takk 8624  3月 10 19:57 c.out
-rw-r--r-- 1 takk takk   50  3月 10 18:13 t.c
takk@deb9:~$ 

gzip bz2 xzそれぞれのコマンドで圧縮して、サイズを比較。

takk@deb9:~$ gzip a.out
takk@deb9:~$ bzip2 b.out
takk@deb9:~$ xz c.out
takk@deb9:~$ ls -l
合計 16
-rwxr-xr-x 1 takk takk 2436  3月 10 19:55 a.out.gz
-rwxr-xr-x 1 takk takk 2560  3月 10 19:56 b.out.bz2
-rwxr-xr-x 1 takk takk 2116  3月 10 19:57 c.out.xz
-rw-r--r-- 1 takk takk   50  3月 10 18:13 t.c
takk@deb9:~$ 

xzが効率化が良さそうなので、xzで圧縮したファイルを対象とします。

解凍するにはxzcatで標準出力すればよいです。

takk@deb9:~$ xzcat c.out.xz > c.out
takk@deb9:~$ file c.out
c.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=41b83ea95a5fb5f9c1c6f5cc9b50a26250c0ea00, not stripped
takk@deb9:~$ 

exe.shというファイル名で展開スクリプトを書きます。

takk@deb9:~$ cat exe.sh
#!/bin/bash
xzcat c.out.xz > /tmp/c.out
/tmp/c.out
takk@deb9:~$ 

実行権限をつけます。

takk@deb9:~$ chmod 755 exe.sh
takk@deb9:~$ ls -l exe.sh
-rwxr-xr-x 1 takk takk   43  3月 10 20:09 exe.sh
takk@deb9:~$ 

実行してみます。

takk@deb9:~$ ./exe.sh
./exe.sh: 行 3: ./c.out: 許可がありません
takk@deb9:~$ 

生成したc.outに実行権限をつけるのを忘れてましたので追加します。

takk@deb9:~$ cat exe.sh
#!/bin/bash
xzcat c.out.xz > /tmp/c.out
chmod 755 /tmp/c.out
/tmp/c.out
takk@deb9:~$ 

実行できることを確認。

takk@deb9:~$ ./exe.sh
Hello
takk@deb9:~$ 

次は、exe.shと圧縮ファイルc.out.xzを結合します。

takk@deb9:~$ ls -l
合計 12
-rwxr-xr-x 1 takk takk 2116  3月 10 19:57 c.out.xz
-rwxr-xr-x 1 takk takk   72  3月 10 21:43 exe.sh
-rw-r--r-- 1 takk takk   50  3月 10 18:13 t.c
takk@deb9:~$ 

catで結合できます。

takk@deb9:~$ cat exe.sh c.out.xz > c.out
takk@deb9:~$ 

結合したファイルのスクリプト部分に、圧縮データのみを抽出するための、tailコマンドと、シェルスクリプトを終了するためのexitを追加しておきます。

takk@deb9:~$ head c.out
#!/bin/bash
tail -n +7 c.out > c.out.xz
xzcat c.out.xz > /tmp/c.out
chmod 755 /tmp/c.out
/tmp/c.out
exit

では、c.outに実行権限をつけて実行してみます。

takk@deb9:~$ chmod 755 c.out
takk@deb9:~$ ./c.out
xzcat: c.out.xz: Unexpected end of input
Hello
takk@deb9:~$ 

実行できました。
xzcatでUnexpected end of inputが出てますが、これは次回に持ち越します。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA