Essayé mais toujours le même soucis.. je dois faire une erreur quelque part mais où..
Essayé mais toujours le même soucis.. je dois faire une erreur quelque part mais où..
As-tu bien tout recompiler dans C::B ?
Peux-tu enlever les options -ffreestanding -flto de C::B et -ffunction-sections -fdata-sections de Kinetis ?
Great! C'était le -flto qui causait le problème. Merci beaucoup!
Avant de clore j'en profite d'avoir quelqu'un du métier pour poser 2-3 dernières questions sur les directives de compilation.
-Est-ce que la directive définissant le processeur -mcpu=cortex-m0plus a une réelle importance ? parce que j'ai essayé en retirant cette directive et ça fonctionne également.
-Est-ce que le niveau d'optimisation a une importance également ? (-O0, -O1, -O2...) ? est-ce que ça peut poser problème si au niveau de la compilation ce n'est pas en adéquation avec le compilateur qui va utiliser la librairie ?
- Même question avec le niveau de debug (-g1, -g, -g3..) ?
En tout cas encore merci pour l'aide apportée, je n'avais jamais travaillé avec des librairies de langage C, et du coup j'ai appris des choses.
L'optimisation ne change en rien les conventions d'appels , donc ça doit marcher , mais néanmoins si tu met du code asm cela peut arriver d'avoir quelque souci avec les optimisations du compilateur.
Les optimisations ne donne aucune incompatibilité , c'est juste ce que tu aurais fait si tu codais en asm en mode full optimisation donc optimiser l’accès a la mémoire cache , déplier les boucles , éviter les calcul superflus/precalculer , utilisation des instructions SIMD ,inliner les fonctions etc etc.
Je suis un peu désolé car dés que tu avais posté ta table de symboles, je m'étais dit "tiens, les symboles contiennent lto, ça doit pas être bon ça..." mais je m'étais dit que tu n'avais pas du mettre cette option exotique sans raison...
Kanngi t'a déjà pas mal répondu sur ce sujet.
Je n'ai pas trop de retour d'expérience à partager là-dedans mais je ne vois pas l'intérêt de rajouter des infos de debug (-g ou -g1/2/3) pour une bibliothèque binaire. On n'a pas les sources, il n'y aura pas grand chose à déboguer. Et même pire : si tu veux vraiment cacher ton code, ça risque de laisser des informations utiles au reverse engineering, comme les noms des fonctions. Tu peux essayer en compilant différemment ta bibliothèque et en la déassemblant avec arm-none-eabi-objdump -d malib.a > dis.txt.
En première approche, je compilerais en -O2 (voir https://gcc.gnu.org/onlinedocs/gcc/O...e-Options.html pour des détails) sans -g (voir https://gcc.gnu.org/onlinedocs/gcc/D...g-Options.html).
L'option -mcpu=cortex-m0plus a une importance puisqu'elle indique le CPU et donc le jeu d'instruction assembleur autorisé. Voir https://gcc.gnu.org/onlinedocs/gcc-4...M-Options.html :
Je pense que dans ton cas ça marche car tu as l'option -mthumb qui lui fait générer de l'assembleur correct. Tu as juste de la chance que ton code soit suffisamment simple (ou parce que -mthumb est suffisamment restrictive) pour que le code généré ne contienne que des mnémoniques compatibles Cortex-M0. Essaye de mettre m3 ou m4 et tu risques d'avoir un code non compatible, car avec des instructions assembleur non supportées, qui t'emmèneront directement dans un Usage Fault (ou plutôt un Hardfault sur M0, voir http://infocenter.arm.com/help/index.../Babcefea.html).-mcpu=name
This specifies the name of the target ARM processor. GCC uses this name to determine what kind of instructions it can emit when generating assembly code. Permissible names are: `arm2', `arm250', `arm3', `arm6', `arm60', `arm600', `arm610', `arm620', `arm7', `arm7m', `arm7d', `arm7dm', `arm7di', `arm7dmi', `arm70', `arm700', `arm700i', `arm710', `arm710c', `arm7100', `arm720', `arm7500', `arm7500fe', `arm7tdmi', `arm7tdmi-s', `arm710t', `arm720t', `arm740t', `strongarm', `strongarm110', `strongarm1100', `strongarm1110', `arm8', `arm810', `arm9', `arm9e', `arm920', `arm920t', `arm922t', `arm946e-s', `arm966e-s', `arm968e-s', `arm926ej-s', `arm940t', `arm9tdmi', `arm10tdmi', `arm1020t', `arm1026ej-s', `arm10e', `arm1020e', `arm1022e', `arm1136j-s', `arm1136jf-s', `mpcore', `mpcorenovfp', `arm1156t2-s', `arm1156t2f-s', `arm1176jz-s', `arm1176jzf-s', `cortex-a5', `cortex-a7', `cortex-a8', `cortex-a9', `cortex-a15', `cortex-r4', `cortex-r4f', `cortex-r5', `cortex-m4', `cortex-m3', `cortex-m1', `cortex-m0', `xscale', `iwmmxt', `iwmmxt2', `ep9312', `fa526', `fa626', `fa606te', `fa626te', `fmp626', `fa726te'.
-mcpu=generic-arch is also permissible, and is equivalent to -march=arch -mtune=generic-arch. See -mtune for more information.
Pour rappel, M0 possède le plus petit subset assembleur de la famille Cortex-M. Ainsi, un code pour M0 tourne sur M3 / M4 / M7 mais la réciproque n'est pas vrai. Ca dépendra des programmes. Plus de détails ici https://community.arm.com/processors...t-arm-cortex-m
Ca n'a pas été facile ah ah ! Content d'avoir pu aidé
PS : pense à cliquer sur le bouton RESOLU en bas de page !
Merci pour toutes les infos.
Justement je crois que j'avais ajouté le -lto et le -freeunderstand car ils étaient dans le programme Kinetis mais je ne retrouve plus...
A une prochaine fois !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager