实际上,Linux上的-static gcc标志现在不起作用。让我从GNU libc常见问题中引用:
2.22。即使是静态链接程序也需要一些共享库,这对我来说是不可接受的。我能做什么?
{AJ} NSS(有关详细信息,请键入`info libc“名称服务开关”“)在没有共享库的情况下无法正常工作。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上完全无效?我的意思是静态构建:
- 行为与动态构建完全相同(行为不一致的static-nss是邪恶的!);
- 适用于合理的glibc环境和Linux版本;