博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译器的原理
阅读量:5964 次
发布时间:2019-06-19

本文共 6885 字,大约阅读时间需要 22 分钟。

一、机器语言

  机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。

  可以理解为机器语言就是二进制

二、源代码

  源代码示例源程序(source code)是指未编译的按照一定的程序设计语言规范书写的文本文件。 源代码(也称源程序),是指一系列人类可读的计算机语言指令

三、预处理器

  预处理器是在真正的编译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。预处理器可由语言(如C)要求或以后作为提供额外功能(诸如为FORTRAN提供Ratfor预处理器)的附加软件。

四、目标代码(目标文件)

  1)指源代码经编译后,产生的能被 CPU直接识别的二进制代码

  2)

目标代码(objectcode)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。[1]目标文件(objectfile)即存放目标代码的计算机文件,它常被称作二进制文件(binaries)。
目标文件包含着 机器代码(可直接被计算机中央处理器执行)以及 代码在运行时使用的数据,如重定位信息,如用于链接或调试的程序符号(变量和函数的名字),此外还包括其他调试信息。[2]目标文件是从源代码文件产生程序文件这一过程的中间产物,链接器正是通过把目标文件链接在一起来生成可执行文件或库文件。目标文件中唯一的要素是机器代码,例如,用于嵌入式系统的目标文件可能仅仅含有机器代码。

 

五、链接器

 

链接器(Linker)是一个程序, 将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。
目标文件是包括机器码和链接器可用信息的程序模块。简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作。

 六、符号表

1)GCC命令之 objdump

objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具

以下3条命令足够那些喜欢探索目标文件与源代码之间的丝丝的关系的朋友。

objdump   -x   obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库>  
objdump   -t   obj 输出目标文件的符号表()
objdump   -h   obj 输出目标文件的所有段概括()

2)objdump例子

代码ztao.cpp

1 #include
2 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.程序代码区

 

转载于:https://www.cnblogs.com/ztteng/p/3415294.html

你可能感兴趣的文章
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
2013 Linux领域年终盘点
查看>>
mysql多实例实例化数据库
查看>>
javascript 操作DOM元素样式
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
org.openqa.selenium.StaleElementReferenceException
查看>>
HBase 笔记3
查看>>
【Linux】Linux 在线安装yum
查看>>
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
阿里百川码力APP监控 来了!
查看>>
使用dotenv管理环境变量
查看>>
温故js系列(11)-BOM
查看>>
Vuex学习
查看>>
bootstrap - navbar
查看>>
切图崽的自我修养-[ES6] 编程风格规范
查看>>
服务器迁移小记
查看>>
FastDFS存储服务器部署
查看>>