Sunteți pe pagina 1din 44

Cursul 7

Compilarea i execuia programelor


14 noiembrie 2011

Moto

There are only two kinds of programming languages: those people always bitch about and those nobody uses.
Bjarne Stroustrup One of the main causes of the fall of the Roman Empire was that lacking zerothey had no way to indicate successful termination of their C programs. Robert Firth
14.11.2011 2

Shell scripting
CLI terminal comenzi prompt interfa

shell

variabile de mediu operatori

expresii regulate escaping

globbing

expandare

grep
variabile

scripting $1, $2, $#


14.11.2011 3

Unix shell

14.11.2011

Cuprins

Programe i cod surs Compilare Fazele compilrii Biblioteci Execuie

14.11.2011

Suport curs

Suport (Introducere n sisteme de operare)


Capitolul 11 Compilare i linking

14.11.2011

Programe
Ce este un program?
Fiier executabil binar (coninutul este cod main)

Care este faza iniial n care se gsete un program?


Fiier cod surs fiier text ce conine implementarea programului ntr-un limbaj de programare
C - app.c, app.h C++ - app.cpp, app.cxx, app.C, app.hpp Java - Application.java Perl, Python, Lisp, etc.

Se mai numete simplu surs (surs C, surs Java, etc.) Scriere de cod surs sau scriere de cod

La nceput programele erau scrise direct n cod main (binar) (cartele perforate)
14.11.2011 7

Editoare
Scrierea de fiiere text (n particular cod surs) Editoare
simple one tool for the job
vim, Emacs, nano, joe notepad++, notepad2, ultraedit, Crimson Editor

integrate (IDE)
Visual Studio 2010 (varianta Visual Studio Express Edition este free) Eclipse, NetBeans Emacs, Kdevelop

Faciliti
syntax higlighting, auto indentation, utilitare pentru debugging integrate code folding, code completion (autocompletion)
14.11.2011 8

XEmacs

14.11.2011

Eclipse

14.11.2011

10

Compilare i interpretare

Un fiier cod surs poate fi compilat sau interpretat Deosebirea ntre compilare i interpretare
Compilare: codul surs este translatat de un program denumit compilator n cod main, dup care poate fi executat Interpretare: un program este executat direct din cod surs prin intermediul unui interpretor

Multe limbaje au att compilatoare, ct i interpretoare: C, Lisp


GCC (GNU Compiler Collection) - compilator de C, C++, Ada, Fortran MSVC (Microsoft Visual C) - compilator de C, C++ CommonLisp - interpretor de Lisp

14.11.2011

11

Compilare i interpretare (2)


Limbaje tradiional compilate
C, C++, Objective-C, Pascal, Java, Ada

Limbaj tradiional interpretate (limbaje de scripting)


Perl, PHP, Python, Lisp, Ruby, shell scripting (bash, csh, ksh)

Avantaje/dezavantaje
Interpretare
sunt, n general, mai uor de neles de programator debugging facil execuie lent

Compilare
debugging greoi (folosirea unui depanator debugger) vitez ridicat de execuie
14.11.2011 12

My codes compiling

14.11.2011

13

Compilare
Un compilator este un translator
translateaz codul surs n cod obiect; de la un limbaj de nivel nalt n cod main

Un compilator va genera de obicei un executabil


F:\code>cl simple.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. simple.c Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. /out:simple.exe simple.obj All rights reserved. All rights reserved.

razvan@asgard:~/code$ ls main.c razvan@asgard:~/code$ gcc main.c razvan@asgard:~/code$ ls

a.out a.out:

main.c

razvan@asgard:~/code$ file a.out ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped

14.11.2011

14

Fazele compilrii
Component/utilitar specializat pentru fiecare faz Preprocesare: cpp
nlocuirea directivelor de preprocesare (#include, #define) nu este specific tuturor limbajelor

Compilare efectiv: gcc


translatarea codului surs (preprocesat) n limbaj de asamblare

Asamblare: as
translaterea fiierului n limbaj de asamblare ntr-un modul obiect (cod main)

Linking: ld
legarea mai multor module obiect i biblioteci ntr-un modul de sine stttor (de obicei un fiier executabil)
14.11.2011 15

Fazele compilrii vedere de ansamblu


proces

editor

loader

fisier cod sursa

executabil

biblioteca

preprocesor

linker

modul obiect

cod preprocesat cod in limbaj de asamblare

modul obiect

biblioteca

compilator
14.11.2011

asamblor
16

Fiier cod surs


Componenta vizibil programatorului Declaraii de variabile, funcii, clase etc. Sintaxa impus de limbajul respectiv Fiier text (ntr-un limbaj de programare)
memcap.c btdownloadheadless.py check_patch.pl dispatch.rb

De ce i se spune cod surs?


pentru c nu este limbaj natural; nu este uor inteligibil
14.11.2011 17

I Write Code

14.11.2011

18

Fazele compilarii - preprocesare

editor

fisier cod sursa

preprocesor

cod preprocesat

14.11.2011

19

Preprocesare
Fiier cod surs Fiier preprocesat
razvan@asgard:~/code$ gcc -E -o simple.i simple.c razvan@asgard:~/code$ cat simple.i # 1 "simple.c" # 1 "<built-in>" #define ITERATIONS #define INITIAL #define HEADER_STRING 10 1 "Number sum: " # 1 "<command line>" # 1 "simple.c" # 1 "/usr/include/stdio.h" 1 3 4 ............. int main (void) { int i; int sum; int main (void) { int i; int sum; printf (HEADER_STRING); for (i = INITIAL; i < INITIAL + ITERATIONS; i++) sum += i; printf ("Number sum: "); for (i = 1; i < 1 + 10; i++) sum += i; printf ("%d\n", sum); return 0; } } printf ("%d\n", sum); return 0; razvan@asgard:~/code$ cat simple.c #include <stdio.h>

14.11.2011

20

Fazele compilarii - compilare

editor

fisier cod sursa

preprocesor

cod preprocesat

compilator
14.11.2011 21

Compilare
ine cont de sintaxa i semantica programului
sintax: programul respect un set de reguli (o anumit gramatic)
operatorul + poate avea doi operanzi sau poate avea unul singur

semantic: instruciunile din program trebuie s aib sens


se adun un numr cu un alt numr, nu un numr cu un ir de caractere

Se obine fiier in limbaj de asamblare Program incorect din punct de vedere sintactic sau semantic -> erori la compilare:
razvan@asgard:~/code$ gcc main.c main.c: In function `main': main.c:6: error: `i' undeclared (first use in this function) main.c:6: error: (Each undeclared identifier is reported only once main.c:6: error: for each function it appears in.)
14.11.2011 22

Compilare (2)
Fiier cod surs Fiier dup compilare
#include <stdio.h> #define ITERATIONS #define INITIAL #define HEADER_STRING int main (void) { int i; int sum; sum = 0; printf (HEADER_STRING); for (i = INITIAL; i < INITIAL + ITERATIONS; i++) sum += i; printf ("%d\n", sum); return 0; } 14.11.2011 10 1 "Number sum: " .LC0: .string "Number sum: " .LC1: .string "%d\n" .text .globl main .type main: pushl movl subl andl movl movl call 23 $0, -8(%ebp) $.LC0, (%esp) printf %ebp %esp, %ebp $24, %esp $-16, %esp main, @function razvan@asgard:~/code$ gcc -S simple.c razvan@asgard:~/code$ cat simple.s .file .section "simple.c" .rodata

Fazele compilarii limbaj de asamblare

editor

fisier cod sursa

preprocesor

cod preprocesat cod in limbaj de asamblare


24

compilator
14.11.2011

Limbaj de asamblare

Form de reprezentare a instruciinilor procesorului


folosete mnemonici (movl, cmpl, addl)
movl $0, %eax ; stocheaza valoarea 0 in eax

Extensia .asm (Windows) sau .s (Unix) O instruciune n limbaj de asamblare


operatori (add, mul, cmp, mov) operanzi pui la dispoziie de procesor (registre, locaii de memorie)

14.11.2011

25

Folosire limbaj de asamblare


Construire unor module pure Integrare n programe C inline assembly
__asm__ ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo" : /* no outputs */ : "g" (from), "g" (to) : "r9", "r10");

Limbaj depedent de arhitectur


greu extensibil dificil de meninut

Cnd folosim limbajul de asamblare?


limbajul de nivel nalt nu ne ofer un suport pentru anumite instruciuni ale procesorului anumite pri din cod trebuie optimizate de mn
14.11.2011 26

Fazele compilarii - asamblor

editor

fisier cod sursa

preprocesor

cod preprocesat cod in limbaj de asamblare

compilator
14.11.2011

asamblor
27

Asamblare
razvan@asgard:~/code$ as -o simple.o simple.s razvan@asgard:~/code$ objdump --disassemble simple.o simple.o: file format elf32-i386

Disassembly of section .text: 00000000 <main>: 0: 1: 3: 6: 9: e: 10: 17: 1e: 23: 4f: 54: 59: 5a: 14.11.2011 e8 fc ff ff ff b8 00 00 00 00 c9 c3 call mov leave ret 28 50 <main+0x50> $0x0,%eax 55 89 e5 83 ec 18 83 e4 f0 b8 00 00 00 00 29 c4 c7 45 f8 00 00 00 00 c7 04 24 00 00 00 00 e8 fc ff ff ff c7 45 fc 01 00 00 00 push mov sub and mov sub movl movl call movl %ebp %esp,%ebp $0x18,%esp $0xfffffff0,%esp $0x0,%eax %eax,%esp $0x0,0xfffffff8(%ebp) $0x0,(%esp) 1f <main+0x1f> $0x1,0xfffffffc(%ebp)

Asamblare (2)

Translatarea fiierului n limbaj de asamblare n fiier cod obiect Instruciunile n limbaj de asamblare se traduc una cte una n echivalentul lor binar (cod main) Asamblor Exemplu rulare as/msvc
razvan@asgard:~/code$ as -o simple.o simple.s F:\code>cl /Fasimple.asm simple.c

14.11.2011

29

Fazele compilarii modul obiect

editor

fisier cod sursa

preprocesor

cod preprocesat cod in limbaj de asamblare

modul obiect

compilator
14.11.2011

asamblor
30

Fiiere cod obiect


Extensia .obj (Windows) sau .o (Unix) Conin, codificate, variabilele (zona de date) i instruciunile programului (zona de cod) objdump investigarea unui modul obiect (dezasamblarea)
razvan@asgard:~/code$ objdump -s simple.o simple.o: file format elf32-i386 U.............). .E.......$...... ....E......}..~. Contents of section .text: 0000 5589e583 ec1883e4 f0b80000 000029c4 0010 c745f800 000000c7 04240000 0000e8fc 0020 ffffffc7 45fc0100 0000837d fc0a7e02 [...] Contents of section .rodata: 0000 4e756d62 65722073 756d3a20 0025640a 0010 00 Number sum: .%d. .

nm identificarea simbolurilor dintr-un modul obiect


razvan@asgard:~/code$ nm simple.o 00000000 T main U print 14.11.2011 31

Biblioteci
Bibliotec = library librrie Colecie de funcii des utilizate de ctre programe stocate ntr-un singur fiier (modul)
de fapt, o colecie de module obiect (fiiere binare)

Nu sunt independente (precum executabilele)


module ce pot ajuta la crearea unui executabil

n prezent, o parte important din codul programelor se regsete n biblioteci


libc (biblioteca standard C), libpurple (Pidgin), libpng /lib/*, /usr/lib/*
14.11.2011 32

Biblioteci (2)
Biblioteci statice (static libraries)
funciile de bibliotec apelate de un program sunt ataate codului executabil la linking codul executabil se mrete eventuale modificri ale bibliotecii din sistemul de operare nu afecteaz n nici un fel programul

Biblioteci dinamice (dynamic libraries/shared object)


la linking se creeaz referine ctre funciile apelate fr a fi incluse efectiv n executabil biblioteca va fi ncrcat n momentul execuiei programului (loading) cod executabil minim este nevoie de recompilare dac modificm biblioteca extensia .so n Linux i .dll n Windows
14.11.2011 33

Fazele compilarii - linker

editor

fisier cod sursa modul obiect

preprocesor

linker

cod preprocesat cod in limbaj de asamblare

modul obiect

biblioteca

compilator
14.11.2011

asamblor
34

Linking
Mai multe module obiect (inclusiv biblioteci) sunt grupate ntr-un modul de sine stttor (de obicei executabil) La legare/linking se rezolv referinele
un modul apeleaz o funcie (sau o variabil) dintr-un alt modul nurma compilrii se creeaz o referin ctre acea funcie (fr a se ti n ce modul se gsete) linker-ul rezolv aceste referine, gsind funciile (variabilele) apelate din alte module dac se apeleaz o funcie dintr-un modul ce nu se regsete la linking, apare eroare la linking
14.11.2011 35

Crearea de biblioteci
Fiierul add.c implementeaz funcia add, iar sub.c implementeaz funcia sub Dorim o bibliotec al crei coninut s fie dat de cele dou module Crearea i legarea unei biblioteci statice
razvan@asgard:~/code$ gcc -Wall -c add.c razvan@asgard:~/code$ gcc -Wall -c sub.c razvan@asgard:~/code$ ar cr libsimple.a add.o sub.o razvan@asgard:~/code$ ar t libsimple.a add.o sub.o razvan@asgard:~/code$ gcc -Wall -L. -o lib_main lib_main.c lsimple

Crearea i legarea unei biblioteci partajate


razvan@asgard:~/code$ gcc -Wall -fPIC -c add.c razvan@asgard:~/code$ gcc -Wall -fPIC -c sub.c razvan@asgard:~/code$ gcc -fPIC shared o libsimple.so add.o sub.c razvan@asgard:~/code$ export LD_LIBRARY_PATH=. razvan@asgard:~/code$ gcc -Wall -L. -o lib_main lib_main.c -lsimple

14.11.2011

36

Fazele compilarii - executabil

editor

fisier cod sursa

executabil

biblioteca

preprocesor

linker

modul obiect

cod preprocesat cod in limbaj de asamblare

modul obiect

biblioteca

compilator
14.11.2011

asamblor
37

Executabil
Tip special de fiier binar
poate fi ncrcat de sistemul de operare ntr-un proces pentru a fi rulat

Noiunea de program se refer, n general, la un fiier executabil Formate specifice


sistemului de operare tie cum s transpun informaiile ntr-un proces a.out formatul iniial pe Unix ELF (Executable and Linking Format) formatul implicit pe sistemele Unix moderne
razvan@asgard:~/code$ file libmain libmain: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped

PE (Portable Executable) formatul implicit pe sistemele Windows


14.11.2011 38

Bibliotecile dinamice folosite de executabil


razvan@einherjar:~$ ldd /usr/bin/convert libMagickCore.so.4 => /usr/lib/libMagickCore.so.4 (0x00007f9446c4a000) libMagickWand.so.4 => /usr/lib/libMagickWand.so.4 (0x00007f9446930000) libtiff.so.4 => /usr/lib/x86_64-linux-gnu/libtiff.so.4 (0x00007f9446491000) libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f94461f4000) libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007f9445fb9000) liblqr-1.so.0 => /usr/lib/liblqr-1.so.0 (0x00007f9445da6000) libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x00007f9445ab7000) libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f9445881000) libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f944566e000) libXt.so.6 => /usr/lib/x86_64-linux-gnu/libXt.so.6 (0x00007f9445409000) libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f94451f8000) libz.so.1 => /usr/lib/libz.so.1 (0x00007f9444fe1000) libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f9444255000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9443dc5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9443a41000) [...]

14.11.2011

39

Execuia unui program - loading


Execuia unui program
Windows:
F:\> hello.exe Hello, World!

Unix: trebuie precizat explicit faptul c rulm executabilul din directorul curent
razvan@asgard:~/code$ ./lib_main add = 2, sub = 0

Execuia i folosirea bibliotecilor partajate sau dinamice necesit suportul sistemului de operare Loader
componenta sistemului de operare care transpune informaia dintr-un executabil ntr-un proces loading = lansare n execuie man ld.so
14.11.2011 40

Puse cap la cap


proces

editor

loader

fisier cod sursa

executabil

biblioteca

preprocesor

linker

modul obiect

cod preprocesat cod in limbaj de asamblare

modul obiect

biblioteca

compilator
14.11.2011

asamblor
41

Cuvinte cheie
program cod surs editor IDE compilator interpretor preprocesare compilare limbaj de asamblare
14.11.2011

asamblare cod obiect bibliotec linker executabil cpp, gcc, gas, ld objdump, nm ldd loader
42 42

Resurse utile

Link-uri utile

http://en.wikipedia.org/wiki/List_of_text_editors http://en.wikipedia.org/wiki/Comparison_of_integrated_ development_environments http://www.microsoft.com/express/ http://en.wikipedia.org/wiki/Source_code http://www.oualline.com/style/index.html

14.11.2011

43

43

The End

14.11.2011

44

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