From 3605c8958e8e2beb32b4c9b0fe166d561d3cfa4f Mon Sep 17 00:00:00 2001 From: Jan Altenberg Date: Tue, 25 Jan 2011 17:20:16 +0100 Subject: Added a basic introduction ti libraries: - Creating static and shared libraries - Naming schemes for dynamic libraries --- .../embedded-devel/pres_embedded-devel_de.tex | 104 +++++++++++++++++++++ 1 file changed, 104 insertions(+) (limited to 'application-devel/embedded-devel/pres_embedded-devel_de.tex') diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex index 889d49a..ef31830 100644 --- a/application-devel/embedded-devel/pres_embedded-devel_de.tex +++ b/application-devel/embedded-devel/pres_embedded-devel_de.tex @@ -287,6 +287,110 @@ $ addr2line -e hello 40050c \end{lstlisting} \end{frame} +\section{Bibliotheken} +\subsection{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} + +\subsection{Dynamische Bibliotheken} + +\begin{frame}[fragile] +\frametitle{Dynamische Bibliotheken} +\begin{lstlisting} +# Erstellen dynamischer Bibliotheken +$ gcc -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 -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} + \section{Buildprozess automatisieren} \subsection{Übersicht} \begin{frame} -- cgit v1.2.3 From 572647504a3d7f62405e19ac44916bbae9d1bb82 Mon Sep 17 00:00:00 2001 From: Jan Altenberg Date: Fri, 28 Jan 2011 12:38:50 +0100 Subject: Fixed shared library example. --- application-devel/embedded-devel/pres_embedded-devel_de.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'application-devel/embedded-devel/pres_embedded-devel_de.tex') diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex index ef31830..0623724 100644 --- a/application-devel/embedded-devel/pres_embedded-devel_de.tex +++ b/application-devel/embedded-devel/pres_embedded-devel_de.tex @@ -306,7 +306,7 @@ $ gcc -o hello hello.o libhello.a \frametitle{Dynamische Bibliotheken} \begin{lstlisting} # Erstellen dynamischer Bibliotheken -$ gcc -fPIC file1.c file2.c +$ 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 @@ -331,7 +331,7 @@ Adresse lauffähig ist. \frametitle{SONAME} \begin{lstlisting} # Erstellen dynamischer Bibliotheken -$ gcc -fPIC file1.c file2.c +$ gcc -c -fPIC file1.c file2.c $ gcc -shared -Wl,-soname,libsayhello.so \ -o libhello.so file1.o file2.o \end{lstlisting} -- cgit v1.2.3