linux - How does one link NASM program to libc via ld? -
i have following program 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 exit
which assembled command:
nasm -f elf libcall.asm
if comment 2 lines _start
, uncomment 2 lines main
, assemble , link command:
gcc libcall.o -o libcall
then program runs ok. if assemble code _start
entry point , link command:
ld libcall.o -o libcall -lc
then after launching program in bash (via command ./libcall
) following error message returned:
bash: ./libcall: no such file or directory
although libcall
file exist. objdump
shows following:
[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>
how nasm assembly code should linked libc
via ld
?
there parts of libc/crt come in object files need link. additionally need specify options such dynamic loader (aka. interpreter) use (which reason issue.) use gcc
right thing you. if interested can run gcc -v
, see horrible command line uses link. have been warned ;)
ps: should use main
entry point have commented out.
Comments
Post a Comment