从gcc静态链接开始的讨论,学了好几手
昨天夜里某 bbs 上进行了一场关于 gcc 链接库的讨论,结果最后转移到了 Windows 下面 VC8 msvcr80.dll 的话题。。
事情的起因是这样的:
我想对某程序静态链接 libstdc++ ,但是动态链接 libc, 因为这个程序用到了 dlopen , 而 dlopen 是无法静态链接的。于是我问如何在 configure.in 里面找到 libstdc++.a 的具体路径,好加在 LDADD 里面
首先是 westline 师弟给出的解决方案 gcc -print-file-name=libstdc++.a , man 了一下,原来 gcc 还提供了一坨类似的函数,用来把他知道的都告诉你。
接下来话题就变成了为啥需要静态链接 libstdc++ 了,我其实就是想避免 libstdc++.so.5 和 libstdc++.so.6 的问题
但是这时侯伟大的 kirbyzhou 爷现身了
发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Mon Dec 5 23:36:11 2005), 转信主要是 c++需要知道 class 的实现细节内容,主要是指对象的大小。
不然 C++的.so 接口定下来也不是什么难事。
- 【 在 COMMAN ( ) 的大作中提到: 】
- 【 在 Kittyboy (Oyahoe) 的大作中提到: 】
- : ……
- : configure 的时候定位出 libstdc++.a 的路径应该是可以的,makefile 里面有那个路径,
就是 configure 出来那个 gcc 的 lib 吧。。- : 不过静态 libstdc++并且动态 libc 这个要求也特别了一点。。
- 这个是想尽量减少依赖性呀,FC2 上面是 libstdc++.so.5 , FC3 上面就是 libstdc++.s
o.6 了,太变态了,libc 倒是从 redhat ?.? 的时候开始已经是 libc.so.6 了。RH 9 开
始里面的名称也都是 GLIBC2.3 了
接下来大家开始讨论 Windows 下面把 MSVCR71.DLL 的符号都给 forward 到 MSVCRT.DLL ,以减少程序依赖性的问题。
kirby 爷还是一如既往的拍砖。
发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:11:24 2005), 转信
- 【 在 boost (我是一棵无聊) 的大作中提到: 】
- 什么意思?缺的那些 symbol?还是说名字一样过去也不去?
1.缺 symbol,比如一些检查 stack 的内部小函数。
2.bootstrap 不一样【 在 COMMAN ( ) 的大作中提到: 】
- : 但是 MSVCRT.dll 基本可以肯定不能支持 MSVCR71 的那些函数吧。我严重怀疑 forwar
d 过去了也是一调用就崩。
发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:35:30 2005), 转信
- 1.exception/type*info 及其子类的 size 不兼容问题
- 2.swprintf 以及一系列和 wchar_t*有关的东西
- 3.*_set_buffer_overrun_handler 等一系列
- 【 在 COMMAN ( ) 的大作中提到: 】
- admire 爷,看来您已经研究过缺 symbol 的函数名了,给个列表吧。
- 【 在 kirbyzhou (世界太小 梦想太大) 的大作中提到: 】
- : 1.缺 symbol,比如一些检查 stack 的内部小函数。
- : 2.bootstrap 不一样
然后下来开始关于 manifest 的讨论。起因是大家开始讨论 VC8 的 msvcr80.dll 的安装问题,kirby 说这个一定要带 manifest, 否则根本不能用。我觉得不是这样的,不过我还没有做试验证明
发信人: COMMAN ( ), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:41:47 2005), 转信嗯,manifest 是表明了你这个 dll 在什么样的 context 下面 load
然后 xp 支持一组 activatectx 之类函数,程序可以调用设定要用什么 context.
如果非常懒,可以给程序也写一个 manifest, 这样 xp 的 loader 会帮你做这个事情
两者加一起就可以自动动态挂接编译者想要的 dll 版本了。不会造成 dll 版本冲突。
assembly 同理。所以我总觉得这个不是必须的,如果没有大不了 fallback 到 system32 下面去 load 嘛
- 【 在 boost (我是一棵无聊) 的大作中提到: 】
- 我土鳖地问一句,manifest 是不是就是包了一个依赖的 crt dll 的 assembly 名字,
- 用来在 winsxs 目录下找 dll?
- 【 在 COMMAN ( ) 的大作中提到: 】
- : 可能是,我刷个牙回来还没有拍出来,不过我还是觉得 manifest 不是必须的,跟 wins
xs 下面那些冲突就冲突了,基本造成问题的可能性微乎其微,只要 microsoft 这个 dll
的向下兼容性还能够保持就行。
本来话题发展到这里,已经跑题很远了,但是 zeel 爷出现了,并且给出了这个话题开始的最标准答案
为这个讨论划上了完美的句号。
发信人: zeel (我爱我老婆), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:25:03 2005), 转信发信人: Valentin Nechayev <netch @segfault.kiev.ua>, 信区: Unix
标 题: Re: Linking with different static and dynamic library
发信站: Dark side of coredump (Tue Mar 11 20:15:23 2003)
转信站: SMTH!maily.cic.tsinghua.edu.cn!news.happynet.org!news.cn99.com!newsfeed
出 处: news.lucky.netKenji Chan wrote:
KC> Here I’ve got a “program” which links to two library lib_a and lib_b
KC> when I use –static for g++, it links all library statically
KC> But how can I do this:
KC> program –> statically lib_a.a
KC> also –> dynamically lib_b.so
KC> What command should I type?If your system uses GNU ld, you may try following:
gcc -o $prog $objs -Wl,-Bstatic -l_a -Wl,-Bdynamic -l_b -Wl,-Bdynamic
last -Wl,-Bdynamic is here to provide mode for system default libraries
(libc, etc.)(If linker isn’t GNU ld, find details in linker manuals.)