Printf aufrufen
-
Hi,
ich möchte gerne mit Assembler (GNU Assembler auf x86) die C-Funktion printf aufrufen. Meinem Wissen nach müsste das wie folgt funktionieren:
.section .data str_hello: .string "Hallo" .section .text .globl _start _start: # Print on stdout by calling printf. movl $str_hello, (%esp) call printf # Exit Program movl $1, %eax movl $0, %ebx int $0x80
as print.s -o print.o ld print.o /usr/lib/libc.so -o print
funktioniert, aber wenn ich die executable dann versuche auszuführen bekomm ich foolgende Meldung:
-bash: ./print: No such file or directory
ls -l print
liefert folgende Ausgabe:
-rwxr-xr-x 1 sebastian users 6382 Jan 12 08:43 print
Also die Datei existiert und hat auch die Privilgien ausgeführt zu werden.
-
Ok, ich habs zwar nich ausprobiert, aber versuchs mal mit
str_hello: .asciz "Hallo"
-
Ich nehm mal an du meinst .ascii führt aber leider zum gleichen Resultat.
Mal ne Frage, ist libc.so überhaupt die richtige Library? Und ist es korrekt die Library einfach mit meinem eigenen Object-File zusammen ld zu übergeben? Nämlich wenn ich eine beliebige andere Library so angebe führt es ebenfalls zu diesem Ergebnis.
-
schrankwand schrieb:
Ich nehm mal an du meinst .ascii führt aber leider zum gleichen Resultat.
Mal ne Frage, ist libc.so überhaupt die richtige Library? Und ist es korrekt die Library einfach mit meinem eigenen Object-File zusammen ld zu übergeben? Nämlich wenn ich eine beliebige andere Library so angebe führt es ebenfalls zu diesem Ergebnis.
Nene! Ich meine schon .asciz.
z steht für zero. Der string muss ja mit nem nullbyte enden(sonst hat printf ein problem). Naja...probiers mal einfach aus.
ps: Tipp mal in einer shell folgendes ein:info as
Geh dann auf Pseudo Ops...dann wirst du sehen , dass es sowohl .ascii als auch .asciz gibt...bloß mit nem Unterschied, dass .asciz noch nen NULLBYTE hinten dranhängt.
-
Sowohl
str_hello: .asciz "Hallo"
als auch
str_hello: .ascii "Hallo\0"
führen zu dem gehabten Ergebnis.
-
Hmm...komisch. Bei mir gehts auch nicht. Also es lässt sich auch assemblieren und linken aber wenn ich es mit
./meinprog
starten will, dann bekomme ich die Meldung, dass es nicht gefunden werden kann. Dabei ist meine ausführbare Datei im Verzeichnis.
Verstehe ich auch nicht.(Naja...hab bis jetzt in asm nur mittels interrupt $0x80 Text ausgegeben).
-
Ich würde an deiner Stelle eine ganz normale int main()-Funktion im .s-File erzeugen und das ganze dann ganz normal mit gcc compilieren und linken. printf() geht wohl davon aus, dass die C-Library ordnungsgemäß initialisiert wurde, und das passiert nach deiner Methode wahrscheinlich nicht.
Außerdem darfst du dir dann den Stack beim Aufruf von printf() nicht überschreiben, so wie du es jetzt anscheinend machst.
-
@alex89ru: Ich bin bereits zu der Schlussfolgerung gekommen dass nicht mein Programm nicht gefunden wird, sonnst würde die Meldung ja
-bash: No such file or directory
lauten, sondern dass mein Programm irgendeine Datei (oder Verzeichnis) nicht findet, da die Meldung wie folgt lautet:
-bash: ./print: No such file or directory
@Ringding: Da ich momentan noch mit dem GNU-Assembler rumspiele, würde das vermutlich gehen, aber zum einen beschäftige ich mich mit Assembler, da ich verstehen möchte wie ein Program wirklich funktioniert und deshalb ist es vollkommen absurt wenn es interessant wird einfach den vollautomatisierten gcc zu benutzen und zum anderen wird das spätestens wenn ich anfange mit dem nasm oder unter Windows in Assembler zu programmieren nicht mehr gehen.
Gruß
Schrankwand
-
Du wirst aber wahrscheinlich weder unter Linux noch unter Windows darum herumkommen, weil die printf-Funktionalität einfach voraussetzt, dass die Library ordnungsgemäß initialisiert ist. Und das ist natürlich ziemlich schlecht bis gar nicht dokumentiert, weil man als User damit soundso nicht konfrontiert wird.
-
Es könnte Probleme geben, da du ne dynamisch ladbare Bibliothek dazulinkst. Wenn man die libc.a (zum statischen Linken) dazunimmt, kann man das Programm auch wieder starten. Allerdings kommt keine Ausgabe, aber zur Problematik der uninitialisierten library wurde ja genug gesagt.
-
Naja zu dieser Problematik wurde eigentlich hier noch garnichts gesagt, ausser dass es sie gibt. Wenn jemand irgendwo nen Code-Beispiel oder nen Howto dazu hat wie man eine C-Library initialisiert wäre ich dankbar. Das was
gcc -S -o file.s file.c
ausspuckt, lässt sich ja mit nichts anderem als dem gcc assemblieren. Und mit google konnte ich zudem Thema auch nichts finden.