当前位置: 首页 > 面试题库 >

Linux静态链接已死?

方野
2023-03-14
问题内容

实际上,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版本;

问题答案:

关于这一事实,现在是否有任何合理的方法可以在Linux上创建功能齐全的静态构建,或者静态链接在Linux上完全无效?

我不知道在哪里可以找到历史参考,但是是的,静态链接在GNU系统上已失效。(我相信它在从libc4
/ libc5过渡到libc6 / glibc 2.x的过程中死了。)

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

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

  • 代码膨胀。如果在同一系统上运行许多静态链接的应用程序,则标准库将不会被重用,因为每个应用程序都包含其自己的所有内容副本。(尝试du -sh /usr/lib了解问题的严重程度。)

尝试挖掘10-15年前的LKML和glibc邮件列表档案。我很确定很早以前就已经看到了与LKML相关的内容。



 类似资料:
  • 静态链接方法:静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来 静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库 动态链接方法:使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这

  • 在编译Linux程序时,我们经常会看到动态链接和静态链接这两个术语。这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamical

  • 问题内容: 我在Linux,GCC中使用Boost库。安装和构建Boost之后,我发现使用Regex和Thread的程序使用共享的Boost库。就我的目的而言,我需要静态链接。如何更改链接类型?我应该重新构建Boost,还是可以通过在自己的项目或Boost配置文件中定义一些常量来设置链接类型? 问题答案: 只需添加到您的构建调用即可。这是一个简单的示例会话: 请注意,静态二进制文件的大小为1.5m

  • 问题内容: 我想编译NRPE,因此可以将编译后的二进制文件复制到不希望安装gcc的OmniOS服务器上。我希望从存储库中安装具有SSl支持的NRPE,但是这种接缝不存在,所以我想自己编译它。但是,脚本不包含它所接缝的静态选项 题 如何编译静态使用的程序? 问题答案: 尝试这个:

  • 我一直试图静态地将sfml链接到C++项目,但它总是给我带来编译器错误,有人知道这里发生了什么以及如何修复它吗; 编辑: 这是产生错误的代码: 严重性代码描述项目文件行抑制状态错误LNK2019未解析外部符号_JPEG_CreateCompress在函数“private:bool__thiscall SF::Priv::ImageLoader::WriteJPG(类STD::Basic_Strin

  • 使用clang链接AFN .a静态库 AFN静态库的生成不是重点, 以链接使用为主 一、准备 在staticLib文件夹下新建test.m文件, 代码如下 #import <Foundation/Foundation.h> #import <AFNetworking.h> int main() { AFHTTPSessionManager *manager = [AFHTTPSe