Problème abstrait: j'ai du code en C. Après compilation, l'exécutable a 604 Ko. J'aimerais qu'il soit plus gros, disons 100 Mo.

Comment y parvenir?

Je pourrais déclarer une chaîne pour augmenter la taille binaire, mais existe-t-il une solution plus évolutive. C'est-à-dire que je voudrais augmenter la taille compilée de N octets sans augmenter le code source de N octets.

 char* filler = "filler"; // increases compiled size only by few bytes

Cas d'utilisation: je développe un micrologiciel et teste la fonctionnalité de mise à niveau du micrologiciel à distance. J'aimerais voir comment il se comportera lorsque le firmware est gros et lourd.

c
9
mjjaniec 20 avril 2017 à 16:16

3 réponses

Meilleure réponse

Cela crée un exécutable de 100 Mo lorsqu'il est compilé avec gcc:

#include <stdio.h>
#define SIZE 100000000

char dummy[SIZE] = {'a'};

int main(void){
    dummy[SIZE-1] = '\n';
    if(dummy[0] == 'a')printf("Hello, bloated world");
    return 0;
}

En définissant le tableau en dehors de main, vous ne faites pas exploser la pile. En utilisant le tableau, gcc ne l'optimise pas.

16
John Coleman 20 avril 2017 à 13:42

Vous devrez créer un tableau global avec tous les éléments explicitement initialisés. Les éléments doivent être randomisés, sinon le compilateur est susceptible d'optimiser la liste d'initialisation dans le code compilé.

Vous avez d'abord besoin d'un programme séparé pour générer votre tableau:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int len = 100000000;
    int i;
    srand(getpid());
    printf("unsigned char buf[%d] = {\n", len);
    for (i=0;i<len;i++) {
        printf(" %hhu,", rand() & 0xff);
        if (i%16==15) printf("\n");
    }
    printf("};\n\n");
    return 0;
}

Exécutez ceci et redirigez la sortie vers un fichier:

./array_generator > array.c

Ensuite, vous obtiendrez array.c qui ressemble à ceci:

unsigned char buf[1000000] = { 
247, 223, 30, 51, 46, 247, 133, 136, 254, 225, 82, 135, 68, 176, 240, 7,
29, 245, 104, 203, 230, 83, 127, 189, 37, 5, 168, 105, 134, 9, 229, 125,
232, 3, 176, 23, 251, 53, 159, 249, 22, 241, 128, 90, 161, 112, 97, 191,
101, 202, 138, 75, 29, 10, 9, 66, 15, 177, 171, 149, 186, 145, 18, 163,
...
};

Ensuite, vous incluez ceci dans votre source principale:

#include  "array.c"
1
dbush 20 avril 2017 à 13:51

Variante spécifique à GCC:

char dummy[100*1024*1024] __attribute__((used)) = { 77 };

En appliquant l'attribut «utilisé», vous n'avez plus besoin de le toucher pour éviter qu'il ne soit optimisé. Néanmoins, un initialiseur non entièrement nul doit être appliqué comme dans la solution de John Coleman.

9
Aconcagua 20 avril 2017 à 13:50