Page 2 sur 5

Publié : mer. 12/nov./2008 15:59
par Anonyme2
Progi1984,

en regardant le code, je viens seulement de percuter, j'ai vu que toutes les fonctions et le reste était dans le même fichier asm. Ca ne doit pas être comme ça pour une lib.

Il y a quelques années, PB ne supportait pas des fichiers asm séparés pour les fonctions. Aujourd'hui oui, car avant même si on utilisait pas toutes les fonctions, elles se retrouvaient toutes dans le fichier exe.

Avant de demander à Fred, tu devrais séparer les commandes comme ceci.

4 fichiers asm, un par commande public (3) et un pour la commande privée, nommes les avec le nom de la fonction, c'est plus pratique (pour le code suivant c'est FunctionTest.asm

Code : Tout sélectionner

format ELF

public PB_FunctionTest


section '.text' executable
;
macro MP0{
_Procedure0:
PB_FunctionTest:
PS0=4
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS0+0]
JMP   _EndProcedure1
; EndProcedure
XOR    eax,eax
_EndProcedure1:
RET    4
le suivant FunctionBis.asm

Code : Tout sélectionner

format ELF

public PB_FunctionBis

; ProcedureDLL FunctionBis(PrimParam.l, TestSecundo.s)
macro MP2{
_Procedure2:
PB_FunctionBis:
PS2=8
XOR    eax,eax
PUSH   eax
MOV    edx,dword [esp+PS2+4]
LEA    ecx,[esp+0]
CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS2+0]
JMP   _EndProcedure3
; EndProcedure
XOR    eax,eax
_EndProcedure3:
PUSH   dword [esp]
CALL   SYS_FreeString
ADD    esp,4
RET    8
}
Je te laisse faire le troisième.

Au début tu donnes le format (format ELF sous linux et format MS COFF sous Windows)

Tu déclares ensuite en public le nom de la fonction avec la règle PB_

Puis tu mets le code de la procedure, tu ne prends vraiment que la fonction qui commence par le mot macro et qui se termine par }

Pour la procedure privée, celle qui ne sera pas connue de l'extérieur, tu la déclares dans le fichier descripteur, tu fais un fichier asm comme ceux ci-dessus sauf que tu ne mets pas de ligne Public suivit du nom de la fonction justement pour qu'elle soit encapsulée dans ta librairie.

Il faut comprendre que cette procedure "privée" sera certainement appelée par une au moins des autres procedures public voire par une procedure privé de cette même librairie.
Pour qu'elle soit reconnue par exemple dans la procedure FunctionTes, il faut qu'elle soit déclarée dans le fichier asm de la fonction FunctionTes comme une commande externe avec le mot extrn

Code : Tout sélectionner

extrn _Procedure4
car PB la nommée _Procedure4, ton Tailbite devra la reconnaître et générer la ligne extrn _Procedure4 pour chaque commande qui l'utilise.

Il faut créer un fichier d'initialisation, qui initialise les chaines même si aucune commande ne l'utilise, ça ne mange pas de pain :D

voilà par exemple le fichier généré par Tailbite dans un exemple que j'ai fait

Code : Tout sélectionner

format MS COFF

extrn _SYS_InitString@0

Public PB_essaiasm_Init

section '.text' code readable executable

PB_essaiasm_Init:
call _SYS_InitString@0

RET
La fonction d'initialisation est public, elle est déclarée dans le desc en Init fonction

Code : Tout sélectionner

essaiasm_Init 
InitFunction | StdCall
Tailbite génère un code "shared", c'est la section data, les déclarations et les macro du début utilisées par PB. Regarde sous windows comme c'est fait.
Il reste enfin le cas des variables globales, elle sont situées dans la section data lorsque l'on fait sa propre librairie. Dans le cas d'un tailbite, elles se retrouve dans le fichier shared car elles sont en datasection mais elle ne seront pas utilisable dans le code PB utilisant la lib.


Avance doucement, recompile et on regarde ensemble ou ça coince.

Publié : mer. 12/nov./2008 17:48
par Progi1984
[EDIT] Je travaille dessus !!! Et j'essaie d'abord de comprendre !

Publié : mer. 12/nov./2008 17:51
par Anonyme2
Alors ça fonctionne sous linux ?

Si oui c'était ou le problème ?

Publié : mer. 12/nov./2008 20:12
par Progi1984
Voilà, où j'en suis en faisant le point :

Code : Tout sélectionner

Première boucle
lister tous les proceduredll & procedure
==============================================================
Pour les procedureDLL

Créer un fichier asm avec le nom
mettre 
"format ELF"
"public PB_<nomdelafonction>"
coller la fonction (la fonction qui commence par le mot macro et qui se termine par } )

regarder tous les "call" et faire un extrn de chq fonction

==============================================================
Pour les procedure (privées)
Créer un fichier asm avec le nom
mettre 
"format ELF"
"public <nomduprojet>_<nomdelafonction>"
coller la fonction (la fonction qui commence par le mot macro et qui se termine par } )

regarder tous les "call" et faire un extrn _PB_Nomdelafonctionasm

==============================================================
Faire un fichier NomProjet_Init

format MS COFF

extrn _SYS_InitString@0

Public PB_essaiasm_Init

section '.text' code readable executable

PB_NameProjet_Init:
call _SYS_InitString@0

RET 
===============================================================

Publié : jeu. 13/nov./2008 20:18
par flaith
...

Publié : jeu. 13/nov./2008 20:49
par Progi1984
Salut Denis, bon j'avance coté code :

Quand je fais un fasm

Code : Tout sélectionner

fasm "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/ASM/FunctionTest.asm" "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/ASM/FunctionTest.o"
Du fichier suivant :

Code : Tout sélectionner

format ELF

public PB_FunctionTest

macro MP0{
_Procedure0:
PB_FunctionTest:
  PS0=4
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS0+0]
; EndProcedure
  XOR    eax,eax
_EndProcedure1:
  RET    4
}
J'ai ce message d'erreur :

Code : Tout sélectionner

flat assembler  version 1.67.18  (16384 kilobytes memory)
/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/ASM/FunctionTest.asm [3]:
public PB_FunctionTest
error: undefined symbol.
Pourtant bien déclaré avec public (pas comme au début)

[EDIT] Problème réglé ! Deux solutions :
- soit on supprime la ligne contenant la macro ("macro MP0{") et le "{"
- soit on ajoute tout à la fin un MP0 pour déclarer la macro
J'apprends ptit à ptit certaines techniques, c'est cool :)

PS : Plus de problème avec Linux ?

Publié : jeu. 13/nov./2008 21:21
par Anonyme2
Progi1984 a écrit :
Pourtant bien déclaré avec public (pas comme au début)

[EDIT] Problème réglé ! Deux solutions :
- soit on supprime la ligne contenant la macro ("macro MP0{") et le "{"
- soit on ajoute tout à la fin un MP0 pour déclarer la macro
J'apprends ptit à ptit certaines techniques, c'est cool :)

PS : Plus de problème avec Linux ?
La deuxième solution (soit on ajoute tout à la fin un MP0 pour déclarer la macro) est à proscrire, le fait de mettre MP0 exécutera la macro, ce n'est pas une déclaration.
La première solution est la bonne. Il me semble que tailbite supprime la notation macro, je n'ai d'ailleurs pas compris pourquoi, un jour, Fred a utilisé les macros pour son code, avant il faisait sans.

Linux, c'est quoi au fait :roll:

Non, je n'ai pas encore retravaillé l'install de PB qui ne fonctionne pas.
J'ai installé ça pour t'aider dans tes codes asm, mais pour l'instant PB nunux sommeille :D

Publié : jeu. 13/nov./2008 21:34
par Progi1984
Cool, c'est la première solution que j'ai mis en place :p

Pour Linux, hésite pas à me contacter samedi par msn pour que l'on travaille sur ton problème :)

Je continue. J'ai réussi à générer des fichiers ASMs distincts. Manque la génération du "_Init'. Et je continue...

Publié : jeu. 13/nov./2008 23:43
par Progi1984
J'arrive à générer les fichiers ASM au complet, et leurs petits frères d'extension O, les objets.

Par contre, quand j'essaie de créer le fichier Library (.A sous Linux, .Lib sous Windows), je n'arrive pas à générer le fichier. En ligne de commande, à la mano, aucun problème.

Code : Tout sélectionner

RunProgram("/usr/bin/ar rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("ar rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("/usr/bin/ar", " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("ar", " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", #PB_Program_Wait)
Aucun fichier généré !...

Un bug dans PB 4.2 ?

Publié : ven. 14/nov./2008 5:47
par Anonyme2
Je suis surpris que sous linux on utilise le Chr(34) car sous windows c'est un reste du dos. Je n'ai pas la doc de PB sous linux mais si on doit mettre le chr(34) la règle que j'applique c'est un nombre pair de chr(34) qui représente le '".

Un chr(34) devant la chaine et un à la fin de la chaine.
Tous les problèmes de ligne de commande sous windows pour créer un asm ou un fichier lib venait pratiquement toujours de problème de Chr(34).

Voici deux de tes exemples corrigés (avec des variantes) et dis moi tout

Code : Tout sélectionner

RunProgram("/usr/bin/ar rvs", Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o"+Chr(34), "", #PB_Program_Wait)


RunProgram("/usr/bin/ar rvs", Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o"+Chr(34), "", #PB_Program_Wait)



RunProgram("/usr/bin/ar", Chr(34)+ " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o" +Chr(34), "", #PB_Program_Wait)


RunProgram("/usr/bin/ar", Chr(34)+ " rvs /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o" +Chr(34), "", #PB_Program_Wait)

Publié : sam. 15/nov./2008 8:20
par Progi1984
Aucun résultat :'(

J'ai fait un paquet avec juste la ligne de commande qui ne fonctionne pas et les fichiers objets pour faire l'archive.
File:1->Test_AR.zip
Image

Peut etre qu'un autre testeur linux pourra tester :)

Publié : sam. 15/nov./2008 10:01
par Anonyme2
Moi je me demande si le Chr(34) a lieu d'être mis car c'est un reste du dos.

Dans le fichier SDK de PB, il n'y a pas d'exemple de ligne de commande ?

Parce que moi linux, rien de rien même avec le tuto de SCRAT, il ne trouve pas un des paket que d'ailleurs je ne trouvais pas moi non plus.

J'ai désinstallé linux (celle que j'ai installé depuis Wndows avec ton lien car il me semble que c'est la version 64 qui s'est installé (j'ai regardé dans la faq) car ma bécane doit supporté certaines instructions.

J'ai voulu installer linux depuis le fichier iso converti sur DVD (les liens de Comtois), tout s'est bien passé sauf qu'il a été incapable de redimensionner la partition choisie, j'ai stoppé car il me proposais des choses que je ne comprenais pas.

Je vais monter cet après-midi un ancien disque dur, je vais débranché les autres et je vais bouter sur le DVD et installer sur l'ensemble du disque, on verra bien ce qu'il va se passer.

Je raffole de ces problèmes

:D

Publié : sam. 15/nov./2008 10:44
par Progi1984
As tu essayé un outil de Virtualisation genre VirtualBox ?

Tu m'étonnes ces problèmes, ce sont ceux qui nous amusent le plus !

Si t'as installé la version X64; sure que cela va poser quelques problèmes !

Publié : sam. 15/nov./2008 16:13
par Progi1984
Pour le bug de génération des objets, cela venait de RunProgram. Le bug est ici :
http://www.purebasic.fr/english/viewtop ... 396#267396

Si tu veux le dernier code source du projet :
http://code.google.com/p/moebius-pb/

Je sais que j'avance sur les problèmes, grace à toi.
Merci.

Allez je continue... :)
Toujours le bug avec la version r12 du code :

Code : Tout sélectionner

[COMPILER]FunctionTest() is not a function, array, macro or linked list

Et pourtant une userlib est générée.

Publié : sam. 15/nov./2008 18:41
par Anonyme2
Pour l'instant, avec fasm j'ai un fichier o avec le code suivant

Code : Tout sélectionner

RunProgram("/home/jj/purebasic/compilers/fasm",  "/home/jj/purebasic/LIbrairie_Asm/FunctionTest.asm /home/jj/purebasic/LIbrairie_Asm/FunctionTest.o","",#PB_Program_Wait)
Bon, je met le chemin complet de fasm car sinon il n'est pas reconnu

mon fichier .bashrc contient ces lignes à la fin
alias pb=/home/jj/purebasic/compilers/purebasic
export PATH=$PATH:/home/jj/purebasic/compilers
Pour la lib je continue mes tests sous linux, je finirais par y arriver.

SI t'as des problèmes sous windows, je t'expliquerais les lignes de commandes que j'utilise.