gpt4 book ai didi

c++ - 编译一个静态二进制文件,其中代码有一个函数 gethostbyname

转载 作者:IT老高 更新时间:2023-10-28 21:55:30 25 4
gpt4 key购买 nike

如何解决编译包含函数 gethostbyname 的代码的静态二进制文件,如果编译时没有像这样的警告:

warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

我在 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;
}

如果我通过 $ 文件查找 进行检查,我想得到这样的输出:

lookup: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0x6fcb2684ad8e5e842036936abb50911cdde47c73, not stripped

不是这样的:

lookup: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf9f18671751927bea80de676d207664abfdcf5dc, not stripped

如果你评论了建议我必须使用无静态,因为我知道的每个 linux 都有不同的 libc,我希望你不需要评论。为什么我坚持静态?因为我需要强制使用静态,所以二进制文件必须是静态的而不是动态的。

我有超过 2 周的时间在寻找这个,但到目前为止还没有成功。

感谢您帮助我解决我的严重问题。

最佳答案

你所要求的将是非常困难的。

this StackOverflow question about getaddrinfo .基本上,getaddrinfo/gethostbyname 下面是 glibc 的 NSS 层。这允许系统管理员说“使用 DNS 将主机名解析为 IP 地址”,或“使用 LDAP”,或“不要使用除了 /etc/hosts 之外的任何东西”。此控件在运行时;系统管理员可以随时更改主机名解析为 IP 的方式。

由于这种灵 active ,glibc 中的所有名称解析调用都使用辅助库(基本上是插件)来完成繁琐的解析工作。有一个共享库用于 LDAP 寻址,一个用于文件,一个用于 DNS,一个用于 YP,以此类推。

如果您希望您的程序 100% 静态链接,您将不得不去其他地方(不是 gethostbyname)将主机名转换为 IP 地址。您可以使用解析器库,如 uDNS (不是这个确切的工具 - 有类似的工具可用),但您应该记住,您的二进制文件不会在配置为不使用 DNS 的系统上做正确的事情!

相反,我建议只保留程序(技术上)动态链接。如果您真的想确保它可以在任何平台上运行,您甚至可以将 glibc 与二进制文件一起发布——尽管这样做需要符合 LGPL。保留这个动态链接仅意味着您不会在具有错误 glibc 版本的系统上工作 - 不是一个巨大的兼容性问题。

谈到许可证合规性,值得注意的是,如果您静态链接 glibc,您很可能必须为您的整个应用程序提供源代码以符合 glibc 的 LGPL 许可证。我不是律师,这不是合格的法律建议,但阅读 LGPL 可以清楚地表明静态链接 glibc 的应用程序必须是开源的。见 this StackOverflow question on the topic .

关于c++ - 编译一个静态二进制文件,其中代码有一个函数 gethostbyname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com