今日の一言
2009/12/07(Mon) 研究本格始動 [長年日記] 10:30現在晴 11℃
_ [FC][Ubuntu][Linux][プロジェクト実習][研究関係]gccを使う上でのメモその2(readelf,objdump)
ELFファイルの内容確認
lsを例にとる。
$ readelf -h /bin/ls | less
*これの結果がどういうことを表しているかはelfのヘッダファイルを見れば分かる。が、別に見なくてもある程度分かると思う。
$ less /usr/include/elf.h
で、プログラムヘッダを見るには-lオプションを使う。
$ readelf -l /bin/ls | less
さらに、セクションヘッダを見るには-Sオプションを使う。
$ readelf -S /bin/ls | less
objdumpコマンド
オブジェクトファイルの詳細な情報を表示するコマンド。
セクションヘッダだけダンプ
$ objdump -s /bin/ls | less
特定の部分だけダンプ。
$ objdump -s -j .interp /bin/ls | less
逆アセンブル
$ objdump -d /bin/ls | less
ソースの情報(行数)を加えて逆アセンブル。
$ objdump -d -l /bin/ls | less
*ただし、-g(デバッグ情報)を付けてコンパイルしていないと分からない。
$ gcc -g hogehoge.c
ソースの中身を加えて逆アセンブル。
$ objdump -d -s -l /bin/ls | less
*ただし、-g(デバッグ情報)を付けてコンパイルしていないと分からない。
_ [FC][Ubuntu][Linux][プロジェクト実習][研究関係]C++でCの関数を呼ぶ(extern "C")
Cの場合「シンボル名」はほぼ関数名と同じ。
が、c++では関数の所属する名前空間の情報や関数の引数の型情報がシンボルに含まれるようになった。
例えば、int hoge(int a) という関数がある場合、シンボル名は
c → _hoge
c++ → __Z4hogei
となる。(nmで確認できる)
その為、c++側で、xの関数を「extern "C"」を付けて宣言する必要がある。
extern "C" void function();
または
extern "C" { void func1(); void func2(); }
これにより、コンパイラはC++形式での名前修飾を行わなくなる。
ただし、extern "C"を使う場合、型のチェックが動かなくなるため、変な使い方をしていてもコンパイル出来てしまうという問題がある。
(実際には実行時にセグメンテーションフォルトで落ちる)
メモ:CでC++の関数を呼ぶ
基本的には出来ないが、extern "C" で宣言をしたc++ の関数ならば可能。
ただし、例外をCに渡してはならない。
_ [雑記]スーパーロボット大戦OGサーガ 無限のフロンティア
以前に買ってはいたものの、時間が無くて進めていなかったのだが、最近、会社説明会に出かける機会が増えたので、道中の電車の中でちょこちょこやっている。
で、昨日の帰りの電車の中でクリアしたのだが、結論としては予想以上に面白かった。
基本的にスパロボしかやらない自分が言うのも何だが、隠れた名作だと思う。
要所要所にスパロボテイストがあふれた小ネタが入っているのも自分としては高評価。
というか、それは使って大丈夫なのか?というようなネタも随所にちりばめられているため、スパロボを知らなくても十分楽しめる。
というか、いろいろギリギリまで頑張り過ぎている気もする。
新作(無限のフロンティアEXCEED)も出るので、やっていない人は是非。
・・・けどコレ、よくCERO審査をBで通ったな。
会話の場面では誰かが必ず一度はセクハラ発言するし。
『あぶない腹巻き』とか『愚者には見えない服』とか、そんなのが高レベル装備(最強装備一歩手前ぐらい)ってのもちょっと・・・
しかも『アミタイツ』に至っては男性キャラも装備できるし!
いろんな意味で、無限のフロンティア。