分解分析を使用したLinuxの最小限の実行可能な例
これは標準で指定されていない実装の詳細であるため、特定の実装でコンパイラが何を行っているかを見てみましょう。
この回答では、分析を行う特定の回答にリンクするか、ここで直接分析を提供し、すべての結果をここに要約します。
それらはすべてさまざまなUbuntu/GCCバージョンにあり、結果はバージョン間でかなり安定している可能性がありますが、バリエーションが見つかった場合は、より正確なバージョンを指定しましょう。
関数内のローカル変数
それmain
または他の機能:
void f(void) {
int my_local_var;
}
に示すように:<valueoptimized out>はgdbで何を意味しますか?
-O0
:スタック
-O3
:こぼれない場合は登録し、そうでない場合はスタックします
スタックが存在する理由の動機については、「x86アセンブリのレジスタで使用されるプッシュ/ポップ命令の機能は何ですか?」を参照してください。
グローバル変数とstatic
関数変数
/* BSS */
int my_global_implicit;
int my_global_implicit_explicit_0 = 0;
/* DATA */
int my_global_implicit_explicit_1 = 1;
void f(void) {
/* BSS */
static int my_static_local_var_implicit;
static int my_static_local_var_explicit_0 = 0;
/* DATA */
static int my_static_local_var_explicit_1 = 1;
}
char *
とchar c[]
に示すように:静的変数はCおよびC ++のどこに格納されていますか?
void f(void) {
/* RODATA / TEXT */
char *a = "abc";
/* Stack. */
char b[] = "abc";
char c[] = {'a', 'b', 'c', '\0'};
}
TODOは、非常に大きな文字列リテラルもスタックに配置されますか?または.data
?または、コンパイルは失敗しますか?
関数の引数
void f(int i, int j);
関連する呼び出し規約を通過する必要があります。例:https ://en.wikipedia.org/wiki/X86_calling_conventions for X86は、各変数の特定のレジスタまたはスタックの場所を指定します。
次に、で示されているように、<valueoptimized out>はgdbで何を意味しますか?、-O0
次にすべてをスタックに丸呑みし、-O3
可能な限りレジスタを使用しようとします。
ただし、関数がインライン化されると、通常のローカルと同じように扱われます。
const
型キャストできるので違いはないと思います。
逆に、コンパイラが一部のデータが書き込まれないと判断できる場合は、理論的には、.rodata
constでなくてもデータを配置できます。
TODO分析。
ポインタ
それらは変数(数値であるアドレスを含む)なので、他のすべてと同じです:-)
malloc
は関数であるためmalloc
、この質問はあまり意味がありません。malloc
int *i = malloc(sizeof(int));
*i
はアドレスを含む変数であるため、上記の場合に該当します。
mallocが内部でどのように機能するかについては、Linuxカーネルが特定のアドレスを内部データ構造に書き込み可能としてマークし、それらが最初にプログラムによってアクセスされると、障害が発生し、カーネルがページテーブルを有効にして、アクセスを許可します。 segfaulなしで発生:x86ページングはどのように機能しますか?
ただし、これは基本的にexec
、実行可能ファイルを実行しようとしたときにsyscallが内部で行うこととまったく同じであることに注意してください。ロード先のページにマークを付け、そこにプログラムを書き込みます。以下も参照してください。 Linux?ロード先にいくつかの追加の制限があることを除いてexec
(たとえば、コードは再配置可能ではありません)。
に使用される正確なシステムコールmalloc
はmmap
、最新の2020実装であり、過去brk
に使用されていました。malloc()はbrk()またはmmap()を使用しますか?
ダイナミックライブラリ
基本的mmap
にメモリにアクセスします:https ://unix.stackexchange.com/questions/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710
環境変数とmain
'sargv
初期スタックの上:https : //unix.stackexchange.com/questions/75939/where-is-the-environment-string-actual-stored TODOなぜ.dataにないのですか?