Linux kann assemblierte Datei nicht finden obwohl vorhanden
-
Guten Abend allerseits.
Ich habe mich in das "Professional Assembly Language" von Blum eingearbeitet und bin mittlerweile soweit, dass die ersten Assembler Beispiele kommen.
Nun habe ich folgendes Beispiel unter PRO2.asm abgespeichert..section .data output: .asciz "The processor Vendor ID is '%s'\n" .section .bss .lcomm buffer, 12 .section .text .globl _start _start: movl $0, %eax cpuid movl $buffer, %edi movl %ebx, (%edi) movl %edx, 4(%edi) movl %ecx, 8(%edi) pushl $buffer pushl $output call printf addl $8, %esp pushl $0 call exit
und es erfolgreich mit den Befehlen:
Andy@PC-0x02:~/Desktops/Desktop2/Assembler> as -o PRO2.o PRO2.asm Andy@PC-0x02:~/Desktops/Desktop2/Assembler> ld -o PRO2 -lc PR02.o Andy@PC-0x02:~/Desktops/Desktop2/Assembler> ./PRO2 bash: ./PRO2: Datei oder Verzeichnis nicht gefunden Andy@PC-0x02:~/Desktops/Desktop2/Assembler>
Ich habe nachgeschaut und es ist eine Ausführbare Datei in diesem Verzeichnis mit dem selben Namen. Ich habe es mal mit dem gdb gestartet und das Programm kann disassembliert werden.
Andy@PC-0x02:~/Desktops/Desktop2/Assembler> gdb -q PRO2 Reading symbols from /home/Andy/Desktops/Desktop2/Assembler/PRO2...(no debugging symbols found)...done. (gdb) disass _start Dump of assembler code for function _start: 0x080481f0 <+0>: mov $0x0,%eax 0x080481f5 <+5>: cpuid 0x080481f7 <+7>: mov $0x804a030,%edi 0x080481fc <+12>: mov %ebx,(%edi) 0x080481fe <+14>: mov %edx,0x4(%edi) 0x08048201 <+17>: mov %ecx,0x8(%edi) 0x08048204 <+20>: push $0x804a030 0x08048209 <+25>: push $0x804a008 0x0804820e <+30>: call 0x80481d0 <printf@plt> 0x08048213 <+35>: add $0x8,%esp 0x08048216 <+38>: push $0x0 0x08048218 <+40>: call 0x80481e0 <exit@plt> End of assembler dump. (gdb) run Starting program: /home/Andy/Desktops/Desktop2/Assembler/PRO2 /bin/bash: /home/Andy/Desktops/Desktop2/Assembler/PRO2: Datei oder Verzeichnis nicht gefunden /bin/bash: /home/Andy/Desktops/Desktop2/Assembler/PRO2: Erfolg During startup program exited with code 1. (gdb)
Ich bin etwas verwirrt kann mir einer das mal erklären
-
Andyman schrieb:
Ich bin etwas verwirrt kann mir einer das mal erklären
Du musst beim Linken "dynamic-linker" angeben:
ld PRO2.o -o PRO2 -lc -dynamic-linker /lib/ld-linux.so.2
oder ähnlich (bin grad unter Windows und kann es nicht ausprobieren/reproduzieren) - viel Glück...
-
Vielen Dank hat funktioniert
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Themen rund um den PC in das Forum Assembler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Übrigens, der String im
buffer
ist nicht Null terminiert und das ist ein Fehler, das Programm wird komische Zeichen ausgeben. Wenn es trotzdem funktioniert, dann vielleicht nur weil zufällig eine Null im Speicher steht. Damit es richtig ist, muss man denbuffer
größer machen und sicherheitshalber terminieren, ungefähr so:.section .bss .lcomm buffer, 16 # Buffer is oversized to be properly zero terminated ... movl $buffer, %edi movl %ebx, (%edi) movl %edx, 4(%edi) movl %ecx, 8(%edi) movl $0, 12(%edi) # Ensure, buffer is zero terminated
die letzte Zeile schreibt eine 32-Bit große Null am Ende des
buffers
. Ein Byte würde ausreichen, aber wir haben ja eine 32-Bit CPU - lassen wir sie ruhig richtige Daten schaufeln