Programowanie w systemie Linux. Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska

Podobne dokumenty
Konsolidacja (linking)

Wydział Elektrotechniki, Informatyki i Telekomunikacji. Instytut Informatyki i Elektroniki. Instrukcja do zajęć laboratoryjnych

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

Tworzenie oprogramowania

Tworzenie oprogramowania

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie Proceduralne

1. Kompilacja i uruchamianie programów

Co nie powinno być umieszczane w plikach nagłówkowych:

Podstawy informatyki

Programowanie w asemblerze Linkowanie

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

Programowanie Systemów Wbudowanych. GNU Toolchain i kompilacja skrośna. GNU Toolchain. Cross-compilation KSEM WETI PG.

Podstawy Programowania.

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie Zespołowe 2004/2005 Zespół VIII

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Pobieranie argumentów wiersza polecenia

Podstawy Programowania

I - Microsoft Visual Studio C++

Qt sygnały i designer

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Wstęp do programowania

Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Pola i metody statyczne

Operacje wejścia/wyjścia odsłona pierwsza

Podstawy Programowania Obiektowego

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Zaawansowane programowanie w C++ (PCP)

Linux Kernel II. Hello kernel - jak napisać pierwszy moduł

Szablony funkcji i szablony klas

Polimorfizm w pigułce

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Język C++ Różnice między C a C++

Biblioteki dzielone, XML i readline

JAVA NATIVE INTERFACE

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wprowadzenie do szablonów szablony funkcji

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Programowanie w języku C++

Zofia Kruczkiewicz, ETE8305_2 1

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

TEMAT : KLASY POLIMORFIZM

Wprowadzenie do szablonów szablony funkcji

Podział programu na moduły

Projektowanie klas c.d. Projektowanie klas przykład

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Projektowanie obiektowe. Roman Simiński Polimorfizm

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Część 4 życie programu

Kurs programowania. Wykład 7. Wojciech Macyna. 25 kwietnia 2017

Wykład 1

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie obiektowe język C++

1 Atrybuty i metody klasowe

PARADYGMATY PROGRAMOWANIA Wykład 3

Operatory na rzecz typu TString

Programowanie Równoległe Wykład, CUDA praktycznie 1. Maciej Matyka Instytut Fizyki Teoretycznej

Technologie cyfrowe semestr letni 2018/2019

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Identyfikacje typu na etapie. wykonania (RTTI)

Szablony funkcji i klas (templates)

PROGRAMOWANIE NISKOPOZIOMOWE

Wykład 11 Zarządzanie pamięcią

INSTYTUT INFORMATYKI, AUTOMATYKI I ROBOTYKI POLITECHNIKI WROCŁAWSKIEJ

Zadanie 2: Arytmetyka symboli

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie, część I

Podstawy programowania C. dr. Krystyna Łapin

Język C++ wykład VIII

PARADYGMATY PROGRAMOWANIA Wykład 2

Wprowadzenie do programowanie obiektowego w języku C++

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie 2. Język C++. Wykład 3.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

TEMAT : KLASY DZIEDZICZENIE

Common Object Request Broker Architecture (CORBA)

Programowanie Systemów Wbudowanych

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Narzędzia internacjonalizacji programów

Programowanie, część I

Transkrypt:

Programowanie w systemie Linux Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska

Plan Biblioteki Narzędzia pomocnicze Biblioteki statyczne Biblioteki dynamiczne Interfejs dynamicznego ładowania bibliotek

Narzędzia nm wypisanie symboli z pliku obiektowego Oznaczenia: x/x symbol lokalny / globalny B niezainicjalizowana sekcja danych D zainicjalizowana sekcja danych T symbol w sekcji kodu U symbol niezdefiniowany Opcje: C rozwikłanie nazw u tylko niezdefiniowane symbole l numery wierszy w kodzie źródłowym

Narzędzia #include <stdio.h> int zg; int zs=1; void hello(void) { printf("hello world\n"); int main(void) { hello(); return 0;

Narzędzia $ nm main 080483d0 T hello 080483e4 T main U printf@@glibc_2.0 080495e4 B zg 08049470 D zs $ nm -u main libc_start_main@@glibc_2.0 register_frame_info@@glibc_2.0 printf@@glibc_2.0

Narzędzia ar obsługa archiwów ar p[mod] archive [member...] p: d, m, q, p, r, x mod: a dodaj za b dodaj przed c utwórz archiwum s zapisz index u uzupełnij archiwum tylko nowszymi elementami

Narzędzia ranlib generacja indeksu zawartości archiwum ldd wypisanie listy bibliotek współdzielonych wymaganych przez program $ ldd main linux-gate.so.1 => (0xb80c8000) libc.so.6 => /lib/libc.so.6 (0xb7f59000) /lib/ld-linux.so.2 (0xb80c9000)

linux gate? int 0x80 sysenter/sysexit cat /proc/self/maps dd if=/proc/self/mem of=linux-gate.bin bs=1 skip=3086897152 count=4096 file linux-gate.bin linux-gate.bin: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

Biblioteki statyczne Tradycyjne rozszerzenie:.a Kolekcja plików obiektowych Tworzenie biblioteki statycznej: Utworzenie plików obiektowych zawierających wymagany kod Utworzenie archiwum zawierającego skompilowany kod [Generacja indeksu] Udostępnienie nagłówków

Biblioteki statyczne hello.c: #include <stdio.h> int hello(void) { printf("hello world\n"); hello.h: #ifndef _HELLO_H_ #define _HELLO_H_ int hello(void); #endif

Biblioteki statyczne $ gcc -c hello.c $ ar crv libhello.a hello.o a - hello.o [$ ranlib libhello.a] $ nm -s libhello.a Archive index: hello in hello.o hello.o: 00000000 t gcc2_compiled. 00000000 T hello U printf

Biblioteki statyczne hello lib.c: #include <stdio.h> #include "hello.h" int main(void) { hello(); return 0; $ gcc main-lib.c -o main-lib -L. -lhello $ ldd main-lib linux-gate.so.1 => (0xb7fe9000) libc.so.6 => /lib/libc.so.6 (0xb7e7a000) /lib/ld-linux.so.2 (0xb7fea000)

Biblioteki dynamiczne + Szybsze działanie (jednokrotne ładowanie) + Mniejsze zużycie zasobów Konieczność rekompilacji w przypadku istotnych zmian w bibliotece Program dynamicznego ładowania bibliotek zawarty jest w bibliotece ld (ld.so, ld linux.so) Konfiguracja: /etc/ld.so.conf Narzędzie do generowania pliku cache: ldconfig Cache zawiera mapowania soname na nazwy plików bibliotek w systemie plików

Biblioteki dynamiczne LD_LIBRARY_PATH /lib/ld linux.so.2 library path PATH EXEC Ostrożnie! rpath (gcc) LD_DEBUG bindings libs versions files

Biblioteki dynamiczne Nazwy: soname libname.so.x name nazwa x wersja real name libname.so.x.y.z y podwersja ldname z wydanie libname.so

Biblioteki dynamiczne Tworzenie biblioteki dynamicznej: Utworzenie kodu biblioteki Kompilacja z przełącznikami: fpic, shared, soname Nie używać: fomit frame pointer Jawne łączenie z biblioteką C

Biblioteki dynamiczne void attribute ((constructor)) my_init(void); void attribute ((destructor)) my_fini(void);

Biblioteki dynamiczne $ gcc -g -c -fpic hello.c -o hello.o $ gcc -g -shared -Wl,-soname,libhello.so hello.o -o libhello.so.1.0.0 -lc $ ln -s libhello.so.1.0.0 libhello.so.1 $ ln -s libhello.so.1.0.0 libhello.so $ gcc main-lib.c -o main-lib -L. -lhello $ ldd main-lib linux-gate.so.1 => (0xb7fe9000) libhello.so => not found libc.so.6 => /lib/libc.so.6 (0xb7e7a000) /lib/ld-linux.so.2 (0xb7fea000) $ LD_LIBRARY_PATH=`pwd` ldd main-lib linux-gate.so.1 => (0xb7f33000) libhello.so =>../ex/libhello.so (0xb7f30000) libc.so.6 => /lib/libc.so.6 (0xb7dc2000) /lib/ld-linux.so.2 (0xb7f34000)

Biblioteki dynamiczne LD_LIBRARY_PATH=. LD_DEBUG=files./main-lib 31828: 31828: file=libhello.so [0]; needed by./main-lib [0] 31828: file=libhello.so [0]; generating link map 31828: dynamic: 0xb7fe3878 base: 0xb7fe2000 size: 0x000019a8 31828: entry: 0xb7fe26c0 phdr: 0xb7fe2034 phnum: 3 31828: 31828: file=libc.so.6 [0]; needed by./main-lib [0] 31828: file=libc.so.6 [0]; generating link map 31828: dynamic: 0xb7fbed7c base: 0xb7e8d000 size: 0x00135630 31828: entry: 0xb7ea34f0 phdr: 0xb7e8d034 phnum: 10 31828: 31828: calling init: /lib/libc.so.6 31828: calling init:./libhello.so 31828: initialize program:./main-lib 31828: transferring control:./main-lib hello world 31828: calling fini:./main-lib [0] 31828: calling fini:./libhello.so [0] 31828: calling fini: /lib/libc.so.6 [0]

Interfejs dl (dynamic loading) Umożliwia dynamiczne wczytanie biblioteki, nie dołączonej podczas kompilacji, w czasie działania programu. Możliwość implementacji mechanizmu wtyczek Umożliwia wczytanie, przeszukiwanie oraz zwolnienie dynamicznego obiektu Zaimplementowany w postaci biblioteki (libdl) Deklaracje: <dlfcn.h>

Wykorzystanie obiektów współdzielonych Wczytanie: void *dlopen(const char *filename, int flag); Odnalezienie symbolu: void *dlsym(void *handle, char *symbol); Zwolnienie: void dlclose(void *handle); Obsługa błędów: const char *dlerror(void);

Wykorzystanie obiektów współdzielonych #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main(void) { void *handle; int (*hello_fun)(void); const char *errmsg; handle = dlopen("./libhello.so", RTLD_NOW); if(handle == NULL) { fprintf(stderr, "dlopen: %s\n",dlerror()); exit(1); dlerror(); hello_fun = dlsym(handle, "hello"); if((errmsg = dlerror())!= NULL ) { fprintf(stderr, "dlsym: %s\n", errmsg); exit(1); hello_fun(); dlclose(handle); return(0);

Wykorzystanie obiektów współdzielonych $ gcc main-dl.c -o main-dl -ldl $ ldd main-dl linux-gate.so.1 => (0xb80a7000) libdl.so.2 => /lib/libdl.so.2 (0xb807b000) libc.so.6 => /lib/libc.so.6 (0xb7f34000) /lib/ld-linux.so.2 (0xb80a8000)

Interfejs dl i C++ Jak odwołać się do funkcji? Jak utworzyć obiekt? C++ przeszkody i mechanizmy pomocne: wikłanie nazw (name mangling) extern C dziedziczenie polimorfizm

base.h #include <iostream.h> #include <stdlib.h> class parent { public: virtual void hello(void) {; ; extern "C" { parent *maker(void);

child.h #include "base.h" class child: public parent { public: virtual void hello(void); ; extern "C" { parent *maker(void);

child.cpp #include "child.h" void child::hello(void) { cout << "child" << endl; parent *maker(void) { child *c = new child; return((parent *)c);

main.cpp #include <stdio.h> #include "child.h" #include <stdlib.h> #include <dlfcn.h> int main(void) { void *handle = 0; parent *(*pmaker)(void) = 0; const char* error = 0; handle = dlopen("./child.so", RTLD_LAZY); if (!handle ) { error = dlerror(); if (!error ) fprintf(stderr, "dlopen()\n"); exit (EXIT_FAILURE); pmaker = (parent *(*)(void))dlsym(handle, "maker"); if (!pmaker ) { error = dlerror(); if (!error ) { fprintf(stderr, "dlsym"); exit (EXIT_FAILURE); parent *p = (*pmaker)(); p->hello(); dlclose(handle); return (EXIT_SUCCESS);