Linux gcc, statisch linken
2010-07-08 13:58
Anonymer User
Ich habe mir ein kleines C-Programm geschrieben, das ich gerne auf meinem Webserver laufen lassen will. Das Problem ist, dass ich Funktionen von poppler und cairo verwende, die ich auf dem Webserver leider nicht nachinstallieren kann. Deswegen würde ich das Binary gerne statisch linken.
Das normale (dynamaisch gelinkte) Binary wird erzeugt und läuft auch einwandfrei:
Ausgabe von ldd:
Will ich das ganze jetzt statisch linken will:
Gibts folgenden Fehler:
Was ich nicht verstehe: Wieso funktioniert das dynamische linken (und zur Laufzeit das laden der richtigen Libs), aber das statische Linken nicht?
Das normale (dynamaisch gelinkte) Binary wird erzeugt und läuft auch einwandfrei:
cc $(pkg-config --cflags --libs poppler-glib poppler-cairo) -o pdf2png pdf2png.c
Ausgabe von ldd:
linux-vdso.so.1 => (0x00007fff257ff000)
libpoppler-glib.so.5 => /usr/lib/libpoppler-glib.so.5 (0x00007fe468cac000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0x00007fe4689f2000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0x00007fe4687d6000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007fe4685c9000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0x00007fe46837e000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fe468137000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fe467f33000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fe467c4e000)
libpoppler.so.6 => /usr/lib/libpoppler.so.6 (0x00007fe467833000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0x00007fe4675b0000)
libc.so.6 => /lib/libc.so.6 (0x00007fe467254000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fe466fbc000)
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6 (0x00007fe466cb1000)
libm.so.6 => /lib/libm.so.6 (0x00007fe466a2e000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe466817000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0x00007fe4665ed000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0x00007fe4663ea000)
libXi.so.6 => /usr/lib/libXi.so.6 (0x00007fe4661da000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fe465fd1000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0x00007fe465dc6000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0x00007fe465bc3000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fe4659b0000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0x00007fe4657ad000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0x00007fe4655a7000)
libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0x00007fe46534c000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fe465117000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fe464eed000)
libglitz-glx.so.1 => /usr/lib/libglitz-glx.so.1 (0x00007fe464ce6000)
libGL.so.1 => //usr/lib64/opengl/nvidia/lib/libGL.so.1 (0x00007fe464ae7000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe4648cb000)
libglitz.so.1 => /usr/lib/libglitz.so.1 (0x00007fe4646a1000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0x00007fe46447b000)
libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007fe464277000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fe46406e000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007fe463e64000)
libz.so.1 => /lib/libz.so.1 (0x00007fe463c4e000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fe463914000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fe4636f6000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fe4634f2000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fe4632ec000)
libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fe46303e000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00007fe462e27000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fe462c23000)
libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007fe4629ea000)
libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe462798000)
liblcms.so.1 => /usr/lib/liblcms.so.1 (0x00007fe46255e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007fe462203000)
libpng14.so.14 => /usr/lib/libpng14.so.14 (0x00007fe461fdc000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe468ee7000)
libGLcore.so.1 => //usr/lib64/opengl/nvidia/lib/libGLcore.so.1 (0x00007fe460346000)
libnvidia-tls.so.1 => //usr/lib64/opengl/nvidia/lib/libnvidia-tls.so.1 (0x00007fe468fc3000)
libldap-2.4.so.2 => /usr/lib/libldap-2.4.so.2 (0x00007fe460104000)
librt.so.1 => /lib/librt.so.1 (0x00007fe45fefb000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007fe45fca7000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007fe45f91c000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fe45f6c3000)
liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00007fe45f4b4000)
Will ich das ganze jetzt statisch linken will:
cc $(pkg-config --cflags --libs poppler-glib poppler-cairo) -static -o pdf2png pdf2png.c
Gibts folgenden Fehler:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpoppler-glib
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgdk-x11-2.0
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgdk_pixbuf-2.0
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpangocairo-1.0
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpango-1.0
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpoppler
Was ich nicht verstehe: Wieso funktioniert das dynamische linken (und zur Laufzeit das laden der richtigen Libs), aber das statische Linken nicht?