Na realidade creio que deveria ser

gcc -c arquivo.c (saida arquivo objeto "arquivo.o")

Isso ira gerar um arquivo (objeto) de saida "arquivo.o"

se vc não usar a opção -c o gcc irá gerar um executável.

A opção -o serve apenas para renomear o arquivo de saida que seria "a.out" no caso do camando abaixo.

gcc arquivo.c (saida arquivo executável "a.out")

Assim sendo,

gcc arquivo.c -o arquivo.o (saida arquivo executável "arquivo.o")

gera um arquivo executável de nome "arquivo.o".