事实上, Linux 上的-static gcc 标志现在不起作用。让我引用 GNU libc 常见问题解答:
2.22。即使是静态链接的程序也需要一些我无法接受的共享库。我能做些什么?
{AJ} NSS(有关详细信息,只需键入 `info libc "Name Service Switch"')在没有共享库的情况下将无法正常工作。NSS 允许通过更改一个配置文件 (/etc/nsswitch.conf) 来使用不同的服务(例如 NIS、文件、db、hesiod),而无需重新链接任何程序。唯一的缺点是现在静态库需要访问共享库。这由 GNU C 库透明地处理。
一种解决方案是使用 --enable-static-nss 配置 glibc。在这种情况下,您可以创建一个仅使用服务 dns 和文件的静态二进制文件(为此更改 /etc/nsswitch.conf)。您需要明确链接所有这些服务。例如:
gcc -static test-netdb.c -o test-netdb \ -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group
这种方法的问题在于,您必须将每个使用 NSS 例程的静态程序与所有这些库链接起来。
{UD} 事实上,不能再说使用此选项编译的 libc 正在使用 NSS。没有开关了。因此强烈 建议不要使用 --enable-static-nss,因为这会使系统上程序的行为不一致。
关于这个事实,现在是否有任何合理的方法可以在 Linux 上创建功能齐全的静态构建,或者静态链接在 Linux 上完全死了?我的意思是静态构建:
- 行为与动态构建完全相同(行为不一致的静态nss是邪恶的!);
- 适用于 glibc 环境和 Linux 版本的合理变化;