コンパイラの原理
16902 ワード
一、機械言語
マシン言語(machine language)は命令セットの体系である.このコマンドセットは、マシンコード(machine code)と呼ばれ、コンピュータのCPUが直接解読できるデータです.
機械言語はバイナリであると理解できる
二、ソースコード
ソースコード例ソースコード(source code)とは、コンパイルされていない一定のプログラム設計言語仕様に従って書かれたテキストファイルを指す.ソースコード(ソースプログラムとも呼ばれる)は、一連の人間が読むことができるコンピュータ言語命令を指す.
三、プリプロセッサ
プリプロセッサは、本格的なコンパイルが開始される前にコンパイラによって呼び出される独立したプログラムです.プリプロセッサは、注釈を削除したり、他のファイルを含んだり、マクロを実行したりすることができます(マクロmacroは重複文字の短い説明です).プリプロセッサは、FORTRANにRatforプリプロセッサを提供するなどの追加の機能を提供する追加のソフトウェアとして、Cのような言語によって要求されるか、または後で使用されることができる.
四、目標コード(目標ファイル)
1)ソースコードをコンパイルした後、CPUが直接認識できるバイナリコードを指す.
2)
ターゲットコード(objectcode)とは、コンピュータ科学におけるコンパイラまたはアセンブリがソースコードを処理した後に生成されるコードを指し、一般的にマシンコードまたはマシン言語に近いコードから構成される.[1]ターゲットファイル(objectfile)は、ターゲットコードを格納するコンピュータファイルであり、バイナリファイル(binaries)と呼ばれることが多い.
ターゲットファイルには
マシンコード(コンピュータ中央プロセッサによって直接実行可能)及び
コードは、リンクやデバッグに使用されるプログラムシンボル(変数や関数の名前)などの再配置情報など、実行時に使用されるデータに加えて、他のデバッグ情報も含まれます.[2]ターゲットファイルはソースファイルからプログラムファイルを生成するプロセスの中間生成物であり、リンクはターゲットファイルをリンクすることによって実行可能ファイルまたはライブラリファイルを生成する.ターゲット・ファイルの唯一の要素はマシン・コードです.たとえば、組み込みシステム用のターゲット・ファイルにはマシン・コードのみが含まれる場合があります.
五、リンク
リンク(Linker)はプログラムで、
コンパイラまたはアセンブリによって生成された1つ以上のターゲットファイルをライブラリに追加して実行可能ファイルにリンクします.
ターゲットファイルは、マシンコードとリンクが使用可能な情報を含むプログラムモジュールです.簡単に言えば、リンクの仕事は未定義のシンボル参照を解析し、ターゲットファイルのプレースホルダをシンボルのアドレスに置き換えることです.リンクはまた、プログラム内の各ターゲットファイルのアドレス空間の組織を完了し、再配置作業に関連する可能性があります.
六、符号表
1)GCCコマンドのobjdump
objdumpは、ターゲットファイルまたは実行可能なターゲットファイルを表示する構成のGCCツールです
次の3つのコマンドは、ターゲットファイルとソースコードの関係を探索するのが好きな友人に十分です.Objdump-x objは、ある分類情報の形でターゲットファイルのデータ組織(いくつかのブロックに分けられる)を出力<このファイルが調べられるすべてのダイナミックライブラリ>objdump-t obj出力ターゲットファイルのシンボルテーブル()objdump-h obj出力ターゲットファイルのすべてのセグメントを要約()
2)objdump例
コードcpp 1 #include<iostream>
2 int main()
3 {
4 std::cout<<"ztao"<<std::endl;
5 return 0;
6 }
シンボルテーブル[ztteng@ztteng 002]$ objdump -t ztao
ztao: file format elf32-i386
SYMBOL TABLE:
08048134 l d .interp 00000000 .interp
08048148 l d .note.ABI-tag 00000000 .note.ABI-tag
08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id
0804818c l d .gnu.hash 00000000 .gnu.hash
080481c0 l d .dynsym 00000000 .dynsym
08048290 l d .dynstr 00000000 .dynstr
08048414 l d .gnu.version 00000000 .gnu.version
08048430 l d .gnu.version_r 00000000 .gnu.version_r
08048490 l d .rel.dyn 00000000 .rel.dyn
080484a0 l d .rel.plt 00000000 .rel.plt
080484e8 l d .init 00000000 .init
08048518 l d .plt 00000000 .plt
080485c0 l d .text 00000000 .text
080487ac l d .fini 00000000 .fini
080487c8 l d .rodata 00000000 .rodata
080487dc l d .eh_frame_hdr 00000000 .eh_frame_hdr
08048818 l d .eh_frame 00000000 .eh_frame
08049910 l d .ctors 00000000 .ctors
0804991c l d .dtors 00000000 .dtors
08049924 l d .jcr 00000000 .jcr
08049928 l d .dynamic 00000000 .dynamic
08049a08 l d .got 00000000 .got
08049a0c l d .got.plt 00000000 .got.plt
08049a3c l d .data 00000000 .data
08049a40 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_str 00000000 .debug_str
00000000 l d .debug_pubtypes 00000000 .debug_pubtypes
00000000 l df *ABS* 00000000 crtstuff.c
08049910 l O .ctors 00000000 __CTOR_LIST__
0804991c l O .dtors 00000000 __DTOR_LIST__
08049924 l O .jcr 00000000 __JCR_LIST__
080485f0 l F .text 00000000 __do_global_dtors_aux
08049acc l O .bss 00000001 completed.5963
08049ad0 l O .bss 00000004 dtor_idx.5965
08048650 l F .text 00000000 frame_dummy
00000000 l df *ABS* 00000000 crtstuff.c
08049918 l O .ctors 00000000 __CTOR_END__
0804890c l O .eh_frame 00000000 __FRAME_END__
08049924 l O .jcr 00000000 __JCR_END__
08048780 l F .text 00000000 __do_global_ctors_aux
00000000 l df *ABS* 00000000 ztao.cpp
08049ad4 l O .bss 00000001 _ZStL8__ioinit
080486a8 l F .text 00000040 _Z41__static_initialization_and_destruction_0ii
080486e8 l F .text 0000001c _GLOBAL__I_main
08049a0c l O .got.plt 00000000 _GLOBAL_OFFSET_TABLE_
08049910 l .ctors 00000000 __init_array_end
08049910 l .ctors 00000000 __init_array_start
08049928 l O .dynamic 00000000 _DYNAMIC
08049a3c w .data 00000000 data_start
00000000 F *UND* 00000000 __cxa_atexit@@GLIBC_2.1.3
08048710 g F .text 00000005 __libc_csu_fini
080485c0 g F .text 00000000 _start
00000000 w *UND* 00000000 __gmon_start__
00000000 w *UND* 00000000 _Jv_RegisterClasses
080487c8 g O .rodata 00000004 _fp_hw
080487ac g F .fini 00000000 _fini
00000000 F *UND* 00000000 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 __libc_start_main@@GLIBC_2.0
08048568 F *UND* 00000000 _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
080487cc g O .rodata 00000004 _IO_stdin_used
08049a3c g .data 00000000 __data_start
08049a40 g O .bss 0000008c _ZSt4cout@@GLIBCXX_3.4
080487d0 g O .rodata 00000000 .hidden __dso_handle
08049920 g O .dtors 00000000 .hidden __DTOR_END__
08048720 g F .text 0000005a __libc_csu_init
08049a40 g *ABS* 00000000 __bss_start
08049ad8 g *ABS* 00000000 _end
00000000 F *UND* 00000000 _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
08048598 F *UND* 00000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
08049a40 g *ABS* 00000000 _edata
080485a8 F *UND* 00000000 __gxx_personality_v0@@CXXABI_1.3
0804877a g F .text 00000000 .hidden __i686.get_pc_thunk.bx
08048674 g F .text 00000034 main
080484e8 g F .init 00000000 _init
七、コンパイラ
簡単に言えば、コンパイラは「高度な言語」を「機械言語(低レベル言語)」に翻訳するプログラムです.現代のコンパイラの主なワークフロー:ソースコード(source code)→プリプロセッサ(preprocessor)→コンパイラ(compiler)→ターゲットコード(object code)→リンク(Linker)→実行可能プログラム(executables)
コンパイラはアセンブリまたは高度なコンピュータ言語ソースプログラム(Source program)を入力としてターゲット言語(Target language)マシンコードの等価プログラムに翻訳する
八、C言語プログラムコンパイルのメモリ配分:
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
5.プログラムコード領域
ソースコード例ソースコード(source code)とは、コンパイルされていない一定のプログラム設計言語仕様に従って書かれたテキストファイルを指す.ソースコード(ソースプログラムとも呼ばれる)は、一連の人間が読むことができるコンピュータ言語命令を指す.
三、プリプロセッサ
プリプロセッサは、本格的なコンパイルが開始される前にコンパイラによって呼び出される独立したプログラムです.プリプロセッサは、注釈を削除したり、他のファイルを含んだり、マクロを実行したりすることができます(マクロmacroは重複文字の短い説明です).プリプロセッサは、FORTRANにRatforプリプロセッサを提供するなどの追加の機能を提供する追加のソフトウェアとして、Cのような言語によって要求されるか、または後で使用されることができる.
四、目標コード(目標ファイル)
1)ソースコードをコンパイルした後、CPUが直接認識できるバイナリコードを指す.
2)
ターゲットコード(objectcode)とは、コンピュータ科学におけるコンパイラまたはアセンブリがソースコードを処理した後に生成されるコードを指し、一般的にマシンコードまたはマシン言語に近いコードから構成される.[1]ターゲットファイル(objectfile)は、ターゲットコードを格納するコンピュータファイルであり、バイナリファイル(binaries)と呼ばれることが多い.
ターゲットファイルには
マシンコード(コンピュータ中央プロセッサによって直接実行可能)及び
コードは、リンクやデバッグに使用されるプログラムシンボル(変数や関数の名前)などの再配置情報など、実行時に使用されるデータに加えて、他のデバッグ情報も含まれます.[2]ターゲットファイルはソースファイルからプログラムファイルを生成するプロセスの中間生成物であり、リンクはターゲットファイルをリンクすることによって実行可能ファイルまたはライブラリファイルを生成する.ターゲット・ファイルの唯一の要素はマシン・コードです.たとえば、組み込みシステム用のターゲット・ファイルにはマシン・コードのみが含まれる場合があります.
五、リンク
リンク(Linker)はプログラムで、
コンパイラまたはアセンブリによって生成された1つ以上のターゲットファイルをライブラリに追加して実行可能ファイルにリンクします.
ターゲットファイルは、マシンコードとリンクが使用可能な情報を含むプログラムモジュールです.簡単に言えば、リンクの仕事は未定義のシンボル参照を解析し、ターゲットファイルのプレースホルダをシンボルのアドレスに置き換えることです.リンクはまた、プログラム内の各ターゲットファイルのアドレス空間の組織を完了し、再配置作業に関連する可能性があります.
六、符号表
1)GCCコマンドのobjdump
objdumpは、ターゲットファイルまたは実行可能なターゲットファイルを表示する構成のGCCツールです
次の3つのコマンドは、ターゲットファイルとソースコードの関係を探索するのが好きな友人に十分です.Objdump-x objは、ある分類情報の形でターゲットファイルのデータ組織(いくつかのブロックに分けられる)を出力<このファイルが調べられるすべてのダイナミックライブラリ>objdump-t obj出力ターゲットファイルのシンボルテーブル()objdump-h obj出力ターゲットファイルのすべてのセグメントを要約()
2)objdump例
コードcpp 1 #include<iostream>
2 int main()
3 {
4 std::cout<<"ztao"<<std::endl;
5 return 0;
6 }
シンボルテーブル[ztteng@ztteng 002]$ objdump -t ztao
ztao: file format elf32-i386
SYMBOL TABLE:
08048134 l d .interp 00000000 .interp
08048148 l d .note.ABI-tag 00000000 .note.ABI-tag
08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id
0804818c l d .gnu.hash 00000000 .gnu.hash
080481c0 l d .dynsym 00000000 .dynsym
08048290 l d .dynstr 00000000 .dynstr
08048414 l d .gnu.version 00000000 .gnu.version
08048430 l d .gnu.version_r 00000000 .gnu.version_r
08048490 l d .rel.dyn 00000000 .rel.dyn
080484a0 l d .rel.plt 00000000 .rel.plt
080484e8 l d .init 00000000 .init
08048518 l d .plt 00000000 .plt
080485c0 l d .text 00000000 .text
080487ac l d .fini 00000000 .fini
080487c8 l d .rodata 00000000 .rodata
080487dc l d .eh_frame_hdr 00000000 .eh_frame_hdr
08048818 l d .eh_frame 00000000 .eh_frame
08049910 l d .ctors 00000000 .ctors
0804991c l d .dtors 00000000 .dtors
08049924 l d .jcr 00000000 .jcr
08049928 l d .dynamic 00000000 .dynamic
08049a08 l d .got 00000000 .got
08049a0c l d .got.plt 00000000 .got.plt
08049a3c l d .data 00000000 .data
08049a40 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_str 00000000 .debug_str
00000000 l d .debug_pubtypes 00000000 .debug_pubtypes
00000000 l df *ABS* 00000000 crtstuff.c
08049910 l O .ctors 00000000 __CTOR_LIST__
0804991c l O .dtors 00000000 __DTOR_LIST__
08049924 l O .jcr 00000000 __JCR_LIST__
080485f0 l F .text 00000000 __do_global_dtors_aux
08049acc l O .bss 00000001 completed.5963
08049ad0 l O .bss 00000004 dtor_idx.5965
08048650 l F .text 00000000 frame_dummy
00000000 l df *ABS* 00000000 crtstuff.c
08049918 l O .ctors 00000000 __CTOR_END__
0804890c l O .eh_frame 00000000 __FRAME_END__
08049924 l O .jcr 00000000 __JCR_END__
08048780 l F .text 00000000 __do_global_ctors_aux
00000000 l df *ABS* 00000000 ztao.cpp
08049ad4 l O .bss 00000001 _ZStL8__ioinit
080486a8 l F .text 00000040 _Z41__static_initialization_and_destruction_0ii
080486e8 l F .text 0000001c _GLOBAL__I_main
08049a0c l O .got.plt 00000000 _GLOBAL_OFFSET_TABLE_
08049910 l .ctors 00000000 __init_array_end
08049910 l .ctors 00000000 __init_array_start
08049928 l O .dynamic 00000000 _DYNAMIC
08049a3c w .data 00000000 data_start
00000000 F *UND* 00000000 __cxa_atexit@@GLIBC_2.1.3
08048710 g F .text 00000005 __libc_csu_fini
080485c0 g F .text 00000000 _start
00000000 w *UND* 00000000 __gmon_start__
00000000 w *UND* 00000000 _Jv_RegisterClasses
080487c8 g O .rodata 00000004 _fp_hw
080487ac g F .fini 00000000 _fini
00000000 F *UND* 00000000 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 __libc_start_main@@GLIBC_2.0
08048568 F *UND* 00000000 _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
080487cc g O .rodata 00000004 _IO_stdin_used
08049a3c g .data 00000000 __data_start
08049a40 g O .bss 0000008c _ZSt4cout@@GLIBCXX_3.4
080487d0 g O .rodata 00000000 .hidden __dso_handle
08049920 g O .dtors 00000000 .hidden __DTOR_END__
08048720 g F .text 0000005a __libc_csu_init
08049a40 g *ABS* 00000000 __bss_start
08049ad8 g *ABS* 00000000 _end
00000000 F *UND* 00000000 _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
08048598 F *UND* 00000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
08049a40 g *ABS* 00000000 _edata
080485a8 F *UND* 00000000 __gxx_personality_v0@@CXXABI_1.3
0804877a g F .text 00000000 .hidden __i686.get_pc_thunk.bx
08048674 g F .text 00000034 main
080484e8 g F .init 00000000 _init
七、コンパイラ
簡単に言えば、コンパイラは「高度な言語」を「機械言語(低レベル言語)」に翻訳するプログラムです.現代のコンパイラの主なワークフロー:ソースコード(source code)→プリプロセッサ(preprocessor)→コンパイラ(compiler)→ターゲットコード(object code)→リンク(Linker)→実行可能プログラム(executables)
コンパイラはアセンブリまたは高度なコンピュータ言語ソースプログラム(Source program)を入力としてターゲット言語(Target language)マシンコードの等価プログラムに翻訳する
八、C言語プログラムコンパイルのメモリ配分:
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
5.プログラムコード領域
1)ソースコードをコンパイルした後、CPUが直接認識できるバイナリコードを指す.
2)
ターゲットコード(objectcode)とは、コンピュータ科学におけるコンパイラまたはアセンブリがソースコードを処理した後に生成されるコードを指し、一般的にマシンコードまたはマシン言語に近いコードから構成される.[1]ターゲットファイル(objectfile)は、ターゲットコードを格納するコンピュータファイルであり、バイナリファイル(binaries)と呼ばれることが多い.
ターゲットファイルには
マシンコード(コンピュータ中央プロセッサによって直接実行可能)及び
コードは、リンクやデバッグに使用されるプログラムシンボル(変数や関数の名前)などの再配置情報など、実行時に使用されるデータに加えて、他のデバッグ情報も含まれます.[2]ターゲットファイルはソースファイルからプログラムファイルを生成するプロセスの中間生成物であり、リンクはターゲットファイルをリンクすることによって実行可能ファイルまたはライブラリファイルを生成する.ターゲット・ファイルの唯一の要素はマシン・コードです.たとえば、組み込みシステム用のターゲット・ファイルにはマシン・コードのみが含まれる場合があります.
五、リンク
リンク(Linker)はプログラムで、
コンパイラまたはアセンブリによって生成された1つ以上のターゲットファイルをライブラリに追加して実行可能ファイルにリンクします.
ターゲットファイルは、マシンコードとリンクが使用可能な情報を含むプログラムモジュールです.簡単に言えば、リンクの仕事は未定義のシンボル参照を解析し、ターゲットファイルのプレースホルダをシンボルのアドレスに置き換えることです.リンクはまた、プログラム内の各ターゲットファイルのアドレス空間の組織を完了し、再配置作業に関連する可能性があります.
六、符号表
1)GCCコマンドのobjdump
objdumpは、ターゲットファイルまたは実行可能なターゲットファイルを表示する構成のGCCツールです
次の3つのコマンドは、ターゲットファイルとソースコードの関係を探索するのが好きな友人に十分です.Objdump-x objは、ある分類情報の形でターゲットファイルのデータ組織(いくつかのブロックに分けられる)を出力<このファイルが調べられるすべてのダイナミックライブラリ>objdump-t obj出力ターゲットファイルのシンボルテーブル()objdump-h obj出力ターゲットファイルのすべてのセグメントを要約()
2)objdump例
コードcpp 1 #include<iostream>
2 int main()
3 {
4 std::cout<<"ztao"<<std::endl;
5 return 0;
6 }
シンボルテーブル[ztteng@ztteng 002]$ objdump -t ztao
ztao: file format elf32-i386
SYMBOL TABLE:
08048134 l d .interp 00000000 .interp
08048148 l d .note.ABI-tag 00000000 .note.ABI-tag
08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id
0804818c l d .gnu.hash 00000000 .gnu.hash
080481c0 l d .dynsym 00000000 .dynsym
08048290 l d .dynstr 00000000 .dynstr
08048414 l d .gnu.version 00000000 .gnu.version
08048430 l d .gnu.version_r 00000000 .gnu.version_r
08048490 l d .rel.dyn 00000000 .rel.dyn
080484a0 l d .rel.plt 00000000 .rel.plt
080484e8 l d .init 00000000 .init
08048518 l d .plt 00000000 .plt
080485c0 l d .text 00000000 .text
080487ac l d .fini 00000000 .fini
080487c8 l d .rodata 00000000 .rodata
080487dc l d .eh_frame_hdr 00000000 .eh_frame_hdr
08048818 l d .eh_frame 00000000 .eh_frame
08049910 l d .ctors 00000000 .ctors
0804991c l d .dtors 00000000 .dtors
08049924 l d .jcr 00000000 .jcr
08049928 l d .dynamic 00000000 .dynamic
08049a08 l d .got 00000000 .got
08049a0c l d .got.plt 00000000 .got.plt
08049a3c l d .data 00000000 .data
08049a40 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_str 00000000 .debug_str
00000000 l d .debug_pubtypes 00000000 .debug_pubtypes
00000000 l df *ABS* 00000000 crtstuff.c
08049910 l O .ctors 00000000 __CTOR_LIST__
0804991c l O .dtors 00000000 __DTOR_LIST__
08049924 l O .jcr 00000000 __JCR_LIST__
080485f0 l F .text 00000000 __do_global_dtors_aux
08049acc l O .bss 00000001 completed.5963
08049ad0 l O .bss 00000004 dtor_idx.5965
08048650 l F .text 00000000 frame_dummy
00000000 l df *ABS* 00000000 crtstuff.c
08049918 l O .ctors 00000000 __CTOR_END__
0804890c l O .eh_frame 00000000 __FRAME_END__
08049924 l O .jcr 00000000 __JCR_END__
08048780 l F .text 00000000 __do_global_ctors_aux
00000000 l df *ABS* 00000000 ztao.cpp
08049ad4 l O .bss 00000001 _ZStL8__ioinit
080486a8 l F .text 00000040 _Z41__static_initialization_and_destruction_0ii
080486e8 l F .text 0000001c _GLOBAL__I_main
08049a0c l O .got.plt 00000000 _GLOBAL_OFFSET_TABLE_
08049910 l .ctors 00000000 __init_array_end
08049910 l .ctors 00000000 __init_array_start
08049928 l O .dynamic 00000000 _DYNAMIC
08049a3c w .data 00000000 data_start
00000000 F *UND* 00000000 __cxa_atexit@@GLIBC_2.1.3
08048710 g F .text 00000005 __libc_csu_fini
080485c0 g F .text 00000000 _start
00000000 w *UND* 00000000 __gmon_start__
00000000 w *UND* 00000000 _Jv_RegisterClasses
080487c8 g O .rodata 00000004 _fp_hw
080487ac g F .fini 00000000 _fini
00000000 F *UND* 00000000 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 __libc_start_main@@GLIBC_2.0
08048568 F *UND* 00000000 _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
080487cc g O .rodata 00000004 _IO_stdin_used
08049a3c g .data 00000000 __data_start
08049a40 g O .bss 0000008c _ZSt4cout@@GLIBCXX_3.4
080487d0 g O .rodata 00000000 .hidden __dso_handle
08049920 g O .dtors 00000000 .hidden __DTOR_END__
08048720 g F .text 0000005a __libc_csu_init
08049a40 g *ABS* 00000000 __bss_start
08049ad8 g *ABS* 00000000 _end
00000000 F *UND* 00000000 _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
08048598 F *UND* 00000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
08049a40 g *ABS* 00000000 _edata
080485a8 F *UND* 00000000 __gxx_personality_v0@@CXXABI_1.3
0804877a g F .text 00000000 .hidden __i686.get_pc_thunk.bx
08048674 g F .text 00000034 main
080484e8 g F .init 00000000 _init
七、コンパイラ
簡単に言えば、コンパイラは「高度な言語」を「機械言語(低レベル言語)」に翻訳するプログラムです.現代のコンパイラの主なワークフロー:ソースコード(source code)→プリプロセッサ(preprocessor)→コンパイラ(compiler)→ターゲットコード(object code)→リンク(Linker)→実行可能プログラム(executables)
コンパイラはアセンブリまたは高度なコンピュータ言語ソースプログラム(Source program)を入力としてターゲット言語(Target language)マシンコードの等価プログラムに翻訳する
八、C言語プログラムコンパイルのメモリ配分:
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
5.プログラムコード領域
1)GCCコマンドのobjdump
objdumpは、ターゲットファイルまたは実行可能なターゲットファイルを表示する構成のGCCツールです
次の3つのコマンドは、ターゲットファイルとソースコードの関係を探索するのが好きな友人に十分です.Objdump-x objは、ある分類情報の形でターゲットファイルのデータ組織(いくつかのブロックに分けられる)を出力<このファイルが調べられるすべてのダイナミックライブラリ>objdump-t obj出力ターゲットファイルのシンボルテーブル()objdump-h obj出力ターゲットファイルのすべてのセグメントを要約()
2)objdump例
コードcpp
1 #include<iostream>
2 int main()
3 {
4 std::cout<<"ztao"<<std::endl;
5 return 0;
6 }
シンボルテーブル
[ztteng@ztteng 002]$ objdump -t ztao
ztao: file format elf32-i386
SYMBOL TABLE:
08048134 l d .interp 00000000 .interp
08048148 l d .note.ABI-tag 00000000 .note.ABI-tag
08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id
0804818c l d .gnu.hash 00000000 .gnu.hash
080481c0 l d .dynsym 00000000 .dynsym
08048290 l d .dynstr 00000000 .dynstr
08048414 l d .gnu.version 00000000 .gnu.version
08048430 l d .gnu.version_r 00000000 .gnu.version_r
08048490 l d .rel.dyn 00000000 .rel.dyn
080484a0 l d .rel.plt 00000000 .rel.plt
080484e8 l d .init 00000000 .init
08048518 l d .plt 00000000 .plt
080485c0 l d .text 00000000 .text
080487ac l d .fini 00000000 .fini
080487c8 l d .rodata 00000000 .rodata
080487dc l d .eh_frame_hdr 00000000 .eh_frame_hdr
08048818 l d .eh_frame 00000000 .eh_frame
08049910 l d .ctors 00000000 .ctors
0804991c l d .dtors 00000000 .dtors
08049924 l d .jcr 00000000 .jcr
08049928 l d .dynamic 00000000 .dynamic
08049a08 l d .got 00000000 .got
08049a0c l d .got.plt 00000000 .got.plt
08049a3c l d .data 00000000 .data
08049a40 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_str 00000000 .debug_str
00000000 l d .debug_pubtypes 00000000 .debug_pubtypes
00000000 l df *ABS* 00000000 crtstuff.c
08049910 l O .ctors 00000000 __CTOR_LIST__
0804991c l O .dtors 00000000 __DTOR_LIST__
08049924 l O .jcr 00000000 __JCR_LIST__
080485f0 l F .text 00000000 __do_global_dtors_aux
08049acc l O .bss 00000001 completed.5963
08049ad0 l O .bss 00000004 dtor_idx.5965
08048650 l F .text 00000000 frame_dummy
00000000 l df *ABS* 00000000 crtstuff.c
08049918 l O .ctors 00000000 __CTOR_END__
0804890c l O .eh_frame 00000000 __FRAME_END__
08049924 l O .jcr 00000000 __JCR_END__
08048780 l F .text 00000000 __do_global_ctors_aux
00000000 l df *ABS* 00000000 ztao.cpp
08049ad4 l O .bss 00000001 _ZStL8__ioinit
080486a8 l F .text 00000040 _Z41__static_initialization_and_destruction_0ii
080486e8 l F .text 0000001c _GLOBAL__I_main
08049a0c l O .got.plt 00000000 _GLOBAL_OFFSET_TABLE_
08049910 l .ctors 00000000 __init_array_end
08049910 l .ctors 00000000 __init_array_start
08049928 l O .dynamic 00000000 _DYNAMIC
08049a3c w .data 00000000 data_start
00000000 F *UND* 00000000 __cxa_atexit@@GLIBC_2.1.3
08048710 g F .text 00000005 __libc_csu_fini
080485c0 g F .text 00000000 _start
00000000 w *UND* 00000000 __gmon_start__
00000000 w *UND* 00000000 _Jv_RegisterClasses
080487c8 g O .rodata 00000004 _fp_hw
080487ac g F .fini 00000000 _fini
00000000 F *UND* 00000000 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 __libc_start_main@@GLIBC_2.0
08048568 F *UND* 00000000 _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
00000000 F *UND* 00000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
080487cc g O .rodata 00000004 _IO_stdin_used
08049a3c g .data 00000000 __data_start
08049a40 g O .bss 0000008c _ZSt4cout@@GLIBCXX_3.4
080487d0 g O .rodata 00000000 .hidden __dso_handle
08049920 g O .dtors 00000000 .hidden __DTOR_END__
08048720 g F .text 0000005a __libc_csu_init
08049a40 g *ABS* 00000000 __bss_start
08049ad8 g *ABS* 00000000 _end
00000000 F *UND* 00000000 _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
08048598 F *UND* 00000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
08049a40 g *ABS* 00000000 _edata
080485a8 F *UND* 00000000 __gxx_personality_v0@@CXXABI_1.3
0804877a g F .text 00000000 .hidden __i686.get_pc_thunk.bx
08048674 g F .text 00000034 main
080484e8 g F .init 00000000 _init
七、コンパイラ
簡単に言えば、コンパイラは「高度な言語」を「機械言語(低レベル言語)」に翻訳するプログラムです.現代のコンパイラの主なワークフロー:ソースコード(source code)→プリプロセッサ(preprocessor)→コンパイラ(compiler)→ターゲットコード(object code)→リンク(Linker)→実行可能プログラム(executables)
コンパイラはアセンブリまたは高度なコンピュータ言語ソースプログラム(Source program)を入力としてターゲット言語(Target language)マシンコードの等価プログラムに翻訳する
八、C言語プログラムコンパイルのメモリ配分:
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
5.プログラムコード領域
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
5.プログラムコード領域