summaryrefslogtreecommitdiff
path: root/application-devel/embedded-devel/pres_embedded-devel_de.tex
diff options
context:
space:
mode:
authorManuel Traut <manut@linutronix.de>2011-02-03 19:12:11 +0100
committerManuel Traut <manut@linutronix.de>2011-02-03 19:12:11 +0100
commita5bbf8777a5886aa6cba798404b996fb459981cc (patch)
tree20ab742e03dd3991c8f30df7fb3acb1b83cde913 /application-devel/embedded-devel/pres_embedded-devel_de.tex
parent883042d9f2ac38c464e1472219a1a4492b45b5de (diff)
parent2354b12678f07579815356ec10eef193a64bb2a6 (diff)
Merge branch 'master' of ssh://tglx.de/home/linutronix/git/schulung
Diffstat (limited to 'application-devel/embedded-devel/pres_embedded-devel_de.tex')
-rw-r--r--application-devel/embedded-devel/pres_embedded-devel_de.tex105
1 files changed, 105 insertions, 0 deletions
diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex
index 31b7a38..22e0d8d 100644
--- a/application-devel/embedded-devel/pres_embedded-devel_de.tex
+++ b/application-devel/embedded-devel/pres_embedded-devel_de.tex
@@ -274,8 +274,113 @@ $ addr2line -e hello 40050c
\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.1.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?}