メモ帳
メモ帳
スポンサーサイト
--年--月--日 (--) --:-- | 編集
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
objcopyとobjdump
2009年05月26日 (火) 11:02 | 編集
とある不具合発生時に陥るループから抜け出す条件を
コンソールからパスワードの入力とする修正対応に
パスワードをオブジェクトに埋め込む必要があった。

で、調べるとojcopyでリンクできるファイルに変換するらしい。

objcopy -I [file形式] -O [file形式] -B [arch] --rename-section [元]=[変更]入力ファイル 出力ファイル

-Iの後は入力ファイルの形式。
今回はパスワードなので「abcdef」とか書いたテキストだったのでbinaryと指定。

-Oの後は出力ファイルの形式。
実装環境がelf32だったのでelf32-littleと指定。

-Bの後はアーキテクチャ指定。
実装アーキテクチャがmepだったのでmepと指定。

--rename-sectionはセクション名を変えたいときに指定。
[元]は元のセクション名。自環境では.dataだった。
[変更]は変更したいセクション名。お好みで。

サポートされている形式なんかは
objcopy --help
objcopy: サポートされているターゲット: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core
て感じで出力される。

出来たファイルを確認するのは
objdump
で。

objdump -t -s 出力ファイル名

-tはシンボルテーブルを出力する。
-sはセクションのデータを出力する。

[file名]: file format elf32-mep-little

SYMBOL TABLE:
00000000 l d .data 00000000
00000000 g .data 00000000 _binary_[file名]_start
00000008 g .data 00000000 _binary_[file名]_end
00000008 g *ABS* 00000000 _binary_[file名]_size


Contents of section .data:
0000 12345678 9abcdef0 xxxxxxxxxx


こんな感じで、ファイルフォーマット、シンボルテーブル、格納されているデータが出力されるので
これを使ってobjcopyで作成したファイルの確認をする。

で、この出来たファイルをリンクしてコードで使用すると
シンボルテーブルの_binary_[file名]_start、_binary_[file名]_end、_binary_[file名]_sizeが使用できる。


abcdefとデータを書き込んだtest.binテキストファイルを用意。
objcopy -I binry -O elf32-mep-little -B mep test.bin test.obj
でリンク可能なファイル生成する。
ソースファイルで

#include 略

extern char _binary_test_bin_start[];
extern char _binary_test_bin_end[];
extern char _binary_test_bin_size[];

int main(void){

}


て感じで外部参照することで使用することが出来る。
_binary_test_bin_startには「abcdef」の先頭アドレス
_binary_test_bin_endには「abcdef」の終端アドレス
_binary_test_bin_sizeには「abcdef」のサイズ
がそれぞれ参照できます。
ちなみに、自分の環境ではファイル終端文字も含まれたので
終端アドレス+1、サイズ+1だったのでそこらへん注意。

test.binに改行コード入れてました。。。なので、+1でないです。
スポンサーサイト
sns_ctxメモ
2009年05月15日 (金) 11:35 | 編集
BOOL state = sns_ctx();
呼び出し元がタスクコンテキストか判定する。
true : タスクコンテキスト
false : 非タスクコンテキスト

get_tidでタスクコンテキストからの呼び出しかを判定しているコードを書いていたが
エラーケースでloc_cpu掛けた状態で呼び出されて、get_tidがコンテキストエラーを
はいてしまい、難儀していたが、判定だけならこれを使えばよかった。

#errorメモ
2009年05月15日 (金) 11:27 | 編集
#error エラーメッセージ
でコンパイル時に記載した箇所を通ったらエラーになる。

例)
#ifndef TEST_DEFINE
#error TEST_DEFINE定義が必須
#endif

TEST_DEFINEを定義してないケースを想定していないようなコードを書く場合は
ソースに上記のように埋め込んでおいて、コンパイル時にエラーで気づかせる。
と良いらしい。
4/28 メモ
2009年04月28日 (火) 12:57 | 編集
4/24 web巡回
2009年04月24日 (金) 08:49 | 編集
copyright © 2004 Powered By FC2 allrights reserved. / template: sukechan
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。