一、机器语言
机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。
可以理解为机器语言就是二进制
二、源代码
源代码示例源程序(source code)是指未编译的按照一定的程序设计语言规范书写的文本文件。 源代码(也称源程序),是指一系列人类可读的计算机语言指令
三、预处理器
预处理器是在真正的编译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。预处理器可由语言(如C)要求或以后作为提供额外功能(诸如为FORTRAN提供Ratfor预处理器)的附加软件。
四、目标代码(目标文件)
1)指源代码经编译后,产生的能被 CPU直接识别的二进制代码。
2)
五、链接器
六、符号表
1)GCC命令之 objdump
objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具
以下3条命令足够那些喜欢探索目标文件与源代码之间的丝丝的关系的朋友。
objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库> objdump -t obj 输出目标文件的符号表()objdump -h obj 输出目标文件的所有段概括()2)objdump例子
代码ztao.cpp
1 #include2 int main() 3 { 4 std::cout<<"ztao"<
符号表
[ztteng@ztteng 002]$ objdump -t ztaoztao: file format elf32-i386SYMBOL TABLE:08048134 l d .interp 00000000 .interp08048148 l d .note.ABI-tag 00000000 .note.ABI-tag08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id0804818c l d .gnu.hash 00000000 .gnu.hash080481c0 l d .dynsym 00000000 .dynsym08048290 l d .dynstr 00000000 .dynstr08048414 l d .gnu.version 00000000 .gnu.version08048430 l d .gnu.version_r 00000000 .gnu.version_r08048490 l d .rel.dyn 00000000 .rel.dyn080484a0 l d .rel.plt 00000000 .rel.plt080484e8 l d .init 00000000 .init08048518 l d .plt 00000000 .plt080485c0 l d .text 00000000 .text080487ac l d .fini 00000000 .fini080487c8 l d .rodata 00000000 .rodata080487dc l d .eh_frame_hdr 00000000 .eh_frame_hdr08048818 l d .eh_frame 00000000 .eh_frame08049910 l d .ctors 00000000 .ctors0804991c l d .dtors 00000000 .dtors08049924 l d .jcr 00000000 .jcr08049928 l d .dynamic 00000000 .dynamic08049a08 l d .got 00000000 .got08049a0c l d .got.plt 00000000 .got.plt08049a3c l d .data 00000000 .data08049a40 l d .bss 00000000 .bss00000000 l d .comment 00000000 .comment00000000 l d .debug_aranges 00000000 .debug_aranges00000000 l d .debug_pubnames 00000000 .debug_pubnames00000000 l d .debug_info 00000000 .debug_info00000000 l d .debug_abbrev 00000000 .debug_abbrev00000000 l d .debug_line 00000000 .debug_line00000000 l d .debug_str 00000000 .debug_str00000000 l d .debug_pubtypes 00000000 .debug_pubtypes00000000 l df *ABS* 00000000 crtstuff.c08049910 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_aux08049acc l O .bss 00000001 completed.596308049ad0 l O .bss 00000004 dtor_idx.596508048650 l F .text 00000000 frame_dummy00000000 l df *ABS* 00000000 crtstuff.c08049918 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_aux00000000 l df *ABS* 00000000 ztao.cpp08049ad4 l O .bss 00000001 _ZStL8__ioinit080486a8 l F .text 00000040 _Z41__static_initialization_and_destruction_0ii080486e8 l F .text 0000001c _GLOBAL__I_main08049a0c l O .got.plt 00000000 _GLOBAL_OFFSET_TABLE_08049910 l .ctors 00000000 __init_array_end08049910 l .ctors 00000000 __init_array_start08049928 l O .dynamic 00000000 _DYNAMIC08049a3c w .data 00000000 data_start00000000 F *UND* 00000000 __cxa_atexit@@GLIBC_2.1.308048710 g F .text 00000005 __libc_csu_fini080485c0 g F .text 00000000 _start00000000 w *UND* 00000000 __gmon_start__00000000 w *UND* 00000000 _Jv_RegisterClasses080487c8 g O .rodata 00000004 _fp_hw080487ac g F .fini 00000000 _fini00000000 F *UND* 00000000 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.400000000 F *UND* 00000000 __libc_start_main@@GLIBC_2.008048568 F *UND* 00000000 _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.400000000 F *UND* 00000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4080487cc g O .rodata 00000004 _IO_stdin_used08049a3c g .data 00000000 __data_start08049a40 g O .bss 0000008c _ZSt4cout@@GLIBCXX_3.4080487d0 g O .rodata 00000000 .hidden __dso_handle08049920 g O .dtors 00000000 .hidden __DTOR_END__08048720 g F .text 0000005a __libc_csu_init08049a40 g *ABS* 00000000 __bss_start08049ad8 g *ABS* 00000000 _end00000000 F *UND* 00000000 _ZNSolsEPFRSoS_E@@GLIBCXX_3.408048598 F *UND* 00000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.408049a40 g *ABS* 00000000 _edata080485a8 F *UND* 00000000 __gxx_personality_v0@@CXXABI_1.30804877a g F .text 00000000 .hidden __i686.get_pc_thunk.bx08048674 g F .text 00000034 main080484e8 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.程序代码区