Pergunta

Provavelmente estou fazendo algo errado, ser um novato. você poderia me ajudar por favor?

Eu escrevi um programa simples Olá Mundo em C chamado hello.c, e correu o seguinte comando:

gcc -S hello.c

Isso hello.s produzido. Então eu usei esse arquivo com GNU assembler, as:

as hello.s

que produziu um a.out não-executável, que ainda precisa ser ligado, eu entendo?

Eu tento ligá-lo usando ld, assim:

ld a.out

Mas obter o seguinte erro:

a.out: file not recognized: File truncated

E ld exclui meu arquivo.

Este é um sistema x86 Ubuntu. O que estou fazendo de errado? Muito obrigado!

Foi útil?

Solução

A minha primeira pergunta seria: por que você está montando o código? Se você deseja que o código assembler a, por todos os meios, uso gcc -S para obtê-lo (para visualização, eu acho).

Mas você não precisa correr que através as para continuar, basta usar:

gcc -o hello hello.c
gcc -S hello.c

Essa primeira etapa irá ligar a fonte C diretamente em um arquivo executável, a segunda lhe dará sua fonte assembler.

O seu problema específico pode ser que tenta ld para escrever sua saída para a.out. Se isso é também o seu arquivo de entrada, pode muito bem estar a ser destruído no processo de execução de ld. Você poderia tentar renomear a.out para a.in antes de executar o comando ld:. ld a.in

Outras dicas

Aqui está como eu faço isso:

> gcc -S forums.c 
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums 
test

Por que invoco gcc vez de ld? Porque GCC cuida de ligar o tempo de execução C, e fazendo outras coisas dependente de implementação. Se você quiser ver que, use a opção --verbose:

> gcc --verbose forums.o -o forums
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC) 
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic'
 /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o

EDIT: ok, eu tentei isso tudo para fora no meu sistema, e eu acho que sei qual é o problema. ld está escrevendo para a.out (seu arquivo de saída padrão), ao ler a partir dele, ao mesmo tempo. Tente algo parecido com isto:

ld a.out -o myprog

reinstalação glibc-devel qualquer maneira você pode e verificar se ele funciona. este processo de trabalho para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top