当前位置: 技术问答>linux和unix
多次连接静态库
来源: 互联网 发布时间:2016-07-24
本文导语: 程序链接了 A.so , B.so , 假设 A,B两个动态库里面有分别有 funcA(), funcB(),这两个函数调用了 funcC(), funcC定义在 C.a 库里, A.so, B.so都静态连接 C.a . 问题如下: 1. 这种连接方式有问题否? 程序里是否存在了两份fun...
程序链接了 A.so , B.so , 假设 A,B两个动态库里面有分别有 funcA(), funcB(),这两个函数调用了 funcC(), funcC定义在
C.a 库里, A.so, B.so都静态连接 C.a . 问题如下:
1. 这种连接方式有问题否? 程序里是否存在了两份funcC() 代码?
2. 假如C.a 里又定义了一个全局变量 g_base , 那么在 A,B库里分别调用该全局变量,会存在什么问题?
3. 关于动态连接与静态连接,我如何预测会出现什么情况或者问题, 关键点在哪里? (例如函数调用,数据存放等方面) 谢谢!~~~
C.a 库里, A.so, B.so都静态连接 C.a . 问题如下:
1. 这种连接方式有问题否? 程序里是否存在了两份funcC() 代码?
2. 假如C.a 里又定义了一个全局变量 g_base , 那么在 A,B库里分别调用该全局变量,会存在什么问题?
3. 关于动态连接与静态连接,我如何预测会出现什么情况或者问题, 关键点在哪里? (例如函数调用,数据存放等方面) 谢谢!~~~
|
1.是存在两份func代码
2.我认为可以,静态库的结构比较简单,其实就是把原来的目标代码放在一起,链接程序根据每一份目标代码的符号表查找相应的符号(函数和变量的名字),找到的话就把该函数里面需要定位的进行定位,然后将整块函数代码放进可执行文件里,若是找不到需要的函数就报错退出。
3.可以通过查看可执行文件,关键点在哪儿不太清楚,推荐《深入理解计算机系统》第7章
祝快乐
2.我认为可以,静态库的结构比较简单,其实就是把原来的目标代码放在一起,链接程序根据每一份目标代码的符号表查找相应的符号(函数和变量的名字),找到的话就把该函数里面需要定位的进行定位,然后将整块函数代码放进可执行文件里,若是找不到需要的函数就报错退出。
3.可以通过查看可执行文件,关键点在哪儿不太清楚,推荐《深入理解计算机系统》第7章
祝快乐
|
1. A.so,B.so里都存在有funcC()的代码,程序里只是调用 A.so, B.so里的funcA()或funcB(),
只是一个调用,而不保存funcA, 或funcB, 或funcC 等的代码
2. 在静态库里定义全局变量,该全局变量在整个进程空间是有效的。所以A,B调用需要考虑对变量的保护问题,避免冲突。
3. 我不清楚你的意思。
只是一个调用,而不保存funcA, 或funcB, 或funcC 等的代码
2. 在静态库里定义全局变量,该全局变量在整个进程空间是有效的。所以A,B调用需要考虑对变量的保护问题,避免冲突。
3. 我不清楚你的意思。
|
1. 没有问题,A.so和B.so都存在funcC()的目标代码。
2. 分别调用,可能会存不同步。
3. http://man.chinaunix.net/linux/debian/debian_learning/ch12s03.html
|
1. 在内存里面会有funcC()的两份代码。主调程序里面没有,因为只是动态链接两个共享库。
2。应该不会有问题,A,B都分别有C的数据段的独立副本。
3。一点经验:当库中含有全局对象时,可能会出现情况。
|
1、这种连接没有问题,在A.so和B.so都独立存在funcC()函数的拷贝。
2、全局变量g_base只会被定义一次,而且放在进程的数据段中。
如果是多线程引用,注意加锁就可以了。
3、尽量不要在动态库中定义全局变量或静态变量,也不要在一个动态库中分配内存,然后在另外一个动态库中释放。
2、全局变量g_base只会被定义一次,而且放在进程的数据段中。
如果是多线程引用,注意加锁就可以了。
3、尽量不要在动态库中定义全局变量或静态变量,也不要在一个动态库中分配内存,然后在另外一个动态库中释放。