CUBE SUGAR CONTAINER

技術系のこと書きます。

Ubuntu 18.04 LTS でコマンドのソースコードを取得する

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 のようだ。

めでたしめでたし。