¿Por qué esta declaración produce un error de enlace con gcc?

Tengo este fragmento de código C extremadamente trivial:

static int arr[];
int main(void) {
    *arr = 4;
    return 0;
}

Entiendo que la primera declaración es ilegal (he declarado una matriz de alcance de archivo con una duración de almacenamiento estático y un enlace de archivo pero sin un tamaño especificado), pero ¿por qué está generando un error de vinculador? :

/usr/bin/ld: /tmp/cch9lPwA.o: in function `main':
unit.c:(.text+0xd): undefined reference to `arr'
collect2: error: ld returned 1 exit status

¿No debería el compilador poder captar esto antes del enlazador?

También es extraño para mí que, si omito elstatic clase de almacenamiento, el compilador simplemente supone que la matriz tiene una longitud1 y no produce ningún error más allá de eso:

int arr[];
int main(void) {
    *arr = 4;
    return 0;
}

Resultados en:

unit.c:5:5: warning: array 'arr' assumed to have one element
 int arr[];

¿Por qué omitir la clase de almacenamiento da como resultado un comportamiento diferente aquí y por qué el primer fragmento de código produce un error de enlace? Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta