こんにちは。
私もそのコードなら"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
C
1static void
2__do_global_ctors (void)
3{
4 func_ptr *p;
5 for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
6 (*p) ();
7}
正直、内容はよく分かりませんが、どうも1文字1文字、コンストラクタを呼び出して設定しているようです。これに適合するような初期化バイナリーは少なくともHelloWorld
が単純に並んだようなバイト列ではないということと思います。
試しに、下記コードをMinGWでビルドして、a.exeをバイナリーエディタで確認したところ、"HelloWorld "
は入っていました。
C
1#include<stdio.h>
2
3int main(){
4 char const* str = "HelloWorld";
5
6 printf("%s\n\n",str);
7
8 return 0;
9}
ただし、objdump -d
結果には出てきませんでしたので、定数領域は逆アセンブル出力してくれないようです。
しかし、逆アセンブラはオブジェクトからアセンブラ・コードを生成するので、元のソースに較べて失われている情報が多いです。
学習目的なら、otnさんの回答のようにコンパイラにアセンブラ・コードを出力させた方が残っている情報が多いので、より分かりやすいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/05/01 13:05
2016/05/02 06:55 編集
退会済みユーザー
2016/05/02 12:47