Oi Claynon,
Vou escrever um pouco, mas o melhor é ler a página
Linker
A mensagem de erro acima não foi gerada pelo compilador (no caso o gcc), mas sim pelo "linker" (no caso o ld).
O processo de compilação verifica se o seu programa está sintaticamente correto e, se for o caso gera os chamados "object files".
Esse object files não são arquivos executáveis. Eles possuem referências à funções que não estão no arquivo fonte do seu programa (como scanf, fscanf. . .).
Um outro programa, o "linker" e o responsável por criar o arquivo executável.
Para isto o linker recebe como entrada o object file (resultado da compilação do programa que você escreveu) e outros arquivos como arquivos de biblioteca.
No caso do pow o linker precisa da biblioteca libm.a.
A opção "-lm" que você coloca é para avisar o linker para procurar o códido do pow na biblioteca libm.a.
Só depois de encontrar o código do pow é que o linker gera o executável do seu programa.
Caso o linker não encontre todos os trechos de código que estão faltando no seu programa ele apresenta uma mensagem, como a que você recebeu.
collect2: ld returned 1 exit status
Voltando ao seu programa. Ele utiliza a função pow da biblioteca matemática do C, ele deve conter a linha
#include <math.h>
que possui o protótipo da função pow:
double pow(double,double);
Com isto o gcc não acusará erro/aviso sobre sintaxe "... pow não declarado ...".
(Sem esse protótipo o gcc supõe que pow é uma função que retorna um inteiro, por default (por negligência)).
Já a opção "-lm" avisa o linker para procurar códigos não definidos no arquivo de biblioteca libm.a.
Bem, estes são os meus não-sei-quantos-centavos (minha explicação meia-boca).