実装をより詳しく見ると、実際にユーザースペースに動的ライブラリをロードするtcpdump
ことがわかります。libpcap.so
ただし、libpcapを使用すると、strace
libpcapからエクスポートされた関数への呼び出しは表示されません。
上記のtcpdumpの動作は予想される動作ですか?ありがとうございます。
root@eve-ng02:~# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.7.4
OpenSSL 1.0.2g 1 Mar 2016
編集:私が受け取ったコメントに基づいて試しましたltrace
が、動的ライブラリへの呼び出しも完了していないようです。
root@eve-ng02:~# ltrace tcpdump -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
^C--- SIGINT (Interrupt) ---
0 packets captured
126 packets received by filter
98 packets dropped by kernel
+++ exited (status 0) +++
root@eve-ng02:~#
答え1
strace
システムコールのみが表示されます。ltrace
図書館の呼び出しを表示するツールです(参照:システムコールとライブラリコールの違い)。
システムコールとライブラリコールの両方を表示するには、以下を-S
追加できますltrace
(「システムコールとライブラリコールの表示」)
(-k
strace
「各システム呼び出し後に追跡されたプロセスの実行スタックトレースを印刷します。」)あなたのstrace
バージョンがそれをサポートしている場合。すべてのライブラリコールを表示するわけではありませんが、各システムコールの実行トレースを表示するので、どのライブラリがシステムコールをトリガしたかを確認できます。
17212 eventfd2(0, EFD_NONBLOCK) = 3
> /lib64/libc-2.31.so(eventfd+0x7) [0x117b87]
> /usr/lib64/libpcap.so.1.10.1() [0xb8fa]
> /usr/lib64/libpcap.so.1.10.1(pcap_create+0xaa) [0x10a9a]
> /usr/sbin/tcpdump() [0x3efbf]
> /usr/sbin/tcpdump() [0x3c891]
> /lib64/libc-2.31.so(__libc_start_main+0xee) [0x3524c]
> /usr/sbin/tcpdump() [0x3e149]
17212 socket(AF_PACKET, SOCK_DGRAM, htons(0 /* ETH_P_??? */)) = 4
> /lib64/libc-2.31.so(__socket+0x7) [0x1190d7]
> /usr/lib64/libpcap.so.1.10.1() [0xa0c0]
> /usr/lib64/libpcap.so.1.10.1(pcap_activate+0x1c) [0x1191c]
> /usr/sbin/tcpdump() [0x3f0d2]
> /usr/sbin/tcpdump() [0x3c891]
> /lib64/libc-2.31.so(__libc_start_main+0xee) [0x3524c]
> /usr/sbin/tcpdump() [0x3e149]