구현을 더 자세히 살펴보면 실제로 사용자 공간에 동적 라이브러리를 로드하는 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]