我正在努力避免这个Stackoverflow条目中描述的情况:调试在客户上生成的核心文件';s框。如果我静态编译所有库,我会避免在核心转储时总是收集共享库吗?我本质上想处于这样一种情况:我可以用gdb加载核心文件,并检查崩溃的应用程序。
如果我走静态链接我们需要的所有库的路线,我应该注意什么。我认为油嘴滑舌和深度阅读可能会造成最大的问题。
Valgrind会不再有用吗?如果我根据静态编译的二进制文件加载Valgrind,它会发现错误吗?或者我们应该维护一个不是静态编译的二进制文件,以便Valgrind继续工作。斯特拉斯怎么样?
我们经常崩溃,因为我们有一个庞大的安装群,而且它也是一个遗留应用程序。收集所有共享库变得越来越困难——我需要另一个解决方案。
编辑:修复了打字错误。
如果我静态编译所有库,我会避免在核心转储时总是收集共享库吗
是的。
然而,与流行的观点相反,静态链接的二进制文件比动态链接的二进制(至少在Linux上)的可移植性要低。
特别是,如果您使用以下函数中的任何一个:gethostbyname
、gethostbyaddr
、getpwent
、getpwnam
、getpwuid
(以及更多),您将在链接时收到警告,类似于以下内容:
Using 'getpwuid' in statically linked applications requires at runtime
the shared libraries from the glibc version used for linking.
此警告的意思是,如果您的客户安装的glibc版本与您在链接时使用的版本不同(即与系统libc版本不同),则程序可能会崩溃。由于这显然比您当前的情况更糟,我认为静态链接对您来说不是一个好的解决方案。