Forum Programmation.c++ Challenge : Reduction de taille

Posté par  .
Étiquettes : aucune
0
20
nov.
2006
Bonjour,
voila le problème (un exemple en C est peut etre plus simple). Soit les programmes :

void f(int x)
{
return 3+x;
}

int g(int x)
{
int i;
for(i=0;i<x;i++) print("%d ",i);
}

int main(void)
{
g(3);
return 0;
}

On n'utilise pas la fonction f donc la taille du programme devrait être plus faible que le programme :

int g(int x)
{
int i;
for(i=0;i<x;i++) print("%d ",i);
}

int main(void)
{
g(3);
return 0;
}


Hors ce n'est pas le cas. Ma question est donc comment faire pour que toutes les fonctions ou méthodes (pour les classes) utilisées directement ou non soient conservées et les autres supprimées. J'utilise gcc. Le but est de réduire au maximum un programme lié à une bibliothèque.
Merci
  • # Un idée peut-être...

    Posté par  (site web personnel) . Évalué à 3.

    Mettre les fonctions f et g "static".

    Zieuter du côté des options du linker.

    Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN

    • [^] # Re: Un idée peut-être...

      Posté par  . Évalué à 1.

      les fonctions f et g c'est juste un exemple, dans mon cas il s'agit de réduire la taille de la bibliothèque liée donc quand il y a 300 classes avec 50 méthodes mais que moi je n'utilise directement ou indirectement que 30 classes je souhaite gagner de la place. Donc ta solution ne marche pas. Mais merci quand même
      • [^] # Re: Un idée peut-être...

        Posté par  (site web personnel) . Évalué à 3.

        J'ai pas tout compris là. Si tu as une bibliothèque partagée (.so), alors le but c'est justement que toutes les fonctions disponibles soient là, même si tu n'y accèdes pas, au cas où une autre application les utilise. C'est le but d'une bibliothèque partagée.

        Sinon tu peux regarder comment "stripper" les binaires, pour réduire leur taille (et sans doute aussi la bibliothèque, mais je t'avoue que ne l'ayant jamais utilisé, je sais juste que le stripping existe).
        • [^] # Re: Un idée peut-être...

          Posté par  . Évalué à 1.

          j'ai 2 possibilitées soit faire une liaison statique soit essayer de réduire la taille du code en faisant une compilation "intelligente". Et je souhaiterais faire cela plutot que de fournir un fichier de 8Mo dont 5Mo de bilbliothèque. Donc j essaye de trouver un moyen de le faire directement à la compilation.
        • [^] # Re: Un idée peut-être...

          Posté par  (site web personnel) . Évalué à 3.

          man strip
          • [^] # Re: Un idée peut-être...

            Posté par  (site web personnel) . Évalué à 1.

            strip --strip-unneeded ton_ou_tes_fichiers_binaires

            http://helpmequ.it: arrêter de fumer pour la bonne cause, http://mapetiteautoentreprise.fr : facturation libre pour les auto-entrepreneurs

      • [^] # Re: Un idée peut-être...

        Posté par  . Évalué à 0.

        Je ne pense pas que cela soit possible avec les outils GNU. J'ai utilisé autrefois cette possiblilité avec les compilateurs TopSpeed.

        Le lieur supprimait le code non référencé comme les fonctions et les variables non utilisées.
  • # visibility feature de gcc 4.*

    Posté par  . Évalué à 3.

    1) tu peux utiliser la fonctionnalite de visibilite de gcc 4.* (marche pour gcc 4., donc, et pour certaines version de gcc 3.4.* assez rencentes):
    http://gcc.gnu.org/wiki/Visibility
    Vu que gcc exporte comme un sagouin tous les symboles, ca va beaucoup aider.
    2) link avec -s (ce qui revient a stripper). Au passage, ne strippe pas en mode debug.
    • [^] # Re: visibility feature de gcc 4.*

      Posté par  . Évalué à 3.

      et j'ai oublie aussi : utilise nm pour savoir quels sont les symboles exportes ou non dans la lib. Ca peut aider pour savoir quels symboles sont presents dans ta lib
      man nm pour la doc, bien sur...
  • # Quand on fait une bibliothèque, on optimise l'édition de lien en...

    Posté par  . Évalué à 1.

    Quand on fait une bibliothèque, on gagne à faire de petites sources car l'éditeur de lien prend les ".o" générés et les concatène à l'exécutable final. Il suffit qu'une fonction soit mentionnée dans ce .o pour que l'ensemble soit ajouté à ton fichier. C'est parce que des variables locales au source C ou C++ sont peut-être utiles à ta fonction, d'où l'édition de lien ne peut pas savoir d'avance si elle peut ou pas redécouper le ".o" en "fonctions" élémentaires.
    D'où : c'est à toi de découper à l'avance en petites sources séparées.
    Voir aussi les options "-O", dont particulièrement "-Os" (Optimiser pour la taille générée). La commande strip a aussi des options pour être (parfois) plus efficace.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.