読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

シェルスクリプトをコンパイルできるshcで遊んでみた

使うことはないかもしれない。でも面白いです。

shcをインストール

 $ sudo apt-get install shc

なかったらソースをダウンロードしてコンパイルしてください。

 $ wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
 $ tar xvzf shc-3.8.7.tgz
 $ cd shc-3.8.7/
 $ make

shcでコンパイル

テストで /usr/bin/ldd を使用。 なんで lddってshell script ってイメージがないんだろう。

$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script text executable
$ cp -p /usr/bin/ldd .
$ ./shc  -v -r -T -f ./ldd
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc  ./ldd.x.c -o ./ldd.x
shc: strip ./ldd.x
shc: chmod go-r ./ldd.x
$ file ./ldd.x
./ldd.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$ ./ldd.x /bin/ls
        linux-vdso.so.1 =>  (0x00007fff0d9ff000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2ed8878000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f2ed8670000)
        libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f2ed8467000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ed80d3000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2ed7ecf000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2ed8a9f000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2ed7cb0000)
        libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f2ed7aab000)

foo.x.c というCのソースができるので、中身を眺めてみるのもオツなものです。