【发布时间】:2013-03-05 11:22:13
【问题描述】:
我有一个小的 c 程序,它基本上调用 getaddrinfo。 根据/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 很重要,因为它几乎是空的(很多 cmets 除外。)事实上,如果我删除该文件,我仍然能够正确解析(根据 /etc/hosts)两个 ips动态链接的程序。
另一方面,在这种情况下,静态链接是否意味着在链接时甚至会评估配置文件??
问题:为什么两个程序的输出不同?
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);
}
}
【问题讨论】:
-
可以从您的测试中得出结论,执行名称查找的两个版本的库的行为不同,实现名称查找的方式不同。
-
是的,这可能是要得出的结论。出于某种原因,我假设静态库和共享库必须相同(相同的源代码来源)。也许当使用完全基于源代码的包时,可能就是这种情况。
-
尝试使用 strace 来发现库在做什么。
标签: c getaddrinfo