[GCC] Linker

Posted 力为

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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


以上是关于[GCC] Linker的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX 上的 GCC——多个版本的 gcc

mingw和gcc的关系?mingw具有gcc的全部核心编译功能吗

gcc 和 g++/gcc-c++ 有啥区别?

ubuntu系统下怎么安装gcc编译器

GCC:在 GCC 版本之间伪装

arm gcc 内嵌汇编,gcc该是啥选项呢