gcc静态链接

链接就是将多个.o文件连接成为一个可执行文件的过程。链接中最终要的部分就是空间地址分配和符号的解析和重定位。

首先说空间地址分配:扫描所有的输入目标文件,获得他们各个段的长度、属性和位置,并进一步将输入目标文件的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表里。在这一步中,连接器能获得所有输入段的长度,并将它们合并,计算出合并后的段长度和位置,并建立映射关系。

符号解析和重定位:使用上面第一步中收集到的所有信息,读取输入文件中的短的数据、重定位信息,并且进行符号的解析和重定位、调整代码中的地址等。事实上第二步是链接过程的核心。特别是重定位过程。

l inux中使用ld a.o b.o -e main -o ab来进行链接。

在.o文件中不存在虚拟地址,链接后产生虚拟地址,符号地址确定。对于可执行文件中的bss段,在elf文件中是没有占据空间的,但是在链接的过程中却要为bss数据段分配虚拟内存空间。

下面描述一下在静态链接中的几个重要概念:

重定位表:对于.o文件中任何未定义的符号都在重定位表里有一项与之对应,该项使用Elf32-rel数据结构表示,其中包括了重定位入口偏移(重定位的符号相对于段的偏移)和与之对应的符号在符号表中的下标。

COMMON块:我们都知道符号类型对链接器是透明的,也就是链接器不知道符号的类型。当有多个同名符号类型不一致的时候就会出现问题。为此设置了一种COMMON块机制,及当多个同名的弱符号类型不一致的时候以占据空间大的那个为准。存在强符号和弱符号类型不一致时以强符号为准,不过当弱符号大小大于强符号时,会发出警告。

重复代码删除问题:以C++模板函数为例,在某个编译单元可能产生了add<int> 和add<double>类型的代码,在另一个编译单元中也存在add<int>的代码,这个时候链接器就会发现,并删除重复代码。

函数级别的链接,对于有些库而言其异常的庞大,在用到其中一个函数的时候就将整个库包含进来,为解决这个问题可将函数生成独立的段,在链接过程中只包含有用的部分,减少可执行文件的大小。

时间: 2024-11-01 12:43:50

gcc静态链接的相关文章

利用GCC编译器生成动态链接库和静态链接库

转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码.链接的时候不通过拷贝来进行. 2.链接过程 gcc –shared –o libxxx.so xxx.o 经过编译链接就可以生成动态链接库,其扩展名为.so Eg. 还可以gcc –fPIC –shared -o libhello.so hello.c 举个例子: //Hello.h //hello

GCC 编译使用动态链接库和静态链接库的方法

1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用. 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题. 首先就是系统空间被浪费了.

[转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链

GCC 编译使用动态链接库和静态链接库

1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库

GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标

mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)

原文地址:mingw qt作者:孙1东 不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -no-script -no-scripttools -nomake tools -nomake examples -nomake demos -nomake docs -

GCC编译过程与动态链接库和静态链接库

1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..dll). windows上对应的是.lib .dll linux上对应的是.a .so 在这里先介绍下Linux下的gcc编译的几个选项 g++ -c hellospeak.cpp 会将hellospeak.cpp 选

&nbsp; &nbsp; &nbsp; &nbsp; 自己制作静态链接库并使用

目的隐藏源代码只提供给.a 与.h文件 /*aston.c */#include <stdio.h>void func1( void ){ printf("func1 in aston.c\n");}int  func2(int a,int b){ printf("func2 in aston.c\n"); return a+b;}//aston.hvoid func1( void ); int  func2(int a,int b); //Makefi

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx