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%