- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如何解决编译包含函数 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!