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

映画『好きになるその瞬間を。~告白実行委員会~』第3弾本予告「今好きになる。-triangle story-」榎本虎太朗(CV:花江夏樹)Ver.

アニメ映画『好きになるその瞬間を。~告白実行委員会~』(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
     #!/bin/sh
     2  skip=23
     set -C
     umask=`umask`
     umask 77
     6  tmpfile=`tempfile -p gztmp -d /tmp` || exit 1
     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:~$

問題ないですね。

コメント

タイトルとURLをコピーしました