zoukankan      html  css  js  c++  java
  • 链接、装载与库_读书笔记

    自己整理的一些读书笔记,主要是重点内容提取和理解。如果有描述不准确,还请各位同仁多多指教!

        第二章   编译、汇编、链接

    以c++ 为例。

    预编译  hello.c  -->   hello.i    处理源代码中以#开头的指令 如 #include #define 删除#define 展开宏,删除注释。

    $gcc -E hello.c -o hello.i  //生成预编译文件

    编译  hello.i  --> hello.s   主要是词句法分析。 通常前两步编译和预编译在一步完成。  预编译编译程序cc1。

    $gcc -S hello.i -o hello.s  或者

    $cc1 hello.c   // 直接生成 hello.s 文件完成预编译和编译。

    汇编  hello.s  --> helli.o

    $as hello.s -o hello.o //或者直接一步到位

    $gcc -c hello.s -o hello.o//

    $gcc -c hello.c -o hello.o//直接一步从源码上升到hello.o

    链接  hello.o  -->  hello  可执行文件

    $ld -static -group 

    总结  编译预编译器cc1,汇编器as,链接器ld。然后gcc -E -S -o 也具有同样功能。

      第三章   目标文件

        弱符号与强符号 : c++中默认的初始化了全局变量为强符号,未初始化的全局变量为弱符号。

                

         弱引用和强引用  : 如果未找到符号的定义,弱引用不报错,强引用报错。

                      

          EFL 文件格式

    第四章  静态链接

         链接  $ld

        

     

       VMA  (  vitual memory address ) 

       LMA  (  load memory address )

      COMMON 多个弱类型或者弱引用,在链接时划分内存我们以最大内存为准。

      API  application programing interface 源代码层面的接口

      ABI  application binary interface  二进制代码层面的接口

       

    两种c++  ABI 标准  window visual c++  he  gnu 的gcc 标准,两种互不兼容。

    为什么静态运行库里面一个一个目标文件只包含一个函数,比如libc.a 里面printf.o 只有printf() 函数, 而strlen.o 里面只有 .strlen() 函数?

       因为 连接器链接动态库是以.o文件也就是目标文件(object file) 为单位的。如果一个目标文件中放了多个函数,比如printf.o里面还有很多其他函数,我们在调用printf()时,会把所有同一个.o文件的函数都调用进去,增大了内存空间。因此一个目标函数只包含一个函数,然后调用哪个函数就链接哪个函数的目标文件,这样最大的减少了文件的内存空间。

      主要摘录的是书籍中和我工作比较相关的内容。

  • 相关阅读:
    HihoCoder1105 题外话·堆(基础二叉搜索树)
    HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)
    HihoCoder1078线段树的区间修改(线段树+lazy)
    HihoCoder1070 区间最小值(简单线段树)
    HDU3577Fast Arrangement(线段树+lazy)
    POJ2985 The k-th Largest Group (并查集+treap)
    HihoCoder1337 动态第k大(treap)
    STL的erase函数和lower_bound
    HihoCoder1329 平衡树·Splay(附STL版)
    etcd 在超大规模数据场景下的性能优化
  • 原文地址:https://www.cnblogs.com/zhezhong/p/5711456.html
Copyright © 2011-2022 走看看