格利布的静态链接

Static linking of Glibc

本文关键字:静态 链接      更新时间:2023-10-16

如何编译我的应用程序静态链接glibc库,但只有我的应用程序所需的代码?(不是全部库)

现在我的编译命令:

g++  -o newserver  test.cpp ... -lboost_system -lboost_thread -std=c++0x

谢谢!

这就是

-static的作用(如另一个答案中所述):不需要的模块不会链接到您的程序中。但是你对所需东西数量的期望(从某种意义上说,我们无法说服链接者相反)可能过于乐观。

如果你试图这样做是为了可移植性(在其他具有较旧 glibc 或类似内容的机器上运行可执行文件),有一个简单的测试问题来查看您是否会得到你想要的东西:

你有没有想到libnss的问题,你确定它不会咬你吗?

如果你的答案是肯定的,也许继续下去是有意义的。如果答案是否定的,或者问题看起来太晦涩而没有答案,只需使用静态链接的glibc退出过期:它伤害的机会大于帮助。

-static添加到编译行。它只会添加您的应用程序需要的内容[当然,您的应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和其他一些零碎的东西],因此它将在 x86 机器上大约 800K(对于简单的"hello world"程序)。其他体系结构各不相同。由于 boost 可能至少还会调用标准库一点点,因此您的应用程序可能会添加超过 800K。但它只应用最终二进制文件中任何代码使用的函数,而不是整个库[大约 2MB 作为共享库]。

如果你只想要链接glibc,你需要修改编译的链接行为: -Wl,-Bstatic -libc -Wl,-Bdynamic .这将防止任何其他库被静态链接[你有时需要有多个这样的语句,因为有时由另一个库拉入的东西需要从glibc中提取"更多"的东西 - 别担心,它不会带来任何超过链接器认为必要的内容]。