带有功能gethostbyname的C编译为静态链接错误

带有功能gethostbyname的C编译为静态链接错误,第1张

概述我正在尝试使用函数gethostbyname()和交叉编译器arm-none-linux-gnueabi编译程序,但是当我在android上运行二进制文件时,它不起作用.我的代码在下面:/*gethostbyname-example.c*/#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>

我正在尝试使用函数gethostbyname()和交叉编译器arm-none-linux-gnueabi编译程序,但是当我在android上运行二进制文件时,它不起作用.

我的代码在下面:

  /* gethostbyname-example.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;  }

我使用arm-none-linux-gnueabi-gcc进行编译,在装有OS ubuntu 12.04和交叉编译器Sourcery Codebench的笔记本电脑上:

$arm-none-linux-gnueabi-gcc gethostbyname-example.c --static -o gethostbyname-example/tmp/ccE0xjBG.o: In function `main':lookup.c:(.text+0x38): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared librarIEs from the glibc version used for linking$lsgethostbyname-example.c gethostbyname-example$file gethostbyname-examplegethostbyname-example: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/linux 2.6.16, not stripped

然后我在chroot臂上测试二进制gethostbyname-example实例,将二进制文件复制粘贴到chroot文件夹,然后登录chroot,然后执行,顺便说一句,我从这里创建chroot https://wiki.ubuntu.com/ARM/BuildEABIChroot,如果我在chroot上运行它,我得到结果如下:

# ./gethostbyname-example www.Google.comHost Google.com :  Officially:    www.Google.com Aliases:    Type:      AF_INET Address:   74.125.135.139 Address:   74.125.135.100 Address:   74.125.135.101 Address:   74.125.135.102 Address:   74.125.135.113 Address:   74.125.135.138

然后我还通过adb push将二进制gethostbyname-example上传到我的androID设备,如果我运行二进制gethostbyname-example,则会收到如下错误

06003

在我的androID设备中,我使用Google DNS在/ etc /和/ system / etc /中存放文件

8.8.8.8 8.8.4.4

大概是什么原因造成的,

谢谢.

解决方法:

简短说明

glibc中的DNS查找需要/lib/libnss_dns.so.2,在AndroID上不可用.

另一个区别是AndroID存储DNS设置/system/etc/resolv.conf,并且使用仿生C库构建的本机AndroID应用程序将在此处查找要查询的DNS服务器.使用glibc构建的应用程序将在/etc/resolv.conf中查找,而该文件在AndroID上不存在.

更长的解释

您已经使用glibc构建了二进制文件,而AndroID使用了仿生C库.

静态链接到libc时,这在大多数情况下应该没问题,因为我不知道androID内核中的足够大的更改会破坏简单的用户陆地应用程序.不过,您应该使用AndroID NDK来构建androID本机应用,

但是,静态链接到glibc时,有些事情出了问题. glibc中的某些功能,例如用于查找用户信息,主机名和通常在/etc/nsswitch.conf中配置的其他内容,以调用其他共享库来实际完成工作.无论是否静态链接到glibc本身,都会发生这种情况.这些文件通常是在glibc系统上找到的/ lib / libnss_ *文件.

这些共享库大多数是glibc的一部分,将安装在glibc系统上.但是它们在AndroID上不可用.当这些共享库可用时,依赖使用这些辅助共享库功能的应用程序将无法正常工作-gethostbyname()是其中之一,因为对于普通的DNS查询,它要求/lib/libnss_dns.so.2.

总结

以上是内存溢出为你收集整理的带有功能gethostbyname的C编译为静态链接错误全部内容,希望文章能够帮你解决带有功能gethostbyname的C编译为静态链接错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1211127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存