기본적으로 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);
}
}
테스트에서 이름 검색을 수행하는 lib의 두 버전이 동일하게 작동하지 않는다고 결론을 내릴 수 있습니다. 이름 조회를 다르게 구현하십시오. – alk
네, 아마도 그게 결론 일 겁니다. 어떤 이유로 정적 라이브러리와 공유 라이브러리가 동일해야한다고 가정했습니다 (동일한 소스 코드의 출처). 어쩌면 소스 코드를 기반으로 완전히 패키지를 사용하는 경우 일 수 있습니다. – user1240076
아마도이 도움말 : http://stackoverflow.com/q/2725255/694576 – alk