Posté le 09/05/2018 17:27
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 140 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 15/06/2018 11:25 | #
J'ai commencé à, regarder un peu plus en détails les sources du Micropython, et notamment le makefile dans /ports/minimals j'ai fait la liste des fichiers utilisé, ainsi que les outils nécessaire, cependant, j'ai un problème avec le fonctionnement des règles implicite de Make, en effet, les instruction commence par les fichiers objets, donc ces fichiers sont compiler par Make de manière implicite, mais dans ce cas, comment spécifier le compilateur à utiliser ? Et cela me parait étrange, aurais-je raté quelque chose ?
Citer : Posté le 15/06/2018 11:29 | #
Les règles implicites ne sont utilisées que si aucune règle du Makefile ne permet effectivement de compiler les fichiers. Là il y a forcément des règles, donc les implicites n'entrent pas en jeu.
Citer : Posté le 15/06/2018 13:37 | #
Okay, je vais re-regarder plus en profondeur, j'ai peut-être raté quelque chose (un include qui m'aurais échappée, ou autre...)
Ajouté le 15/06/2018 à 23:24 :
J'avais belle et bien raté un include bon, je pense pouvoir rédiger un rapport sur le processus de compilation de microPython d'ici une semaine (le temps d'aller au bout du truc) ce serait utile que je le poste ou je le garde pour moi??
Par contre, je manque clairement de connaissances sur comment sont gérées les 'libs standard' sur Casio, du côté de fxlib et de gint, y aurait t'il un endroit qui en parle ? Car sans savoir cela, je ne peux pas mesurer correctement la quantité de travail nécessaire pour le portage..
Citer : Posté le 16/06/2018 14:01 | #
La lib standard est dans fxlib, mais elle est incomplète.
- Poste ce que tu as compris du processus de compilation sur ce topic.
- Vois standard_libraries.pdf dans l'archive du SDK pour le subset supporté de la lib standard (pas beaucoup).
- Poste aussi les fonctions dont tu as besoin mais qui ne sont pas implémentées (open(), etc).
Citer : Posté le 30/06/2018 00:00 | # | Fichier joint
Voilà ce que je pense avoir compris du processus de compilation.
Pour les fonctions nécessaire mais non implémenté, j'ai fais un script à la va vite, mais je n'ai pas encore regardé si elle sont réellement nécessaire.
Citer : Posté le 30/06/2018 18:20 | #
Joli travail ! @Zezombye, est-ce que ça t'aide à comprendre la marche à suivre ?
Citer : Posté le 30/06/2018 20:47 | #
J'ai pas encore regardé
Ajouté le 23/07/2018 à 08:26 :
Bon j'ai réussi à compiler, voici ma péripétie d'une heure :
- Je lis le truc d'hackcell en diagonale. J'installe cygwin, avec gcc, make, python, etc. J'exécute la commande "make cross=1" : plein d'erreurs.
- Je remplace l'arm-eabi-truc par le gcc normal, je vire les switchs spécifiques à ce truc arm, je corrige un bug de détection de version dans un script python, je vire le -werror parce que y'a 4324 warnings de cast, cette fois ci ça me fait une erreur, il ne trouve pas arm-eabi-truc-ld.
- Je me rends compte qu'il y a 2 sets de commande, et que je dois pas foutre cross=1 parce que je veux pas compiler pour leur pyboard.
- Je réessaye avec juste "make". Cette fois ci ça me fait une erreur d'escamotage. Je regarde la définition d'"escamotage" sur google, puis je cherche l'erreur sur internet, apparemment ce serait un problème de librairie 32-bits.
- Je vire le switch -m32, ça marche.
Pour l'instant j'ai fait ça avec le gcc pour PC, mais je suis en train de compiler le gcc pour casio.
Du coup j'ai un firmware.elf : je fais comment pour le linker avec mon code généré par le SDK ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/07/2018 18:46 | #
Tu balances à GCC avec d'autres fichiers objets. Oui, évite le SDK, c'est juste une cause d'erreurs en plus ; compile ton propre code avec GCC. Tu n'es plus à ça près il me semble.
Ensuite tu passes à objcopy une fois que tu as fini. Regarde les options utilisées par la règle de $(BUILD)/firmware.bin pour ne pas te planter.
Citer : Posté le 27/07/2018 18:30 | #
Pour la compilation avec le sh3eb-elf-gcc, j'ai des problèmes au niveau du linkage :
$ make
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
LINK build/firmware.elf
/home/Zezombye/opt/sh3eb-elf/lib/gcc/sh3eb-elf/7.3.0/../../../../sh3eb-elf/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make: *** [Makefile:66: build/firmware.elf] Error 1
Une idée ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 28/07/2018 17:57 | #
Oui, il te faut une lib standard petit malin. Compile avec -nostdlib mais tu auras plein de fonctions manquantes au moment de linker.
Citer : Posté le 29/07/2018 00:16 | #
Je compile déjà avec nostdlib, les arguments c'est :
LD = sh3eb-elf-gcc
CFLAGS = $(INC) -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc $(COPT)
LDFLAGS = -Wl,-Map=$@.map,--cref -Wl,--gc-sections
Virer le std=c99 n'a aucun effet.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 21:03 | #
Cherche si l'option a bien été passée lors du linkage ; sinon ils ont peut-être ajouté -lc ailleurs pour obliger à linker avec la libc. Tu peux remplacer -lc par -lta_lib -lfx ou libta_lib.a est une archive où tu as compilé les fonctions standard que tu as du implémenter.
Citer : Posté le 29/07/2018 21:15 | #
J'ai mis -nostdlib dans les LDFLAGS et maintenant ça compile, mais je pense que le fichier elf est un peu vide :
$ make
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
LINK build/firmware.elf
/home/Zezombye/opt/sh3eb-elf/lib/gcc/sh3eb-elf/7.3.0/../../../../sh3eb-elf/bin/ld: warning: cannot find entry symbol start; not setting start address
text data bss dec hex filename
0 4 0 4 4 build/firmware.elf
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 21:17 | #
Utilise V=1 ou BUILD_VERBOSE pour faire apparaître le détail des commandes, et cherche où les données se sont perdues :
- Les fichiers objets ont-ils été passés au linker ?
- Les fichiers objets sont-ils vides ?
- Quels sont les options de compilation ?
- Quel linker script as-tu utilisé ?
Citer : Posté le 29/07/2018 21:26 | #
Les fichiers objets sont pas vides, voici l'output :
[...]
sh3eb-elf-gcc -I. -I../.. -Ibuild -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc -Os -DNDEBUG -fdata-sections -ffunction-sections -c -MD -o build/lib/utils/stdout_helpers.o ../../lib/utils/stdout_helpers.c
CC ../../lib/utils/pyexec.c
sh3eb-elf-gcc -I. -I../.. -Ibuild -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc -Os -DNDEBUG -fdata-sections -ffunction-sections -c -MD -o build/lib/utils/pyexec.o ../../lib/utils/pyexec.c
CC ../../lib/libc/string0.c
sh3eb-elf-gcc -I. -I../.. -Ibuild -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc -Os -DNDEBUG -fdata-sections -ffunction-sections -c -MD -o build/lib/libc/string0.o ../../lib/libc/string0.c
CC ../../lib/mp-readline/readline.c
sh3eb-elf-gcc -I. -I../.. -Ibuild -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc -Os -DNDEBUG -fdata-sections -ffunction-sections -c -MD -o build/lib/mp-readline/readline.o ../../lib/mp-readline/readline.c
MISC freezing bytecode
../../tools/mpy-tool.py -f -q build/genhdr/qstrdefs.preprocessed.h -mlongint-impl=none frozentest.mpy > build/_frozen_mpy.c
CC build/_frozen_mpy.c
sh3eb-elf-gcc -I. -I../.. -Ibuild -Wall -std=c99 -m3 -mb -ffreestanding -nostdlib -lgcc -Os -DNDEBUG -fdata-sections -ffunction-sections -c -MD -o build/build/_frozen_mpy.o build/_frozen_mpy.c
LINK build/firmware.elf
sh3eb-elf-gcc -Wl,-Map=build/firmware.elf.map,--cref -Wl,--gc-sections -nostdlib -o build/firmware.elf build/py/mpstate.o build/py/nlr.o build/py/nlrx86.o build/py/nlrx64.o build/py/nlrthumb.o build/py/nlrxtensa.o build/py/nlrsetjmp.o build/py/malloc.o build/py/gc.o build/py/pystack.o build/py/qstr.o build/py/vstr.o build/py/mpprint.o build/py/unicode.o build/py/mpz.o build/py/reader.o build/py/lexer.o build/py/parse.o build/py/scope.o build/py/compile.o build/py/emitcommon.o build/py/emitbc.o build/py/asmbase.o build/py/asmx64.o build/py/emitnx64.o build/py/asmx86.o build/py/emitnx86.o build/py/asmthumb.o build/py/emitnthumb.o build/py/emitinlinethumb.o build/py/asmarm.o build/py/emitnarm.o build/py/asmxtensa.o build/py/emitnxtensa.o build/py/emitinlinextensa.o build/py/formatfloat.o build/py/parsenumbase.o build/py/parsenum.o build/py/emitglue.o build/py/persistentcode.o build/py/runtime.o build/py/runtime_utils.o build/py/scheduler.o build/py/nativeglue.o build/py/stackctrl.o build/py/argcheck.o build/py/warning.o build/py/map.o build/py/obj.o build/py/objarray.o build/py/objattrtuple.o build/py/objbool.o build/py/objboundmeth.o build/py/objcell.o build/py/objclosure.o build/py/objcomplex.o build/py/objdeque.o build/py/objdict.o build/py/objenumerate.o build/py/objexcept.o build/py/objfilter.o build/py/objfloat.o build/py/objfun.o build/py/objgenerator.o build/py/objgetitemiter.o build/py/objint.o build/py/objint_longlong.o build/py/objint_mpz.o build/py/objlist.o build/py/objmap.o build/py/objmodule.o build/py/objobject.o build/py/objpolyiter.o build/py/objproperty.o build/py/objnone.o build/py/objnamedtuple.o build/py/objrange.o build/py/objreversed.o build/py/objset.o build/py/objsingleton.o build/py/objslice.o build/py/objstr.o build/py/objstrunicode.o build/py/objstringio.o build/py/objtuple.o build/py/objtype.o build/py/objzip.o build/py/opmethods.o build/py/sequence.o build/py/stream.o build/py/binary.o build/py/builtinimport.o build/py/builtinevex.o build/py/builtinhelp.o build/py/modarray.o build/py/modbuiltins.o build/py/modcollections.o build/py/modgc.o build/py/modio.o build/py/modmath.o build/py/modcmath.o build/py/modmicropython.o build/py/modstruct.o build/py/modsys.o build/py/moduerrno.o build/py/modthread.o build/py/vm.o build/py/bc.o build/py/showbc.o build/py/repl.o build/py/smallint.o build/py/frozenmod.o build/main.o build/uart_core.o build/lib/utils/printf.o build/lib/utils/stdout_helpers.o build/lib/utils/pyexec.o build/lib/libc/string0.o build/lib/mp-readline/readline.o build/build/_frozen_mpy.o
/home/Zezombye/opt/sh3eb-elf/lib/gcc/sh3eb-elf/7.3.0/../../../../sh3eb-elf/bin/ld: warning: cannot find entry symbol start; not setting start address
sh3eb-elf-size build/firmware.elf
text data bss dec hex filename
0 4 0 4 4 build/firmware.elf
Les trucs de compilation, c'est ça :
LDFLAGS = -Wl,-Map=$@.map,--cref -Wl,--gc-sections -nostdlib
C'est quoi le symbole "start", pourquoi il le trouve pas ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 21:32 | #
Ah oui, alors. start c'est là où le programme commence. C'est une fonction qui fait divers travaux d'initialisation et appelle main et est fournie en général par la lib standard, ou par exemple par gint.
Donc il ne sait pas où le programme commence, ce pauvre linker. Et c'est normal puisque tu n'as pas de lib standard !
Ce qui ne résout pas non plus le fait que le programme est vide...
Citer : Posté le 29/07/2018 22:39 | #
J'ai remplacé toutes les occurences de initalize par start dans addin.ld et crt0.s, maintenant j'ai ces erreurs :
build/py/nlrsetjmp.o: In function `_nlr_jump':
nlrsetjmp.c:(.text.nlr_jump+0x28): undefined reference to `_longjmp'
build/py/mpprint.o: In function `_mp_print_int':
mpprint.c:(.text.mp_print_int+0x10c): undefined reference to `___udivsi3'
build/py/lexer.o: In function `_mp_lexer_new':
lexer.c:(.text.mp_lexer_new+0x88): undefined reference to `___movmemSI12'
build/py/runtime.o: In function `_mp_load_method_protected':
runtime.c:(.text.mp_load_method_protected+0x58): undefined reference to `_setjmp'
build/py/runtime.o: In function `_mp_parse_compile_execute':
runtime.c:(.text.mp_parse_compile_execute+0x88): undefined reference to `_setjmp'
build/py/runtime.o: In function `_mp_resume':
runtime.c:(.text.mp_resume+0x13c): undefined reference to `_setjmp'
build/py/runtime.o: In function `_mp_iternext':
runtime.c:(.text.mp_iternext+0x84): undefined reference to `_setjmp'
build/py/map.o: In function `_mp_map_lookup':
map.c:(.text.mp_map_lookup+0x204): undefined reference to `___udivsi3'
build/py/objgetitemiter.o: In function `_it_iternext':
objgetitemiter.c:(.text.it_iternext+0x64): undefined reference to `_setjmp'
build/py/objint.o: In function `_mp_int_format_size':
objint.c:(.text.mp_int_format_size+0x44): undefined reference to `___udivsi3'
build/py/objint.o: In function `_mp_obj_int_formatted':
objint.c:(.text.mp_obj_int_formatted+0x140): undefined reference to `___udivsi3'
build/py/objrange.o: In function `_range_len':
objrange.c:(.text.range_len+0x28): undefined reference to `___sdivsi3'
build/py/objstr.o: In function `_mp_obj_str_format_helper':
objstr.c:(.text.mp_obj_str_format_helper+0x2bc): undefined reference to `___movmemSI16'
build/py/builtinimport.o: In function `_do_execute_raw_code':
builtinimport.c:(.text.do_execute_raw_code+0x70): undefined reference to `_setjmp'
build/py/vm.o: In function `_mp_execute_bytecode':
vm.c:(.text.mp_execute_bytecode+0x1f4): undefined reference to `_setjmp'
build/py/smallint.o: In function `_mp_small_int_mul_overflow':
smallint.c:(.text.mp_small_int_mul_overflow+0x4c): undefined reference to `___sdivsi3'
build/py/smallint.o: In function `_mp_small_int_modulo':
smallint.c:(.text.mp_small_int_modulo+0x28): undefined reference to `___sdivsi3'
build/py/smallint.o: In function `_mp_small_int_floor_divide':
smallint.c:(.text.mp_small_int_floor_divide+0x24): undefined reference to `___sdivsi3'
build/lib/utils/pyexec.o: In function `_parse_compile_execute':
pyexec.c:(.text.parse_compile_execute+0x144): undefined reference to `_setjmp'
collect2: error: ld returned 1 exit status
make: *** [Makefile:66: build/firmware.elf] Error 1
C'est quoi toutes ces fonctions cheloues ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 22:42 | #
Des procédures de copie de mémoire ou de calcul de divisions de la libgcc. Tu dois mettre -lgcc à la fin de la ligne de commande, je suis sûr que je te l'ai déjà dit. À la fin de la fin.
Il reste quelques fonctions qui ne sont pas dans libgcc et que tu devras implémenter toi-même. Pour setjmp() et longjmp(), tu peux piquer dans gint.
Citer : Posté le 29/07/2018 22:46 | #
Dans ton tuto le -lgcc est pas à la fin, d'ailleurs l'ordre des arguments n'importe pas si ?
Bref, même en le mettant à la fin (du ld et du gcc) j'ai toujours les mêmes erreurs :
LDFLAGS = -Wl,-Map=$@.map,--cref -Wl,--gc-sections -nostdlib -T addin.ld crt0.s -L . -lfx -lgcc
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 22:49 | #
Dans ton tuto le -lgcc est pas à la fin, d'ailleurs l'ordre des arguments n'importe pas si ?
Parce qu'en l'occurrence je sais de quoi je parle et que libgcc et libfx « commutent » ?
Bien sûr qu'il importe, les symboles non résolus dans un fichier ne seront cherchés que dans les fichiers suivants. Il faut que tu révises tout ça...
Bref, même en le mettant à la fin (du ld et du gcc) j'ai toujours les mêmes erreurs[/quote]
Regarde les commandes générées par un Makefile verbose, pas les flags. (Et pas les commandes que tu penses avoir.)
Citer : Posté le 29/07/2018 22:59 | #
En effet, le makefile ajoutait des trucs -o à la fin, j'ai ajouté le -lgcc à la fin de la commande de build :
$(ECHO) "LINK $@"
$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS) -lgcc
$(Q)$(SIZE) $@
J'ai ajouté le setjmp.s de gint, et maintenant ça compile merci lephé !
Ecrivez vos programmes basic sur PC avec BIDE