2012-12-21 11 views
5

sto montando il mio mondo ciao con il seguente comando:non può essere eseguito eseguibile collegato con libc

nasm -f elf64 test.asm

Ho poi legame con questo:

ld -s test.o -lc

So che questo funziona perché file a.out mi mostra

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

Tuttavia quando ho eseguito questo con ./a.out ricevo bash: ./a.out: No such file or directory

Quando link senza libc funziona benissimo! Come posso ottenere il mio exe con libc link da eseguire?

risposta

10

Il problema immediato è che ld utilizza /lib/ld64.so.1 come interprete di default e si può mancare che (può essere un link simbolico a /lib64/ld-linux-x86-64.so.2 o qualsiasi altra cosa è appropriato):

$ 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 

È possibile aggirare questo impostando l'interprete esplicitamente passando -dynamic-linker /lib64/ld-linux-x86-64.so.2 opzione per il vostro ld invocazione:

$ 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 
$ 

la semplice regola pratica però è quello di utilizzare gcc f o collegando se hai bisogno di libc, farà tutto giusto per te. Assicurati inoltre di utilizzare main come punto di ingresso in modo che il normale codice di avvio di libc abbia una possibilità di inizializzarsi. Allo stesso modo, basta tornare dal tuo main alla fine e non utilizzare direttamente syscall exit syscall (puoi usare la funzione exit da libc se lo desideri). In generale, l'uso di syscalls non è raccomandato.