ping
私が知っている限り、grep
orまたは同じコマンドを実行すると、ls
Linuxオペレーティングシステムはそのコマンド名を見つけるためにディレクトリを検索します/bin
。また、ほとんどのLinuxコマンドがCで書かれていることも知っています。
ping
実際のCでORがどのようにls
書かれているのか見たかったです。ちなみにcat
ファイルを使うとcat /bin/ping
バイナリ形式なのでガベージデータを吐き出します。
それでは、Cで書かれたコマンドを見る方法はありますか?
答え1
どのパッケージがコマンドを提供しているかを知ることが役立ちます。たとえば、多くの(すべてではない!)Linuxディストリビューションでは、このls
コマンドはGNUパッケージで提供されていますcoreutils
。次のリンクから、これらのコマンドのソースを見つけることができます。coreutils ウェブページ。
このping
コマンドはパッケージで提供されますiputils
。ソースを見つけることができます。ここ。
ほとんどのディストリビューションは、どのパッケージが特定のファイルを所有しているかを確認するメカニズムを提供します。たとえば、Ubuntuではdpkg-query
次のように使用できます。
$ dpkg-query -S /bin/ls
coreutils: /bin/ls
Red Hat / Fedora / CentOS / etcに対応するコマンドは次のとおりです。
$ rpm -qf /bin/ls
coreutils-8.32-33.fc35.x86_64
興味のあるファイルを提供するパッケージがわかっている場合は、通常、ディストリビューションが提供する適切なソースパッケージを見つけてソースコードを見つけることができます。 Ubuntuの場合は、以下を訪問できます。https://packages.ubuntu.com/名前でパッケージを見つけると、iputils
次のようになります。ここ、パッケージの構築に使用されたソースをダウンロードするためのリンクを見つけることができます。
Fedoraパッケージの場合は、以下をご覧ください。https://packages.fedoraproject.org/パッケージを検索してみてください。この場合、ファイルを読み取る必要がありますspec
(例:これはiputilsからのものです。)ソースをどこで見つけることができるかをご覧ください。
UbuntuまたはFedora以外のシステムを使用している場合は、同様のメカニズムを使用できます。ほとんどのディストリビューションは、名前でソースパッケージをダウンロードするためのコマンドラインツールも提供しています。
答え2
と言うと、cat /bin/ping
Cソースコードでコンパイルされたコマンドのバイナリコードを見ようとするのです。このコマンドのCソースコードを見つける必要があります。よりシェルコマンドのソースコードを読み取るには?より多くの情報を知りたいです。
答え3
Linuxでは、次のようなバイナリコマンドを分析するいくつかの方法があります。
- ファイル、ファイルの種類を決定します。
- ldd は共有オブジェクトの依存関係を出力します。
- ltrace、ライブラリ呼び出しトラッカー。
- Hexdumpはファイルの内容をASCII、10進数、16進数、または8進数で表示します。
- 文字列、印刷ファイルの印刷可能な文字列です。
- readelf は ELF ファイルに関する情報を表示します。
- objdumpはターゲットファイルの情報を表示します。
- strace はシステムコールとシグナルを追跡します。
- nm、オブジェクトファイルのシンボルを一覧表示します。
- gdb、GNUデバッガ。