一、机器语言
机器语言(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 #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.程序代码区