Compiler un programme en un binaire statique

Bonjour à tous

Je souhaite compiler “putty” en statique de sorte à pouvoir le lancer aussi bien sous une Mandrake 9.0, une Debian sarge, et une Ubuntu breezy.

Je ne peux le compiler que sur ma Debian testing chez moi, sur les postes où je vais l’utiliser les bibliothèques partagées ne sont pas toutes disponibles et encore moins dans leur version de développement…

J’ai tenté d’ajouter “-static” dans la variable CFLAGS du fichier “unix/Makefile.gtk”, mais ça ne donne pas grand chose de bon… A savoir :

[quote]$ ldd putty
linux-gate.so.1 => (0xffffe000)
libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0xb7e75000)
libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0xb7e3f000)
libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0xb7e3c000)
libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0xb7e16000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e12000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb7e09000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb7dfb000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7d34000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7d0f000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7bde000)
/lib/ld-linux.so.2 (0xb7fbb000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb7bda000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7bd5000)[/quote]

Existe-t-il une solution ?

Et plus généralement, comment faire pour compiler un programme en statique ?

Merci d’avance pour vos réponses, je me doute que tout ne peut pas être compilé de cette façon mais j’aimerais bien apprendre, mes recherches ne sont pas très fructueuses
:unamused:

hello,

As tu essayé le flag “–enable-static” ?

En ajoutant cette option dans la CFLAGS du Makefile.gtk et ensuite dans la ligne contenant le ‘-o’, ça ne change rien j’ai toujours un binaire non statique :confused:

[quote]
[…]
/usr/bin/gcc-3.3 -enable-static -O2 -Wall -Werror -g -I…/./ -I…/charset/ -I…/windows/ -I…/unix/ -I…/mac/ -I…/macosx/ gtk-config --cflags -c …/wildcard.c
/usr/bin/gcc-3.3 -enable-static -O2 -Wall -Werror -g -I…/./ -I…/charset/ -I…/windows/ -I…/unix/ -I…/mac/ -I…/macosx/ gtk-config --cflags -c …/x11fwd.c
/usr/bin/gcc-3.3 -enable-static -O2 -Wall -Werror -g -I…/./ -I…/charset/ -I…/windows/ -I…/unix/ -I…/mac/ -I…/macosx/ gtk-config --cflags -c …/charset/xenc.c
/usr/bin/gcc-3.3 -enable-static -O2 -Wall -Werror -g -I…/./ -I…/charset/ -I…/windows/ -I…/unix/ -I…/mac/ -I…/macosx/ gtk-config --cflags -c …/unix/xkeysym.c
/usr/bin/gcc-3.3 gtk-config --libs --enable-static -o putty be_all.o cmdline.o config.o cproxy.o
dialog.o fromucs.o gtkcfg.o gtkcols.o gtkdlg.o gtkpanel.o
gtkwin.o ldisc.o ldiscucs.o localenc.o logging.o macenc.o
mimeenc.o minibidi.o misc.o pinger.o portfwd.o proxy.o raw.o
rlogin.o sbcs.o sbcsdat.o settings.o slookup.o ssh.o
sshaes.o sshblowf.o sshbn.o sshcrc.o sshcrcda.o sshdes.o
sshdh.o sshdss.o sshmd5.o sshpubk.o sshrand.o sshrsa.o
sshsh512.o sshsha.o sshzlib.o telnet.o terminal.o time.o
timing.o toucs.o tree234.o utf8.o ux_x11.o uxagentc.o
uxcfg.o uxmisc.o uxnet.o uxnoise.o uxprint.o uxproxy.o
uxputty.o uxsel.o uxsignal.o uxstore.o uxucs.o version.o
wcwidth.o wildcard.o x11fwd.o xenc.o xkeysym.o

$ ldd putty
linux-gate.so.1 => (0xffffe000)
libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0xb7e38000)
libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0xb7e02000)
libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0xb7dff000)
libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0xb7dd9000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7dd5000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb7dcc000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb7dbe000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7cf7000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7cd2000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ba1000)
/lib/ld-linux.so.2 (0xb7f7e000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb7b9d000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7b98000)[/quote]

Je déplace ds “Support Debian”

hello,

Pase le Makefile, les sources pour que je puisse tester.

Ici : the.earth.li/~sgtatham/putty/lat … .58.tar.gz

Support Debian, ça me laisse sceptique, mon but est avant tout de rendre le binaire exécutable partout :wink:

Ou alors la compilation change aussi d’une distribution à l’autre ? :open_mouth:

L’édition de lien à la fin n’utilise pas les flags, et elle se fait donc en dynamique. sinon quand tu fait l’édition de liens en statique, tu obtiens les messages

uxmisc.o(.text+0xf8): In function `get_username’:
/tmp/putty-0.58/unix/…/unix/uxmisc.c:82: warning: Using ‘getpwnam’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
uxmisc.o(.text+0x111):/tmp/putty-0.58/unix/…/unix/uxmisc.c:97: warning: Using ‘getpwuid’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

Bref, il y a des fonctions utilisant des librairies qui appellent d’autres librairies. Tu es parti pour compiler un paquet de trucs…

Pour faire la compilation change
CC = $(TOOLPATH)cc
en
CC = $(TOOLPATH)cc -static

Je suppose que quasi toutes les bibliothèques de la distrib sont compilées en shared… Donc c’est peine perdue en quelques sortes ? :wink:

oui. AMA, tu fais une liste du minimum de libs à installer pour chaque distrib :frowning: .
ou tu prends openssh comme tout le monde :wink:

J’utilise putty sous SSH pour le ssh tunnelling et sous une vielle mandrake dont le ssh semblait pas supporter encore la redirection de ports.

Maintenant que ce sont des Ubuntu, et que je peux passer à travers le proxy HTTP, ça va mieux… Mais cette question de compiler un programme en statique continue de m’intéresser :wink:

Pour la compilation en statique, le mieux est quand même d’utiliser diet gcc. Inconvénient: tout n’est pas possible loin de là, mais les petits utilitaires systèmes se compilent très bien:

$ gcc -static -o linuxrc linuxrc.c $ ls -l linuxrc -rwxr-xr-x 1 francois francois 486576 2006-10-13 22:00 linuxrc $ ldd linuxrc not a dynamic executable $ gcc -o linuxrc linuxrc.c $ ls -l linuxrc -rwxr-xr-x 1 francois francois 26723 2006-10-13 22:00 linuxrc $ ldd linuxrc libc.so.6 => /lib/libc.so.6 (0x40028000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) $ diet gcc -o linuxrc linuxrc.c /usr/lib/diet/lib-i386/libc.a(stderr.o)(.text+0x7): In function `__fflush_stderr': : warning: warning: your code uses stdio (7+k bloat). /usr/lib/diet/lib-i386/libc.a(vprintf.o)(.text+0x3d): In function `vprintf': : warning: warning: the printf functions add several kilobytes of bloat. $ ls -l linuxrc -rwxr-xr-x 1 francois francois 31084 2006-10-13 22:01 linuxrc $ ldd linuxrc not a dynamic executable $
diet gcc n’inclut que les fonctions réellement utilisées et pas la librairie entière ce qui donne une différence de taille importante (31K au lieu de 480K à comparer avec les 27K du binaire dynamique sur l’exemple ci dessus).
Malheureusement, tout ne passe pas avec diet gcc.

[bizarre c’était dans trucs et astuces, je met un message et hop dans support debian]

Les dépendances qui foirent ne sont pas seulement liées à libc, donc je pense pas que cette méthode m’apporte quelque chose… Si ?

Désolé si je me trompe :wink:

Non, j’avais mis ça parce que ce post s’était retrouvé dans Trucs et Astuces

[quote=“fran.b”]Non, j’avais mis ça parce que ce post s’était retrouvé dans Trucs et Astuces[/quote]Quelqu’un l’aura basculé de section au moment ou tu postais.

Je pensais aussi que les méthodes pour faire des chroots minimaux pour installer un service pouvaient servir. C’est la même démarche, sauf que dans le cas d’un chroot, c’est pour savoir quelles librairies copier.

Mais je ne suis pas un pros des commandes pour trouver les infos de linkage d’un exe.

Tu as un script de ce type dans «Comment faire un paquet» pour trouver les dépendances… (5ième paquet)