home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

日記/2010/01/03/ldオプションの--start-group,--end-group

作成日: 2010-01-03 21:31:36   /   last updated at: 2010-01-03 21:39:41
カテゴリ: C言語 

が何なのか不思議だったのですが、ちょっと調べたら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
original url: https://www.glamenv-septzen.net/view/534