如何解决编译包含函数 gethostbyname 的代码的静态二进制文件,如果在没有警告的情况下编译,如下所示:
警告:在静态链接的应用程序中使用“gethostbyname”需要在运行时使用 glibc 版本中用于链接的共享库
我使用命令在 ubuntu 12.04 上编译:
$ gcc -static lookup.c -o lookup
这是lookup.c的代码:
/* lookup.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
extern int h_errno;
int main(int argc,char **argv) {
int x, x2;
struct hostent *hp;
for ( x=1; x<argc; ++x ) {
hp = gethostbyname(argv[x]);
if ( !hp ) {
fprintf(stderr,
"%s: host '%s'\n",
hstrerror(h_errno),
argv[x]);
continue;
}
printf("Host %s : \n" ,argv[x]);
printf(" Officially:\t%s\n", hp->h_name);
fputs(" Aliases:\t",stdout);
for ( x2=0; hp->h_aliases[x2]; ++x2 ) {
if ( x2 ) {
fputs(", ",stdout);
}
fputs(hp->h_aliases[x2],stdout);
}
fputc('\n',stdout);
printf(" Type:\t\t%s\n",
hp->h_addrtype == AF_INET
? "AF_INET" : "AF_INET6");
if ( hp->h_addrtype == AF_INET ) {
for ( x2=0; hp->h_addr_list[x2]; ++x2 ) {
printf(" Address:\t%s\n",
inet_ntoa( *(struct in_addr *)
hp->h_addr_list[x2]));
}
}
putchar('\n');
}
return 0;
}
我想如果我检查通过$ file lookup
会得到这样的输出:
查找:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (GNU/Linux),静态链接,适用于 GNU/Linux 2.6.24,BuildID[sha1]=0x6fcb2684ad8e5e842036936abb50911cdde47c73,未剥离
不像这样:
查找:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.24,BuildID[sha1]=0xf9f18671751927bea80de676d207664abfdcf5dc,未剥离
如果你评论了建议我必须使用无静态,因为我知道的每个 linux 都有不同的 libc,我希望你不需要评论。为什么我坚持静态?因为我需要强制使用静态,所以二进制文件必须是静态的而不是动态的。
我有两个多星期的时间来寻找这个,但到目前为止还没有成功。
感谢您帮助我解决我的严重问题。