创建使用getaddrinfo的静态链接二进制文件?

我已经包含了头文件netdb.h ,其中包含了getaddrinfo ,但是gcc发出了这个警告:

 warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c 

如何静态编译丢失的文件?

可能的解决方案:

  1. 可能是glibc安装缺少静态编译所需的相应目标文件。 如果是这种情况,请创建相应的目标文件并在编译时链接它。

  2. 尝试EGLIBC而不是glibc。

  3. 我成功地用dietlibc编译了我的程序,它编译时没有任何错误加上得到的二进制文件比glibc制作的要小得多。

glibc使用libnss来支持许多不同的地址解析服务提供程序。 遗憾的是,您无法静态链接libn​​ss,因为它加载的提供程序取决于本地系统的配置。

我找到了一个解决方案:你可以用musl库代替glibc。 要使用musl,您可以使用musl-gcc安装它并构建软件,也可以使用使用musl的Linux发行版,例如Alpine Linux。

在我的例子中,为了节省时间,我选择Alpine Linux来构建我的程序( https://github.com/zhanxw/rvtests ),因为我不想构建多个编译器(gcc,g ++和gfortran)。

我认为某些function依赖于动态加载器来在运行时解决问题。 不幸的是,静态链接不再实用http://people.redhat.com/drepper/no_static_linking.html