Kompilieren einer statischen binary code gibt es eine Funktion "gethostbyname"

Wie zu beheben kompilieren einer statischen binary die code-Funktion "gethostbyname" und wenn kompiliert ohne Warnung wie diese:

Warnung: die Verwendung von 'gethostbyname' in statisch gelinkten Anwendungen
erfordert zur Laufzeit die shared-libraries, von der glibc-version verwendet
für die Verknüpfung von

Ich kompilieren unter ubuntu 12.04 mit dem Befehl:

$ gcc -static lookup.c -o lookup

Dies ist der code für die Suche.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;
  }

Möchte ich, wenn ich überprüfen, über $ file lookup erhalten eine Ausgabe wie diese:

Suche: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux),
statisch linked, for GNU/Linux-2.6.24,
BuildID[sha1]=0x6fcb2684ad8e5e842036936abb50911cdde47c73, nicht abgestreift

Nicht so:

Suche: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), für GNU/Linux-2.6.24,
BuildID[sha1]=0xf9f18671751927bea80de676d207664abfdcf5dc, nicht abgestreift

Wenn Sie kommentiert mit Vorschlägen, die ich verwenden muss, ohne statisch, da unterschiedliche libc jeder linux-ich wusste es, ich hoffe, Sie brauchen nicht zu kommentieren.
Warum muss ich anhalten, in der für die statische?
Denn dort muss ich tun, um die obligatorische Verwendung von statischen, binäre Dateien werden müssen statisch und nicht dynamisch.

Habe ich mehr als 2 Wochen auf der Suche, aber bisher noch nicht gelungen.

Danke für die Hilfe mich zu lösen meine schweren problem.

Kurz gesagt: nicht statisch verknüpft, so ein Programm. Link es dynamisch, wie gewohnt, zu Ihrem libc.so
Hallo Basile. Warum?
Wie es zu tun? was mit-Bdynamic -lc -Wl ?
BorealId Antwort erklärt. Im Grunde /etc/nsswitch.conf verwendet dlopen für gethostbyname so muss ein dynamisch gelinkten Programm (weil der dynamische linker muss es sein). Einfach kompilieren mit gcc -Wall -g -O lookup.c -o lookup und Ihre lookup werden dynamisch miteinander verbunden.
Wenn Sie die Umstellung auf eine andere libc, warum man nicht einfach das Android NDK Ihre Anwendungen zu kompilieren ? Das ist, was Sie tun sollen, und dass Ihnen die bionic LIBC, und alles, was Sie brauchen, um zu kompilieren Programme, die laufen auf android.

InformationsquelleAutor Loren Ramly | 2013-03-01

Schreibe einen Kommentar