C 言語では次の様にしてchar配列を初期化できますが、

int main(void)
{
    char str[] = "abc";
    ...
}

これは C99 の規格文書で 6.7.8 Initialization の paragraph 14

An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

に基づくものです。一方 6.4.5 String literals の paragraph 5 には

(...) The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. (...)

とあるのですが、この規定は文字列リテラルが初期化に使われる場合にも適用されるのでしょうか。

つまり、厳密に規格準拠のコンパイラは冒頭のコードをコンパイルする場合、"abc"を静的領域に確保してからstrの初期化を行わなければならないのでしょうか?

冒頭の様なコードを gcc -std=c99 -O0 -S すると、当該部分は

    movl    $6513249, 24(%esp)

となるので即値(6513249 = 0x636261)で初期化しており、6.4.5 の規定にそぐわない様に思われるのですが……。