web-dev-qa-db-fra.com

Lorsque j'exécute le débogueur: "Impossible de définir le terminal de contrôle"

Dans un livre que j'ai lu, la CPU de l'auteur était en 32 bits. Le mien est 64 bits. Je lance l'assembleur NASM dans le terminal avec:

nasm -f elf -g -F stabs asmwork/eatsyscall.asm

Puis je lance l'éditeur de liens:

ld -o eatsyscall eatsyscall.o

Cela a renvoyé:

ld: l'architecture i386 du fichier d'entrée eatsyscall.o est incompatible avec la sortie i386: x86-64

J'ai lu quelques réponses et il a été dit que je devais utiliser elf64 (pas comme le dit le livre). Je lance l'assembleur et il a résolu ce message.

Maintenant, je cours dans le terminal kdbg eatsyscall.o. Il ouvre le logiciel KDbg et KDbg: Sortie du programme .

Je sélectionne un point d'arrêt sur une ligne et, comme d'habitude, un cercle rouge apparaît. Je clique sur Exécuter et le cercle rouge ne change pas pour une flèche. Au lieu de cela dans KDbg: Sortie du programme , il affiche ce message (je ne montre pas où se trouve le fichier .o de la même manière que dans la sortie écrit):

warning: GDB: Failed to set controlling terminal: Operation not permitted 
/bin/bash: Permission denied 
/bin/bash: line 0: exec: cannot execute: Permission denied.

Ou à une occasion, juste ce message:

warning: GDB: Failed to set controlling terminal: Operation not permitted

Dans Paramètres> Options globales J'ai les éléments suivants.

  • Comment appeler GDB: gdb --fullname --nx
  • Terminal pour la sortie du programme: xterm -name kdbgio -title %T -e sh -c %C

Que puis-je faire? Pourquoi ai-je une erreur de permission? Est-ce quelque chose lié à la commande Sudo?


UPDATE

Pour exécuter le débogueur, j'ai utilisé kdbg program et kdbg ./program. Le fichier exécutable que je veux déboguer s'appelle program et il se trouve dans le dossier asmwork. Lorsque mon répertoire de travail se trouve dans ce dossier, j’écris ls -l et j’obtiens ce qui suit concernant le fichier:

-rwxrwxr-x 1 adam adam 1304 יול 24 17:56 program

This

this

this

2
Pichi Wuana

Je vois que c'est vieux. Cependant, il est sans réponse et il reçoit des points de vue significatifs, d’où… ..

J'ai lu quelques réponses et il a été dit que je devais utiliser `elf64` (pas comme le dit le livre).

Le livre en question concerne vraiment la programmation en langage d'assemblage pour les processeurs Intel 32 bits x86, cela est explicitement indiqué tout au long, et dans toute la littérature marketing que j'ai vue. Vous devez être attentif aux différences subtiles entre les architectures IA-32 et x86-64. Si vous utilisez un ordinateur x86-64, il va sans dire que certains des exemples donnés dans le texte peuvent nécessiter une légère modification.

En plus de remplacer elf par elf64, il serait judicieux de remplacer stabs par dwarf, comme dans mon expérience, l'assemblage de votre programme avec stabs en x86. -64 n'est pas entièrement compatible. poignets serait un format plus approprié pour travailler avec IA-32 Linux.

Encore une fois, il vous appartient de déchiffrer où les exemples donnés dans le texte doivent être adaptés au changement technologique.

nasm -f elf -g -F stabs eatsyscall.asm

devient...............

nasm -f elf64 -g -F dwarf eatsyscall.asm

Cela devrait permettre de compiler votre code source dans un fichier de code objet compatible x86-64. .................................................. .................................................. .................................................. .............

En utilisant le format elf par opposition à elf64, Assembly assemblera un fichier de code objet x86. Vous pouvez ensuite créer un exécutable 32 bits en utilisant les éléments suivants:

ld -m elf_i386 -o executablename objectfilename.o

L'option -m est destinée à l'émulation (voir les pages de manuel ld). Ici, vous pouvez sélectionner votre architecture souhaitée parmi celles disponibles. Utiliser -m elf_i386 nous permet de créer un exécutable i386 sur notre machine x86-64.

Vous pouvez utiliser l'option -V pour obtenir une liste des architectures disponibles. veuillez consulter les pages de manuel pour plus de détails.

.................................................. ............................

Je cours dans le terminal `kdbg eatsyscall.o`. Il ouvre le logiciel Kdbg et Kdbg: Sortie du programme

Vous devrez charger un fichier exécutable dans le débogueur, pas un fichier de code objet comme ci-dessus. Vous avez déjà créé ce fichier exécutable, en supposant que tout se passe bien, lorsque vous avez exécuté le module d’objet via l’éditeur de liens; comme indiqué dans votre question.

Votre principale préoccupation semble être avec l'avertissement dans la fenêtre du terminal de sortie.

La solution peut être recherchée dans le manuel . Je vais reproduire la solution ici, au cas où l’URL échouerait à l’avenir.

Lorsqu'un programme est débogué avec KDbg pour la première fois, le programme
La fenêtre de sortie n'est pas utilisée. La raison en est que KDbg ne peut pas savoir si le programme nécessite une émulation de terminal sophistiquée ou s'il s'attend à une entrée via un terminal. Ainsi, un programme d'émulateur de terminal est utilisé par défaut. Pour rediriger la sortie vers la fenêtre de sortie, vous devez procéder comme suit:

  1. Ouvrez la boîte de dialogue Paramètres en sélectionnant Paramètres | Ce programme.
  2. Basculez vers l'onglet Sortie.
  3. Choisissez Uniquement sortie, émulation de terminal simple, puis cliquez sur OK.
  4. Rechargez le programme en le sélectionnant dans la liste dans Fichier | Récents> Exécutables.
1
Andrew Hardiman