SIer だけど技術やりたいブログ

Linux rpmパッケージのコードリーディングをしたい

linux

デバッグ情報を付与するだけなら debuginfo-install を使えばいいが、今回は、ソースコードを閲覧または変更できるようにする。
参考 CentOS 7: デバッグシンボルでパッケージをデバッグする

検証バージョン

]$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

]$ uname -a
Linux localhost.localdomain 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

手順

src.rpm パッケージからビルドすることで、yumでインストールしたプログラムと同一のソースコードを用意することができる。これ以外の方法(例えばgitリポジトリからチェックアウトして独自にビルドしたり)だと、ディストリビューション側で対応したパッチが適用されていない、といった差が出ることがある。

// プログラムがどのパッケージに属しているか調べる
]$ rpm -qf /bin/ls
coreutils-8.22-23.el7.x86_64

// src.rpm をダウンロードする
]$ yumdownloader --source coreutils
...
coreutils-8.22-23.el7.src.rpm             | 5.3 MB  00:00:05    

// src.rpm をインストールする
]$ rpm -ivh coreutils-8.4-37.el6.src.rpm

// 依存パッケージのインストール
]$ sudo yum-builddep -y coreutils-8.22-23.el7.src.rpm

// src.rpm からソースコードを取り出す
// -bp は spec ファイルをもとに展開~パッチ適用まで実行する(ビルドおよびインストールはしない)
]$ rpmbuild -bp ~/rpmbuild/SPECS/coreutils.spec 
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.kPFFtJ
+ umask 022
+ cd /home/kimura/rpmbuild/BUILD
+ cd /home/kimura/rpmbuild/BUILD
+ rm -rf coreutils-8.22
+ /usr/bin/xz -dc /home/kimura/rpmbuild/SOURCES/coreutils-8.22.tar.xz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
...

// ソースコードを閲覧する
]$ cd rpmbuild/BUILD/coreutils-8.22/src

// 実行したい場合は、ビルドする
]$ rpmbuild -bc ~/rpmbuild/SPECS/coreutils.spec 
...

// デバッグする(以下、C言語の例)
]$ gdb ./ls
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/kimura/rpmbuild/BUILD/coreutils-8.22/src/ls...done.

// breakpoint を設定する
(gdb) b main
Breakpoint 1 at 0x4028c0: file src/ls.c, line 1349.

// 実行する
(gdb) r
Starting program: /home/kimura/rpmbuild/BUILD/coreutils-8.22/src/./ls 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffddf8) at src/ls.c:1349
1349    {
Missing separate debuginfos, use: debuginfo-install pcre-8.32-17.el7.x86_64

gdb 使用中に Ctrl + 1 を押せば、コードも表示できる。