が何なのか不思議だったのですが、ちょっと調べたらinfoにも載ってるしmanにも出てた。
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-6.0.0/man&man=ld
上はFreeBSD 6.0のmanページなんですが、CentOS5.2のldのmanページには出てなかったんですよね・・・。
NetBSD1.6/CentOS5.2では共にldのinfoページに出てました。
仕組みとしては上記manページの次の一文が端的に表していると思います。
アーカイブをグループ化すると、すべての可能な参照が解決されるま で、
それらのすべてのアーカイブは繰返し検索されます。
とりあえずこれで、staticリンクしようとした時のldのオプションは分かりました。
$ gcc -Wall -static -v -o hello_static hello.c ... /usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 -m elf_i386 --hash-style=gnu -static -o hello_static /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginT.o -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. /tmp/ccMRvVHp.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o
あとは普通にダイナミックリンクでコンパイルした時の"--as-needed", "--no-as-needed"をまた後日調べてみたいですね・・・。".dynamic"セクションのDT_NEEDEDと関連するところまでは分かったのですが、具体的な部分がまだ理解し切れてない。
$ gcc -Wall -v -o hello hello.c ... /usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. /tmp/ccPygftP.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o
コメント