C-Compiler verstehen



  • Wenn ich mir den ASM-Quelltext eines compilierten Hello-World-Programms ansehe, finde ich
    die Zeile "call _printf", was mich nicht sonderlich überrascht. Weiter mit dem gcc übersetzt
    erhalte ich Maschinencode (noch nicht die fertige *.exe), von dem ich eigentlich erwarte, dass ich ihn nicht mehr lesen kann.
    Kann ich auch nicht, ich finde aber trotzdem wieder den string "_printf" in der Datei, was
    mich ein wenig verwirrt. Eigentlich hätte der Aufruf von printf doch schon aufgelöst seien
    müssen, oder was verstehe ich das falsch?



  • Auch wenn Du Debuggingsymbole aus der Datei (compiliert & ungebunden?) entfernst?



  • Wenn Library dynamisch gebunden wird, müssen die Funktionsnamen AFAIK auch vorhanden sein, da die Auflösung über den Namen passiert. Wenn ich dlsym(3) richtig verstehe jedenfalls.



  • Hab mir folgene gcc-Befehle rausgesucht (weis leider nicht, ob debugg-infos dadurch entfernt
    werden oder nicht):

    gcc -E hallo.c -o hallo.i
    gcc -S hallo.i
    gcc -c hallo.s
    


  • Versuchs mal im Anschluss mit strip -g hallo.o. Danach sollten die debug-Symbole weg sein.



  • Besagtes printf ist immer noch da. Lässt dich daraus schließen, dass es keine Debug-Sysmbol ist?



  • *auf mein Posting hinweis und leise pfeif*



  • oki....



  • Hey Taurin,

    ich weiss jetzt nicht genau was -E beim gcc zu bedeuten hat, aber mit
    -S überführst du den Quelltext ja soweit ich weiss in Assembler code.
    In der nächsten Zeile hast du diesen dann in Maschienencode oder Objectcode assemblieren lasssen. Das -c bedeutet dann noch, das der Ergebnis nicht gelinkt werden soll.
    das Ergebnis ist dann ja noch nicht lauffertig, sondern eine objectdatei, die man zu anderen obj. dateien zulinken kann, das bedeutet die datei muss symbole für eintritte in der datie enthaltene funktionen enthalten und gleichzeitig auch symbole für funktionen die aufgerufen werden sollen..
    daher dieses _printf

    hoffe das war irgendwie verständlich

    kibble



  • wenn du die glibc statisch linkst (glaub mit -static geht das), sollte nach Bashars Theorie das call _printf ja verschwinden

    @knibble
    das -E sorgt dafür, dass nur der Precompiler benutzt wird



  • durch das -c sagt er ja aber eben, das nicht gelinkt werden soll...
    auch leise pfeif

    kibble


Anmelden zum Antworten