Category Archives: 6.ファイル・アーカイブ・バイナリ

実行ファイルを圧縮(bzexe)


アニメ映画『好きになるその瞬間を。~告白実行委員会~』(2016)

青春です。

実行ということで、実行ファイルをbzexeで圧縮してみます。
まず適当にプログラム作ります。

takk@deb9:~$ cat t.c
#include <stdio.h>
int main()
{
	puts("Hello");
}
takk@deb9:~$ 

ビルドします。

takk@deb9:~$ gcc t.c

実行ファイルa.outができました。

takk@deb9:~$ ls -l
合計 16
-rwxr-xr-x 1 takk takk 8624  3月  8 19:54 a.out
-rw-r--r-- 1 takk takk   50  3月  8 19:54 t.c
takk@deb9:~$ 

実行できるか確認してみましょう。

takk@deb9:~$ ./a.out
Hello

ではa.outをbzexeで圧縮します。

takk@deb9:~$ bzexe a.out
  a.out:    3.369:1,  2.375 bits/byte, 70.32% saved, 8624 in, 2560 out.
takk@deb9:~$ 

a.outは置き換わるので注意が必要です。

takk@deb9:~$ ls -l
合計 20
-rwxr-xr-x 1 takk takk 3214  3月  8 19:54 a.out
-rwxr-xr-x 1 takk takk 8624  3月  8 19:54 a.out~
-rw-r--r-- 1 takk takk   50  3月  8 19:54 t.c
takk@deb9:~$ 

a.out~が元の実行ファイルで、a.outが自己解凍付き実行ファイルです。

fileでどのようなファイルかチェックしてみましょう。

takk@deb9:~$ file a.*
a.out:  POSIX shell script executable (binary data)
a.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:~$ 

元ファイルであるa.out~は当然ELFですが、生成されたa.outはなんとshellスクリプトのようです。
内容を確認してみます。

takk@deb9:~$ cat -n a.out | head -22
     1	#!/bin/sh
     2	skip=23
     3	set -C
     4	umask=`umask`
     5	umask 77
     6	tmpfile=`tempfile -p gztmp -d /tmp` || exit 1
     7	if /usr/bin/tail -n +$skip "$0" | /bin/bzip2 -cd >> $tmpfile; then
     8	  umask $umask
     9	  /bin/chmod 700 $tmpfile
    10	  prog="`echo $0 | /bin/sed 's|^.*/||'`"
    11	  if /bin/ln -T $tmpfile "/tmp/$prog" 2>/dev/null; then
    12	    trap '/bin/rm -f $tmpfile "/tmp/$prog"; exit $res' 0
    13	    (/bin/sleep 5; /bin/rm -f $tmpfile "/tmp/$prog") 2>/dev/null &
    14	    /tmp/"$prog" ${1+"$@"}; res=$?
    15	  else
    16	    trap '/bin/rm -f $tmpfile; exit $res' 0
    17	    (/bin/sleep 5; /bin/rm -f $tmpfile) 2>/dev/null &
    18	    $tmpfile ${1+"$@"}; res=$?
    19	  fi
    20	else
    21	  echo Cannot decompress $0; exit 1
    22	fi; exit $res
takk@deb9:~$ 

ファイルの先頭から22行目までは、bashのスクリプトとなっており、それ以降に圧縮されたデータがバインドされているようです。

おっと忘れてました。圧縮したa.outが実行できることを確認します。

takk@deb9:~$ ./a.out
Hello
takk@deb9:~$ 

問題ないですね。