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 den buffer 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 🙂


Anmelden zum Antworten