Yoshinori Sato
ysato****@users*****
2004年 2月 9日 (月) 02:28:10 JST
At Fri, 06 Feb 2004 10:12:00 -0500 (EST), Kazu Hirata wrote: > > 佐藤様、 > > > ありがとうございます。 > > テストプログラムが正常に読める所までは確認できました。 > > 基本的な動作は問題ないと思います。 > > もう少しいろいろ試してみます。 > > こちらこそどうもありがとうございます。実行の試験ですが、2 点、気になり > ます。 > > 1) switch statement が jump table を使う時の試験が必要かもしれません。 > 新たに追加された R_H8_PCREL32 という reloc を使うからです。以下のよ > うな program に適当な main() をつけて走らせて頂けると幸いです。 > > int g; > > void > foo (int a) > { > switch (a) > { > case 0: g = 4; > case 1: g = 3; > case 2: g = 2; > case 3: g = 1; > case 4: g = 0; > } > } > > 2) 初期化された大域変数の確認。以下では、p の初期化が ".long g" として > 行われます。つまり、position independent ではない g に対する絶対位 > 置がそのまま p の中に入ってしまいます。elf2flt がうまいこと直してく > れていると良いのですが、自信がありません。 > > int g; > int *p = &g; > > int > main () > { > g = 1234; > return *p == 1234; > } どちらも正常に動作しました。 2の方はnopic用の再配置処理でロード時にアドレス計算していますが、m68kも 同じ仕様なのでこれで問題ないと思います。 これとは関係ありませんが、gasでR_H8_DIR32が出力されるはずなのに、R_H8_GOT32O が出力されてしまう事があるようです。 こののパッチで直りましたが、別の原因があるかもしれません。 --- binutils-040205/gas/config/tc-h8300.c~ 2004-02-09 01:35:14.000000000 +0900 +++ binutils-040205/gas/config/tc-h8300.c 2004-02-09 00:23:07.000000000 +0900 @@ -2031,6 +2031,11 @@ operand[0].mode = 0; operand[1].mode = 0; operand[2].mode = 0; +#ifdef OBJ_ELF + operand[0].pic_reloc = pic_none; + operand[1].pic_reloc = pic_none; + operand[2].pic_reloc = pic_none; +#endif if (OP_KIND (instruction->opcode->how) == O_MOVAB || OP_KIND (instruction->opcode->how) == O_MOVAW -- Yoshinori Sato <ysato****@users*****>