Tengo un siguiente programa para NASM (ArchLinux i686)
SECTION .data LC1: db "library call", 0 SECTION .text extern exit extern printf ;global main ;main: global _start _start: push LC1 call printf push 0 call exitQue se ensambla con el comando:
nasm -f elf libcall.asm Si desea comentar dos líneas con _start y descomentar dos líneas con main , entonces ensamble y vincule con el comando:
gcc libcall.o -o libcall Entonces el programa funciona bien. Pero si para ensamblar el código con el punto de entrada _start y vincularlo con el comando:
ld libcall.o -o libcall -lc Luego, después de iniciar el programa en bash (mediante el comando ./libcall ), aparece el siguiente mensaje de error:
bash: ./libcall: No such file or directory Aunque el archivo libcall existe. objdump muestra lo siguiente:
[al libcall ]$ objdump -d libcall libcall: file format elf32-i386 Disassembly of section .plt: 08048190 <printf@plt-0x10>: 8048190: ff 35 78 92 04 08 pushl 0x8049278 8048196: ff 25 7c 92 04 08 jmp *0x804927c 804819c: 00 00 add %al,(%eax) ... 080481a0 <printf@plt>: 80481a0: ff 25 80 92 04 08 jmp *0x8049280 80481a6: 68 00 00 00 00 push $0x0 80481ab: e9 e0 ff ff ff jmp 8048190 <printf@plt-0x10> 080481b0 <exit@plt>: 80481b0: ff 25 84 92 04 08 jmp *0x8049284 80481b6: 68 08 00 00 00 push $0x8 80481bb: e9 d0 ff ff ff jmp 8048190 <printf@plt-0x10> Disassembly of section .text: 080481c0 <_start>: 80481c0: 68 88 92 04 08 push $0x8049288 80481c5: e8 d6 ff ff ff call 80481a0 <printf@plt> 80481ca: 6a 00 push $0x0 80481cc: e8 df ff ff ff call 80481b0 <exit@plt> ¿Cómo se debe vincular correctamente el código ensamblador NASM con libc a través de ld ?
Hay algunas partes de libc/crt que vienen en archivos de objetos que también necesita vincular. Además, debe especificar algunas opciones, como el cargador dinámico (también conocido como intérprete) para usar (lo que probablemente sea el motivo de su problema). Simplemente use gcc para hacer lo correcto para usted. Si está interesado, puede ejecutar con gcc -v y luego verá la línea de comando horrible que usa para vincular. Usted ha sido advertido ;)
PD: debe usar el punto de entrada main que ha comentado.