gcc -c -o - が失敗(GNU asが悪い)

ちょっとしたときにGCCにパイプでソースを食わせて,そのままパイプで出力を見たいことってあると思うんだよね.ところが,という話.まず,

$ echo 'main(c){return c+8;}'|gcc -xc - -m32 -S -o -|cat -n
     1          .file   ""
     2          .text
     3  .globl main
     4          .type   main, @function
     5  main:
     6          pushl   %ebp
     7          movl    %esp, %ebp
     8          movl    8(%ebp), %eax
     9          addl    $8, %eax
    10          popl    %ebp
    11          ret
    12          .size   main, .-main
    13          .ident  "GCC: (Debian 4.4.5-10) 4.4.5"
    14          .section        .note.GNU-stack,"",@progbits

ここまではよいのだが...

$ echo 'main(c){return c+8;}'|gcc -xc - -m32 -c -o -|od -v -t x1 -Ax
Assembler messages:
Fatal error: can't open a bfd on stdout -
0000000
$ echo 'main(c){return c+8;}'|gcc -xc - -m32 -c -o /dev/stdout|od -v -t x1 -Ax
/tmp/ccp46iNT.s: Assembler messages:
/tmp/ccp46iNT.s:14: Fatal error: can't write /dev/stdout: Illegal seek
/tmp/ccp46iNT.s:14: Fatal error: can't close /dev/stdout: Illegal seek
0000000

くっそ くっそ
ld(1) まで来ると今度は(一応)実行できるという...

$ echo 'main(c){return c+8;}'|gcc -xc - -o -|od -v -t x1
0000000
$ rm -- -   ← m9(^Д^)
$ echo 'main(c){return c+8;}'|gcc -xc - -o /dev/stdout|od -v -t x1 -Ax
000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
000010 02 00 3e 00 01 00 00 00 b0 03 40 00 00 00 00 00
000020 40 00 00 00 00 00 00 00 60 09 00 00 00 00 00 00
(略
$ echo -en '\x7eELF'|od -t x1 -Ax
0000000 7e 45 4c 46
0000004

(ちゃんと先頭にELFヘッダ*1が出てる.)直交性のかけらもないな...
ちなみに最近流行りのClangでも試したが,中では結局 GNU as を呼んでるので -o --o /dev/stdoutGCCと同じであった.