質問: 4; printf("%s\n%d\n",str,num); return 0; } ``` この場合、"HelloWorld"という文字列や4という数値がアセンブリのどこかにかいていそうなものですが見当たりませんでした。 ハードコーディングした情報はどこに保存されているのでしょうか。
回答: こんにちは。 私もそのコードなら"HelloWorld"がオブジェクト内のどこかにこのままの形で入っていると思っていたのですが、a.exeを直接バイナリーエディタでみても入ってなかったです。 `objdump -d`を見ると、`char str[] = "HelloWorld";`は、__do_global_ctors()という関数でコンストラクトされるようです。 gcc 4.9.2のソースをgrepしたところ、この関数の中身は、下記でした。 gcc\gcc-4.9.2\libgcc\config\arc\initfini.c ``` static void __do_global_ctors (void) { func_ptr *p; for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--) (*p) (); } ``` 正直、内容はよく分かりませんが、どうも1文字1文字、コンストラクタを呼び出して設定しているようです。これに適合するような初期化バイナリーは少なくとも`HelloWorld`が単純に並んだようなバイト列ではないということと思います。 試しに、下記コードをMinGWでビルドして、a.exeをバイナリーエディタで確認したところ、`"HelloWorld "`は入っていました。 ``` #include int main(){ char const* str = "HelloWorld"; printf("%s\n\n",str); return 0; } ``` ただし、`objdump -d`結果には出てきませんでしたので、定数領域は逆アセンブル出力してくれないようです。 しかし、逆アセンブラはオブジェクトからアセンブラ・コードを生成するので、元のソースに較べて失われている情報が多いです。 学習目的なら、otnさんの回答のようにコンパイラにアセンブラ・コードを出力させた方が残っている情報が多いので、より分かりやすいと思います。