昨天夜里某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 , 信区: 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.net

>>> Kenji 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.)