diff options
Diffstat (limited to 'application-devel/embedded-devel/pres_embedded-devel_de.tex')
| -rw-r--r-- | application-devel/embedded-devel/pres_embedded-devel_de.tex | 493 |
1 files changed, 0 insertions, 493 deletions
diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex deleted file mode 100644 index e8f2e87..0000000 --- a/application-devel/embedded-devel/pres_embedded-devel_de.tex +++ /dev/null @@ -1,493 +0,0 @@ -\input{configpres} - -\title{\lq (Embedded) LINUX Applikationsentwicklung\rq} -\maketitle - -\begin{frame} -\frametitle{Übersicht} -\tableofcontents -\end{frame} - -\subsection{Der GNU Compiler} -\subsubsection{Hello world} -\begin{frame}[fragile] -\frametitle{Der GNU Compiler} -\begin{lstlisting}[language=c] -/* hello.c */ -#include <stdio.h> - -int main(void) -{ - printf("Hello world\n"); - return 0; -} -\end{lstlisting} -\begin{lstlisting}[language=bash] -# Uebersetzen des Testprogramms -gcc -o hello hello.c -\end{lstlisting} -\end{frame} - -\subsubsection{Wichtige Optionen} -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Nur Objectfile erzeugen -gcc -c -o hello.o hello.c - -# Uebersetzen mit Optimierungslevel 3 -gcc -O3 -o hello hello.c - -# Ohne Optimierung und mit -# Debugsymbolen uebersetzen -gcc -O0 -g hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Gegen zusaetzliche Bibliothek linken (librt.so) -gcc -lrt -o hello hello.c - -# Suchpfad fuer Bibliotheken hinzufuegen -gcc -L /mypath -lrt -o hello hello.c - -# Suchpfad fuer Includes hinzufuegen -gcc -I /mypath -o hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Alle Warnings ausgeben -gcc -Wall -o hello hello.c - -# Warnings als Fehler behandeln -gcc -Werror -o hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{GCC: Nützliches} -\begin{lstlisting}[language=bash] -# Vordefinierte / Interne Makros ausgeben -$ gcc -E -dM - < /dev/null | cut -c 9- | sort -[...] -__SIZEOF_DOUBLE__ 8 -__SIZEOF_FLOAT__ 4 -__SIZEOF_INT__ 4 -__SIZEOF_LONG__ 8 -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{GCC: Nützliches} -\begin{lstlisting}[language=bash] -# Nur Pre-Prozessor ausfuehren -$ gcc -C -E hello.c -o hello_pre - -# Woher kommt welches Symbol? -$ gcc -Wl,-y,printf hello.c -/lib/libc.so.6: definition of printf -\end{lstlisting} -Quelle und weitere nuetzliche Tipps: http://elinux.org/GCC\_Tips -\end{frame} - -\subsection{Der Dynamic Loader} -\begin{frame} -\frametitle{Der Dynamic Loader: ld-linux.so} -\begin{alertblock}{Was ist der Dynamic Loader?} -Der Dynamic Loader: ld-linux.so lädt die dynamischen Bibliotheken, die von einem Programm -benötigt werden. Er ist Bestandteil der C Bibliothek. -\end{alertblock} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: ld-linux.so} -\begin{lstlisting}[language=bash] -# Entweder -./hello - -# oder -/lib/ld-linux-x86-64.so.2 ./hello -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: Umgebungsvariablen} -\begin{tabular}{|l|p{5cm}|} -\hline -\textbf{Umgebungsvariable} & \textbf{Abkürzung} \\ -\hline -LD\_LIBRARY\_PATH & Suchpfad für Bibliotheken \\ -\hline -LD\_PRELOAD & Liste von Bibliotheken, die vor allen anderen zu laden sind \\ -\hline -LD\_DEBUG & Debug Ausgaben \\ -\hline -\end{tabular} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: Umgebungsvariablen} -\begin{lstlisting}[basicstyle=\ttfamily\fontsize{9}{9}\selectfont] -$ LD_DEBUG=help ./hello -Valid options for the LD_DEBUG environment -variable are: - - libs display library search paths - reloc display relocation processing - files display progress for input file - symbols display symbol table processing - bindings display information about symbol binding - versions display version dependencies - all all previous options combined - statistics display relocation statistics - unused determined unused DSOs - help display this help message and exit -\end{lstlisting} -\end{frame} - -\begin{frame} -\frametitle{Der Dynamic Loader: Suchreihenfolge} -\begin{enumerate} -\item DT\_RPATH dynamic subsection (ELF) -\item LD\_LIBRARY\_PATH -\item DT\_RUNPATH dynamic subsection (ELF) -\item ld.so.cache -\item /lib bzw. /usr/lib -\end{enumerate} -\end{frame} - -\subsection{Die Binutils} -\subsubsection{Übersicht} -\begin{frame} -\frametitle{Die Binutils} -Eine Sammlung von Programmen zum Erstellen / Bearbeiten von Binaries. -Die wichtigsten Tools sind: -\begin{itemize} -\item Der GNU Linker (ld) -\item Der GNU Assembler (as) -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Weitere Programme der Binutils} -\begin{itemize} -\item \textbf{addr2line}: Ordnet Adressen Zeilennummern zu -\item \textbf{gprof}: Profiler -\item \textbf{nm}: Listet Symbole in Objectfiles -\item \textbf{objcopy}: Kopiert und konvertiert Objectfiles -\item \textbf{objdump}: Listet Informationen zu Objectfiles -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Weitere Programme der Binutils} -\begin{itemize} -\item \textbf{ranlib}: Generiert den Index zu einem Archivinhalt -\item \textbf{readelf}: Zeigt Informationen zu ELF Files -\item \textbf{size}: Listet die Sektionsgrößen für Object- oder ELF Files -\item \textbf{strip}: Entfernt Symbole -\end{itemize} -\end{frame} - -\subsubsection{objdump} -\begin{frame}[containsverbatim] -\frametitle{Untersuchen von Binaries mit Objdump} -\begin{lstlisting}[language=bash] -jan@hopfropf:~$ objdump -x /bin/ls -/bin/ls: file format elf64-x86-64 -/bin/ls -architecture: i386:x86-64, flags 0x00000112: -EXEC_P, HAS_SYMS, D_PAGED -start address 0x0000000000402490 - -Program Header: - PHDR off 0x0000000000000040 vaddr [...] - filesz 0x00000000000001f8 memsz [...] -[...] -Dynamic Section: - NEEDED librt.so.1 -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Untersuchen von Binaries mit Objdump} -\begin{lstlisting}[language=bash] -Version References: - required from librt.so.1: - 0x09691a75 0x00 07 GLIBC_2.2.5 -[...] -Sections: -Idx Name Size VMA [...] - 0 .interp 0000001c 000000000040 [...] - CONTENTS, ALLOC, LOAD, [...] - 1 .note.ABI-tag 00000020 000000000040 [...] - CONTENTS, ALLOC, LOAD, [...] -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Bibliotheksabhängigkeiten mit objdump bestimmen} -\begin{lstlisting}[language=bash] -jan@hopfropf:~$ objdump -x /bin/ls | grep NEEDED - NEEDED librt.so.1 - NEEDED libselinux.so.1 - NEEDED libacl.so.1 - NEEDED libc.so.6 -\end{lstlisting} -\end{frame} - -\subsubsection{objcopy} -\begin{frame}[fragile] -\frametitle{Binaries bearbeiten mit objcopy} -\begin{lstlisting}[language=bash] -# 64bit ELF ins SREC Format kopieren -objcopy -I elf64-x86-64 -O srec hello hello.srec -# SREC in 64 bit ELF kopieren -objcopy -I srec -O elf64-x86-64 hello.srec hello -\end{lstlisting} -\end{frame} - -\subsubsection{addr2line} -\begin{frame}[containsverbatim] -\frametitle{Adressen zuordnen mit addr2line} -\begin{lstlisting}[language=bash] -objdump -D hello | less -\end{lstlisting} -\begin{verbatim} -[...] -000000000040050c <main>: - 40050c: 55 push %rbp - 40050d: 48 89 e5 mov %rsp,%rbp -[...] -\end{verbatim} -\begin{lstlisting}[language=bash] -$ addr2line -e hello 40050c -/home/jan/work/examples/hello.c:4 -\end{lstlisting} -\end{frame} - -\subsection{Bibliotheken} -\subsubsection{Statische Bibliotheken} -\begin{frame}[fragile] -\frametitle{Statische Bibliotheken} -\begin{lstlisting} -# Erstellen -$ gcc -c file1.c file2.c -$ ar r libhello.a file1.o file2.o -# Benutzen -$ gcc -o hello hello.o libhello.a -\end{lstlisting} -\end{frame} - -\subsubsection{Dynamische Bibliotheken} - -\begin{frame}[fragile] -\frametitle{Dynamische Bibliotheken} -\begin{lstlisting} -# Erstellen dynamischer Bibliotheken -$ gcc -c -fPIC file1.c file2.c -$ gcc -shared -o libhello.so file1.o file2.o -# Gegen die Bibliothek linken -$ gcc -o hello hello.c libhello.so -# Versuchen Sie nun das Programm zu starten -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wir erinnern uns an den Dynamic Loader!} -Also, entweder LD\_LIBRARY\_PATH setzen, oder nach /lib bzw. /usr/lib -kopieren. -\end{frame} - -\begin{frame} -\frametitle{\textbf{P}osition \textbf{Independent} \textbf{Code}} -Die Option -fPIC bewirkt die Erzeugung von ''position independent code''. -Das heißt, es wird Code erzeugt, der zur Laufzeit an jeder beliebigen virtuellen -Adresse lauffähig ist. -\end{frame} - -\begin{frame}[fragile] -\frametitle{SONAME} -\begin{lstlisting} -# Erstellen dynamischer Bibliotheken -$ gcc -c -fPIC file1.c file2.c -$ gcc -shared -Wl,-soname,libsayhello.so \ - -o libhello.so file1.o file2.o -\end{lstlisting} -Die -soname Linker-Option bewirkt, daß beim Linken der Name -''libsayhello.so'' eingetragen wird. Das heißt der Loader -sucht beim Starten der Applikation nach einer Bibliothek mit -dem Namen ''libsayhello.so''. -\end{frame} - -\begin{frame} -\frametitle{Namensgebung} -\begin{itemize} -\item linker name -\item SONAME -\item real name -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Namensgebung} -\begin{verbatim} -libhello.so.1 -> libhello.so.1.0.2 -# New minor version -libhello.so.1 -> libhello.so.1.0.3 -# New Major version -libhello.so.2 -> libhello.so.2.0.1 -\end{verbatim} -SONAME beeinhaltet die Majornumber. Der Symbolic Link mit -der Majornumber(SONAME) zeigt normalerweise auf die Bibliotheksversion -mit der aktuellsten Minornumber (real name). -\end{frame} - -\begin{frame}[fragile] -\frametitle{Namensgebung} -\begin{verbatim} -libhello.so -> libhello.so.1 -\end{verbatim} -Oft wird auch ein Link ohne Versionsnummer angelegt, der auf die -aktuellste Majornumber Zeigt. Man spricht hier vom sogenannten -''linker name''. -\end{frame} - -\begin{frame}[fragile] -\frametitle{DT\_RPATH und DT\_RUNPATH} -\begin{lstlisting} -$ gcc -Wl,-rpath,/mypath -o hello hello.c \ - libhello.so -\end{lstlisting} --rpath erzeugt per Default DT\_RPATH. Um DT\_RUNPATH zu erzeugen, -benötigt man die Option --enable-new-dtags. Beispiel: -\begin{lstlisting} -$ gcc -Wl,--enable-new-dtags \ - -Wl,-rpath,/mypath \ - -o hello hello.c libhello.so -# Was faellt bei folgendem Kommando auf: -$ objdump -p hello | grep PATH -\end{lstlisting} -\end{frame} - -\subsection{Buildprozess automatisieren} -\subsubsection{Übersicht} - -\begin{frame} -\frametitle{GNU make} -\begin{alertblock}{Was ist GNU make?} -GNU make kontrolliert und automatisiert Buildprozesse. -\end{alertblock} -\end{frame} - -\subsubsection{Anwendungsbeispiele} -\begin{frame}[containsverbatim] -\frametitle{Einfaches Beispiel} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -# Makefile - -hello: hello.o - gcc -o $@ $< - -hello.o: hello.c - gcc -c -o $@ $< - -clean: - rm -rf hello hello.o -\end{lstlisting} -\end{frame} - -\begin{frame} -\frametitle{Aufgabe} -\begin{itemize} -\item Erstellen Sie ein Beispielprojekt mit einem Hallo Welt Programm und dem -im Beispiel aufgeführten Makefile -\item Übersetzen Sie das Programm -\item Erstellen Sie eine Datei mit dem Namen clean und führen make clean aus -(Was passiert?!) -\end{itemize} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Problem} -\begin{lstlisting}[language=bash] -$ make -gcc -c -o hello.o hello.c -gcc -o hello hello.o -$ touch clean -$ make clean -make: `clean' is up to date. -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{PHONY targets} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -hello: hello.o - gcc -o $@ $< - -hello.o: hello.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf hello hello.o -\end{lstlisting} -Aufgabe: Erweitern Sie Ihr Makefile um das PHONY target und führen Sie erneut -make clean aus. -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Regeln mit Pattern} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -hello: hello.o - gcc -o $@ $< - -%.o: %.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf hello hello.o -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Variablen} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -EXE = hello -OBJ = $(EXE).o - -$(EXE): $(OBJ) - gcc -o $@ $< - -%.o: %.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf $(EXE) $(OBJ) -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Pattern substitution} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -SRC = hello.c hello1.c -OBJ = $(SRC:%.c=%.o) -[...] -\end{lstlisting} -\end{frame} - -\input{tailpres} |
