福間@福岡 です。

記事 <199902190218.LAA13407 / tpegasus.lab.okidata.co.jp> において、
Jun Adachi <adachi / tpegasus.lab.okidata.co.jp> さんは書きました :

> >   $ gcc -v -shared foo.o -lc

> > とかでもこけるのでしょうか?
> 
> こけます。

あらら。

> そもそも、私のegcsのインストールが間違ってる可能性もあるのですが。

試しにports-currentの lang/{pgcc,egcs} を使ってみるといかがでしょう。

> [ 実行結果 ]

>  /usr/local/lib/gcc-lib/i386-unknown-freebsd2.2.5/pgcc-2.90.29/ld \
> -e start -dc -dp \
> -L/usr/local/lib/gcc-lib/i386-unknown-freebsd2.2.5/pgcc-2.90.29 \
> -L/usr/local/i386-unknown-freebsd2.2.5/lib -L/usr/local/lib foo.o -lc \
> -lgcc -lc -lgcc

うーん、なんかおおよそshared libraryを作るようなオプションの渡り方じゃ
なさそうですねぇ…。

さっきインストールして試してみたらこんな感じになりました。ELF環境なので
参考にはならないかも知れませんが:

  $ gcc -v -shared foo.o -lc
  Reading specs from \
   /usr/local/lib/gcc-lib/i386-unknown-freebsdelf/pgcc-2.91.60/specs
  gcc version pgcc-2.91.60 19981201 (egcs-1.1.1 release)
   /usr/(長いので中略)/pgcc-2.91.60/collect2 -m elf_i386 -shared \
    /usr/lib/crti.o /usr/lib/crtbeginS.o -L/usr/.../pgcc-2.91.60 \
    -L/usr/local/i386-unknown-freebsdelf/lib -L/usr/local/lib foo.o \
    -lc -lgcc -lgcc /usr/lib/crtendS.o /usr/lib/crtn.o

> > 少なくとも FreeBSD 3.1-RELEASE(相当) / 標準gcc 2.7.2.1 / ELF という
> > 環境では問題ないようです。egcsでどうなるかまでは確認していませんが。
> 
> とりあえず、安心。
> まぁ、ldを明示的に呼んでいるだけなので、バークレイのldを使っている場合
> なら、うまくいって当然なのですが。

というより、3.x以上なら/usr/bin/objformatがあって処理がそっちに逃げる
から、変な変更をしなければ影響ない、というだけなんですけどね(^^;;

ちなみに、a.out用のldはいままでどおり4.4BSD-lite由来のものですが、
ELF用のは

  $ ld -elf -v
  GNU ld version 2.9.1 (with BFD 2.9.1)

と、(新しい) binutilsのものになっています。

# あれ、pgcc-2.91.60 + binutils-2.9.1…(^^;;

> #だけど、3.1になっても標準はいまだに2.7.2.1なんですか?

です。まあPerl5が取り込まれるのにもずいぶん長いことかかりました[1]し、
重要な標準コマンドをソースツリー単位でまるごとバージョンアップしなければ
ならないわけですから、それによって起こりうる副作用のことを考えると、
慎重にならざるをえないのかなという気がしないでもないです。

# [1] http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/contrib/perl5/README

---
 Yasuhiro Fukuma (福間 康弘) as Yasu.F @ Kitakyushu.Fukuoka.Japan
 Web site: http://www8.big.or.jp/~yasuf/
 “君の主人公は君だ。”