Les exécutables réduits - C'est possible !


10 juin 2007

Petite page temporaire de prise de notes pour un futur point complet sur l'analyse et la réduction des exécutables.

#include <stdio.h>
#include <string.h>

int pgcd(int u, int v, int verbose)
{
    int M = 1;
    while (u && v)      {
        if (verbose)        printf("pgcd(%d, %d)\n", u, v);
        if (!(u&1) && !(v&1))       { M <<= 1; u>>=1, v>>=1; }
        else    if (!(u&1) && v&1)      u>>=1;
        else    if (u&1 && !(v&1))      v>>=1;
        else    {
            //Les deux nombres sont impairs
            if (u>v)    u=(u-v)>>1;
            else        v=(v-u)>>1;
        }
    }
    return M * (u ? u : v);
}

int printSyntax(char* progName, int retVal)
{
    printf("Syntaxe pour calculer le PGCD de u et v :\n\n\t%s [--verbose] <u> <v>\n\n", progName);
    return retVal;
}

int main(int argc, char** argv)
{
    int Verbose;
    int N[2], i, j;
    for(i=1, j=0; i<argc && j<2; i++)    {
        if (!strcmp(argv[i], "--verbose"))  Verbose = 1;
        if (!strcmp(argv[i], "--help"))     return printSyntax(*argv, 0);
        if (!sscanf(argv[i], "%d", &N[j++]))    j--;
    }
    if (argc<=2 || j<2) {
        printf("J'ai besoin de deux pour calculer leur PGCD.\n");
        return printSyntax(argv[0], 1);
    }
    //
    printf("%d\n", pgcd(N[0], N[1], Verbose));
    return 0;
}

Si on compile le source ci-dessus avec les commandes suivantes on arrive à un exécutable de 2764 octets (sur ma machine) :

gcc -Os -Wall -L`gcc -print-file-name=` /usr/lib/crt1.o /usr/lib/crti.o -nostdlib -o pgcd pgcd.c /usr/lib/crtn.o -lc
strip --strip-unneeded -R .comment -R .gnu.version -R .note.ABI-tag pgcd

Questions :

  • le code (le segment .text) ne fait que 557 octets et les segments .init et .fini ensembles 36 octets. Total = 593 octets. Pourquoi 2171 octets en plus ?
  • Optimiser le fichier ELF résultant.
  • Combler le fossé (500 octets je crois) entre les versions C et C++.
  • Déduire les meilleures pratiques (code et compil) pour avoir un code le plus petit possible.
Accueil