我正在尝试避免此Stackoverflow条目中描述的情况:Debugging core files generated on a Customer's box。如果我静态编译所有库,我会避免在核心转储时总是收集共享库吗?我本质上希望处于这样一种情况:我可以用gdb加载核心文件并检查崩溃的应用程序。
如果我沿着静态链接我们需要的所有库的路线,应该注意什么。我认为glib和pthreads可能会导致最大的问题。
Valgrind会不会有用吗?如果我将Valgrind加载到具有静态编译的所有内容的二进制文件中它会发现错误吗?或者我们应该维护一个非静态编译的二进制文件,以便Valgrind继续工作。 strace怎么样?
我们经常崩溃,因为我们有一个大型安装基础,它也是一个遗留应用程序。收集所有共享库变得棘手 - 我需要另一种解决方案。
编辑:修正错字。
答案 0 :(得分:2)
如果我静态编译所有库,我将避免在核心转储时总是收集共享库
是
然而,与流行的看法相反,静态链接的二进制文件比动态链接的二进制文件更少可移植(至少在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.
此警告的含义是 IF 您的客户安装了与您在链接时使用的glibc不同版本的glibc(即与您的系统libc不同), 然后您的程序可能会崩溃。由于这比现在的情况明显更糟,我不相信静态链接对你来说是一个很好的解决方案。