Когда я запускаю отладчик: "не удалось установить управляющий терминал"
В книге, которую я прочитал, процессор автора был 32-разрядным. Мой 64-битный. Я запускаю ассемблер NASM в терминале с:
nasm -f elf -g -F stabs asmwork/eatsyscall.asm
Затем я запускаю компоновщик:
ld -o eatsyscall eatsyscall.o
Это вернулось:
архитектура входного файла ld: i386 eatsyscall.o
несовместим с выходом i386:x86-64
Я прочитал несколько ответов, и он сказал, что мне нужно использовать elf64
(не так, как сказано в книге). Я запускаю ассемблер, и это решило это сообщение.
Теперь я бегу в терминале kdbg eatsyscall.o
, Открывается программное обеспечение KDbg и KDbg: вывод программы.
Я выбираю точку останова в строке и, как обычно, появляется красный круг. Я нажимаю кнопку "Выполнить", и красный круг не изменяется для стрелки. Вместо этого в выводе программы KDbg: она выводит это сообщение (я не показываю, где .o
файл как в выводе написано):
warning: GDB: Failed to set controlling terminal: Operation not permitted
/bin/bash: Permission denied
/bin/bash: line 0: exec: cannot execute: Permission denied.
Или в одном случае, просто это сообщение:
warning: GDB: Failed to set controlling terminal: Operation not permitted
В Настройки> Глобальные параметры у меня есть следующее.
- Как вызвать GDB:
gdb --fullname --nx
- Терминал для вывода программы:
xterm -name kdbgio -title %T -e sh -c %C
Что я могу сделать? Почему я получаю ошибку разрешения? Это что-то связано с командой sudo
?
ОБНОВИТЬ
Для запуска отладчика я использовал kdbg program
а также kdbg ./program
, Исполняемый файл, который я хочу отладить, называется program
и он находится в папке asmwork
, Когда мой рабочий каталог находится в этой папке, я пишу ls -l
и я получаю следующее о файле:
-rwxrwxr-x 1 adam adam 1304 יול 24 17:56 program
1 ответ
Я вижу, что это старо. Тем не менее, это без ответа, и он получает значительные мнения, следовательно.....
Я прочитал некоторые ответы, и они сказали, что мне нужно использовать `elf64` (не так, как сказано в книге).
Рассматриваемая книга действительно посвящена программированию на ассемблере для 32-битных процессоров Intel x86, об этом прямо говорится во всех публикациях по маркетингу, которые я видел. Вам нужно помнить о тонких различиях между архитектурами IA-32 и x86-64. Если вы используете компьютер с архитектурой x86-64, то вполне вероятно, что некоторые примеры, приведенные в тексте, могут потребовать незначительной настройки.
В дополнение к изменению elf
в elf64
было бы разумно заменить stabs
с dwarf
, как по моему опыту, сборка вашей программы с stabs
в x86-64 не совсем совместимо; stabs будет более подходящим форматом для работы с IA-32 Linux.
Опять же, вам решать, где примеры, приведенные в тексте, необходимо скорректировать с учетом изменений в технологии.
nasm -f elf -g -F stabs eatsyscall.asm
становится...............
nasm -f elf64 -g -F dwarf eatsyscall.asm
Это должно успешно скомпилировать ваш исходный код в файл объектного кода, совместимый с x86-64....................................................................................................................................................................
С помощью elf
формат в отличие от elf64
Будет сборка x86
файл объектного кода. Затем вы можете создать 32-битный исполняемый файл, используя следующее:
ld -m elf_i386 -o executablename objectfilename.o
вариант -m
для эмуляции (смотрите ld
справочные страницы). Здесь вы можете выбрать желаемую архитектуру из доступных. С помощью -m elf_i386
позволяет нам создать i386
исполняемый на нашей машине x86-64.
Вы можете использовать опцию -V
получить список доступных архитектур; пожалуйста, смотрите справочные страницы для более подробной информации.
..............................................................................
Я запускаю в терминале `kdbg eatsyscall.o`. Он открывает программное обеспечение Kdbg и Kdbg: вывод программы
Вам нужно будет загрузить исполняемый файл в отладчик, а не файл объектного кода, как указано выше. Вы уже создали этот исполняемый файл, предполагая, что он был успешным, когда вы запускали объектный модуль через компоновщик; как указано в вашем вопросе.
Похоже, ваша главная проблема связана с предупреждением в окне выходного терминала.
Решение можно найти в руководстве. Я воспроизведу решение здесь, на случай, если в будущем произойдет сбой URL.
Когда программа отлаживается с помощью KDbg в первый раз, программа
окно вывода не используется. Причина этого заключается в том, что KDbg не может знать, требует ли программа сложной эмуляции терминала или ожидает ввода через терминал. Таким образом, программа-эмулятор терминала используется по умолчанию. Чтобы перенаправить вывод в окно вывода, вы должны сделать следующее:
- Откройте диалоговое окно "Настройки", выбрав "Настройки | Эта программа".
- Перейдите на вкладку "Вывод".
- Выберите "Только вывод", простую эмуляцию терминала и нажмите "ОК".
- Перезагрузите программу, выбрав ее в списке "Файл | Недавние"> "Исполняемые файлы".