Compilation d’assemblage 32 bits sur Ubuntu 64 bits sous Windows

EDIT: On dirait que le problème est que le sous-système Windows pour Linux ne peut pas gérer 32 bits.

Assembly et linux newbie essayent ici de comstackr l’assemblage 32 bits (syntaxe AT & T) sur Ubuntu 64 bits sous Windows. Ma situation est pratiquement une réplique exacte de cette autre question de stackoverflow, mais les solutions (que je vois répétées dans de nombreux autres articles) ne fonctionnent pas pour moi, pour une raison quelconque. J’apprends l’assemblage x86 avec le livre Programming from the Ground Up et je ne parviens pas à comstackr les programmes sur Bash sous Ubuntu sous Windows.

J’ai essayé plusieurs combinaisons d’options dans mes commandes, certaines paraissent apparemment comstackr, mais je ne peux pas non plus exécuter le fichier binary (erreur de format) ou je peux mais j’obtiens une erreur de segmentation quand j’arrive à movl 8(%ebp), %eax dans mon fichier source (j’ai lu qu’il est probablement dû à la configuration d’une stack 32 bits dans un environnement 64 bits).

Sans .32code comme première ligne de mon programme et avec une option --32 pour as , aucune tentative avec ld produire quelque chose de utile: sans .32code et avec –32 (impossible d’intégrer des images dans mes messages alors placez un lien à la place) ).

Toujours sans .32code et maintenant avec --x32 ( sans .32code et avec –x32 ) j’ai découvert qu’il avait des problèmes avec push, pop, etc. si vous n’incluez pas le .32code alors je l’inclus ici dans ma source fichier: avec .32code et avec –x32 .

Ensuite, il y a des tentatives similaires que je peux faire avec gcc au lieu de as et de ld mais je ne suis pas sûr qu’il soit logique d’inclure toutes les différentes combinaisons d’échecs et d’ouvrir cette boîte de ver parce que bibliothèques dont il a besoin (?). Par exemple, avec gcc -m32 -nostdlib factorial.s -o factorial j’obtiens le message “ne peut pas exécuter le fichier binary: Exec format error”, avec ou sans le .32code . Essayer des choses comme sudo apt-get install lib32gcc-4.8-dev et d’autres tentatives, rien ne semble fonctionner et je rencontre souvent des problèmes avec qemu-user-static parce que je l’ai installé à un moment donné ^ #! d.

Une réponse a simplement recommandé d’installer gcc en 32 bits, mais cela ne semblait pas faire quoi que ce soit pour moi. Une autre solution pourrait être de convertir manuellement tous les exemples du livre en 64 bits et d’oublier tout cela. J’imagine que cela impliquerait de repenser la stack pour contenir 8 au lieu de 4 (c.-à-d. Des choses comme 4(%esp) deviendraient 8(%esp) ) mais changeraient aussi certains movl en movq , par exemple, ou certains %eax à %rax , etc. Mais je pense qu’il devrait y avoir une solution à cela, surtout que l’affiche en 2013 semblait avoir le problème exact résolu. Peut-être que je dois réessayer avec -march=CPU[+EXTENSION...] ou -mtune=CPU ? Peut-être que je manque juste de connaissances de base sur les architectures, ou Linux, ou en tant que / gcc?

Je pense que votre assembleur fonctionne très bien. Si vous souhaitez créer un lien avec la version installée de glibc, vous devez vous assurer d’installer la version i386 des packages de développement (probablement libc6-dev:i386 , mais cela pourrait aussi être libc6-dev-i386 selon la version de dissortingbution). et lier avec gcc -m32 pour obtenir les bons chemins. Le pilote du compilateur gcc appellera alors ld avec les indicateurs appropriés.

Vous pouvez vérifier que vous avez une configuration de travail en compilant et en liant un petit fichier C avec gcc -m32 . Cela devrait générer un programme 32 bits.