Professional Documents
Culture Documents
Moduł 2
Plan prezentacji
●
Etapy tworzenia programu
●
Postać pośrednia
●
Łączenie
●
Biblioteki
●
Kompilacja
kompilator zamienia zapis w języku wysokiego poziomu na zapis
asemblerowy lub od razu na postać pośrednią
każdemu plikowi źródłowemu odpowiada oddzielny plik wynikowy
●
Asemblacja
plik źródłowy napisany przez programistę w języku asemblera lub
wygenerowany przez kompilator jest zamieniany przez asembler na
postać pośrednią (object file)
każdemu plikowi źródłowemu odpowiada oddzielny plik w postaci 3
pośredniej
●
Łączenie
konsolidator łączy pliki pośrednie i pliki bibliotek tworząc postać
wykonywalną, zawierającą zapis binarny programu i danych,
ładowany do pamięci komputera
Przykład – DOS/Microsoft C
●
Wywołanie: “cl hello.c”
Program “cl” jest powłoką kompilatora – programem wywołującym
inne programy potrzebne do zamiany postaci źródłowej na
wykonywalną
●
Etapy:
cl wywołuje kompilator
kompilator generuje postać pośrednią – plik hello.obj
cl wywołuje konsolidator “link” z odpowiednimi argumentami
4
link łączy plik hello.obj z biblioteką języka c
biblioteka zawiera moduł startowy crt0 oraz funkcje standardowe, np.
printf, scanf itp.
moduł crt0 zawiera kod odpowiedzialny za przygotowanie środowiska dla
funkcji main i wywołanie funkcji main z odpowiednimi argumentami (argc,
argv)
●
Powstaje plik hello.exe – postać wykonywalna programu
Przykład - Linux/GCC
●
cc jest powłoką (tzw. driverem) kompilatora
cc wywołuje kompilator, asembler i konsolidator przekazując im
odpowiednie argumenty
●
wywołanie “cc -o hello hello.c”
“-o hello” określa nazwę pliku wykonywalnego (bez tej opcji plik
nazywałby się a.out)
cc wywołuje kompilator, który tworzy strumień (plik) asemblerowy
cc wywołuje asembler, który tworzy plik pośredni hello.o
5
cc wywołuje konsolidator ld, który tworzy plik hello używając modułu
crt0.o, hello.o i biblioteki standardowej języka C
●
powstaje plik wykonywalny o nazwie “hello”
Przykład - Windows
●
Przebieg kompilacji jak w przykładzie dla DOS
●
System Windows używa tzw. bibliotek dynamicznych
postać wykonywalna programu nie jest kompletna
zamiast funkcji standardowych postać wykonywalna programu
zawiera informacje o sposobie dołączenia tych funkcji
dołączenie funkcji następuje podczas ładowania programu do pamięci
dzięki temu wiele programów może korzystać z jednej, wspólnej kopii
biblioteki
daje to redukcję zajętości pamięci 6
●
Podobny mechanizm jest dostępny w systemach rodziny Unix (w
tym również Linux)
Przykłady - podsumowanie
●
Postać wykonywalna powstaje przez połączenie modułów w
postaci pośredniej
●
Moduły te mogą powstać przez kompilację (asemblację) postaci
źródłowych pisanych w językach wysokiego poziomu lub
asemblerze
●
Wiele kompilatorów (w tym GCC) generuje jawnie postać
asemblerową, która jest następnie translowana przez asembler
do postaci pośredniej 7
●
Konsolidator nie wie, w jakim języku był oryginalnie napisany
łączony moduł
●
Biblioteki zawierają gotowe do użycia moduły (w zmodyfikowanej
postaci pośredniej), wcześniej skompilowane
np. funkcje biblioteki standardowej danego języka programowania
Kompilacja
●
Kompilator języka wysokiego poziomu tworzy postać
asemblerową każdego kompilowanego modułu programu
postać ta podlega następnie asemblacji
niektóre kompilatory (np. Microsoft C) tworzą od razu postać
pośrednią, gotową do konsolidacji
●
Microsoft C (Visual studio)
Otworzyć x86 command prompt z menu Visual Studio Tools
cl -Fa mysource.c
Tworzy plik mysource.asm
●
Gnu CC
cc -m32 -S mysource.c
Tworzy plik mysource.s
9
Asemblacja
●
Asemblacja – to inaczej kompilacja postaci asemblerowej
programu do postaci pośredniej (lub wykonywalnej)
●
Postać asemblerowa może być stworzona przez programistę lub
może być wynikiem działania kompilatora języka wysokiego
poziomu
10
Postać pośrednia
●
Postać pośrednia zawiera binarny kod wykonywalny, w którym
część odwołań (np. do zmiennych i procedur) może być
niezdefiniowana
●
Typowy program składa się z wielu modułów powiązanych ze
sobą
moduł może korzystać z funkcji i zmiennych zdefiniowanych w innych
modułach
●
Postać pośrednia zawiera opis zewnętrznych odwołań modułu i 11
opis symboli (np. etykiet i nazw zmiennych) udostępnianych
przez moduł na zewnątrz
wiązanie obiektów następuje poprzez ich nazwy
●
Plik pośrednie noszą zwykle rozszerzenie nazwy .o (Unix)
lub .obj (Windows)
Konsolidacja
●
Konsolidacja polega na realizacji odwołań do symboli
zewnętrznych poprzez związanie tych odwołań z symbolami
udostępnianymi przez moduły, w których je zdefiniowano
●
Wiązanie symboli jest możliwe tylko wtedy, gdy występują one w
postaci pośredniej jako zewnętrzne i publiczne
●
W wyniku konsolidacji powstaje postać wykonywalna programu,
w której wszystkie odwołania są zrealizowane
nie dotyczy to odwołań do bibliotek dynamicznych, które podlegają 12
konsolidacji w trakcie ładowania programu do pamięci
●
Niemożność zrealizowania odwołań powoduje błąd konsolidacji
np. przy braku definicji funkcji lub danej, z której korzysta jakiś moduł
●
Błąd konsolidacji występuje również przy napotkaniu więcej niż
jednej zwykłej definicji symbolu o tej samej nazwie
Symbole zewnętrzne
●
Symbole zewnętrzne są to symbole zdefiniowane w innych
modułach, z których korzysta dany moduł
●
W module korzystającym z symboli zewnętrznych muszą one być
zadeklarowane jako zewnętrzne w sposób specyficzny dla
użytego języka programowania, np.
język C:
słowo kluczowe extern przy deklaracji danych
funkcje niezdefiniowane w danym pliku źródłowym są domyślnie
traktowane jako zewnętrzne 13
asembler
wymagana jawna deklaracja symbolu jako zewnętrznego – słowo
kluczowe extern lub extrn
●
Symbole publiczne – to symbole, z których mogą korzystać inne
moduły
●
Symbole publiczne są deklarowane jako publiczne w sposób
specyficzny dla języka programowania
język C:
każdy symbol na poziomie zewnętrznym jest traktowany jako publiczny, o
ile nie jest zadeklarowany ze słowem kluczowym static
asembler:
wymagana jawna deklaracja określająca symbol jako publiczny – słowo 14
kluczowe public lub global/globl
●
Symbole prywatne są widoczne tylko w module, w którym zostały
zdefiniowane
Każdy symbol niepubliczny jest symbolem prywatnym
W innych modułach programu mogą istnieć inne symbole prywatne
lub publiczne o takiej samej nazwie
section .data
hello: db "Hello, world!", 13, 10, '$'
;-----------------------------------------------------------------
Program jednomodułowy
●
Bardzo proste programy pisane w języku asemblera mogą
składać się z jednego modułu i nie zawierać odwołań do żadnych
symboli zewnętrznych
●
Konsolidacja takich programów sprowadza się do
wygenerowania postaci wykonywalnej z postaci pośredniej i nie
wymaga przeprowadzenia wiązania symboli
●
Niektóre asemblery mogą bezpośrednio generować postać
wynikową programów jednomodułowych, z pominięciem postaci 16
pośredniej (np. NASM)
org 0x100
start:
mov ah, 9 ; funkcja wypisywania łańcucha
mov dx, hello ; adres łańcucha
int 0x21 ; wywołanie systemu
17
mov ax, 0x4c00 ; funkcja exit (0x4c), kod powrotu 0
int 0x21 ; wywołanie systemu
Biblioteki
●
Biblioteka – to kolekcja gotowych modułów w postaci pośredniej,
które mogą być łączone z innymi modułami tworzonymi przez
programistę
●
Plik biblioteki zawiera postaci pośrednie wielu modułów
●
Biblioteki zawierające funkcje standardowe dla danego języka
programowania są zwykle dostarczane wraz z kompilatorami
są one niezbędne do utworzenia działającego programu
●
Programista może tworzyć własne biblioteki, z których może 18
następnie korzystać w innych programach
Konsolidacja z biblioteką
●
Konsolidator wybiera z biblioteki i łączy tylko te moduły, w których
są zdefiniowane symbole zadeklarowane jako zewnętrzne
w bazowych modułach pośrednich
●
Wybrane z biblioteki moduły mogą zawierać odwołania do
symboli zewnętrznych zdefiniowanych w innych modułach
bibliotecznych
●
Wybieranie i łączenie modułów następuje aż do zrealizowania
wszystkich odwołań 19