> Langages compilés (C en fait)
> =============================
>
> Ici c'est Lucas Nussbaum qui remporte la palme avec un exécutable de 716
> octets compilé avec diet. Cependant, à lire la description dans le site
> web en question, il n'est pas clair si son Hello, World! est lié
> statiquement ou dynamiquement. Est-ce que tu pourrais me l'envoyer, pour
> voir ?
>
> > Alors, je gagne quoi ? :)
>
> Si c'est statique, une bière à la prochaine bouffe Guilde, car je suis
> content d'avoir appris l'existemnce de diet. Si c'est du dynamique, rien
> du tout, car sur la plupart des Linux il ne tournera pas.
$ ldd hello
not a dynamic executable
> $ cat hello.c
> #include <linux/unistd.h>
> int errno;
> static inline _syscall3(int, write,
> int, fd, const void *, buf, int, count);
> static inline _syscall1(int, exit, int, status);
> void _start(void) { write(1, "Hello, World!\n", 14); exit(0); }
> $ gcc -w -O -c hello.c
> $ ld hello.o -o hello
> $ strip hello
> $ wc -c hello
> 916 hello
> $ ./hello && echo ni!
> Hello, World!
> ni!
Avec exactement les memes instructions et le meme code, et sans utiliser
dietlibc, je suis à 572 octets.
> $ cat hello.c
> #include <linux/unistd.h>
> #undef __syscall_return
> #define __syscall_return(type, res) return (type) (res)
> static inline _syscall3(int, write,
> int, fd, const void *, buf, int, count);
> static inline _syscall1(int, exit, int, status);
> void _start(void) { write(1, "Hello, World!\n", 14); exit(0); }
>
> ce qui me donne un exécutable de 884 octets. On n'est pas loin des
> performances de diet sans outils particulier.
552 octets ici. Je me demande ce qui cause une différence si importante
entre ta version en C et ta version en assembleur optimisée à la main...
> Voici ma version, un peu moins bonne (544 octets). Comme je ne sais pas
> programmer en assembleur, j'ai pris l'assembleur généré par gcc -O et
> j'ai simplifié ce que j'ai pu :
>
> .globl _start
> _start:
> movl $4, %eax # write(
> movl $1, %ebx # 1,
> movl $message, %ecx # message,
> movl $14, %edx # 14
> int $0x80 # );
> movl $1, %eax # exit(
> movl $0, %ebx # 0
> int $0x80 # );
> message:
> .string "Hello, World!\n"
>
> Je compile avec
>
> as -o hello.o hello.s
> ld --gc-sections hello.o -o hello
> strip hello
Avec les mêmes commandes, le même code, etc ... j'arrive à 348 octets !
Comment faire pour savoir d'où viennent les différences ?
Lucas