IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Affichage des résultats du sondage: Améliorer la bibliothèque standard au niveau de l'allocation dynamique?

Votants
10. Vous ne pouvez pas participer à ce sondage.
  • C'est une bonne idée

    1 10,00%
  • J'en vois pas l'utilité

    9 90,00%
C Discussion :

Allocation dynamique, discussion autour de la librairie standard


Sujet :

C

  1. #21
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,

    Citation Envoyé par chrtophe Voir le message
    non, tu ne pourras pas l’exécuter sous Windows. Par ailleurs, ton programme va appeler des fonctions systèmes qui ne sont pas les même sous Linux et Windows. Par ailleurs la convention d'appel des fonctions est différente.

    Par contre, si tu écrit un code en C, en utilisant les fonctions de la libc (comme fopen, fread, fwrite), et en recompilant ton code, il fonctionnera sur Windows et Linux (avec un programme exécutable différent par plateforme).

    malloc existe sous Windows, fonctionnera pareil en externe (paramètres à fournir, paramètre retourné), mais pas pareil en interne. Tu as vu dans les posts que malloc sous Linux utilisait mmap et sbrk, ces fonctions n'existent pas sous Windows. Tout comme HeapAlloc, VirtualAlloc n’existe que sous Windows.
    Non, il est tout à fait possible d'écrire du code assembleur sous GNU/Linux, Mac OS et le compiler pour qu'il soit exécutable sous le système d'exploitation Windows, il suffit juste de connaître le format PE de Windows (et notamment les ABI système de Windows) et ainsi écrire des instructions assembleur qui vont fonctionner sur le système Windows (voir exemple ci-dessous)
    En revanche oui utilisée, le langage C permettra d'avoir le même code source fonctionnel sur différents systèmes et architecture.
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    BITS 32
     
    	extern _printf
    	global _main
     
    	section .data
     
    Msg_x86_32: db 'Bonjour Windows 32 bits', 0xA, 0x13,0x0
    Msg_x86_64: db 'Bonjour Windows 64 bits', 0xA, 0x13,0x0
     
     
    	section .text
    _main:
    		push Msg_x86_32
    		call _printf
    		add esp, 0x4
    		ret

    Code compil Unix : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    labSec:DebugAsm_unix_pe MrDebugVirtual$ nasm -fWin32 source.asm -o source.obj 
    labSec:DebugAsm_unix_pe MrDebugVirtual$ i686-w64-mingw32-gcc source.obj -o Deb.exe
    labSec:DebugAsm_unix_pe MrDebugVirtual$ nasm -fWin32 source.asm -o source.obj 
    labSec:DebugAsm_unix_pe MrDebugVirtual$ i686-w64-mingw32-gcc source.obj -o Deb.exe
    labSec:DebugAsm_unix_pe MrDebugVirtual$ objdump -h Deb.exe
    Deb.exe:	file format COFF-i386
    
    Sections:
    Idx Name          Size      Address          Type
      0 .text         00001224 0000000000401000 TEXT DATA 
      1 .data         00000060 0000000000403000 DATA 
      2 .rdata        00000430 0000000000404000 DATA 
      3 .bss          00000000 0000000000405000 BSS
      4 .idata        00000538 0000000000406000 DATA 
      5 .CRT          00000034 0000000000407000 DATA 
      6 .tls          00000020 0000000000408000 DATA 
      7 .debug_aranges 00000038 0000000000409000 DATA 
      8 .debug_info   00001b48 000000000040a000 DATA 
      9 .debug_abbrev 00000133 000000000040c000 DATA 
     10 .debug_line   00000349 000000000040d000 DATA 
     11 .debug_frame  00000038 000000000040e000 DATA 
     12 .debug_str    00000156 000000000040f000 DATA
    Et dans Windows sous la console en obtient bien
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    C:\Users\WINLABSEC\Desktop\DebugAsm\Deb.exe
    Bonjour Windows 32 bits
    @


    Autres points si en souhaite allouer de la mémoire sous Windows, autant utiliser directement ce que L'API mise a disposition HeapAlloc, GlobalAlloc etc.. seul différence entre HeapAlloc et malloc par exemple est que l'un est portable l'autre non.
    À bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  2. #22
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    printf n'est pas une fonction système, mais une fonction libc. Donc à ce niveau, oui ça marchera.

    Donc si tu utilises fopen pour ouvrir un fichier ça fonctionnera partout, mais pas si tu utilises CreateFile, qui est une fonction spécifique Windows, ton code ne sera compatible qu'avec Windows;
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #23
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    printf n'est pas une fonction système, mais une fonction libc. Donc à ce niveau, oui ça marchera.

    Donc si tu utilises fopen pour ouvrir un fichier ça fonctionnera partout, mais pas si tu utilises CreateFile, qui est une fonction spécifique Windows, ton code ne sera compatible qu'avec Windows;
    Oui et je n'ai pas dit le contraire
    Citation Envoyé par sambia39 Voir le message
    Bonsoir,
    Non, il est tout à fait possible d'écrire du code assembleur sous GNU/Linux, Mac OS et le compiler pour qu'il soit exécutable sous le système d'exploitation Windows, il suffit juste de connaître le format PE de Windows (et notamment les ABI système de Windows) et ainsi écrire des instructions assembleur qui vont fonctionner sur le système Windows (voir exemple ci-dessous)
    Le but était de montrer quand pouvait écrire du code assembleur sous le système GNU/Linux, MAC Os X, FreeBSD ou UNIX le compiler sous ces derniers aux formats PE Windows (donc qu'il est question de format d'excutable) et le faire exécuter sous le système Windows. J'ai volontairement pris l'exemple du cas de la libc parce qu'il est portable, je peux faire de même en utilisant uniquement les appels système Windows (voir exemple ci-dessous)

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    BITS 32
    	global _main
    	extern _MessageBoxA@16
    	extern _ExitProcess@4
     
    	section .data
    Msg_x86_32_A: db ' Tiens une Fenêtre 32 bits Windows',0x0
    Msg_x86_32_B: db ' Autre exemple ;)', 0x0
     
    	section .text
    _main:
    	push 0x0 | 100h
    	push Msg_x86_32_A
    	push Msg_x86_32_B
    	push 0x0
     
    	call _MessageBoxA@16
    	cmp eax, 0x7
    	je _main
     
    	push 0x0
    	call _ExitProcess@4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    labSec:DebugAsm_unix_pe MrDebugVirtual$ nasm -fWin32 source.asm -o source.obj 
    labSec:DebugAsm_unix_pe MrDebugVirtual$ i686-w64-mingw32-gcc source.obj -o Deb.exe
    labSec:DebugAsm_unix_pe MrDebugVirtual$ objdump -h Deb.exe
    Deb.exe:	file format COFF-i386
    Sections:
    Idx Name          Size      Address          Type
      0 .text         00001244 0000000000401000 TEXT DATA 
      1 .data         0000007c 0000000000403000 DATA 
      2 .rdata        00000430 0000000000404000 DATA 
      3 .bss          00000000 0000000000405000 BSS
      4 .idata        00000580 0000000000406000 DATA 
      5 .CRT          00000034 0000000000407000 DATA 
      6 .tls          00000020 0000000000408000 DATA 
      7 .debug_aranges 00000038 0000000000409000 DATA 
      8 .debug_info   00001b48 000000000040a000 DATA 
      9 .debug_abbrev 00000133 000000000040c000 DATA 
     10 .debug_line   00000349 000000000040d000 DATA 
     11 .debug_frame  00000038 000000000040e000 DATA 
     12 .debug_str    00000156 000000000040f000 DATA
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  4. #24
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    On peut cross-compiler un programme pour Windows depuis Linux (en utilisant MinGW), mais l'exécutable PE résultant ne pourra pas tourner nativement sous Linux.

    Il pourra tourner dans WINE, par contre.
    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.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/06/2016, 06h27
  2. Extraire les objets d'une librairie dynamique
    Par Lapk_gre dans le forum C
    Réponses: 13
    Dernier message: 29/07/2008, 14h49
  3. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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