2013-03-05 1 views
3

기본적으로 getaddrinfo를 호출하는 작은 c 프로그램이 있습니다. /etc/hosts에 따르면 localhost는 "127.0.0.1"및 ":: 1"로 확인할 수 있습니다.localhost를 사용하는 getaddrinfo : 정적으로 링크되거나 동일한 시스템에 없을 때 다른 동작

이제 출력 내가 컴파일 여부에 따라 프로그램을 실행하고 사용하여 링크 할 때 :

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에 따라) ips를 다음과 같이 정확하게 해결할 수 있습니다. 다이나믹하게 링크 된 프로그램.

반면에 정적으로 링크하는 경우 연결 파일에서 심지어 구성 파일을 평가하는 것을 의미합니까?

질문 : 두 프로그램의 출력이 다른 이유는 무엇입니까?

TEST.C

: Glibc의 체제 하에서

#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); 
    } 
} 
+0

테스트에서 이름 검색을 수행하는 lib의 두 버전이 동일하게 작동하지 않는다고 결론을 내릴 수 있습니다. 이름 조회를 다르게 구현하십시오. – alk

+0

네, 아마도 그게 결론 일 겁니다. 어떤 이유로 정적 라이브러리와 공유 라이브러리가 동일해야한다고 가정했습니다 (동일한 소스 코드의 출처). 어쩌면 소스 코드를 기반으로 완전히 패키지를 사용하는 경우 일 수 있습니다. – user1240076

+0

아마도이 도움말 : http://stackoverflow.com/q/2725255/694576 – alk

답변

3

는 getaddrinfo를 통해 RFC 3484의 구현 (어드레스 선택의 IPv6에서/주문)가()이고, 본 경우 gai.conf 파일을 통해 수행 여기서 핵심 요소는 정확하고 동적으로 링크 된 라이브러리 호출의 경우와 동일해야합니다.

정적으로 링크 된 라이브러리에서 gai.conf에 시스템 호출이 이루어지지 않는다는 사실은 관계없이 두 라이브러리간에 불일치가 있음을 강력하게 암시하며, 반환하는 유일한 주소는 IPv4 주소입니다. 또한 RFC 3484의 구현에서 반환 된 기본값은 동적으로 링크 된 라이브러리 호출을 실행함으로써 존재하는 IPv6 주소임을 나타냅니다.

시스템에 액세스하지 않으면 코딩 오류가 아니라 여기에 라이브러리 파일 오류가 있다고합니다.

관련 문제