Linux Prinzipien und Programmierung



Ähnliche Dokumente
Einführung zum Arbeiten mit Microsoft Visual C Express Edition

Nuetzlicher Kleinkram

Kompilieren und Linken

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

Compilieren und Linken von C- und C++-Dateien

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Zählen von Objekten einer bestimmten Klasse

Linux Prinzipien und Programmierung

Informationen zur Verwendung von Visual Studio und cmake

Propädeutikum. Dipl.-Inf. Frank Güttler

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Einführung in die Programmierung

E Mail Versand mit der Schild NRW Formularverwaltung

Einführung in die C++ Programmierung für Ingenieure

Programmentwicklung mit C++ (unter Unix/Linux)

AutoTexte und AutoKorrektur unter Outlook verwenden

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Nach der Installation des FolderShare-Satellits wird Ihr persönliches FolderShare -Konto erstellt.

Objektorientiertes Programmieren mit Suse Linux

LANiS Mailversender ( Version 1.2 September 2006)

Compiler und Präprozessor (1) Erstellen eines Projektes

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Programmierung in C. Grundlagen. Stefan Kallerhoff

Import und Export von Übergängern

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?

Punkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Version 0.3. Installation von MinGW und Eclipse CDT

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Internet online Update (Mozilla Firefox)

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Wie man eigene Programme erstellt

TIF2ELO Maskeneditor Handbuch

Wie halte ich Ordnung auf meiner Festplatte?

WinVetpro im Betriebsmodus Laptop

Abwesenheitsnotiz im Exchange Server 2010

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Druckerscriptsprache

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

Enigmail Konfiguration

Hilfen zur Verwendung der Word-Dokumentvorlage des BIS-Verlags

Professionelle Seminare im Bereich MS-Office

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg Weiterstadt

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Evident VDDS-Anbindung von MIZ

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Einführung in die Java- Programmierung

teamsync Kurzanleitung

1 Vom Problem zum Programm

Hinweise zum elektronischen Meldeformular

Zahlen auf einen Blick

Einführung in LINUX Der Editor vi

Stand: Adressnummern ändern Modulbeschreibung

Installation und Inbetriebnahme von Microsoft Visual C Express

BILDER TEILEN MIT DROPBOX

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

Einführungskurs MOODLE Themen:

Lehrer: Einschreibemethoden

Umzug der Datenbank Firebird auf MS SQL Server

Primzahlen und RSA-Verschlüsselung

Satzhilfen Publisher Seite Einrichten

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil IV: Programmieren an Beispielen

Angaben zu einem Kontakt...1 So können Sie einen Kontakt erfassen...4 Was Sie mit einem Kontakt tun können...7

Prozentrechnung. Wir können nun eine Formel für die Berechnung des Prozentwertes aufstellen:

SRH - Kurzinformation

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Erstellen von x-y-diagrammen in OpenOffice.calc

2. Semester, 2. Prüfung, Lösung

Einführung in. Logische Schaltungen

Wir machen neue Politik für Baden-Württemberg

FH-SY Chapter Version 3 - FH-SY.NET - FAQ -

Mozilla Firefox - Zeit für den Wechsel

Anmeldung zu Seminaren und Lehrgängen

Microsoft Access 2010 Navigationsformular (Musterlösung)

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Erstellen der Barcode-Etiketten:

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Einführung in die C-Programmierung

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Mit dem sogenannten Seriendruck können Etiketten und Briefe mit einer Adressdatei (z. B. Excel) verknüpft werden.

Viele Bilder auf der FA-Homepage

Anleitung für die Formularbearbeitung

Die Post hat eine Umfrage gemacht

Zwischenablage (Bilder, Texte,...)

NoClick. Eine kurze Anleitung. Kommhelp e.v Vereinsregister. Spendenkonto kommhelp e. V. Konto Horstweg 25

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Arbeiten mit UMLed und Delphi

Transkript:

Linux Prinzipien und Programmierung Dr. Klaus Höppner Hochschule Darmstadt Wintersemester 2011/2012 1 / 22 popen Programmentwicklung unter Linux make gcc, objdump, readelf 2 / 22 Die Funktion popen Im letzten Beispiel wurden fork, Pipes und die exec-funktionen miteinander verknüpft: Per fork wurde ein Kindprozess erzeugt, dieser benutzte eine vorher angelegt Pipe, wobei stdin auf die lesende Seite der Pipe umgebogen wurde. Dann wurde der Kindprozess durch eine bash ersetzt, die über die Pipe aus dem Elternprozess Befehle bekam. Letzlich geht diese Aktion allerdings einfacher, nämlich mit #include <stdio.h> FILE* popen(const char* cmd, const char* type) wobei type entweder r oder w ist. 3 / 22 Handout S. 1

Die Funktion popen (Forts.) Die Pipe an das ausgeführte Programm wird mit pclose(file *stream) geschlossen. Hierbei wird (mit waitpid) auf das Ende des aufgerufenen Programms gewartet, es wird also erwartet, dass dieses bei EOF auf stdin bzw. beim Schließen von stdout endet. Die Kommunikation mit dem externen Programm ist unidirektional, also können entweder Eingaben an das Programm geschickt oder dessen Ausgabe gelesen werden. Es gibt in der C-Bibliothek kein popen2 mit bidirektionaler Kommunikation, dieses muss entweder selbst implementiert oder von dritter Seite bereit gestellt werden. 4 / 22 Beispiel Im folgenden Beispiel soll aus einem Programm heraus eine E-Mail verschickt werden (wie es z. B. Backup-Programme bei Fehlern bei der Datensicherung tun). Hierfür wird das Programm sendmail aufgerufen, das unter Linux Mails entgegennimmt und transportiert. #include <stdio.h> int main() { FILE* p = popen("/usr/lib/sendmail -t -oem -oi","w"); fprintf(p,"from: klaus\n"); fprintf(p,"to: karl\n"); fprintf(p,"subject: Test\n"); fprintf(p,"\n"); fprintf(p,"hallo\n"); pclose(p); return(0); } 5 / 22 Beispiel zur Motivation Normalerweise bestehen C-Programme aus mehreren Quelltext- (.c) und Header-Dateien (.h), die einzeln kompiliert und dann zu einem ausführbaren Programm gelinkt werden. Datei main.c: #include <stdio.h> #include <stdlib.h> #include <myfunc.h> int main() { int i = myfunc(3); printf("die Antwort heisst: %d\n", i); return(exit_success); } 6 / 22 Handout S. 2

Beispiel (Forts.) Datei myfunc.h: #ifndef _MYFUNC_H #define _MYFUNC_H int myfunc(int); #endif Datei myfunc.c: #include <myfunc.h> int myfunc(int x) { return(x*2); } 7 / 22 Editoren/IDEs Prinzipiell können C-Programme mit jedem beliebigen Texteditor geschrieben werden, z. B. vi, emacs, kedit, nano. Teilweise bieten diese bereits gewisse Unterstützung bei der Programmentwicklung. z. B. Syntax-Highlighting. Speziell für die Programmentwicklung existieren spezielle Editoren bzw. Entwicklungsumgebungen (IDE integrated development environment: Eclipse mit CDT-Plugin KDevelop Bluefish Geany 8 / 22 Einführung: Manuelles Kompilieren und Linken Aus den einzelen Quelltexten wird das Programm mit folgenden Befehlen kompiliert und gelinkt: gcc -c -I. -Wall main.c gcc -c -I. -Wall myfunc.c gcc -o prog main.o myfunc.o Während des Entwicklungsprozesses muss auf folgende Dinge geachtet werden: Ändert sich eine der beiden C-Dateien, so muss diese neu kompiliert, also eine neue Object-Datei erzeugt werden. Hat sich eine der beiden Object-Dateien geändert, so muss neu gelinkt werden. 9 / 22 Handout S. 3

Grundlagen von Makefiles Der Workflow zum Kompilieren und Linken eines Programms aus verschiedenen Dateien lässt sich automatisieren. Betrachten wir folgende Datei mit dem Namen Makefile: CC=gcc CFLAGS=-I. -Wall prog: main.o myfunc.o $(CC) -o $@ $+ myfunc.o: myfunc.c myfunc.h $(CC) -c $(CFLAGS) $< main.o: main.c myfunc.h $(CC) -c $(CFLAGS) $< 10 / 22 Regeln in Makefiles Eine Regel in einem Makefile hat folgende Form: target: dep1 dep2... (TAB) Anweisung1 (TAB) Anweisung2 (TAB)... wobei innerhalb der Anweisungen folgende Variabeln definiert sind: $@ Name des Targets, $+ Alle Dateien, von denen das Target abhängt, $< Erste Datei, von der das Target abhängt. 11 / 22 Workflow im Beispiel Beim Befehl make prog soll das gleichnamige Ziel erzeugt werden. Im Makefile steht, dass das Programm von main.o und myfunc.o abhängt. main.o und myfunc.o hängen jeweils von der entsprechenden C-Datei ab sowie beide von myfunc.h ab. Abhängigkeiten werden rekursiv geprüft: Ist eine der Object-Dateien älter als die entsprechende C-Datei oder myfunc.h, so wird die entsprechende C-Datei neu kompiliert. Ist ein evtl. schon vorhandenes Programm prog älter als eine der beiden Object-Dateien, so wird neu gelinkt. 12 / 22 Handout S. 4

Phony Targets Häufig finden sich in Makefiles Targets wie: clean: rm -f abc.o xyz.o Hier wird im Ggs. zu normalen Targets keine Datei erzeugt (sondern in diesem Fall beim Build-Prozess erzeugte Dateien gelöscht). Trotzdem funktioniert das Target, es sei denn, es existiert eine Datei, die zufällig clean heißt. Dann erscheint beim Aufruf von make clean die Meldung, dass clean schon aktuell sei. Um dies zu verhindern, können Targets, die keine Dateien bezeichnen, als phony deklariert werden:.phony: clean clean: rm -f abc.o xyz.o 13 / 22 Implizite Regeln Die Regeln zum Kompilieren von main.c und myfunc.c im Beispiel vom Anfang sind faktisch identisch. Diese lassen sich durch eine allgemeine Vorschrift zum Kompilieren ersetzen. Allerdings muss hier dann noch explizit die Abhängigkeit der Object-Dateien von myfunc.h angegeben werden, sonst wird bei Änderungen in dieser Datei nicht mehr automatisch kompiliert. myfunc.o: myfunc.h main.o: myfunc.h %.o: %.o $(CC) -c $(CFLAGS) $< 14 / 22 Inkludieren von Makefiles In einem Makefile können weitere Makefiles importiert werden, z. B.: include filename.mk Dies kann verschiedene Funktionen haben: Bei einem großen Projekt mit mehreren Makefiles wird z. B. die Datei global.mk inkludiert, die in allen Makefiles benutzte Definitionen enthält; es werden Dateien inkludiert, die Abhängigkeitsinformationen für Quelldateien enthalten. Hierbei können inkludierte Makefiles von GNU-Make automatisch regeneriert werden, wenn diese selber Target sind. Dies ist insbesondere im zweiten Fall sehr nützlich, damit die Abhängigkeiten der Quelldateien immer aktuell sind. 15 / 22 Handout S. 5

Automatisches Bestimmen von Abhängigkeiten Der GNU-C-Compiler hat die Optionen -M und -MM, die einen Make-Schnipsel mit den Abhängigkeiten einer C-Datei ausgeben (im ersten Fall inklusive, im zweiten ohne System-Header). So kann der Befehl gcc -MM main.c folgende Ausgabe erzeugen: main.o: main.c myfunc.h Dies kann man sich mit folgenden Zeilen im Makefile zunutze machen: include main.d %.d:%.c gcc -M $< sed s,\($*\)\.o[ ]*:,\1.o $@ :,g > $@ 16 / 22 Konvention: Unterstützen von DESTDIR Betrachten wir folgendes Makefile: INSTALL_EXE=install -m755 -D install: $(DESTDIR)/usr/bin/myprog $(DESTDIR)/usr/bin/myprog: myprog $(INSTALL_EXE) $< $@ Mit make install wird myprog wie gewünscht nach /usr/bin installiert. Sollen die Dateien des Projekts in einem anderen Verzeichnisbaum installiert werden, so ruft man auf: make install DESTDIR=/tmp/myprog Dies ist hilfreich beim Erstellen von Software-Releases, die als Archiv weitergegeben und auf einem anderen Rechner installiert werden sollen. 17 / 22 gcc: Format der Ausgabedatei Normalerweise versucht der GNU-C-Compiler gcc direkt ein ausführbares Programm zu erzeugen, beim Aufruf von gcc xyz.c unter dem Namen a.out, bei gcc -o myprog xyz.c als myprog. Mit folgenden Optionen kann die Verarbeitung der Datei vorher abgebrochen werden: -E Nur Präprozessing, z. B. Ersetzen von #define. -S Nur Kompilieren, ohne Assemblieren. Ausgabe ist eine Datei mit Assemblercode unter dem Namen xyz.s. -c Kompilieren und Assemblieren, aber nicht Linken. Ausgabedatei heißt xyz.o. 18 / 22 Handout S. 6

Weitere Optionen -Wall Zeigt besonders viele Warnungen an. -Werror Warnungen werden als Fehler behandelt, führen also zum Abbruch. -I Zusätzliches Verzeichnis, wo Headerdateien gesucht werden. -l Eine Bibliothek wird dazugelinkt. Achtung: vor den Namen wird automatisch der String lib gestellt, bei -lpthread wird also die Datei libpthread.so (dynamische Bibliothek) bzw. libpthread.a (statisch) hinzugelinkt. -L Zusätzliches Verzeichnis, wo Bibliotheken gesucht werden. 19 / 22 Was passiert beim Kompilieren eines Quelltextes? Betrachten wir folgenden Quelltext in der Datei test.c : #include <stdio.h> int glob_var1 = 7; int glob_var2; const int glob_var3 = 99; int glob_var4 = 77; int main() { int lokal_var = 111; int glob_var2 = 192; printf("werte: %d %d %d %d\n", glob_var1, glob_var2, glob_var3, lokal_var); return(0); } 20 / 22 Sections für Anweisungen und Daten Beim Kompilieren landen die globalen Variablen in folgenden Sections: Initialisierte Daten in der Section.data (les- und schreibbar) Konstante Daten in der Section.rodata (nur lesbar) Nicht initialisierte globale Variablen werden wie lokale Variablen auf dem Stack abgelegt. Der Maschinencode der Funktion main() landet in der Section.text. Diese Sections lassen sich über der Prozess zum Erzeugen des ausführbaren Programms mit den Programmen objdump und readelf nachverfolgen. 21 / 22 Handout S. 7

Optionen Optionen von objdump: -h Vorhandene Sections -t Tabelle der verwendeten Symbole -d -j.text Disassemblieren der Section.text -s -j.data Inhalt der Section.data Optionen von readelf -h Header-Informationen zum Programm -S Sections -s Symbole -x.rodata Hexdump der Section.rodata 22 / 22 Handout S. 8