2012-12-21 11 views
5

ich meine hallo Welt mit dem folgenden Befehl am Zusammenbauen:Kann nicht ausführbar läuft mit libc gelinkt

nasm -f elf64 test.asm

ich dann mit diesem Link:

ld -s test.o -lc

Ich weiß, das funktioniert weil file a.out zeigt mir

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped

aber wenn ich diese laufen mit ./a.out i bekommen bash: ./a.out: No such file or directory

Wenn die Verbindung ohne libc es läuft gut! Wie kann ich meine libc verknüpfte exe zum Laufen bekommen?

Antwort

10

Das unmittelbare Problem ist, dass ld/lib/ld64.so.1 als Dolmetscher standardmäßig verwendet, und Sie können, dass (es kann ein symbolischer Link zu /lib64/ld-linux-x86-64.so.2 oder was auch immer geeignet sein) fehlen:

$ readelf -l a.out | grep interpreter 
     [Requesting program interpreter: /lib/ld64.so.1] 
$ ls -l /lib/ld64.so.1 
ls: cannot access /lib/ld64.so.1: No such file or directory 

Sie können dieses Problem umgehen, indem der Interpreter explizit von -dynamic-linker /lib64/ld-linux-x86-64.so.2 Option zu Ihrem ld Aufruf übergeben:

$ ld -s -dynamic-linker /lib64/ld-linux-x86-64.so.2 test.o -lc 
$ readelf -l a.out | grep interpreter 
     [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
$ ./a.out 
$ 

die einfache Daumenregel ist jedoch gcc f verwenden oder verlinken, wenn Sie libc benötigen, es wird alles für Sie richtig machen. Stellen Sie außerdem sicher, dass Sie main als Einstiegspunkt verwenden, damit der normale libc-Startup-Code initialisiert werden kann. In ähnlicher Weise, nur von Ihrem main am Ende zurückkehren und nicht syscall direkt verwenden (Sie können die Funktion von libc verwenden, wenn Sie wirklich wollen). Im Allgemeinen wird die Verwendung von syscalls nicht empfohlen.

Verwandte Themen