【问题标题】:Create statically-linked binary that uses getaddrinfo?创建使用 getaddrinfo 的静态链接二进制文件?
【发布时间】:2011-02-13 02:13:28
【问题描述】:

我已包含标题 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 生成的要小得多。

【问题讨论】:

  • 我会让您的可能解决方案成为答案。然后你可以接受你自己的答案。

标签: c gcc posix c99 static-linking


【解决方案1】:

glibc 使用 libnss 来支持许多不同的地址解析服务提供程序。不幸的是,您不能静态链接 libnss,因为它加载的提供程序具体取决于本地系统的配置。

【讨论】:

  • 同时在 2.20 版中有 --enable-static-nss 标志 configure 似乎正是这样做的。请注意,静态链接会带来一些缺点(请参阅@pixelbeat 的答案和对其做出的 cmets)。
  • 我找到了一个使用 musl 而不是 glibc 的解决方案。请参阅下面的答案:stackoverflow.com/a/37245653/425758
【解决方案2】:

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

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

【讨论】:

  • 你知道 C++ 的解决方案吗?
  • 谢谢。您知道在 Alpine 中编译的二进制文件是否可移植?我正在构建一个二进制文件以在 Amazon AWS 上作为 lambda 运行,我认为强烈建议在 CentOS(用于 lambdas 的操作系统)上编译它。
  • @JC1 是的,我在 Alpine Linux 上编译,可以在 Ubuntu 16.04 和 CentOS7 上运行。
【解决方案3】:

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

【讨论】:

  • 我认为这取决于您需要做什么。如果二进制可移植性是必须的,静态编译是一个有效的解决方案。
  • 好吧,上面提到,如果你静态链接,有些事情是不可能的。我在这里有一些关于二进制兼容性的说明:pixelbeat.org/programming/linux_binary_compatibility.html
猜你喜欢
  • 2015-04-02
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多