事实上,Linux上的-staticGCC标志现在不起作用.让我引用GNU libc常见问题:

2.22. Even statically linked programs need some shared libraries which is not acceptable for me. What can I do?

{AJ}NSS(有关详细信息,请键入'info'

解决方案是使用

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

The problem with this approach is that you've got to link every static program that uses NSS routines with all those libraries.
{UD} In fact, one cannot say anymore that a libc compiled with this option is using NSS. There is no switch anymore. Therefore it is highly recommended not to use --enable-static-nss since this makes the behaviour of the programs on the system inconsistent.

考虑到这个事实,现在有没有合理的方法在Linux上创建一个完整的静态构建,或者静态链接在Linux上完全失效?我指的是静态构建:

  • 行为方式与
  • 研究glibc环境和Linux版本的合理变化;

推荐答案

考虑到这个事实,现在有没有合理的方法在Linux上创建一个完整的静态构建,或者静态链接在Linux上完全失效?

我不知道在哪里可以找到历史参考文献,但是是的,GNU系统上的static linking个已经死了.(我相信它是在从libc4/libc5过渡到libc6/glibc 2.x的过程中消亡的.)

鉴于以下原因,该功能被视为无用:

  • 安全漏洞.静态链接的应用程序甚至不支持libc的升级.如果应用程序链接到包含lib漏洞的系统上,那么它将在静态链接的可执行文件中永久存在.

  • 代码inflating .如果许多静态链接的应用程序在同一个系统上运行,标准库就不会被重用,因 for each 应用程序都包含在自己的所有内容的副本中.(试着理解问题的严重程度.)

try 挖掘10-15年前的LKML和glibc邮件列表档案.我很确定很久以前我在LKML上看到过一些相关的东西.

Linux相关问答推荐

在Linix&;Mac中运行Reaction本机项目时出现问题

并行函数的最后一个实例的状态

Linux 的 __fastfail 替代方案?

jinja2.exceptions.TemplateSyntaxError:预期标记,,得到整数(支持十六进制,八进制和二进制整数文字)

如何查明第三方是否杀死或 destruct 了 C++ 中的程序

从另一个文件中的大文件中查找行的最快方法

awk 不打印所需的 df 输出

进程Forking 后 pthread_key_create() 生成的密钥会发生什么?

来自远程主机的 mysqldump

在 Linux 上的进程之间传递消息的最快技术?

如何从 Linux 中的用户空间访问物理地址?

Docker Bash 提示不显示 colored颜色 输出

如何在字符串中查找子字符串(或如何 grep 变量)?

如何在 shell 脚本中向文件中添加一行?

有什么方法可以在linux中保留但不提交内存?

Linux 上真的没有异步块 I/O 吗?

如何使用 sed 通过灵活的键和值更改我的配置文件?

svn over HTTP 代理

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

学习内核编程