コードに関数 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;
}
via をチェックする$ 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が異なるため、静的なしで使用する必要があるとコメントした場合は、コメントする必要がないことを願っています。なぜ静的に固執するのですか? 静的な使用を必須にする必要があるため、バイナリ ファイルは動的ではなく静的である必要があります。
私はこれを2週間以上探していますが、これまでのところ成功していません.
私の重い問題を解決するのを手伝ってくれてありがとう。