[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:6265] Re: MSVC最適化有効時のbootstrap



永野です。(随分とお久しぶりの登場になります。)
調査ありがとうございます。

まずご質問にお応えします

At Mon, 06 Dec 2004 21:32:50 +0900 (JST),
Hidefumi Fujimoto wrote:
> 実際にPDUMP_OFFSETを、
> #define PDUMP_OFFSET 10485760
> (=0xA00000)
> とすることで、最適化有りでbootstrap等一連のコンパイルと動作確認をしました。
> 
> このようにPDUMP_OFFSETを大きな値にすることは問題ないでしょうか?

はい、問題ありません。load 時(通常の起動時)にいきなり随分と広い memory 
空間を使っているように「見える」ようになるくらいで、実害はないはずです。
(もしかしたら、Lisp Pointer Size Max が想定よりも早く来てしまうように
なるかもしれない(? 勘違い?)ので、自分でも見てみます...)

ところで、もっと大きな問題はその過程にあると思っています

> 原因:
> 1. 問題となるのは、pdump_load時のpdump_relocate_objectsの中の下記行
>   (alloc.c(Rev.3575)の7047行目:シンボルのrelocate)で、
>   SUBRP(ptr->function) == TRUE の時  (Cで書かれた組み込み関数)
>   
>       PDUMP_RELOCATE (ptr->function, offset);
> 
> 2. 最適化してコンパイルを行うと、XPNTR(ptr->function)(= Lisp_Subrのアドレス)が
>    約0x5A0000〜0x5B0000と、0x670000以上となる。(最適化なしの場合は、すべて0x670000以上)
>    0x5A0000〜0x5B0000の場合、PDUMP_RELOCATE内部で、組み込み関数なのに
>    ptr->functionが変更されてしまう。
> 
> 3. 実際にptr->functionが呼び出されたときに、全く違うアドレスを実行しようとしてエラーとなる
> 
> と言うことではないかと思います。

折角の portable dumper が、compiler の挙動によって動いたり動かなかった
りするのは、それではぜんぜん portable ではないではないかという意味で名
前と矛盾しており、意義を失っています。

dump 前に malloc を空打ちしてみて、そこで取得できた addr を、offset に
使うようにすれば、いいのでしょうか? >develop


# MSVC7、2まんえん...
# http://www.amazon.co.jp/exec/obidos/ASIN/B00009PJOC/
# 学生ではなくなってしまった新卒サラリーマンには、きびしいい

-- 
Keiichiro Nagano