• [GCC] Linker



    生成可执行文件的简单过程:
    1、从源文件中生成object文件
    2、连接object文件为可执行文件
    ___________________________________________________________________
    多个object模块有三种存在形式:
    目录下的object文件:最终的可执行文件将包含object文件中的所有代码

    静态库中的object模块:
    可执行文件中只包含使用到的模块,即静态库中没用到的模块不会被包含到可执行文件中。因此这种方式生产

    的可执行文件比第一种方式产生的要小。
    用ar生成静态库时,.a文件中保存了一个object模块的索引列表,连接器根据该列表来决定包含需要包含模块

    。因此源文件改变后,通过更新已有的索引列表即可。
    用ar -q向已有的静态库添加objcet模块:
     $ ar -q libXXX.a ml.o m2.o m3.o
    更新受影响的索引:
    $ ranlib libXXX.a
    当同一个符号的定义出现在不同的模块时,连接器将使用第一个包含该符号的模块。因此有时需要改变静态库

    中模块的顺序:
    ar [options] [positionname] [count] archive objectfile [objectfile...]

    动态库中的object模块:
    当程序执行的时候才加载。因此,可执行文件更小。
    ____________________________________________________________________
    定位库
    链接时:
    /lib 和 /usr/lib 为自动搜索目录。
    自定义搜索目录:
    $ gcc -L. -L/home/fred/lib prog.o //同时搜索当前目录和/home/fred/lib
    运行时:
    环境变量LD_LIBRARY_PATH中的目录、文件/etc/ld.so.cache中的库、/lib 和 /usr/lib、当前目录
    _______________________________________________________________________
    运行时加载动态库
    dlfcn.h中的几个函数:
    dlopen()
    dlsym()
    dlcose()
    dlerror()
    编译选项-ldl:
    $ gcc xxx.c -ldl -o xxx
    ____________________________________________________________________-
    显示库中的符号名字
    $ nm libXXX.a
    移除object文件中的无用信息:如调试符号表信息
    $ strip libXXX.a
    获取dll依赖信息:
    $ ldd xxx
    获取object内部信息:
    $ objdump -f -h -EB XXX.o


  • 相关阅读:
    angularjs 中使用 service 在controller 之间 share 对象和数据
    angularjs 中实现 load more 功能
    MVC 中对返回的 data 进行压缩
    linq中如何合并多个predicate条件
    mysql安装常见问题
    Ehcache的CacheManager的使用
    Java Web开发——Filter过滤器
    Java Web开发——Servlet监听器
    JSP内置对象
    JSP指令与动作
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333156.html
Copyright © 2020-2023  润新知