Quando executo o depurador: “falha ao definir o terminal de controle”

2

Em um livro que li, a CPU do autor era de 32 bits. O meu é de 64 bits. Eu corro o montador NASM no terminal com:

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

Então eu corro o linker:

ld -o eatsyscall eatsyscall.o

Isso retornou:

ld: arquitetura i386 do arquivo de entrada eatsyscall.o é incompatível com i386: saída x86-64

Eu li algumas respostas e ele disse que eu precisava usar elf64 (não como o livro dizia). Eu corro o montador e resolvi essa mensagem.

Agora eu corro no terminal kdbg eatsyscall.o . Ele abre o software KDbg e KDbg: saída do programa .

Eu seleciono um ponto de interrupção em uma linha e, como de costume, um círculo vermelho aparece. Eu clico em executar e o círculo vermelho não é alterado para uma seta. Em vez disso, na saída do KDbg: Program , esta mensagem é exibida (não estou mostrando onde o arquivo .o está como na saída em que está escrito):

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

Ou, em uma ocasião, apenas esta mensagem:

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

Em Configurações > Opções Globais Eu tenho o seguinte.

  • Como invocar o GDB: gdb --fullname --nx
  • Terminal para saída do programa: xterm -name kdbgio -title %T -e sh -c %C

O que posso fazer? Por que recebo um erro de permissão? É algo relacionado ao comando sudo ?

UPDATE

Para executar o depurador, usei kdbg program e kdbg ./program . O arquivo executável que eu quero depurar é chamado program e está localizado na pasta asmwork . Quando meu diretório de trabalho está com essa pasta, escrevo ls -l e obtenho o seguinte sobre o arquivo:

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

    
por Pichi Wuana 23.07.2016 / 18:44

1 resposta

0

Eu vejo que isso é velho. No entanto, não é respondido e está recebendo visões significativas, portanto ...

% bl0ck_qu0te%

O livro em questão é realmente sobre programação em linguagem assembly para as CPUs x86 de 32 bits da Intel, isso é explicitamente indicado em toda a literatura de marketing que já vi. Você precisa estar atento às diferenças sutis entre as arquiteturas IA-32 e x86-64. Se você estiver usando um PC x86-64, é lógico que alguns dos exemplos dados no texto podem precisar de alguns ajustes.

Além de alterar elf para elf64 , seria aconselhável substituir stabs por dwarf , pois, em minha experiência, montar seu programa com stabs em x86-64 não é totalmente compatível; stabs seria um formato mais apropriado para trabalhar com o IA-32 Linux.

Mais uma vez, cabe a você decifrar onde os exemplos dados no texto precisam ser ajustados para a mudança na tecnologia.

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

torna-se ...............

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

Isso deve compilar com sucesso seu código-fonte em um arquivo de código de objeto compatível com x86-64. .................................................. .................................................. .................................................. .............

Usando o formato elf em vez de elf64 , irá montar um arquivo de código de objeto x86 . Você pode criar um executável de 32 bits usando o seguinte:

ld -m elf_i386 -o executablename objectfilename.o

Opção -m é para Emulação (consulte ld man pages). Aqui você pode selecionar a arquitetura desejada, dentre as disponíveis. Usar -m elf_i386 nos permite criar um executável i386 em nossa máquina x86-64.

Você pode usar a opção -V para obter uma lista de arquiteturas disponíveis; por favor, veja man pages para detalhes completos.

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

% bl0ck_qu0te%

Você precisará carregar um arquivo executável no depurador, não um arquivo de código objeto como acima. Você já criou este executável, assumindo que foi bem-sucedido, quando você executou o módulo de objeto através do vinculador; como afirmado na sua pergunta.

Sua principal preocupação parece ser com o aviso na janela do terminal de saída.

A solução pode ser procurada no manual . Vou reproduzir a solução aqui, caso a URL falhe no futuro.

% bl0ck_qu0te%     
por Andrew Hardiman 07.11.2017 / 22:35