Linux カーネル バージョン 2.1.57 を gcc バージョン 2.8.? で コンパイルするためのパッチです。 gcc-2.8.? では配列サイズの計算ルールが変更されており mm/simp.c で struct simp 構造体のメンバ(fill)のサイズが 不正になります。また、最適化によって arch/i386/kernel/ioport.c の 89行目がそっくり削除されてしまうため iopl システムコールが まともに動作しなくなります(Xサーバなどが動作しなくなります)。 これらの現象はソースのバージョンを上げることによって回避されます (2.1.87で確認)が、Linux/98では 2.1.57 しか移植されていない (バージョンアップも計画中ですが)ため、このようなパッチを用意しました。 このパッチは応急的に作ったもので、一応コンパイルが通って Xサーバも使えることは確認してありますが、カーネルの隅々までバグが 出ないとは言えません。 また、このパッチを使用した結果についての責任は負いません。 京大マイコンクラブ(KMC) Linux/98 プロジェクト --- mm/simp.c.orig Sun May 10 04:48:28 1998 +++ mm/simp.c Sun May 10 04:55:51 1998 @@ -70,8 +70,12 @@ /* next cache line */ struct header * usable_list; spinlock_t lock; +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) char fill[sizeof(void*) - sizeof(spinlock_t)]; long real_size; +#else + long real_size __attribute__((aligned(sizeof(void *)))); +#endif long max_elems; structor again_ctor; structor first_ctor; --- arch/i386/kernel/ioport.c.orig Sun May 10 04:37:33 1998 +++ arch/i386/kernel/ioport.c Sun May 10 05:54:27 1998 @@ -86,6 +86,10 @@ return -EINVAL; if (!suser()) return -EPERM; +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) *(&eflags) = (eflags & 0xffffcfff) | (level << 12); +#else + ((struct pt_regs *)&ebx)->eflags = (eflags & 0xffffcfff)|(level << 12); +#endif return 0; }