Sunteți pe pagina 1din 32

Construirea programelor

Modificat: 26.10.2021

Curs 18 - 19 1
Suport curs
• https://github.com/systems-cs-pub-
ro/iocla/tree/master/curs/chap-02-construire-
programe
• text: prezentare, explicații, demo-uri
• fișiere de suport demo-uri

Curs 18 - 19 2
De la cod sursă la executabil

Curs 18 - 19 3
Variabile globale
• Trei zone de memorie
∗ .data: initializate
∗ .bss: neinitializate (zero @load-time)
 .rodata: initializate, read-only
• .data: int a = 10;
• .bss: int a;
• .rodata: const int a = 10;
• Variabile locale declarate ‘static’ in C
• Experiment: comparați executabilele generate cu
• int a[10000000];
• int a[10000000] = {1};

Curs 13 4
Programe compuse din mai multe module
• Un program poate conține fișiere sursă diferite
• Avantaje
» Daca un modul este modificat, doar acela este recompilat (nu tot
programul)
» Mai multi programatori pot folosi module comune
» Modificarea programului este mai usoara datorita fisierelor de
dimensiune redusa
» Modificarile neintentionate pot fi evitate
• Directive de asamblare:
» GLOBAL si EXTERN

Curs 13 5
Scope & linkage în C
• http://norswap.com/c_scope_duration_linkage/
• Scope: domeniul de vizibiliate al unei variabile
∗ block scope (locală unui bloc/funcții)
∗ file scope (locală unui fișier/unități de compilare)
• Linkage: declarații multiple pentru aceeași definiție
∗ no linkage (locală unui block)
∗ internal linkage (globală, marcată cu static)
∗ external linkage (globală, nemarcată cu static)

Curs 13 6
De ce să mă preocupe fazele compilării?
• Ești inginer, în pana mea!

• Sistemele / programele / procedurile dau greș


• probleme de compilare
• probleme de asamblare
• probleme de linking

• Pentru testare pe configurații diferite

• Pentru analiză de performanță, securitate

Curs 18 - 19 7
De ce să știu despre linking?
• Se întâmplă oricând generăm un executabil

• Problemele de linking sunt frecvente și puțin


înțelese

• În general, te vei folosi de componente software


existente
• fie firect la nivelul codului (API)
• fie printr-o interfață binără specifică (ABI)
• fie prin linkarea lor

Curs 18 - 19 8
Probleme de linking
• O funcție este definită static și este apelată din alt
modul (compilation unit)

• O funcție este este definită în două module

• Nu se poate localiza biblioteca dorită

• Uneori probleme de linking se manifestă doar la


încărcare sau la rulare
• o funcție este folosită cu altă signatură
• se folosește o altă bibliotecă dinamică
Curs 18 - 19 9
Momente din procesul de build / run
• compile time

• link-time

• load-time

• run-time

Curs 18 - 19 10
Linking
• module obiect + biblioteci legate / linkate
• rezultă fișier executabil (su biblioteci dinamice)

• fișierul executabil poate fi încărcat (loaded)

• încărcare = crearea unui proces din codul și datele


executabilului

Curs 18 - 19 11
Fișiere folosite
• Cod sursă (editabil de programator), text
• numit și compilation unit / translation unit
• Fișier cod obiect, modul obiect
• obținut din compilation unit
• Bibliotecă
• din unul sau mai multe fișiere obiect
• colecție
• Executabil
• din unul sau mai multe module obiect
• selecție
• unele module obiect pot fi în biblioteci

Curs 18 - 19 12
Module obiect vs fișiere executabile
• ambele: cod mașină (poate fi dezasamblat)
• ambele: format de fișier comun, analizabile cu
utilitare separate

• doar fișierul executabil


• entry point (de unde începe execuția), poate fi încărcat
• adrese efective ale programului

• doar fișierul obiect


• simboluri (variabile, funcții) nedefinite
• sunt definite în alte module
Curs 18 - 19 13
Ce conține un fișier executabil / obiect?
• header
• secțiuni
• .text (cod)
• .data (date)
• .debug (depanare)
• .symtab / .strtab / .shstrtab (simboluri)
 secțiunile de cod pot fi dezasamblate

Curs 18 - 19 14
Responsabilitățile linkerului
• rezolvarea simbolurilor (symbol resolution)
• unificarea secțiunilor
• stabilirea adreselor (address binding)
• relocarea simbolurilor (relocation)
• stabilirea entry pointului

Curs 18 - 19 15
Stabilirea entry pointului
• adresa primei instrucțiuni executate la rulare
• localizat în header
• readelf -h
• nu este main
• este, uzual, _start
• _start pregătește mediul de lucru (stivă, argumentele
programului)
• apoi apelează main

Curs 18 - 19 16
Simboluri
• Variabile globale, funcții, variabile locale statice
• Au un nume, o adresă, un conținut, o dimensiune
• Funcțiile se găsesc în secțiunea .text
• Variabilele se găsesc în .data, .bss, .rodata
• Definiții de variabile – simboluri definite
• int var = 10;
• int func(void) {…}
• Declarații și folosiri de variabile / funcții - simboluri
nedefinite;
• extern int var;
• int func(void);
Curs 18 - 19 17
Rezolvarea simbolurilor
• în fiecare fișier obiect se parcurg simbolurile
nedefinite
• se localizează în celelalte fișiere obiect
• dacă nu se găsesc: eroare de linking
• investigare folosind utilitarul nm sau readelf -s

Curs 18 - 19 18
Secțiuni
• compartimente ale fișierelor obiect / executabile
• conțin tipuri comune de informații: cod, date
inițializate, date neinițializate
• nu au adrese stabilite în fișiere obiect
• au adrese stabilite în fișierul executabil

Curs 18 - 19 19
Unificarea secțiunilor + Stabilirea adreselor
• secțiunile de același tip sunt puse una după alta în
executabil
• fiecare secțiune primește o adresă
• secțiunile unificate sunt puse consecutiv în
executabil
• apoi fiecare simbol din secțiunile unificate primește
o adresă finală
• readelf -S

Curs 18 - 19 20
Relocarea simbolurilor
• acolo unde simbolurile nedefinite sunt folosite se
plasează placeholdere
• putem folosi objdump pentru dezasamblarea fișierului
obiect
• după stabilirea adreselor aceste placeholdere sunt
completate: relocare
• fișierul executabil are placeholderele completate
• fișierele obiect se mai numesc "relocabile"
• readelf -r

Curs 18 - 19 21
Stripping
• executabilele nu au cu adevărat nevoie de simboluri
(de nume)
• simbolurile pot fi scoase (stripped) din executabile
• mare parte din executabilele finale sunt stripped

Curs 18 - 19 22
Demo time
• 01-one-file
• 02-two-files
• 03-reloc

Curs 18 - 19 23
Biblioteci
• colecții de fișiere obiect
• extensia .a (arhivă - fișiere puse unul după altul,
necomprimate)
• ar rc libtest.a a.o b.o c.o
• putem folosi nm, objdump
• pentru linkare
• -ltest
• -L. (directorul curent sau cel în care se află biblioteca)

Curs 18 - 19 24
Biblioteca standard C
• standard C library
• libc
• oversiune de libc pe orice sistem
• linkată implicit
• funcționalități de bază pentru programe
• lucru cu memoria
• lucru cu șiruri
• lucru cu fișiere I/O
• comunicare inter-proces (IPC)

Curs 18 - 19 25
Executabile cu linkare statică
• codul și datele din modulele obiect folosite din
cadrul bibliotecilor sunt în executabil
• executabile complete
• pot rula pe orice configurație
• dimensiune mare
• bibliotecile sunt numite statice

Curs 18 - 19 26
Demo
• 04-lib/
• 05-static/

Curs 18 - 19 27
Executabile cu linkare dinamică
• codul și datele din biblioteci nu mai sunt plasate în
executabil
• sunt referințe
• rezolvate la load-time de loader / dynamic linker
• bibliotecile se numesc dinamice / partajate
• .dll pe Windows, .dylib pe macOS, .so pe Linux
 executabile mai mici
 codul bibliotecilor este partajate între procese la
load-time / run-time

Curs 18 - 19 28
Comenzi pentru/cu biblioteci dinamice
• ldd /bin/ls
• gcc -shared -o libtest.so a.o b.o c.o
• gcc –L. -o main main.o -ltest
• LD_LIBRARY_PATH=. ./test

Curs 18 - 19 29
Demo
• 06-dynamic/
• 07-dynlib/

Curs 18 - 19 30
Sumar
• linking: fișiere obiect -> fișier executabil
• unificare secțiuni, stabilire adrese, rezolvare /
relocare simboluri, stabilire entry point
• header, secțiuni, simboluri
• nm, objdump, readelf
• linkare statică, biblioteci statice
• linkare dinamică, biblioteci dinamice

Curs 18 - 19 31
Intrebari?

Curs 18 - 19 32

S-ar putea să vă placă și