Ich schreibe eine strcmp bash builtin. Es kompiliert gut, aber wenn ich versuche, es zu aktivieren, bekomme ich:
%Vor%Die großen Teile meiner eingebauten:
%Vor%Die Kompilierzeile (aus der erweiterten make-Datei):
%Vor%Ich habe ET_DYN und ET_EXEC gegoogelt und nur Links zu solchen Fragen gefunden.
Haben Sie das -c
-Flag bemerkt? Das verhindert eine Verknüpfung. Ersetze das durch -shared
, wie @shr erwähnt
Ein paar Antworten auf meine spezifische Frage (ET_DYN und ET_EXEC), sowie eine Erweiterung auf WHY @ stanparkers Antwort ist korrekt.
ET_DYN und ET_EXEC sind ausführbare ELF-Typen. Im ELF-Header gibt es ein Feld Elf32_Half e_type
oder Elf64_Half e_type
mit mehreren möglichen ET_ * enums. Ich vermute, ET ist "Executable Type", EXEC ausführbar und DYN Dynamic. All dies sollte ausreichen, um zu zeigen, dass das emittierte Artefakt tatsächlich kein ausführbares Objekt jeglicher Art war und hätte die GCC-Flags näher betrachten sollen. (Weitere Informationen zu den ELF-Kopfzeilen finden Sie unter Ссылка )
Nun, da wir sehen, dass wir nicht verlinken, entfernen wir das Flag -c. Dann erhalten wir einen zweiten Fehler (dieses Mal irgendwo in der Kompilierung),
%Vor% Es gibt tatsächlich zwei Fehler hier. Der erste ist "undefinierter Verweis auf 'main'", der zweite ist "undefinierter Verweis auf 'make_builtin_argv'" (eine bash interne Funktion). Die letzte Zeile reicht aus, um uns zu zeigen, dass GCC während der Verlinkung stirbt. Die Funktion _start ist ein allgemeiner Einstiegspunkt, der von glibc definiert wird, der selbst main im Programm aufruft. An diesem Punkt, duh, machen wir keine ausführbare Datei, sondern eine gemeinsame lib. Durch das Hinzufügen von -shared
zur Befehlszeile werden wir perfekt kompiliert.
Also, warum wurde ich nicht dazu gebracht, die Befehlszeile "Richtig" zu geben? Makefile.in testet nicht dynamisch nach Quelldateien. Daher hätte ich die .c- und .o-Ziele manuell hinzufügen und dann ./configure erneut ausführen sollen. Danach bekommen wir
%Vor%Funktioniert es?
%Vor%Das ist es, was ich von ihm erwarte, also scheint es, dass es funktioniert.
Wie auch immer, der Punkt, an dem ich das schreibe, ist, dass es nicht das erste Mal ist, dass ich mich persönlich mit GCC- und C-Compiling beschäftigt habe. Dies ist nicht das erste Mal, dass ich jemanden sehe, der diese Probleme hat. Es gibt eine enorme Menge an Arbeit, die in eine erfolgreiche C-Kompilierung fließt, und jede Phase ist wichtig. Also schreibe ich das auf, um mich genau daran zu erinnern, was GCC (cc, ld und die elf libs) gemacht haben, warum das eine kleine Zeichen hier und da wichtig ist, und den gesamten Entdeckungsprozess. Ich habe es nirgendwo anders getippt gesehen, also hier ist was ich habe.
PS. Für diejenigen, die daran interessiert sind, wird es auf meiner Website, Ссылка