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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie fordern, ist sehr schwierig.
Sehen diese StackOverflow-Frage, getaddrinfo. Im Grunde, unter
getaddrinfo
/gethostbyname
ist glibc - NSS-Schicht. Dies ermöglicht dem Systemadministrator, zu sagen, "verwenden von DNS für das auflösen von Hostnamen zu IP-Adressen", oder "LDAP verwenden", oder "don' T Nutzung alles andere als/etc/hosts
". Dieses Steuerelement ist zur Laufzeit; die sysadmin-Rolle können jederzeit ändern, wie Hostnamen aufgelöst werden, um IPs.Weil dieser Flexibilität, die alle die Namen-Auflösung Anrufe in glibc verwenden helper-Bibliotheken (plugins, im Grunde) zu tun, die Routinearbeit Auflösung. Es ist eine gemeinsame Bibliothek für LDAP-Adressierung, eine für Dateien, eine für die DNS, eine für YP, und so weiter und so weiter.
Wenn Sie möchten, dass das Programm zu 100% statisch verknüpft, Sie gehen, um anderswo zu gehen (NICHT
gethostbyname
) zu konvertieren, einen Hostnamen zu einer IP-Adresse. Man könnte dies mit einem resolver-Bibliothek wie uDNS (nicht genau dieses eine - gibt es ähnliche tools zur Verfügung), aber Sie sollten im Hinterkopf behalten, dass Ihre binäre ist nicht das richtige zu tun, auf Systemen, die konfiguriert sind, nicht für die Verwendung von DNS!Stattdessen würde ich empfehlen, einfach das Programm verlassen (technisch) dynamisch miteinander verbunden. Wenn Sie wirklich wollen, um sicherzustellen, dass es auf jeder Plattform ausgeführt, man könnte sogar Schiff
glibc
mit dem binary - obwohl dies würde erfordern, LGPL zu erfüllen. Das verlassen einer dynamic link an Ort und Stelle nur bedeuten, dass Sie nicht auf Systemen mit dem falschenglibc
version - nicht eine riesige Kompatibilitätsprobleme.Apropos Lizenz-compliance, es ist erwähnenswert, dass, wenn Sie statisch link
glibc
Sie wahrscheinlich haben, um Schiff der source-code für Ihre gesamte Anwendung zu erfüllenglibc
's LGPL-Lizenz. Ich bin kein Jurist und dies ist keine qualifizierte Rechtsberatung, aber das Lesen der LGPL macht es sehr klar, dass Applikationen statisch gelinktglibc
muss open-source. Sehen diese StackOverflow Frage zu dem Thema.+1 für die Lizenz daran erinnern, über die LGPL in der libc. Beachten Sie, dass einige libc-s sind nicht LGPL sondern MIT zB musl-libc.org
Gelöst mit musl-libc. Ich kompilieren mul-libc und dann habe ich mein Programm kompilieren Bibliotheken musl-libc mit " Befehl-L/Pfad/tomuslcompiled/lib . Ich bin very2 glücklich, vielen Dank Herr Borealid
was tun Sie für gethostbyname() ? Tun Sie dlopen/dlsym Sie von glibc?
Keine Notwendigkeit für dlopen/dlsym. musl enthält eine Implementierung von gethostbyname (), dass muss nicht die glibc-Helfer-plugins. Schauen Sie hier - git.musl-libc.org/cgit/musl/tree/src/network
InformationsquelleAutor Borealid
Bekomme ich die gleiche Warnung und, um es zu beheben ich glibc kompiliert. Schalten Sie Schalter
--enable-static-nss
beim konfigurieren, um es an die Arbeit.InformationsquelleAutor kimi shi
Habe ich 2 Antworten -
Halten den wichtigsten Teil von Ihrem Programm statisch gelinkt, und trennen Sie eine einzelne Funktion Programm nur auf Aufruf gethostbyname(). Erlauben letztere werden dynamisch miteinander verbunden. Mit Gabel dann exec ausführen dieser separaten Programm, um die Adresse für einen domain-Namen. Anstelle Gabel dann exec könnte man die Verwendung von system (), aber es dauert länger (eine ganze Millisekunde) das sollte nicht von Bedeutung sein, da bist du auf der Suche Nameservern im internet sowieso, und das braucht Zeit.
Schreiben, den source-code zu tun, der DNS, als ich es getan habe. Kompilieren Sie in ein Archiv (.a) und habe es gesucht in der statischen Verknüpfung.
InformationsquelleAutor Clive