3

基本的にgetaddrinfoを呼び出す小さなcプログラムがあります。/etc/hosts によると、localhost は "127.0.0.1" と "::1" に解決できます。

プログラムを実行すると、出力は次を使用してコンパイルおよびリンクしたかどうかによって異なります。

gcc -static test.c
$ a.out
127.0.0.1 2

gcc test.c
$ a.out
::1 10
127.0.0.1 2

どのシステム コールが実行されたかを確認しましたが、最初のケースでは構成ファイル /etc/gai.conf が使用されていなかったようです。ただし、gai.conf はほとんど空なので (多くのコメントを除いて)、問題になるとは思いません。実際にファイルを削除しても、(/etc/hosts に従って) 両方の IP を正しく解決できます。動的にリンクされたプログラム。

一方、この場合、静的リンクとは、リンク時に構成ファイルでさえ評価されることを意味しますか??

質問: 両方のプログラムの出力が異なるのはなぜですか?

test.c :

#include <netdb.h>
#include <stdio.h>

int main(int argc, char *argv[]) {

    struct addrinfo *result, *rp;
    int s = getaddrinfo("localhost", "", NULL, &result);
    char host[INET6_ADDRSTRLEN];
    for (rp = result; rp != NULL ; rp = rp->ai_next) {
        inet_ntop(rp->ai_family,
        (rp->ai_family == AF_INET ?
            &(((struct sockaddr_in*)rp->ai_addr)->sin_addr): 
                &(((struct sockaddr_in6*)rp->ai_addr)->sin6_addr)),
                host, sizeof host);
        printf("%s %d\n", host, rp->ai_family);
    }
}
4

1 に答える 1

3

glibc システムでは、getaddrinfo() による RFC 3484 (IPv6 でのアドレス選択/順序付け) の実装は、存在する場合は gai.conf ファイルを介して実行されます。動的にリンクされたライブラリ呼び出し。

静的にリンクされたライブラリで gai.conf に対してシステム コールが行われていないという事実は、2 つのライブラリ間に不一致があることを強く示唆しており、それが返す唯一のアドレスが IPv4 アドレスであるという事実も懸念されます。 RFC 3484 の実装では、返されるデフォルト値は IPv6 アドレスであると述べられています。これは、動的にリンクされたライブラリ呼び出しを実行することで存在することがわかっています。

システムにアクセスできない場合は、コーディング エラーではなく、ここにライブラリ ファイル エラーがあると言えます。

于 2013-08-13T02:03:03.327 に答える