Programowanie w asemblerze Linkowanie

Podobne dokumenty
Konsolidacja (linking)

Komputery przemysłowe i systemy wbudowane

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces

Optymalizacja programów Open-Source. Optymalizacja czasu uruchamiania programu. Krzysztof Lichota

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Wykład 4. Środowisko programistyczne

Programowanie Systemów Wbudowanych

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Zarządzanie pamięcią w systemie operacyjnym

Programowanie niskopoziomowe

Od programu źródłowego do procesu

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Zarządzanie pamięcią. Od programu źródłowego do procesu. Dołączanie dynamiczne. Powiązanie programu z adresami w pamięci

Podstawy programowania

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Zarządzanie pamięcią operacyjną zagadnienia podstawowe

Zarządzanie pamięcią operacyjną

Programowanie Niskopoziomowe

Biblioteki wspólne w systemach UNIX, ładowanie dynamiczne bibliotek

Ćwiczenie nr 6. Programowanie mieszane

Wirusy w systemie Linux. Konrad Olczak

Programowanie w asemblerze Aspekty bezpieczeństwa

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Pamięć. Jan Tuziemski Źródło części materiałów: os-book.com

Systemy Operacyjne. Ćwiczenia

Programowanie Niskopoziomowe

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

Kernel Kompilacja jądra

Kompilator języka C na procesor 8051 RC51 implementacja

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

BSD - alternatywa dla Linuksa

1.Wstęp. 2.Generowanie systemu w EDK

Zarządzanie pamięcią. Podstawy Wymiana (swapping). Przydział ciągły pamięci. Stronicowanie. Segmentacja. Segmentacja ze stronicowaniem.

Kompilacja i scalanie programów w linii poleceń gcc i make

Zarządzanie pamięcią operacyjną

Technika mikroprocesorowa. Struktura programu użytkownika w systemie mikroprocesorowym

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Podstawy Informatyki Języki programowania c.d.

dr inż. Jarosław Forenc

Podstawy Informatyki Języki programowania

PRZYDZIAŁ PAMIĘCI OPERACYJNEJ

Struktura programu w asemblerze mikrokontrolera 8051

Trojan bankowy Emotet w wersji DGA

Technologie informacyjne (2) Zdzisław Szyjewski

Programowanie w asemblerze Środowiska 64-bitowe

Spis treści. Wstęp 15

Programy użytkowe (utilities)

Wstęp do programowania

Pakiety podprogramów Dynamiczny SQL

Zarządzanie pamięcią. Zarządzanie pamięcią. Podstawy. Podsystem zarządzania pamięcią. Zadania podsystemu: W systemie wielozadaniowym:

DOS Podstawowe komendy Przygotowanie dyskietki do pracy Praca z katalogami w systemie DOS Operacje kopiowania

Laboratorium 2: Biblioteki statyczne i dynamiczne w języku C. mgr inż. Arkadiusz Chrobot

Architektura komputerów

Logiczny model komputera i działanie procesora. Część 1.

Systemy Operacyjne Zarządzanie pamięcią operacyjną

Architektura komputerów

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Programowanie w C. dr inż. Stanisław Wszelak

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Mikrokontroler ATmega32. Język symboliczny

1.1 Definicja procesu

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

PMiK Programowanie Mikrokontrolera 8051

Zasoby, pliki graficzne

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Oracle PL/SQL. Paweł Rajba.

Architektura komputerów

1. Dyrektywy asemblerowe

Hosting WWW Bezpieczeństwo hostingu WWW. Dr Michał Tanaś (

Narz«dzia do programowania w j«zyku C

Architektura komputerów

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Dariusz Kozak ZESTAW URUCHOMIENIOWY MIKROKOMPUTERÓW JEDNOUKŁADOWYCH MCS-51 ZUX51. Asembler ASMX51 INSTRUKCJA OBSŁUGI

Analiza Malware Win32.KeyloggerSpy

Java jako język programowania

X P.I.W.O. Portowanie Tizena na nowe architektury na przykładzie ARMv6. Maciej Wereski Samsung R&D Institute Poland. 17 Maj Poznań, Polska

Metody Kompilacji Wykład 1 Wstęp

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 1. Krzysztof Lichota

Działanie systemu operacyjnego

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

6. Algorytmy ochrony przed zagłodzeniem dla systemów Linux i Windows NT.

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Programowanie niskopoziomowe

Podstawy. Podsystem zarządzania pamięcią - zadania: Wiązanie (binding) rozkazów i danych z adresami pamięci. W systemie wielozadaniowym:

Systemy wbudowane. Rysunek 1: Ilustracja procesu kompilacji oprogramowania

Działanie systemu operacyjnego

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Java Podstawy. Michał Bereta

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Transkrypt:

Programowanie w asemblerze Linkowanie January 17, 2017

Problem rozmieszczenia (relokacji) Ponieważ w pamięci równocześnie może znajdować się kilka programów, nie można w trakcie kompilacji przewidzieć ich rzeczywistych adresów. Podział pracy: linker: rozmieszczenie pamięci = przygotowanie adresów względnych w programie loader: finalna relokacja

Rozwiazania architektoniczne Relokacja sprzętowa (rejestry relokacji) i pamięć wirtualna uprościły pracę linkera. Każdy program dostaje cała (wirtualna) przestrzeń adresowa. Ale za to pojawiło się dzielenie kodu: podział programu na sekcje kodu i danych.

Zadania linkera Scala moduły binarne Łaczy binarne moduły relokowalne w pojedynczy plik wykonywalny, który można będzie załadować loaderem. Rozwiazuje odwołania zewnętrzne Musza być rozwiazywane w trakcie procesu scalania Odwołanie zewnętrzne: odwołanie do symbolu w innym module. Relokuje symbole Wiaże nazwy symbolicznych opisane względnymi adresami w ramach modułów (plików.o) z konkretnymi adresami absolutnymi w kodzie wykonywalnym. Na przykład: getline w module iosys adres 612 bajtów od poczatku wykonywalnego kodu. Wykonuje code fixups: aktualizuje wszystkie odwołania do tych symboli tak, aby odpowiadały ich nowym adresom.

Relokacja Asembler generuje adresy nierelokowane. Załóżmy np., że dla mov eax,[a] mov [b],eax a ma adres lokalny 0x1234, zaś b jest importowany. Kod po asemblacji A1 34 12 00 00 A3 00 00 00 00 mov eax,[a] mov [b],eax Przy linkowaniu linker ustala, że sekcja zawierajaca a ma być relokowana 0x10000 bajtów, zaś b ma adres 0x9A12 A1 34 12 01 00 A3 12 9A 00 00 mov eax,[a] mov [b],eax

Relokacja Podobne modyfikacja sa wymagane w sekcji danych, jeśli występuja tam wskaźniki, np. tablica adresów procedur. Problemy w procesorach RISC, gdzie adres często budowany przez 2 lub 3 kolejne instrukcje.

Formaty plików binarnych W Unixie pliki binarne (i nie tylko) rozpoczynaja się od 32-bitowej liczby magicznej (magic number), określajacej typ pliku. Tradycyjnym, choć obecnie rzadko używanym, formatem pliku binarnego w Unixie jest a.out. Jego liczba magiczna to 0x407. Zastapiony formatem ELF.

Format a.out Nagłówek a.out Sekcja text Sekcja data Inne sekcje Opcjonalna informacja o relokacji

Format ELF Nagłówek ELF Tablica nagłówków programów (dla loadera) Sekcja.text Sekcja.data Sekcja.bss.symtab.rel.text.rel.data.debug Tablica nagłówków sekcji (informacje o relokacji dla linkera)

Format ELF (Executable and Linking Format) Obecnie podstawowy format w Linuxie o liczbie magicznej 0x177 = ELF Nadaje się zarówno do zapisywania programów wykonywalnych, jak i modułów i bibliotek (a także obrazów pamięci). Ma kilka typów: relokowalny, wykonywalny, shared, core image. Tak więc można w nim umieszczać informacje potrzebne zarówno linkerowi, jak i loaderowi. Na poczatku pliku znajduje się nagłówek, następnie tablica nagłówków programów (opis segmentów dla loadera).

Format ELF Potem następuje właściwa zawartość pliku, czyli sekcje: kod.text dane inicjowane.data dane nieinicjowane.bss.symtab: tablica symboli.rel.text: informacje o relokacjach dla.text.rel.data: informacje o relokacjach dla.data.debug: informacja dla debuggera (gdy użyto gcc -g) Na końcu tablica nagłówków sekcji, opisujaca poszczególne sekcje i przeznaczona dla linkera.

Biblioteki Biblioteki dziela się na statyczne i dzielone. Wszelkie biblioteki statyczne wymagaja relinkowania programu po każdej modyfikacji bibliotek.

Biblioteki dzielone Biblioteki dzielone dziela się na ładowane statycznie i dynamicznie. dla bibliotek ładowanych statycznie adresy (rozmieszczenie) sa ustalane w trakcie ładowania programu biblioteki ładowane dynamicznie moga być doładowywane w miarę potrzeby w trakcie pracy, przy pierwszym wywołaniu ich procedur W bibliotekach dzielonych używa się Position Independent Code (PIC), aby można je było ładować w dowolne miejsce w pamięci (np. w kompilatorze gcc jest do tego opcja).

Linkowanie dynamiczne: metody Implicit linking Z programem zwiazujemy linkage segment, opisujacy wołane procedury zewnętrzne z biblioteki dynamicznej jako pary [nazwa, adres(poczatkowo równy 0, czyli błędny)]. W kodzie wywołania pośrednie przez te adresy, z wyjatkiem pierwszego razu, bo poczatkowo jest to pułapka (trap) do dynamicznego linkera, powodujaca dolinkowanie docelowej biblioteki i wypełnienie pola adresu. Explicit linking Program w swoim prologu podaje wszystkie używane biblioteki dzielone i łaczy się z nimi.

Tworzenie biblioteki dynamicznej Aby zbudować bibliotekę dynamiczna, plik asemblujemy normalnie nasm -f elf pakiet.asm W deklaracjach eksportowanych symboli powinniśmy jednak podawać ich typ: function lub data, np. global random:function,seed:data Inaczej natomiast będziemy go linkować ld -shared -o libpakiet.so pakiet.o

Tworzenie biblioteki dynamicznej Tak zbudowanej biblioteki można teraz używać podobnie jak systemowej ld -L. -dynamic-linker /lib/ld-linux.so.2 \ -o program program.o -l pakiet Dodatkowo przed uruchomieniem program musimy odpowiednio ustawić zmienna środowiska LD_LIBRARY_PATH=. export LD_LIBRARY_PATH Polecenie systemowe ldd podaje, jakich bibliotek dzielonych używa program, natomiast polecenie nm podaje wszystkie symbole zewnętrzne modułu binarnego.