[過去ログ]
ゲームプログラミング相談室【Part5】 (970レス)
ゲームプログラミング相談室【Part5】 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
8: 名前は開発中のものです。 [] 02/11/06 20:50 ID:mrrgYg+p 某 MIPS 系のマシンで STL コンテナを使おうとすると、リンク時に "relocation truncated"と怒られる。どうも template がらみでできる weak object の配置に 失敗してるみたいだけど、解決策知ってる人います? (確かに MIPS だとグローバルポインタ相対でアクセスするから、配置する箇所に よってはグローバル変数といえどアクセスできなくなるよな。ld に喰わせるスクリ プトファイル書けばいいのか?) http://echo.5ch.net/test/read.cgi/gamedev/1036410116/8
9: 名前は開発中のものです。 [age] 02/11/07 01:44 ID:??? >>8 ふつう -G0 ってコンパイラ何使ってるかくらい書けヨ! http://echo.5ch.net/test/read.cgi/gamedev/1036410116/9
11: 8 [sage] 02/11/07 21:47 ID:??? >>9 Thanks > ってコンパイラ何使ってるかくらい書けヨ! 確かに。想像の通り gcc です。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/11
14: 8 [sage] 02/11/08 21:31 ID:??? STL の件だけど、要するに __malloc_alloc_oom_handler などの static 変数 が .sdata セクションに配置されるのが問題なんだね。 教えてもらった -G0 を使って「全部 .data セクションに置く」方法に加えて、 問題になってる変数に個別に __attribute__((section(".data"))) 指定する 方法でも動きました。 しかし、何で __malloc_alloc_oom_handler などのクラステンプレート中で 定義された static 変数に限って .sdata に配置できないのかは謎です。 .sdata や.sbss 使い切るほど static 変数定義してないんだけど。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/14
18: 8 [sage] 02/11/09 01:16 ID:??? >>16 vtbl が配置されるセクションと、クラステンプレートの static 変数が配置される セクションが違うと、何か問題がある? あと、今回の件に関しては STL のコン テナが利用する allocator の話なんで、仮想関数は出てこないはず。 そもそも .sdata, .sbss に関しては、こういうことだと理解してるんだが、勘違い があったら指摘して下さいな。 1. EE-core (っつーか MIPS) は 32bit 固定長命令を採用しており、アドレス 空間も 32bit ある。 2. したがって 1 命令で 32bit の任意のアドレスにアクセスすることはできない。 どうしてもアクセスしたければ a) まず 16bit をレジスタの上位アドレスに読み込み b) 次にオフセット付きメモリ参照命令を使って、メモリにアクセス と 2 命令使う。 3. それだと効率が悪いので、汎用レジスタの一つ ($gp) をグローバルポインタ として固定した値を入れて利用。static なデータは $gp から 16bit 相対で アクセスできる範囲に入れておく。(これが .sdata と .sbss) 当然 16bit 相対でアクセスできる範囲は限られるから、そこから溢れたデータ は効率悪くても 2 の方法でアクセスする必要がある。gcc は標準では 8byte 以下のデータは .sdata, .sbss セクションに、それ以上のデータは .data, .bss セクションに格納する。この閾値は、必要に応じて -G オプションで変更できる。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/18
19: 8 [sage] 02/11/09 01:19 ID:??? >>18 の続き そういうわけで gp がらみで問題になるのは 1. .sdata, .sbss が溢れるほど大量に static データを定義した場合 2. 翻訳単位によって、閾値が異なる場合。たとえば同一のグローバル変数を 参照するプログラムの片方を -G0 でコンパイル、他方を -G8 でコンパイル とか。 3. $gp を書き換える場合。特に位置独立なコードを使うシェアードライブラリの 関数を呼ぶ場合。(ふつー Global Offset Table 用意して、$gp 書き換えた上 で関数を呼ぶスタブを作る) といった場合。クラステンプレートの static 変数が関わるとは思えんのよ。 PS2 Linux だとなんの問題もなく動いたような気がするし。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/19
34: 名前は開発中のものです。 [age] 02/11/10 00:32 ID:??? >>8 誰なのかわかりますた ヽ(´ー` )ノ 初期化してないstatic class memberが .bssに入らないで.dataセクションに 入っちゃうみたいだけど、それじゃない? それが正しいのか間違ってるのかしらないけど。 http://chapuni.com/topics/psx/ でも、やっぱ -G0 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/34
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.021s