Compiler un binaire statique qui code une fonction gethostbyname

Comment résoudre compiler un binaire statique qui code une fonction gethostbyname et si compilé sans avertissement comme ceci:

avertissement: à l'Aide de "gethostbyname" dans les applications liées statiquement
nécessite au runtime des bibliothèques partagées à partir de la version de la glibc utilisé
pour relier

Je compile sur ubuntu 12.04 avec la commande:

$ gcc -static lookup.c -o lookup

C'est le code pour la recherche.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;
  }

Je veux si je vérifie via $ file lookup obtiendrez de sortie comme ceci:

de recherche: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux),
statiquement, pour GNU/Linux 2.6.24,
BuildID[sha1]=0x6fcb2684ad8e5e842036936abb50911cdde47c73, non dénuée

Pas comme cela:

de recherche: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
liée de façon dynamique (utilise shared libs), pour GNU/Linux 2.6.24,
BuildID[sha1]=0xf9f18671751927bea80de676d207664abfdcf5dc, non dénuée

Si vous commentée avec a suggéré que je doit utiliser sans statique, parce que les différents libc tous les linux, je le savais, j'espère que vous n'avez pas besoin de commentaire.
Pourquoi dois-je rester statique?
Parce que là, j'ai besoin de faire afin de rendre obligatoire l'utilisation de la statique, des fichiers binaires doivent être statiques et non dynamiques.

J'ai plus que 2 semaines à la recherche pour cela, mais jusqu'à présent n'ont pas réussi.

Merci de m'aider à résoudre mon lourd problème.

En bref: ne pas lier statiquement un tel programme. Lien de façon dynamique, comme d'habitude, à votre libc.so
Bonjour Basile. Pourquoi?
Comment faire? qu'est-ce avec -Bdynamic -lc -Wl ?
BorealId réponse expliqué. Fondamentalement /etc/nsswitch.conf utilise dlopen pour gethostbyname donc besoin d'un programme lié dynamiquement (parce que l'éditeur de liens dynamique doit être là). Juste compiler avec gcc -Wall -g -O lookup.c -o lookup et votre lookup seront liés de façon dynamique.
Si vous passez à un autre de la libc, pourquoi ne pas simplement utiliser le Android NDK pour compiler vos applications ? C'est ce que vous êtes censé faire, et qui vous donnera la bionique de la LIBC, et tout le reste vous avez besoin pour compiler des programmes qui s'exécutent sur android.

OriginalL'auteur Loren Ramly | 2013-03-01