На этот вопрос уже есть ответ:
В книге, которую я читал, процессор автора был 32-битным. Моя 64-битная. Я запускаю ассемблер NASM в терминале с помощью:
nasm -f elf -g -F stabs asmwork/eatsyscall.asm
Затем я запускаю компоновщик:
ld -o eatsyscall eatsyscall.o
Это вернуло:
ld: i386 архитектура входного файла eatsyscall.o
несовместима с i386: x86 -64 output
Я прочитал несколько ответов, и там было сказано, что мне нужно использовать elf64
(не так, как сказано в книге).
Я запустил ассемблер, и он решил это сообщение.
Теперь я запускаю в терминале kdbg eatsyscall.o
. Он открывает программное обеспечение KDbg и KDbg: программный вывод .
Я выбираю точку останова в строке и, как обычно, появляется красный кружок. Я нажимаю кнопку «Выполнить», и красный кружок не меняется на стрелку. Вместо этого в KDbg: Program output он выводит это сообщение (я не показываю, где находится файл .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 --fullname --nx
xterm -name kdbgio -title% T -e sh -c% C
Что я могу делать? Почему я получаю ошибку разрешения? Это что-то связано с командой sudo
?
ОБНОВЛЕНИЕ
Для запуска отладчика я использовал программу kdbg
и kdbg ./program
. { {1}} Исполняемый файл, который я хочу отладить, называется программа
и находится в папке asmwork
. Когда мой рабочий каталог находится в этой папке, я пишу ls -l
и получаю следующее о файле:
-rwxrwxr-x 1 adam adam 1304 יול 24 17:56 program
Я вижу, что это старо. Однако это является оставшимся без ответа, и это получает значительные представления, следовательно …..
Я прочитал некоторые ответы, и это сказало, что я должен был использовать 'elf64' (не как сказанная книга).
Рассматриваемая книга действительно о программировании в ассемблере для 32-разрядного x86 ЦП Intel, это явно указано повсюду, и в любой маркетинговой литературе, которую я видел. Необходимо будет помнить тонкие различия между IA-32 и x86-64 архитектурой. При использовании x86-64 ПК он выдерживает обосновать, что некоторым примерам, данным в тексте, возможно, понадобится тонкая настройка немного.
В дополнение к изменению elf
кому: elf64
, было бы мудро заменить stabs
с dwarf
, как, по моему опыту, собирая Вашу программу с stabs
в x86-64 не совсем совместимо; удары были бы более соответствующим форматом для работы с Linux IA-32.
Снова, Вам решать для дешифровки, где примеры, данные в текстовой потребности, корректирующейся для изменения в технологии.
nasm -f elf -g -F stabs eatsyscall.asm
становится...............
nasm -f elf64 -g -F dwarf eatsyscall.asm
Это должно успешно скомпилировать Ваш исходный код в x86-64 совместимый файл объектного кода....................................................................................................................................................................
Используя elf
формат в противоположность elf64
, будет блок a x86
файл объектного кода. Можно затем создать 32-разрядный исполняемый файл с помощью следующего:
ld -m elf_i386 -o executablename objectfilename.o
Опция -m
для Эмуляции (посмотрите ld
страницы справочника). Здесь можно выбрать желаемую архитектуру от доступных. Используя -m elf_i386
позволяет нам создать a i386
исполняемый файл на нашей x86-64 машине.
Можно использовать опцию -V
получить список доступной архитектуры; см. страницы справочника для полного изложения.
..............................................................................
Я работаю в терминале 'kdbg eatsyscall.o'. Это открывает программное обеспечение Kdbg и Kdbg: Программа производится
Необходимо будет загрузить исполняемый файл в отладчик, не файл объектного кода как выше. Вы уже создали этот исполняемый файл, предположив, что это было успешно при выполнении объектного модуля через компоновщика; как указано в Вашем вопросе.
Ваше основное беспокойство, кажется, с предупреждением в окне выходной клеммы.
Решение может быть найдено в руководстве. Я воспроизведу решение здесь, в случае, если URL перестал работать в будущем.
Когда программа отлажена с KDbg впервые, программой
окно вывода не используется. Причина этого состоит в том, что KDbg не может знать, требует ли программа сложной эмуляции терминала или если это ожидает вход через терминал. Так, программа эмулятора терминала используется по умолчанию. Для перенаправления вывода к окну вывода необходимо сделать следующее:
- Откройте диалоговое окно Настроек путем выбора Программы Settings|This.
- Переключитесь на вкладку Output.
- Выберите вывод Only, простую эмуляцию терминала и нажмите "OK".
- Перезагрузите программу путем выбора его из списка в File|Recent> Исполняемые файлы.