ブログ

ARM用バイナリが使用しているライブラリのDebianパッケージ名、Debianソースパッケージ名を調べる方法

at_ito
2015年1月9日 18時54分

プログラムを作成した際に、依存しているライブラリのライセンスを確認する必要があると思います。その際に、リンクしているライブラリのソースコードを取得する必要があるため、指定のバイナリが使用しているライブラリのDebianパッケージ名、Debianソースパッケージ名を調べるためのシェルスクリプトを作ってみました。

以下のシェルスクリプトを作成し、ATDEで動かしてみてください。

#!/bin/sh
 
OBJDUMP=arm-linux-gnueabi-objdump
GCC=arm-linux-gnueabi-gcc
BIN="$1"
 
dirname2() {
    local base=`pwd`
    cd `dirname $1`
    local dir=`pwd`
    cd $base
    echo $dir
}
 
needed=`$OBJDUMP -p $BIN | grep NEEDED | sed -e "s/^.* //"`
libdirs=`$GCC -print-search-dirs | grep -e "libraries: =" | sed -e "s/libraries: =//" -e "s/:/ /g"`
 
pkgs=
for f in $needed
do
    lib=`find $libdirs -ignore_readdir_race -name $f 2>/dev/null`
    if [ ! "$lib" ]; then
        echo "can't find package: $f"
        continue
    fi
    lib=`dirname2 $lib`/`basename $lib`
    pkgs="$pkgs `dpkg -S $lib | cut -d':' -f1`"
done
 
pkgs=`echo $pkgs | tr ' ' '\n' | sort | uniq | tr '\n' ' '`
echo "packages: $pkgs"
 
srcpkgs=
for pkg in $pkgs
do
    srcpkg=`dpkg-query -p $pkg | grep 'Source:' | cut -d' ' -f2`
    if [ ! "$srcpkg" ]; then
        echo "can't find source package: $pkg"
        continue
    fi
    srcpkgs="$srcpkgs $srcpkg"
done
echo "source packages: $srcpkgs"

※: ATDE5で使用することを想定しています。他の環境で使用する場合は、修正が必要な可能性があります。

上記シェルスクリプトの実行例(ファイル名find_package.shの場合)は以下のとおりです。

[ATDE ~]$ ./find_package.sh ~/atmark-dist/romfs/bin/wget
packages: libc6-armel-cross libssl1.0.0-armel-cross
source packages:  eglibc openssl

上記のソースパッケージ名をもとに、ソースコード等を取得し、ライセンスを調べることができます。