新城@筑波大学情報です。

In article <m3ekh15zag.fsf@nospam.maedapc.cc.tsukuba.ac.jp>
        MAEDA Atusi <maeda-news@ialab.cs.tsukuba.ac.jp> writes:
> ・ダイナミックリンクされるライブラリが、32bitモードのバイナリと64bitバ
>   イナリで異なる(magic numberとか、ELFヘッダとかで区別する)。
>   → スタティックリンクしたバイナリをあきらめるならこれが簡単そう。
>      というか、この仕組みはシステムコールに限らず、ポインタを渡すライ
>      ブラリ全般についてどうせ必要かな?

動的リンクのライブラリを複数、32bit用と64bit用を置くのはやる
んでしょう。Solaris とかそうなっているし、今でも、32bit でも
やっているし。

magic number で 32bit か 64bit か区別するの簡単でしょう。実
際、FreeBSD なんかでは、システムコールのジャンプテーブルを複
数持っています。Linux のシステムコールのエミュレーションをし
ています。この時、magic number 見てシステムコールのジャンプ
テーブルを切替えています。FreeBSD だと a.out から ELF に切替
えた時にもこの手を使っていました。Java もこれだったのでは。

システムコールの番号を変えても、ジャンプテーブルを複数持つの
も、全部のシステムコールがこのような浅い段階での32->64への拡
張で済むかというと、そうは行かないんだと思います。拡張するの
はいいとして、64->32 に変換できない場合もあるでしょうから。
たとえば、mmap() で MAP_FIXED がない時など、
0xffffffff00000000 などが返されたりした時などです。これだと、
mmap() の中身を 32bit か 64bit かで全部置換えるか、mmap() 本
体の深い所で 32bit か 64bit かの判断をすることになります。

mmap() は、話題のシステムコールですけど、他にもありますか。
sbrk() とか。

動的リンク・ライブラリを2種類用意するのは簡単としても、バイ
ナリのプラグインとか問題かもね。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\