System V Application Binary Interface
Początkowy stan procesu
System V Application Binary Interface
Początkowy stan stosu
EDB
Nagłówki w pliku wykonywalnym

Program hello world (Pokaż/ukryj kod)

; wersja NASM na system 64-bitowy (x86-64)
; kompilacja: nasm -felf64 hello64.asm -o hello64.o
; linkowanie: ld hello64.o -o hello64
 
bits 64
section	.text			; początek sekcji kodu.
global _start		        ; linux rozpoczyna wykonywanie programu od etykiety _start
                                 ; musi ona być widoczna na zewnątrz (global)
 
_start:				; punkt startu programu
	mov	rax, 1		; numer funkcji systemowej:
				; sys_write - zapisz do pliku
	mov	rdi, 1		; numer pliku, do którego piszemy.
				; 1 = standardowe wyjście = ekran
	mov	rsi, tekst	; RSI = adres (offset) tekstu
	mov	rdx, dlugosc	; RDX = długość tekstu
	syscall			; wywołujemy funkcję systemową
	mov	rax, 60		; numer funkcji systemowej
				; (sys_exit - wyjdź z programu)
	syscall			; wywołujemy funkcję systemową
 
section .data			; początek sekcji danych.
	tekst	db	"Czesc", 0ah	; nasz napis, który wyświetlimy
	dlugosc	equ	$ - tekst	; długość napisu
 

objdump -x hello64

Nagłówki w pliku wykonywalnym

hello64:     file format elf64-x86-64
hello64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000004000b0
 
Program Header:
    LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
         filesz 0x00000000000000d2 memsz 0x00000000000000d2 flags r-x
    LOAD off    0x00000000000000d4 vaddr 0x00000000006000d4 paddr 0x00000000006000d4 align 2**21
         filesz 0x0000000000000006 memsz 0x0000000000000006 flags rw-
 
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000022  00000000004000b0  00000000004000b0  000000b0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000006  00000000006000d4  00000000006000d4  000000d4  2**2
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
00000000004000b0 l    d  .text	0000000000000000 .text
00000000006000d4 l    d  .data	0000000000000000 .data
0000000000000000 l    df *ABS*	0000000000000000 hello64.asm
00000000006000d4 l       .data	0000000000000000 tekst
0000000000000006 l       *ABS*	0000000000000000 dlugosc
0000000000000000 l    df *ABS*	0000000000000000 
00000000006000d8 l     O .data	0000000000000000 _GLOBAL_OFFSET_TABLE_
00000000004000b0 g       .text	0000000000000000 _start
00000000006000da g       .data	0000000000000000 __bss_start
00000000006000da g       .data	0000000000000000 _edata
00000000006000e0 g       .data	0000000000000000 _end

Wywołanie funkcji zewnętrznej

Odwołania do funkcji zewnętrznych odbywa się przy pomocy procedure linkage table (PLT)

 CALL printf WRT ..plt


Tomasz Kapela, Kraków 2011-2020