Re: [amusement] Petit Hello, World!

Page principale

Répondre à ce message
Auteur: Lucas Nussbaum
Date:  
À: Liste Guilde
Sujet: Re: [amusement] Petit Hello, World!
> 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