diff options
| author | John Ogness <john.ogness@linutronix.de> | 2018-02-20 15:33:14 +0100 |
|---|---|---|
| committer | John Ogness <john.ogness@linutronix.de> | 2018-02-20 15:33:14 +0100 |
| commit | 0351969fdffa9959921d8ec38b7d0d7cf095fcd0 (patch) | |
| tree | 168fe35c8d3324b11181098dd7c09d0fa409f88d /application-devel/embedded-devel | |
| parent | ffce744d7d8a0f7a6846164bfc16fc0753683127 (diff) | |
remove german slides when english are available
Remove german slides if a completely translated english version is
available. For slides that have been translated to english, but do
not contain all the information of the german slides, the german
slides are still available. But they are only available for
reference. That will not be built.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Diffstat (limited to 'application-devel/embedded-devel')
| -rw-r--r-- | application-devel/embedded-devel/Makefile | 1 | ||||
| -rw-r--r-- | application-devel/embedded-devel/pres_embedded-devel_de.tex | 493 |
2 files changed, 0 insertions, 494 deletions
diff --git a/application-devel/embedded-devel/Makefile b/application-devel/embedded-devel/Makefile index 336a755..08752ae 100644 --- a/application-devel/embedded-devel/Makefile +++ b/application-devel/embedded-devel/Makefile @@ -1,3 +1,2 @@ obj-$(CONFIG_DEVEL_EMBEDDED) += hints_embedded-devel_de.pdf -obj-$(CONFIG_DEVEL_EMBEDDED) += pres_embedded-devel_de.pdf obj-$(CONFIG_DEVEL_EMBEDDED) += pres_embedded-devel_en.pdf 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} |
