GCC – Comment arrêter le lien entre malloc?

J’ai du mal à réduire mon code à une taille minimale d’os nus! J’utilise un STM32F0 avec une mémoire flash de 32 Ko seulement et j’ai besoin d’une bonne partie de la mémoire flash pour le stockage des données. Mon code est déjà à environ 20k de taille flash! Cela est dû en partie à l’utilisation des fonctions STM32 HAL que je peux prendre en compte et optimiser ultérieurement si besoin est.

Cependant, mon plus gros consommateur de flash est l’ensemble des routines de bibliothèque implicitement incluses. Je n’arrive pas à supprimer ces fonctions. Ils ne sont appelés nulle part dans mon code ni dans aucun code HAL. Des fonctions telles que _malloc_r (1,3 Ko), __vfiprintf_r (3 Ko) et bien d’autres utilisent une grande partie de mon flash. Je pense que ce sont toutes les fonctions de la libc. Je ne les utilise pas et je voudrais les faire disparaître!

Est-ce que quelqu’un sait comment les enlever?

J’ai essayé différents niveaux d’optimisation et différentes options, mais pas de chance jusqu’à présent. J’ai essayé -nostdlib et –specs = nosys.specs sans changement. Si je supprime mon fichier avec des définitions pour des fonctions telles que _exit, un message d’erreur lié à l’éditeur de liens indique que la bibliothèque est toujours incluse et en a besoin. De plus, la carte de l’éditeur de liens confirme la présence de nombreuses fonctions indésirables!

Aucune suggestion?

Résolu … Une partie de mon code inclus et appelé assert. Dès que je supprime Assert, la taille de mon code est plus que divisée par deux! J’ai plutôt utilisé la macro assert_param STM32 HAL qui est une assertion légère qui redirige simplement vers une fonction définie par l’utilisateur.

Il serait utile que quelqu’un puisse m’expliquer comment gcc décide d’inclure les fonctions de bibliothèque lorsque l’assert est appelé? Je vois que assert.h déclare une fonction externe __assert_func. Comment l’éditeur de liens sait-il comment le référencer depuis une bibliothèque plutôt que de simplement dire “référence non définie à __asert_func”?

Lorsque vous vous demandez ce qui prend de l’espace ou pourquoi les fonctions et les bibliothèques ont été liées, générez un fichier de carte avec des références croisées – quelque chose comme “-Wl, -Map = program.map, – cref”. Examinez le fichier avec un éditeur de texte et vous comprendrez pourquoi une fonction telle que malloc a été incluse.