Dynamisk länkning och shared objects i FreeBSD: Difference between revisions
mNo edit summary |
mNo edit summary |
||
Line 14: | Line 14: | ||
│ ├── Makefile | │ ├── Makefile | ||
│ ├── foo.c | │ ├── foo.c | ||
│ | │ ├── foo.h | ||
├── main.c | │ ├── libfoo.so -> libfoo.so.1.0 | ||
│ └── libfoo.so.1 -> libfoo.so.1.0 | |||
└── main.c | |||
</pre> | </pre> | ||
Line 26: | Line 27: | ||
</pre> | </pre> | ||
}} | }} | ||
För att sedan länka ihop libfoo.so så använder vi följande kommando: | För att sedan länka ihop libfoo.so.1 så använder vi följande kommando: | ||
{{Box Kommando|Länka libfoo.so| | {{Box Kommando|Länka libfoo.so| | ||
<pre> | <pre> | ||
gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 foo.o | gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 foo.o | ||
</pre> | </pre>}} | ||
Optionen <tt>-shared</tt> används för att skapa ett shared object (so-fil). Optionen <tt>-Wl,-soname,libfoo.so.1</tt> är en länkar option <tt>-soname libfoo.so.1</tt>. Denna option sätter en ELF variabel (DT_SONAME). När ett program laddas och detta är länkat mot ett shared object som har DT_SONAME satt, då kommer den dynamiska laddaren gå på DT_SONAME istället för filnamnet. Mer om detta senare. Vi har nu skapat en fil som heter libfoo.so.1.0 | |||
=== Bygga och länka myapp === | |||
Vår exekverbar fil består av källkoden main.c men behöver en funktion i libfoo.so för att kunna köras. Vi kompilerar källkoden med kommandot: | |||
{{Box Kommando|Kompilera main.c | |||
<pre> | |||
gcc -std=c99 -Wall -Wextra -Wno-unused -O2 -Ilib -c main.c -o main.o | |||
</pre>}} | |||
Och för att länka ihop programmet myapp: | |||
{{Box Kommando|Kompilera main.c | |||
<pre> | |||
gcc -Llib main.o -lfoo -o myapp | |||
</pre>}} | |||
[[Category:FreeBSD]] | [[Category:FreeBSD]] |
Revision as of 16:16, 1 January 2012
Detta ämne är under utveckling.
Problem med dynamisk länkning är ofta det som strular när man ska kompilera länka ihop något större program. Särskilt om man inte är root på systemet och måste installera sina program på andra ställen än systemets standardställen.
Bygga och länka mot en so-fil
Vi börjar med ett exempel på ett litet program som består av en exekverbar fil + en so-fil. Detta exempel kommer sedan användas för att åskådliggöra problemen runt so-filer och dynamisk länkning. Vår filstruktur i exemplet är:
. ├── Makefile ├── lib │ ├── Makefile │ ├── foo.c │ ├── foo.h │ ├── libfoo.so -> libfoo.so.1.0 │ └── libfoo.so.1 -> libfoo.so.1.0 └── main.c
Bygga och länka libfoo.so
Källkoden till libfoo.so ligger i foo.c och dess interface i foo.h. När vi kompilerar koden måste vi använda -fPIC flaggan. Vi använder det fullständiga kommandot: Template:Box Kommando För att sedan länka ihop libfoo.so.1 så använder vi följande kommando: Template:Box Kommando Optionen -shared används för att skapa ett shared object (so-fil). Optionen -Wl,-soname,libfoo.so.1 är en länkar option -soname libfoo.so.1. Denna option sätter en ELF variabel (DT_SONAME). När ett program laddas och detta är länkat mot ett shared object som har DT_SONAME satt, då kommer den dynamiska laddaren gå på DT_SONAME istället för filnamnet. Mer om detta senare. Vi har nu skapat en fil som heter libfoo.so.1.0
Bygga och länka myapp
Vår exekverbar fil består av källkoden main.c men behöver en funktion i libfoo.so för att kunna köras. Vi kompilerar källkoden med kommandot:
Och för att länka ihop programmet myapp: Template:Box Kommando