Warum Symbole einer gemeinsamen Bibliothek nicht gelöst werden konnten, zur link-Zeit?
Dies ist mein 2. post auf dieser Seite in meinem bemühen zu verstehen, die Zusammenstellung/linking-Prozess mit dem gcc. Wenn ich versuche, um eine ausführbare Datei, die Symbole gelöst werden müssen, zur link-Zeit, aber wenn ich versuche auf eine shared-library, die Symbole sind nicht gelöst, die zur link-Zeit in dieser Bibliothek. Sie werden vielleicht behoben werden, wenn ich versuche, eine ausführbare Datei mit diesem gemeinsam genutzten Bibliothek. Hands-on:
bash$ cat printhello.c
#include <stdio.h>
//#include "look.h"
void PrintHello()
{
look();
printf("Hello World\n");
}
bash$ cat printbye.c
#include <stdio.h>
//#include "look.h"
void PrintBye()
{
look();
printf("Bye bye\n");
}
bash$ cat look.h
void look();
bash$ cat look.c
#include <stdio.h>
void look()
{
printf("Looking\n");
}
bash$ gcc printhello.c printbye.c
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/tmp/cck21S0u.o: In function `PrintHello':
printhello.c:(.text+0x7): undefined reference to `look'
/tmp/ccNWbCnd.o: In function `PrintBye':
printbye.c:(.text+0x7): undefined reference to `look'
collect2: ld returned 1 exit status
bash$ gcc -Wall -shared -o libgreet printhello.c printbye.c
printhello.c: In function 'PrintHello':
printhello.c:6: warning: implicit declaration of function 'look'
printbye.c: In function 'PrintBye':
printbye.c:5: warning: implicit declaration of function 'look'
Also meine Frage ist, warum sind die Symbole nicht aufgelöst, wenn ich die Verknüpfung einer gemeinsam genutzten Bibliothek. Diese arbeiten(Lösen Symbole seiner downstream) müssen getan werden, wenn ich diese Bibliothek verwenden, um eine ausführbare Datei, aber das heißt, wir müssen wissen, was diese Bibliothek hängt davon ab, Wann die diese Bibliothek nutzen, aber ist es nicht nicht unerwünscht?
Dank,
Jagrati
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wirkt sich das hinzufügen
-z defs
beim erstellen der Bibliothek tun, was Sie wollen? Wenn nicht, überprüfen Sie die ld die man-Seiten, es gibt durchaus ein paar Optionen über die Behandlung von undefinierten Symbole.Da Sie nicht geben Sie die Option-c (compile only) die option, die Sie angefordert gcc zum kompilieren der beiden Quell-Dateien, und verknüpfen Sie Sie mit der standard-Bibliothek (libc) und die c run-time startup (crt0, in der Regel), um zu produzieren ein Programm läuft. crt0 versucht, geben Sie Ihr Programm durch Aufruf von main(), die den undefinierten symbol, das der linker nicht finden können. Sie können es nicht finden, weil Sie nicht über eine main () - entweder von Ihr .c-Dateien, richtig?
Also, auf zu Ihrer eigentlichen Frage, "Warum die Symbole einer gemeinsamen Bibliothek nicht gelöst werden konnten, zur link-Zeit?" Die Antwort ist, was meinst du mit "link-Zeit?" Per Definition, ein dynamisch verknüpfte Programm, das nicht "verlinkt", bis es startet (oder vielleicht nicht einmal dann, abhängig von Ihrem system).
Auf einem Linux-system, können Sie sehen, welche dynamischen Bibliotheken von einem Programm abhängt, mit der ldd-Befehl (auf Mac OS benutzen Sie 'otool -L'). Die Ausgabe von ldd wird Ihnen sagen, welche dynamischen Bibliotheken von einem Programm abhängt, die sich in den library-Suchpfad, und die, die nicht gefunden werden kann (wenn überhaupt).
Wenn Sie dynamische Programm gestartet wird, wird der dynamische linker, verknüpft wurde, in das er findet und lädt die dynamische Bibliothek, das Programm hängt sich auf, und "behebt" die Verweise auf die externen Symbole. Wenn alle diese scheitern, wird das Programm nicht gestartet werden. Man alle die früher nicht aufgelöste Symbole wurde behoben, der dynamische linker gibt und die C-runtime-Aufruf deiner main () - Funktion. (Es ist etwas anders auf dem Mac OS, aber ähnlich in der Wirkung, die Verknüpfung passiert, nachdem das Programm gestartet wird.)
Ich denke, dass die linker-option
-Bsymbolic
ist, was Sie suchen.Die verlinkte hat keine Möglichkeit zu wissen, in ELF wenigstens, wo die Symbole sind (also Bibliotheken). In OS X, auf der anderen Seite, müssen Sie den link Bibliotheken der Weise, die Sie beschrieben. Am Ende ist es eine Frage der Gestaltung. Man ist flexibler, der andere strenger.
-flat_namespace
option zu machen, Verhalten sich wie andere Betriebssysteme wie zB. Linux.Selbst wenn Sie bauen eine shared-library, es muss eine Lösung für alle Abhängigkeiten.
So, wenn eine shared library geladen, die zur Kompilierzeit es weiß, welche Bibliotheken zur Laufzeit geladen, so dass Sie es beheben können andere Abhängigkeiten.
1) Erstellen eines freigegebenen (Blick.<sharedLib>) - Bibliothek mit suchen()
2) Erstellen Sie eine gemeinsame (hg.<sharedLib>) - Bibliothek mit Hallo() bye() link gegen-look.<sharedLib>
3) Erstellen Sie die Anwendung mit main (), die links gegen die hg.<sharedlib>
Zur Laufzeit der Anwendung wird dann geladen hg.<sharedlib> wird intern load shared library-look.<sharedlib>
Einer ausführbaren Datei erfordert eine Einstiegspunkt. Aber eine shared-library, die gebaut werden können, ohne die den Einstiegspunkt und später die ausführbare Datei kompiliert werden kann, mit diesem gemeinsamen Bibliothek.