27

コードに関数 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週間以上探していますが、これまでのところ成功していません.

私の重い問題を解決するのを手伝ってくれてありがとう。

4

3 に答える 3

0

2つの答えがあります -

  1. プログラムの主要部分を静的にリンクしたままにし、単一の関数プログラムを分離して gethostbyname() を呼び出すだけです。後者を動的にリンクできるようにします。fork を使用してから exec を使用して、この別のプログラムを実行し、ドメイン名のアドレスを取得します。fork then exec の代わりに system() を使用できますが、インターネット上でネームサーバーを検索しているため、時間がかかるため、心配する必要はありません。

  2. 私が行ったように、DNS を実行するソース コードを記述します。それをアーカイブ (.a) にコンパイルし、静的リンクで検索します。

于 2014-01-26T02:01:10.103 に答える