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/stdout
もGCCと同じであった.
*1:http://caspar.hazymoon.jp/OpenBSD/annex/elf.html ELF Formatについて