Por que não posso vincular esse arquivo de objeto de linguagem assembly simples?

1

Estou usando o Ubuntu 14.04 e o Terminal.

Estou fazendo um exercício de linguagem assembly para uma aula. Eu queria tentar executar isso no terminal, mas não consigo vincular esse arquivo. [Eu acho que 'link' é a terminologia correta para usar o comando gcc -o ex71 ex71.s , mas eu sou novo na linguagem assembly e GNU / Linux, então eu posso estar enganado]. Abaixo está meu arquivo .s.

Primeiro, digito as -gstabs -o ex71.o ex71.s no terminal, que é o que meu livro-texto faz [para criar um arquivo de objeto direito?]. Em seguida, digito o comando gcc -o ex71 ex71.s . Então, eu digitaria ./ex71 , mas recebo um erro longo com gcc -o ex71 ex71.s me informando relocation ## has invalid symbol index ## . No final do erro, diz undefined reference to 'main' .

Exemplo da mensagem de erro de saída que demonstra sua forma:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12

Código-fonte:

# ex71.s
# Minimum components of a C program, in assembly language
# Copied from Bob Plantz
# 
# comment lines placed to correspond with textbook

    .text
    .globl  f
    .type   f, @function
f:  
    pushq   %rbp            # save caller's frame pointer
    movq    %rsp, %rbp      # establish our frame pointer

    movl    $0, %eax        # return 0 to caller

    movq    %rbp, %rsp      # restore stack pointer
    popq    %rbp            # restore caller's frame pointer
    ret             # back to caller
    
por Timothy Duggan 25.10.2014 / 20:12

1 resposta

0

Você já tem seu arquivo de objeto (gerado, como você supôs corretamente, usando as -gstabs -o ex71.o ex71.s ), então, para vinculá-lo, você deve estar usando:

gcc -o ex71 ex71.o

Veja, por exemplo, este SO pergunta .

O undefined reference to main do GCC é porque espera uma função main quando instruído a criar um executável. Pelo que entendi (posso estar errado, nunca fiz programação em linguagem assembly), você precisa de uma função _start (caso em que você usaria ld ) ou uma função main (nesse caso, você usaria o GCC). Então, substitua f por _start e faça:

ld -o ex71 ex71.o

Ou substitua f por main e faça:

gcc -o ex71 ex71.o

Depois disso, obtenho um segfault, mas cabe a você depurar. Minha compreensão disso termina aqui. :)

    
por muru 25.10.2014 / 21:17