Cygwin なんでも掲示板

一覧最新記事過去一覧 | 検索FAQアンテナHOME
(新規投稿・発言はできません)


スレッド

└◇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 <


2961● .oファイルからデータを抜き取る方法[ kgon ] 2005 06/23 22:51
はじめまして。
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,
};
スレッド一覧


2962● Re:.oファイルからデータを抜き取る方法[ wa ] 2005 06/24 08:34
> Cファイルに記述したデータをgcc -c -data.c
> でObjectファイルにして、そこからデータを抽出し
> バイナリデータを作成できないか、と試行錯誤しております。

なにが目的でそんなことをやっているのかわかりませんが、
テキストの羅列からバイナリデータを作成するのであれば、
xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。

> あと少しというところで問題がおきてしまいました。
> エンディアンを指定したいために arm用gcc を使用しているのですが、
> ポインタ参照のデータが0でクリアされてしまいます。
> このarn用gcc以外ですと問題なくオフセット値が入っているのですが、どういった原因が考えられるでしょうか?

コンパイラとリンカの役割分担がターゲットアーキテクチャに
よって少しずつ異なるためです。

特にサンプルコードでは記憶クラスに extern が指定されているので、
オブジェクトファイルの段階では実アドレスが確定できません。

にもかかわらず、x86 アーキでは歴史的な経緯により、
オブジェクトファイルの段階ではオフセットアドレスを
仮にセットしておくコンパイラがほとんどです。

したがって、C ソースの体裁で記述したデータをバイナリファイルに
落としたいのであれば、自分でリンカスクリプトを書くなどして、
データが配置されるアドレスを指定する必要があります。

DOS の時代には EXE2BIN などを使うのが一般的でしたが、
いまなら、最初に述べたように、xpm なり pnm なりを調べるのが
近道でしょう。
スレッド一覧


2963● Re[2]:.oファイルからデータを抜き取る方法[ kgon ] 2005 06/24 11:01
waさんご返答ありがとうございます。

>なにが目的でそんなことをやっているのかわかりませんが、

説明不足ですいません。
目的ですがプラットフォームのメモリが少ないため
メモリ不足を解消するため
状況によってでデータを読み込もうと考えました。
そのため今までCで記述したデータをバイナリにしなくてはならないので、安易な考えでソースからバイナリに変換できないか?というのが発端です。


>テキストの羅列からバイナリデータを作成するのであれば、
>xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。

残念ながらテキストの羅列だけではないため
この方法はできないと思われます。


>オブジェクトファイルの段階では実アドレスが確定できません。
>・・・
>仮にセットしておくコンパイラがほとんどです。

なるほど、そういうことだったんですね。
あまりコンパイラの動きとか気にせずやってきたもので
まったく知りませんでした。
もっと勉強しなければ・・・。

リンカを通すとアドレスが入ってきましたので
リンカスクリプトを使用して解決できそうです。
いろいろ教えて頂きありがとうございました。
とても助かりました。
スレッド一覧


2964● Re[3]:.oファイルからデータを抜き取る方法[ nil ] 2005 06/24 13:01

うう、そもそも Cygwinの話じゃない…

|>テキストの羅列からバイナリデータを作成するのであれば、
|>xbm/xpm, ppm/pnm あたりを調べた方が早いかと思います。
|残念ながらテキストの羅列だけではないため
|この方法はできないと思われます。

waさんがおっしゃっているのは、"Cで記述したデータ"であれば(ソースがあるん
だったら)、例えば下記のような "なんらかのテキストの羅列(記述)"であるはず
なので、必要な部分から(整形しなおして?)バイナリに変換するような、簡単な
スクリプト等を自前で用意するほうがはるかに容易で手早いはず(まっとうだし)、
ということだと思いますが…

int as32Data[] = {
0xFF00FF00,

# うう、解決手段のまともな方向とは思えない… sigh.
# そもそも endian や byte swapぐらい後処理してもいいだろし、
# Symbol table の OFFSET ぐらい binutils で参照できるだろし…
スレッド一覧

早田のホームページへ
CGIROOM