我想用編譯程序使用函數gethostbyname()
與交叉編譯器arm-none-linux-gnueabi
,但它沒有工作時,我在Android上運行我的二進制文件。編譯C與函數gethostbyname靜態鏈接錯誤
我在下面的代碼:
/* 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
$ ls
gethostbyname-example.c gethostbyname-example
$ file gethostbyname-example
gethostbyname-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上運行它I得到的結果如下:
# ./gethostbyname-example www.google.com
Host 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
然後我也上傳二進制的gethostbyname,例如與亞行推到我的Android設備,如果我運行的二進制的gethostbyname,例如我得到如下錯誤:
# ./gethostbyname-example www.google.com # Unknown server error: host 'www.google.com' # ping www.google.com # PING www.google.com (74.125.135.99) 56(84) bytes of data. # 64 bytes from ni-in-f99.1e100.net (74.125.135.99): icmp_seq=1 ttl=49 time=798 ms # 64 bytes from ni-in-f99.1e100.net (74.125.135.99): icmp_seq=2 ttl=49 time=1039 ms
在我的Android設備我已經在/ etc /和/系統的/ etc /文件主機與谷歌DNS
8.8.8.8
8.8.4.4
大概是什麼原因造成這種故障,
謝謝。在glibc的
什麼樣的設備是你的手臂設備,你在chroot中運行它?這聽起來像你鏈接到glibc,它的運行時間可以在你的手臂設備上使用。在android上,沒有glibc。 – nos 2013-02-27 17:50:23
我在這裏使用chroot https://wiki.ubuntu.com/ARM/BuildEABIChroot – 2013-02-27 17:53:41
所以它基本上是Ubuntu的手臂構建,而不是任何Android的? – nos 2013-02-27 17:54:35