Als eine Übung, um genauer zu lernen, wie c Programme funktionieren und welche minimale Ebene des Inhalts muss für ein Programm vorhanden sein, um libc verwenden zu können, habe ich es auf mich genommen zu versuchen, in erster Linie in x86 Assembly mit Gas und ld zu programmieren .Wie wird ein Gas-Assembly-Programm, das die C-Standard-Bibliothek verwendet, mit ld verknüpft, ohne gcc zu verwenden?
Als eine lustige kleine Herausforderung, habe ich erfolgreich mehrere Programme zusammengestellt und verknüpft mit verschiedenen selbst erstellten dynamischen Bibliotheken, aber ich konnte nicht ein Programm von Grund auf neu zu combusieren, um libc Funktionsaufrufe zu verwenden, ohne gcc direkt zu verwenden .
Ich verstehe die Aufrufkonventionen der einzelnen c-Bibliotheksfunktionen, und gründlich geprüft Programme aus gcc durch Verwendung von objdump und readelf kompiliert, aber sind nicht soweit, was Informationen in eine Gas-Assembly-Datei und enthalten Welche Parameter rufen in ld auf, um erfolgreich mit libc zu verknüpfen. Hat jemand einen Einblick darauf?
Ich verwende Linux, auf einer x86-Maschine.
das ist sehr hilfreich, das eine Menge Informationen verdeutlicht. wenn ich das auf meinen Code anwende, bekomme ich 2 Fehler, "undefinierter Verweis auf '__libc_csu_fini'" und "undefinierter Verweis auf '__libc_csu_init'" nachdem ich einen Symbol-Dump auf allen Objektdateien gemacht habe, konnte ich diese nicht finden Symbole, und crt1.o scheint die Symbole zu nennen. Gibt es irgendetwas, das diese Symbole möglicherweise in ihrer Objektdatei enthalten könnte? – Cyro
Diese stammen aus einem nicht freigegebenen Teil der C-Bibliothek; Die Verknüpfung mit '-lc' sollte'/usr/lib/libc.so' enthalten, was eigentlich ein Linker-Skript-Fragment ist, das auf die richtige Datei verweist ('/ usr/lib/libc_nonshared.a'). Vielleicht ein Problem mit der Linkreihenfolge? Ich bin mir ziemlich sicher, dass Sie zuerst 'crt1.o' gefolgt von' crti.o' wollen, dann Ihre Objekte und Bibliotheken, dann 'crtn.o' direkt am Ende - aber vielleicht sollte' -lc' nach Ihren Objekten kommen (kurz vor 'crtn.o'), nicht vorher. –
Ich ging weiter und verband einfach mit /usr/lib/libc_nonshared.a direkt nach der Eingabe in -lc und das Ganze hat funktioniert! tausend Dank! – Cyro