C++言語で書かれたプログラムの実行ファイルが50個ほど
あり(それぞれ50MB程度)、ある関数を修正した場合に
どの実行ファイルに影響があるか調べたいのですが、
ソースコードを追って依存関係を調べるのは現実的ではないため
実行ファイルの中にその関数名が含まれるかどうかで
判断しようと思っております。
ためしにFTPでパソコン上に転送して、バイナリエディタで表示し
使用している関数名が文字列として含まれていることは
確認できましたが、毎回全ファイルをFTP転送するのは避けたいので、
同様の調査をUNIXマシン上で行いたいのですが、
バイナリファイルから文字列を検索するコマンドは
ありますでしょうか?
OSは SUN OS5.8です。
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
状況によるんだけど,
・何も考えず grep (存在するかどうかくらいは出るんじゃないかな)
・strings + (必要なら c++filt) + grep (普通)
・nm + (必要なら c++filt) + grep (オブジェクトファイルなどに限定)
くらいは思い付くかな. c++filt はなくてもいいけど, あった方が「出力をよみやすい」と思います.
この回答への補足
grep だと strings と同様に検出できず、fgrepでは検出できました。grep系はテキストファイルを前提にしているとはずなのでバイナリファイルだと動作が保証されなさそうです。fgrepでも必ず検出できるかどうか不安なので、もっと確実な方法を考えたいと思います。
文字列検索を自作する手もあるのですが、それ自体にバグがあったら意味がないので、出来れば一般に使われている実績のあるものにしたいです。一般に使われているものならばバグもほとんどないとみなせますし、万一のときでも、言い訳できますから^^;
No.7
- 回答日時:
nm -C
なんてものがあるのですね。
勉強になりました。
ところで、少し気になったのですが
対象の関数が、関数ポインタに代入されていたりすると
思わぬところで実行されていたりすると思うので
そういう可能性があるかなど、
対象の関数の性質は抑えておいた方がいいかもしれませんね。
この回答への補足
関数ポインタのことは見落としていました。
開発メンバーが関数ポインタを使えるほどスキルが高くないのと、実行ファイルから検索するので(静的リンクなので呼ばれる関数は全て含まれるはず)今回はたぶん大丈夫だと思います。
ご指摘ありがとうございました。
No.6
- 回答日時:
sun os は使ったことが無いのですが
GNU の gcc, binutils なら以下でいいと思います。
もし違ったら、同様のコマンドがあるかもしれないので探してみて下さい。
使うのは、
nm => 実行ファイル、オブジェクトファイルからシンボル一覧を出す
c++filt => シンボルをデマングルする
です。
関数 int hoge(int a)と double hoge(double a)が 探したいとして以下のように作業します。
% cat a.cc
int hoge(int a) {
return a*2;
}
double hoge(double a) {
return a*2;
}
int xyz();
int main() {
xyz();
}
% cat b.cc
int hoge(int a);
double hoge(double a);
int xyz() {
return hoge(1) * hoge(2.2);
}
% g++ -c a.cc
% nm a.o | grep hoge
0000000a T _Z4hoged
00000000 T _Z4hogei
% nm a.o | grep hoge | c++filt
0000000a T hoge(double)
00000000 T hoge(int)
% g++ -c b.cc
% nm b.o | grep hoge
U _Z4hoged
U _Z4hogei
% nm b.o | grep hoge | c++filt
U hoge(double)
U hoge(int)
% g++ -o bin a.o b.o
% nm bin | grep hoge
0804840e T _Z4hoged
08048404 T _Z4hogei
% nm bin | grep hoge | c++filt
0804840e T hoge(double)
08048404 T hoge(int)
ありがとうございます。
今日会社でちょうどnmコマンドが使えるかもとアドバイスをもらったところだったので、nmとgrepでなんとか目的が達成できそうでした。
nm -C でデマングルできるようなのですが、マングル化の文字列も同時に出力されてじゃまだったので、週明けに c++filt を試して見ます。
No.5
- 回答日時:
> ソースコードを追って依存関係を調べるのは現実的ではないため
C++の場合、ヘッダファイルにインターフェースを定義しますよね。
makedepend するのが良いでしょう。
ありがとうございます。
makedepend の役割が今回の目的に合致すると思ったのですが、調べてみても、どのように使えばよいのかイマイチわからなかったので、
次の回答者さまから教わった nm を使ってみたいと思います。
No.4
- 回答日時:
★追記。
・http://www.vector.co.jp/soft/winnt/util/se420663 …→『hashs』
これに C のソースが同封されているみたいです。
上手くすれば作り変えられると思います。
・以上。参考に。
参考URL:http://www.vector.co.jp/soft/winnt/util/se420663 …
この回答への補足
気づいたのですが、
CRCなどを計算しなくても、
単純に旧ファイルと新ファイルがバイナリ完全一致するかどうか
比較する方法がありました。
これなら20行程度のプログラムなのでバグの心配もなさそうです。
但し、コンパイラが毎回同じバイナリを出力する仕様だったらなのですが。(作成時刻などがファイル内に含まれていたらアウト)
まずは試してみます。
No.3
- 回答日時:
★CRC32 とかは?
・修正した EXE がどれかだけを見つけたいのなら 50 個ある EXE ファイルの
CRC32 の値を計算しておきます。そして関数を修正したあとまた CRC32 を
計算します。CRC32 が異なる EXE ファイルが影響を受けたものと特定が
できませんかね。
・ただファイルの CRC32 を計算するコマンドが Windows 系のツールばかりで
Sun OS 用のツールが見つかりにくいので自作するとかの方法になります。
ネット検索すればソースが見つかります。
ちょっとしたCRC32比較ツールを作れば出来そうですが…。
どうでしょうか? C/C++ カテゴリだし。
・以上。
参考:
http://search.vector.co.jp/search?query=CRC&path=→『CRC』
http://oshiete1.goo.ne.jp/qa2740939.html→『VC6でCRC64・CRC128が出来るソースを探しています。』
この回答への補足
ファイルのバイナリが変わったかどうかを検知する方法もあったんですね。まずファイルサイズを比較して変わっていたらその時点で影響を受けたとみなせるのでサイズが同じなら今度はハッシュ値を比較する方法を試してみます。
#ハッシュ値を計算する方法は別途調べてみますが、外部からの持込は出来ないので、自作になりそうです・・・
#だったら文字列の検索を自作という手も・・・
ご回答、ありがとうございました。
No.1
- 回答日時:
strings コマンドでバイナリファイルに含まれている文字列を表示できます。
あとはgrepなどにパイプでつなげば検索は可能かと思います。
参考URL:http://www.linux.or.jp/JM/html/GNU_binutils/man1 …
この回答への補足
試してみましたが、stringsではソースコード中のいわゆる文字列
("Hello"など)は出力されるのですが、
int myfunction() などの関数名は出力されませんでした。
バイナリエディタで見ると .__1clmyfunction6F_v_. という感じで
関数名がメタ情報としてアスキー文字列になっているのですが、stringsでは文字列とみなされないようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
バイナリファイルの検索について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Linux バイナリ実行できない "...
-
Boolean型配列中のTrueの有無を...
-
C# .NET DataGridView の行を追...
-
【正規表現】【javascript】CR...
-
static constメンバ変数(配列)...
-
<a>タグのテキストを取得
-
関数でy=g(x)のgとは何の略です...
-
VSCODE[Python]の設定について
-
オブジェクト指向のsetTimeout...
-
javascriptで行を抽出したいです。
-
JavaScript/HTML5での図形の描写
-
form内のinputタグのみロックす...
-
Google Apps Script で添付ファ...
-
お世話になります。contentedit...
-
GASでundefinedエラーが出ます
-
javascriptで関数の削除は出来...
-
jQueryのプラグイン「Skitter」...
-
TexでΣの添え字の位置直し
-
document.clear()の使い方について
-
二次元配列を使って順位をだす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
ASP+アクセスでのSQLコメントに...
-
Linux バイナリ実行できない "...
-
【正規表現】【javascript】CR...
-
Vb.netのグローバル変数の宣言...
-
Excel VBA の ChangeFileAccess
-
javascriptで文字挿入でtoggle...
-
HTTPSのとき":"が"%3A"ではなく...
-
「オブジェクトが必要です。」...
-
【Jquery】changeイベント毎にa...
-
C# .NET DataGridView の行を追...
-
複数ファイルで使うグローバル...
-
ボタンをクリックすると数が増...
-
URLの一部をコピーできるブック...
-
static と externについて
-
バイナリファイルから文字列を...
-
ifreamをリロードしたい
-
class指定したHTML要素の背景色...
-
サブウインドウから親ウインド...
-
VC++のちらつき防止方法
おすすめ情報