ltraceがglibc __nss_configure_lookup()への呼び出しを表示しないのはなぜですか?

ltraceがglibc __nss_configure_lookup()への呼び出しを表示しないのはなぜですか?

ltraceコマンドがどのように機能するかを理解しようとしています。

だから一緒に遊んでいた/etc/nsswitch.conf。そこに「hosts:resolve」行があります。glibc動的ローディングnss-resolveホスト名検索用のプラグインモジュールです。プラグインがロードされているのを見たいですltrace

$ ltrace getent hosts google.com
mtrace()                                                           = <void>
setlocale(LC_ALL, "")                                              = "en_GB.UTF-8"
textdomain("libc")                                                 = "libc"
argp_parse(0x55e7c8bf5140, 3, 0x7fffd79d00c8, 0)                   = 0
strcmp("hosts", "hosts")                                           = 0
inet_pton(10, 0x7fffd79d11fb, 0x7fffd79cff60, 0)                   = 0
inet_pton(2, 0x7fffd79d11fb, 0x7fffd79cff60, 38)                   = 0
gethostbyname2(0x7fffd79d11fb, 10, 0, 55)                          = 0x7fbb0311b340
inet_ntop(10, 0x55e7c8f3ba38, 0x7fffd79cfef0, 46)                  = 0x7fffd79cfef0
printf("%-15s %s", "2a00:1450:4009:", "google.com")                = 35
__overflow(0x7fbb03118760, 10, 0x7fffd79cf990, 02a00:1450:4009:816::200e google.com) = 10
+++ exited (status 0) +++

プラグインがltraceロードされるように見える出力には何もありませんが。/lib/x86_64-linux-gnu/libnss_resolve.so.2strace

たとえば、ロードプロセスに次のものが含まれると99%確信しています。電話到着__nss_configure_lookup()glibc/nss/nsswitch.cからしかし、出力にはそのような呼び出しはありません。なぜですか?__nss_configure_lookup()呼び出される使用法や他のツールを表示する方法はありますか?ltrace

ベストアンサー1

$ ltrace getent hosts google.com

たとえば、ロードプロセスにglibc / nss / nsswitch.cで__nss_configure_lookup()呼び出しが含まれると99%確信しています。

なぜですか?-sフラグ[1]を使用していません:

% ltrace getent -s hosts:dns hosts google.com
...
__nss_configure_lookup(0x563d2eecc194, 0x7ffcff9ec80f, 5, 9) = 0
...

ltrace出力にはプラグインがロードされているように見えるものはありません。

ltraceライブラリ内の呼び出しは追跡できません。このようなデバッガを使用すると、目的のgdb場所にブレークポイントとウォッチポイントを設定できます。


[1]あなたがリンクしたソースの引用:

 879 static error_t
 880 parse_option (int key, char *arg, struct argp_state *state)
 881 {
 882   char *endp;
 883   switch (key)
 884     {
 885     case 's':
 886       endp = strchr (arg, ':');
 887       if (endp == NULL)
 888         /* No specific database, change them all.  */
 889         for (int i = 0; databases[i].name != NULL; ++i)
 890           __nss_configure_lookup (databases[i].name, arg);
 891       else
 892         {
 893           int i;
 894           for (i = 0; databases[i].name != NULL; ++i)
 895             if (strncmp (databases[i].name, arg, endp - arg) == 0)
 896               {
 897                 __nss_configure_lookup (databases[i].name, endp + 1);
 898                 break;
 899               }
 900           if (databases[i].name == NULL)
 901             error (EXIT_FAILURE, 0, gettext ("Unknown database name"));
 902         }
 903       break;

おすすめ記事