• 嵌入式培训学习历程第二十一天


      1.static

          跟全局变量 : 限制作用域。  跟局部变量 : 延长生命周期。  跟函数 :只能在本模块内有效

      2. 函数副作用 :  内部改变外部的值

      3. 目标文件和可执行文件的区别

            目标文件 : 相对路径,不可运行      

            可执行文件 : 绝对路径,可运行

            虚拟址通过mmu物理址

      4.数据段合并,(合并同类项)    地址回填(重定位)

      5.

    .bss  这两个合并
    .data
    .rodata 这两个合并
    .text

      6.标准C库

          Linux下  libc,  unix和windows下的glibc

      7.静态库

            特点 : 比较消耗内存      优点 :速度快

      8.如果用ls做链接时没有用-T选项制定链接脚本,则使用ld的默认链接脚本,默认链接脚本可以使用ld --verbose命令查看

      9.ENTRY(_start) 说明_start是整个程序的入口点,因此_start是入口点并不是规定死的,是可以改用其它函数做入口点的。

      10.做静态库流程。。源文件main.c, sub.c,add.c, head.h

            (1)gcc -c main.c sub.c add.c

            (2)ar rs libaddsub.a sub.o add.o

          或者(2)ar r libaddsub.a sub.o add.o

            ranlib liaaddsub.a

            (3)gcc main.c -L. -laddsub -omain

            -L.表示在当前目录找(.不可省略),-laddsub告诉编译器要链接的libaddsub库

             (4)选项r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包忠已有同名文件就替换成新的,。s是专门用于生成静态库,表示位静态库创建索引。这个索引被链接器使用

      11.如果希望编译器只链接静态库,可以指定-static选项

      12.好处 : (1)连接器可以从静态库中只取出需要的部分来做链接    (2)不需要写一长串目标文件名

      12 共享库 :

          优点 : 节省内存,方便更新

          缺点 : 速度较慢

      13. 共享库采用的机制 :延迟绑定

      14.在共享库调用时,动态库是否加载到内存,取决于程序是否运行。

      15.生成共享库流程:main.c add.c sub.c head.h

            gcc -c -fPIC add.c sub.c

            gcc -shared -o libaddsub.so add.o sub.o

          (1). -f 后面跟一些编译选项,

          (2). PIC : 表示生成位置无关代码

            注意 : 加调试信息必须每个目标文件时用-g选项,而不能只在最后编译生成可执行文件时用-g选项

            ldd命令查看可执行文件依赖于哪些共享库

            使用gcc做链接时用-dynamic-linker指定动态链接器的路径

            共享库的搜索路径由动态链接器决定,从ld.so(8)Man page可以查到共享库路径的搜索路径:

                (1)在环境变量LD_LIBRARY_PATH所记录的路径中查找

                    export LD_LIBRARY_RATH=.      或把这句话加在 .bashrc中

                    ./main

                (2)(重点)从缓存文件/etc/ld.so.cache中查找,这个由ldconfig命令读取配置文件/etc/ld.so.conf之后生成

                    把libaddsub.so所在目录的绝对路径添加到/etc/ld.so.conf中

                    然后 sudo ldconfig -v

                (3)(重点)把libaddsub.so 拷贝到/usr/lib或/lib目录

                (4)在编译时把libaddsub.so的路径写死在可执行文件中

                    gcc main.c -g -L. -laddsub -o main -Wl,-rpath,/home/cxw/CXW

      16.每个共享库都有三个文件名 : realname  soname  linkername

            英语,今天的  : directory(目录) libraries(库)  loading(加载)

  • 相关阅读:
    想出去走走
    一辈子的孤单
    好久不见
    bash 源码分析
    如何查看bash shell 帮助信息?
    mvn使用笔记
    StringTemplate初步使用
    使用tungsten将mysql的数据同步到hadoop
    《大脑幸福密码》
    《跳出头脑,融入生活》
  • 原文地址:https://www.cnblogs.com/cxw825873709/p/3256303.html
Copyright © 2020-2023  润新知