▼スレッド
│
└◇2961:.oファイルからデータを抜き取る方法 [kgon] 06/23 22:51
└◇2962:Re:.oファイルからデータを抜き取る方法 [wa] 06/24
└◇2963:Re[2]:.oファイルからデータを抜き取る方法 [kgon] 06/24
└◇2964:Re[3]:.oファイルからデータを抜き取る方法 [nil] 06/24 <
はじめまして。スレッド一覧
kgonと申します。
gcc については勉強不足ですいませんが
質問したいことがあります。
Cファイルに記述したデータをgcc -c -data.c
でObjectファイルにして、そこからデータを抽出し
バイナリデータを作成できないか、と試行錯誤しております。
あと少しというところで問題がおきてしまいました。
エンディアンを指定したいために arm用gcc を使用しているのですが、
ポインタ参照のデータが0でクリアされてしまいます。
このarn用gcc以外ですと問題なくオフセット値が入っているのですが、どういった原因が考えられるでしょうか?
他のendian指定できるPowerPC用は
入手方法が良くわからないためまだ試しておりません。
初心者で申し訳なですが
ご存知の方がおられましたらご教授の程
よろしくお願い致します。
環境:Windows2000 gcc 2.9-arm-00512
(例)
data.c
typedef struct{
int s32Num;
void *pvData;
}stcTest00;
extern int as32Data[];
stcTest00 gsTest = {
sizeof(as32Data)/sizeof(int),
as32Data, // ←ここの値が0になってしまう
};
int as32Data[] = {
0xFF00FF00,
0xFF00FF00,
0xFF00FF00,
0xFF00FF00,
};
> Cファイルに記述したデータをgcc -c -data.cスレッド一覧
> でObjectファイルにして、そこからデータを抽出し
> バイナリデータを作成できないか、と試行錯誤しております。
なにが目的でそんなことをやっているのかわかりませんが、
テキストの羅列からバイナリデータを作成するのであれば、
xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。
> あと少しというところで問題がおきてしまいました。
> エンディアンを指定したいために arm用gcc を使用しているのですが、
> ポインタ参照のデータが0でクリアされてしまいます。
> このarn用gcc以外ですと問題なくオフセット値が入っているのですが、どういった原因が考えられるでしょうか?
コンパイラとリンカの役割分担がターゲットアーキテクチャに
よって少しずつ異なるためです。
特にサンプルコードでは記憶クラスに extern が指定されているので、
オブジェクトファイルの段階では実アドレスが確定できません。
にもかかわらず、x86 アーキでは歴史的な経緯により、
オブジェクトファイルの段階ではオフセットアドレスを
仮にセットしておくコンパイラがほとんどです。
したがって、C ソースの体裁で記述したデータをバイナリファイルに
落としたいのであれば、自分でリンカスクリプトを書くなどして、
データが配置されるアドレスを指定する必要があります。
DOS の時代には EXE2BIN などを使うのが一般的でしたが、
いまなら、最初に述べたように、xpm なり pnm なりを調べるのが
近道でしょう。
waさんご返答ありがとうございます。スレッド一覧
>なにが目的でそんなことをやっているのかわかりませんが、
説明不足ですいません。
目的ですがプラットフォームのメモリが少ないため
メモリ不足を解消するため
状況によってでデータを読み込もうと考えました。
そのため今までCで記述したデータをバイナリにしなくてはならないので、安易な考えでソースからバイナリに変換できないか?というのが発端です。
>テキストの羅列からバイナリデータを作成するのであれば、
>xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。
残念ながらテキストの羅列だけではないため
この方法はできないと思われます。
>オブジェクトファイルの段階では実アドレスが確定できません。
>・・・
>仮にセットしておくコンパイラがほとんどです。
なるほど、そういうことだったんですね。
あまりコンパイラの動きとか気にせずやってきたもので
まったく知りませんでした。
もっと勉強しなければ・・・。
リンカを通すとアドレスが入ってきましたので
リンカスクリプトを使用して解決できそうです。
いろいろ教えて頂きありがとうございました。
とても助かりました。
スレッド一覧
うう、そもそも Cygwinの話じゃない…
|>テキストの羅列からバイナリデータを作成するのであれば、
|>xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。
|残念ながらテキストの羅列だけではないため
|この方法はできないと思われます。
waさんがおっしゃっているのは、"Cで記述したデータ"であれば(ソースがあるん
だったら)、例えば下記のような "なんらかのテキストの羅列(記述)"であるはず
なので、必要な部分から(整形しなおして?)バイナリに変換するような、簡単な
スクリプト等を自前で用意するほうがはるかに容易で手早いはず(まっとうだし)、
ということだと思いますが…
int as32Data[] = {
0xFF00FF00,
# うう、解決手段のまともな方向とは思えない… sigh.
# そもそも endian や byte swapぐらい後処理してもいいだろし、
# Symbol table の OFFSET ぐらい binutils で参照できるだろし…