Ubuntu を使っていて、このコマンドってどんな処理してるんだろうなーとか気になったときにソースコードを取り寄せる方法について。
使った環境は次の通り。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS" $ uname -r 4.15.0-29-generic
題材は ls
コマンドにする。
$ which ls
/bin/ls
まずは下準備として APT のソースコード用リポジトリを有効にしておく。
$ sudo sed -i.back -e "s/^# deb-src/deb-src/g" /etc/apt/sources.list
$ sudo apt-get update
続いて、お目当てのコマンドの実行ファイルが含まれるパッケージ名を dpkg -S
で調べる。
今回は coreutils
にあることが分かった。
$ dpkg -S $(which ls) coreutils: /bin/ls
あとは apt-get source
コマンドでパッケージのソースコードを取得する。
$ apt-get source coreutils
これでカレントディレクトリにソースコードがダウンロードされる。
$ ls coreutils-8.28 coreutils_8.28-1ubuntu1.dsc coreutils_8.28.orig.tar.xz.asc coreutils_8.28-1ubuntu1.debian.tar.xz coreutils_8.28.orig.tar.xz $ ls coreutils-8.28/src/ | head base64.c basename.c blake2 cat.c chcon.c chgrp.c chmod.c chown.c chown-core.c chown-core.h
展開されたファイルの中に ls.c
という、それらしき名前のファイルが見つかった。
$ ls coreutils-8.28/src/ | grep ^ls.c$ ls.c
ビルドしてみる
ダウンロードしたのが本当に ls
コマンドのソースコードなのか、ビルドすることで確かめてみよう。
$ sudo apt-get -y install build-essential
パッケージのソースコードが入ったディレクトリに移動する。
$ cd coreutils-8.28
ビルドする。
$ ./configure $ make
すると Linux の実行ファイルができる。
$ file src/ls src/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=b29ae91cb81dca67ce217d928be9a2926b3008c2, with debug_info, not stripped
試しに実行してみよう。
$ ./src/ls ABOUT-NLS build-aux configure doc lib Makefile.in src THANKS-to-translators aclocal.m4 cfg.mk configure.ac gnulib-tests m4 man tests THANKStt.in AUTHORS ChangeLog COPYING GNUmakefile maint.mk NEWS THANKS TODO bootstrap config.log debian init.cfg Makefile po thanks-gen bootstrap.conf config.status dist-check.mk INSTALL Makefile.am README THANKS.in
ちゃんと ls
のようだ。
めでたしめでたし。
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログ (1件) を見る