Cygwin なんでも掲示板

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


スレッド

└◇2962:
Re:.oファイルからデータを抜き取る方法 [wa] 06/24 08:34

 └◇2963:Re[2]:.oファイルからデータを抜き取る方法 [kgon] 06/24
  └◇2964:Re[3]:.oファイルからデータを抜き取る方法 [nil] 06/24 <


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