Eine mit NASM erstellte ausführbare Datei kann nicht ausgeführt werden

7

Ich versuche, die folgende Assembly-Quelldatei mit dem folgenden NASM-Befehl zusammenzustellen:

nasm -f elf -o test.o test.asm

Dies wird ohne Fehler abgeschlossen und ich versuche dann, eine ausführbare Datei zu verknüpfen mit ld:

ld -m elf_i386 -e main -o test test.o -lc

Dies scheint auch erfolgreich zu sein und ich versuche dann, die ausführbare Datei auszuführen:

$ ./test
bash: ./test: No such file or directory

Leider scheint es nicht zu funktionieren. Ich habe versucht, lddauf der ausführbaren Datei zu laufen :

linux-gate.so.1 =>  (0xf777f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7598000)
/usr/lib/libc.so.1 => /lib/ld-linux.so.2 (0xf7780000)

Ich habe das lsb-corePaket installiert und überprüft, ob es /lib/ld-linux.so.2existiert. Wie kommt es, dass ich die ausführbare Datei immer noch nicht ausführen kann?

Ich versuche dies auf einem Computer zu tun, auf dem die 64-Bit-Edition von Ubuntu 15.04 ausgeführt wird.

Der Quellcode:

; This code has been generated by the 7Basic
; compiler <http://launchpad.net/7basic>

extern printf
extern scanf
extern read
extern strlen
extern strcat
extern strcpy
extern strcmp
extern malloc
extern free

; Initialized data

      SECTION .data
s_0 db "Hello, World!",0
printf_i: db "%d",10,0
printf_s: db "%s",10,0
printf_f: db "%f",10,0
scanf_i: db "%d",0
scanf_f: db "%lf",0
; Uninitialized data

      SECTION .bss
v_12 resb 4
v_0  resb 4
v_4  resb 8

      SECTION .text

; Code

global main
  main:
finit
push ebp
mov ebp,esp
push 0
pop eax
mov [v_12], eax
    l_0:
mov eax, [v_12]
push eax
push 5
pop edx
pop eax
cmp eax, edx
jl l_2
push 0
jmp l_3
    l_2:
push 1
    l_3:
pop eax
cmp eax, 0
je l_1
push s_0
push printf_s
call printf
add esp, 8
mov eax, [v_12]
push eax
push 1
pop edx
pop eax
add eax, edx
push eax
pop eax
mov [v_12], eax
jmp l_0
    l_1:
mov esp,ebp
pop ebp
mov eax,0
ret

Hier ist die Ausgabe von strings test:

/usr/lib/libc.so.1
libc.so.6
strcpy
printf
strlen
read
malloc
strcat
scanf
strcmp
free
GLIBC_2.0
t'hx
Hello, World!
.symtab
.strtab
.shstrtab
.interp
.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rel.plt
.text
.eh_frame
.dynamic
.got.plt
.data
.bss
test.7b.out
printf_i
printf_s
printf_f
scanf_i
scanf_f
v_12
_DYNAMIC
_GLOBAL_OFFSET_TABLE_
strcmp@@GLIBC_2.0
read@@GLIBC_2.0
printf@@GLIBC_2.0
free@@GLIBC_2.0
_edata
strcat@@GLIBC_2.0
strcpy@@GLIBC_2.0
malloc@@GLIBC_2.0
scanf@@GLIBC_2.0
strlen@@GLIBC_2.0
_end
__bss_start
main
Nathan Osman
quelle
Nur damit ich verstehe, stellen Sie x86 (i386) 32-Bit-Code in einer 64-Bit-Installation zusammen?
Bruce Ediger
Können Sie versuchen: ld -m elf_i386 -e main -o test test.o -lc -I /path/ld-linux.so.2?
Taliezin
@taliezin: Hab das gerade versucht und es schien keinen Unterschied zu machen.
Nathan Osman
@ Gilles Los geht's: paste.ubuntu.com/11552354
Nathan Osman
Das /usr/lib/libc.so.1sollte wohl sein /lib/ld-linux.so.2. Keine Ahnung, wie es dahin gekommen ist.
Gilles 'SO - hör auf böse zu sein'

Antworten:

1

Sie müssen auch Startfragmente wie crt1.ound andere verknüpfen, wenn Sie libc-Funktionen aufrufen möchten. Der Verknüpfungsprozess kann sehr kompliziert sein, daher sollten Sie ihn besser verwenden gcc.

Unter amd64 Ubuntu können Sie:

sudo apt-get install gcc-multilib
gcc -m32 -o test test.o

Sie können Dateien und Befehle für den Link anzeigen, indem Sie eine -vOption hinzufügen .

yaegashi
quelle