前回binutilsにodコマンドがあると思ってた勘違いに気づきました。
コマンドがどのパッケージに含まれるかって、いつもapt-file searchを使ってますが、odが、binutilsに含まれるかを確認するには、
takk@deb9:~$ which od /usr/bin/od takk@deb9:~$ apt-file search /usr/bin/od | grep binutils takk@deb9:~$
とやるだけで確認できましたね。
odは、coreutilsなので、coreutilsで検索すればヒットします。
takk@deb9:~$ apt-file search /usr/bin/od | grep coreutils coreutils: /usr/bin/od takk@deb9:~$
では、パッケージ名を指定して、パッケージ内にあるコマンドを確認するには、どうすれば良いかというと、apt-file listすればよいです。
takk@deb9:~$ apt-file list binutils | head binutils: /usr/bin/addr2line binutils: /usr/bin/ar binutils: /usr/bin/as binutils: /usr/bin/c++filt binutils: /usr/bin/dwp binutils: /usr/bin/elfedit binutils: /usr/bin/gold binutils: /usr/bin/gprof binutils: /usr/bin/ld binutils: /usr/bin/ld.bfd takk@deb9:~$
これは手元にパッケージがなくても使えるコマンドですが、bin2cのようなインストールされないコマンドは、一覧に表示されないようです。
takk@deb9:~$ apt-file list binutils | grep bin2c takk@deb9:~$
さて、特定パッケージ内で、bin2cのようなコマンドを見つけるにはどうすれば良いでしょうか。
ファイル名=コマンド名.cとなってることが多いので、たいていのコマンドは、main関数が存在する.cをgrepすれば、見つけることができます。
(検索するために、パッケージのソースは取得しておく必要があります)
では、binutilsに含まれるコマンド一覧を抽出してみます。
全ファイル数と、ランダムに10件ピックアップ。
takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | wc -l 529 takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | shuf | head binutils/elfcomm.c gas/config/tc-i386.c bfd/elf32-sh.c intl/localename.c libiberty/strrchr.c intl/textdomain.c binutils/nlmconv.c bfd/elf32-tilepro.c bfd/elf64-ia64-vms.c zlib/examples/zpipe.c takk@deb9:~/src/binutils-2.28$
bin2c.cソースは、binutilsディレクトリでしたので、binutilsのみに絞ります。
takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | grep ^binutils | pr -t2 binutils/debug.c binutils/deflex.c binutils/cxxfilt.c binutils/nlmconv.c binutils/ar.c binutils/nlmheader.c binutils/sysinfo.c binutils/addr2line.c binutils/coffdump.c binutils/prdbg.c binutils/ieee.c binutils/readelf.c binutils/testsuite/binutils-all/tes binutils/srconv.c binutils/bfdtest1.c binutils/bfdtest2.c binutils/syslex.c binutils/wrstabs.c binutils/nm.c binutils/arlex.c binutils/rdcoff.c binutils/strings.c binutils/dwarf.c binutils/dllwrap.c binutils/elfcomm.c binutils/dlltool.c binutils/sysdump.c binutils/elfedit.c binutils/stabs.c binutils/objdump.c binutils/windmc.c binutils/size.c binutils/objcopy.c binutils/bin2c.c binutils/od-macho.c binutils/windres.c takk@deb9:~/src/binutils-2.28$
これをbasenameでディレクトリ名と拡張子.cを除いて一覧にします。
takk@deb9:~/src/binutils-2.28$ for i in `grep -rl main * --include *.c | grep ^binutils`;do basename $i .c;done | pr -t3 debug elfcomm srconv cxxfilt sysdump bfdtest2 ar stabs wrstabs sysinfo windmc arlex coffdump objcopy strings ieee od-macho dllwrap testprog deflex dlltool bfdtest1 nlmconv elfedit syslex nlmheader objdump nm addr2line size rdcoff prdbg bin2c dwarf readelf windres takk@deb9:~/src/binutils-2.28$
これで、.cファイル名=コマンド名と見なして一覧ができました。
実際はインストール時はコマンド名が変わるものもあるので、apt-file listの結果とは一致しませんが、隠れコマンドは見つかるかと思います。
bin2cは、下から2行目の3列目にありますね。
コメント