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

  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(加载)

原文地址:https://www.cnblogs.com/cxw825873709/p/3256303.html