Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : novembre 2016
    Messages : 29
    Points : 12
    Points
    12

    Par défaut Créer une librairie langage C

    Bonjour à tous,

    J'aimerais savoir s'il est possible de créer une librairie en langage C donc le code ne serait pas visible ?
    Le but est de fournir a des clients des algorithmes implémentables dans leur programme sans qu'ils puissent voir le code source.

    Merci,

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 965
    Points : 11 043
    Points
    11 043
    Billets dans le blog
    1

    Par défaut

    Oui. A ceci prêt que l'assembleur sera toujours visible.

    Mais je vois que tu es "Ingénieur développement matériel électronique" donc je vais quand même te poser la question "quelle est ta ou tes plateformes cibles ?".

    De manière générale, à qui souhaites-tu distribuer cette bibliothèque ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : novembre 2016
    Messages : 29
    Points : 12
    Points
    12

    Par défaut

    C'est pour de la clientèle de l'entreprise où je travaille ,c'est pour une application sur microcontrôleur mais le code sera fait de manière indépendant du micro utilisé.

    Quand tu dis que l'assembleur sera toujours visible, c'est que au moment de la compilation, le compilateur va forcément transformer la librairie en assembleur (lié à la cible sur laquelle est implémenté le code ?)

    Aussi, implicitement, mon poste voulait aussi dire, comment fait-on ce genre de chose ?

  4. #4
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 697
    Points : 6 315
    Points
    6 315

    Par défaut

    Citation Envoyé par SamPirate62 Voir le message
    le compilateur va forcément transformer la librairie en assembleur
    Techniquement non C'est le linker qui produit de l'assembleur.

    Le compilateur lui sort du pseudo-assembleur, mais contrairement au Java par exemple, ce pseudo-assembleur n'est pas normé [et apparemment, même en C++ personne ne veut le normer]

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 824
    Points : 39 523
    Points
    39 523

    Par défaut

    Techniquement de nos jours ni l'un ni l'autre ne produit de l'assembleur, car ça fait belle lurette que le back-end du compilateur passe directement de "arbre syntaxique" à "code objet" (code machine séparé en mini-sections qui attendent l'édition de liens, extension .obj sous Visual et .o sous GCC).
    (Edit: Du moins, quand la Link-Time Code Generation n'est pas activée)

    Mais quand on passe l'option appropriée, c'est bel et bien le compilateur qui sort un fichier "source assembleur" (généralement .asm sous Visual, .s sous GCC) qui peut ensuite lui être passé directement pour qu'il en fasse un "code objet"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 965
    Points : 11 043
    Points
    11 043
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par SamPirate62 Voir le message
    C'est pour de la clientèle de l'entreprise où je travaille ,c'est pour une application sur microcontrôleur mais le code sera fait de manière indépendant du micro utilisé.
    Et là tu vas rentrer dans l'enfer de la livraison sous forme de binaires...

    J'ai travaillé pour une entreprise qui vendait des bibliothèques sous forme de binaires, et dans ma vie j'ai travaillé avec des bibliothèques en binaires et en sources en tant qu'utilisateurs. Il faut avoir de très bonnes raisons de ne pas le faire en sources.

    Pourquoi ?

    Parce que pour fournir ta bibliothèque en binaire, il faut compiler ton code. Donc il te faut plusieurs compilateurs, potentiellement avec des licences que ton entreprise devra payer.. Si tu vises par exemple du ARM Cortex-M3, du ARM Cortex-M4 et du Renesas RX113, il te faut 3 compilateurs a priori. Mais pour ARM Cortex-M, tu as du GCC, du IAR, du Keil. Et je crois que pour Renesas RX113 il y a 2 toolchains (une gratuite, une payante). En tout, ça fait donc 8 compilateurs. Tu devras potentiellement gérer des variantes, par exemple une version avec et une version sans log. Tu devras peut-être gérer des options pour une même cible, par exemple sur Cortex-M4 avec utilisation de la FPU ou sans utilisation de la FPU ou avec l'ABI mixte. J'ai déjà perdu le compte du nombre de variantes...

    Au final, tu te retrouves avec énormément de binaires à produire, maintenir, tester, supporter.

    Autre gros soucis du binaire, ce n'est pas débogable côté client, qui risque de t'appeler pour te dire "ça marche pas" à tout bout de champ.

    Si tu es prêt accepter tout ça, tu peux livrer un ensemble de *.o et de *.h. En étant un peu plus propre, tu feras archive *.a (ou *.lib ou *.truc selon le compilateur) pour regrouper les *.o. Comment faire ? Ca dépend de ta cible et donc de la toolchain qui va avec. Voici par exemple pour du GCC : https://gradot.wordpress.com/2013/11...statique-en-c/

    Comment voir le code assembleur ? Simplement en dé-assemblant ta bibliothèque. Avec GCC, tu as la commande objdump -d pour faire ça.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : novembre 2016
    Messages : 29
    Points : 12
    Points
    12

    Par défaut

    Merci pour toutes ces informations.

    J'ai testé un *.o + *.h et *.a avec Codeblocks ça fonctionne. Je vais essayer de compiler avec notre compilateur et de tester ce bout de code avec notre plateforme actuelle.

    On va y réfléchir parce qu’effectivement ça peut vite devenir lourd à gérer.

    Merci beaucoup,

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : novembre 2016
    Messages : 29
    Points : 12
    Points
    12

    Par défaut

    Juste une dernière aide avant de clore.

    J'ai compilé sous CodeBlocks et GNU Tools ARM Embedded (compilateur de notre plateform de dév). Pas d'erreur de compilation.
    J'ai essayé d'appeler la fonction de la librairie que j'ai générée mais ça ne fonctionne pas.

    J'ai généré un *.a à partir d'un projet comportant un *.c et un *.h. Le point h comporte le prototype de la fonction codée dans le *.c.
    Je link bien la libraire dans mon logiciel (Kinetis Design Studio pour info) et j'ajoute le *.a et le *.h dans mon projet, j''appelle le *.h dans mon main et j’appelle la fonction mais le compilateur me revnoie "undefined reference to 'mafonction'....

    Je dois mal faire les choses mais je ne vois pas où..

  9. #9
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 426
    Points : 7 309
    Points
    7 309

    Par défaut

    Citation Envoyé par SamPirate62 Voir le message
    J'ai compilé sous CodeBlocks
    Techniquement Code::Block ne compile rien , c'est juste un IDE et éventuellement tu peux lui assigner un compilateur (par défaut il utilise gcc sur Linux ou MinGW sur Windows).
    Tu peux lui rajouter autant de compilateur que tu veux (tu as sur C::B un build target qui permet de changer de cible).

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : novembre 2016
    Messages : 29
    Points : 12
    Points
    12

    Par défaut

    Désole si ma phrase précédente n'est pas claire : J'ai assigné GNU Tools ARM Embedded à CodeBlocks et j'ai compilé.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 965
    Points : 11 043
    Points
    11 043
    Billets dans le blog
    1

    Par défaut

    Je te renvoie vers cette entrée de la FAQ : https://c.developpez.com/faq/?page=G...mbol-not-found

    Tu peux faire un arm-none-eabi-objdump -t ta_lib.a pour avoir la liste de ce qu'elle contient.

    Mais pourquoi faire une partie du travail dans C::B et une autre dans Kinetis ?

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo