草庐IT

c++ - 为什么不鼓励静态链接 glibc?

大多数在线资源表明您可以静态链接glibc,但不鼓励这样做;例如centospackagerepo:Theglibc-staticpackagecontainstheClibrarystaticlibrariesfor-staticlinking.Youdon'tneedthese,unlessyoulinkstatically,whichishighlydiscouraged.这些消息来源很少(或从不)说明为什么这是一个坏主意。 最佳答案 其他答案给出的理由是正确的,但不是最重要的原因。glibc不应该被静态链接的最重要原因是它在

c++ - GLIBCXX 版本

如果我在我的机器上编译一个C++程序,并在另一个(使用旧软件)上运行它,我会得到:/usr/lib/libstdc++.so.6:version`GLIBCXX_3.4.9'notfound。事实上,在我的系统上glibc是更新的(我有gcc-libs4.5.1:libstdc++.so.6.0.14)和strings/usr/lib/libstdc++.so.6|grepGLIBCXX从GLIBCXX_3.4打印到GLIBCXX_3.4.14。相反,在另一个系统上,它只打印到GLIBCXX_3.4.8(我得到了libstdc++.so.6.0.8)。所以我有几个问题:为什么我的链接器

c++ - GLIBCXX 版本

如果我在我的机器上编译一个C++程序,并在另一个(使用旧软件)上运行它,我会得到:/usr/lib/libstdc++.so.6:version`GLIBCXX_3.4.9'notfound。事实上,在我的系统上glibc是更新的(我有gcc-libs4.5.1:libstdc++.so.6.0.14)和strings/usr/lib/libstdc++.so.6|grepGLIBCXX从GLIBCXX_3.4打印到GLIBCXX_3.4.14。相反,在另一个系统上,它只打印到GLIBCXX_3.4.8(我得到了libstdc++.so.6.0.8)。所以我有几个问题:为什么我的链接器

c - 构建一个 .so 这也是一个可执行文件

所以大家可能都知道glibc的/lib/libc.so.6可以像普通的可执行文件一样在shell中执行,在这种情况下它会打印其版本信息并退出。这是通过在.so中定义一个入口点来完成的。在某些情况下,将其用于其他项目也可能很有趣。不幸的是,您可以通过ld的-e选项设置的低级入口点有点太低级:动态加载程序不可用,因此您无法调用任何适当的库函数。出于这个原因,glibc在这个入口点通过一个裸系统调用来实现write()系统调用。我现在的问题是,任何人都可以想出一种好方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他.so的函数? 最佳答案

c - 构建一个 .so 这也是一个可执行文件

所以大家可能都知道glibc的/lib/libc.so.6可以像普通的可执行文件一样在shell中执行,在这种情况下它会打印其版本信息并退出。这是通过在.so中定义一个入口点来完成的。在某些情况下,将其用于其他项目也可能很有趣。不幸的是,您可以通过ld的-e选项设置的低级入口点有点太低级:动态加载程序不可用,因此您无法调用任何适当的库函数。出于这个原因,glibc在这个入口点通过一个裸系统调用来实现write()系统调用。我现在的问题是,任何人都可以想出一种好方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他.so的函数? 最佳答案

linux - 链接旧版本的 libc 以提供更大的应用程序覆盖率

Linux二进制文件通常动态链接到核心系统库(libc)。这使得二进制文件的内存占用非常小,但依赖于最新库的二进制文件不会在旧系统上运行。相反,链接到旧库的二进制文件将在最新系统上愉快地运行。因此,为了确保我们的应用程序在分发期间具有良好的覆盖率,我们需要找出我们可以支持的最旧的libc并将我们的二进制文件链接到它。我们应该如何确定可以链接到的最旧版本的libc? 最佳答案 找出可执行文件中的哪些符号正在创建对不需要的glibc版本的依赖。$objdump-pmyprog...VersionReferences:requiredfr

linux - 链接旧版本的 libc 以提供更大的应用程序覆盖率

Linux二进制文件通常动态链接到核心系统库(libc)。这使得二进制文件的内存占用非常小,但依赖于最新库的二进制文件不会在旧系统上运行。相反,链接到旧库的二进制文件将在最新系统上愉快地运行。因此,为了确保我们的应用程序在分发期间具有良好的覆盖率,我们需要找出我们可以支持的最旧的libc并将我们的二进制文件链接到它。我们应该如何确定可以链接到的最旧版本的libc? 最佳答案 找出可执行文件中的哪些符号正在创建对不需要的glibc版本的依赖。$objdump-pmyprog...VersionReferences:requiredfr

linux - "No such file or directory"执行二进制文件时出错

我正在Ubuntu9.10x86_64上安装二进制Linux应用程序。该应用程序附带旧版本的gzip(1.2.4),它是为更旧的内核编译的:$filegzipgzip:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.0.0,stripped我无法执行这个程序。如果我尝试过,就会发生这种情况:$./gzip-bash:./gzip:Nosuchfileordirectoryldd对这个二进制文件同样不满意:$lddgzipnotadynamic

linux - "No such file or directory"执行二进制文件时出错

我正在Ubuntu9.10x86_64上安装二进制Linux应用程序。该应用程序附带旧版本的gzip(1.2.4),它是为更旧的内核编译的:$filegzipgzip:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.0.0,stripped我无法执行这个程序。如果我尝试过,就会发生这种情况:$./gzip-bash:./gzip:Nosuchfileordirectoryldd对这个二进制文件同样不满意:$lddgzipnotadynamic

linux - 单个主机上的多个 glibc 库

我的linux(SLES-8)服务器目前有glibc-2.2.5-235,但我有一个程序不能在这个版本上运行并且需要glibc-2.3.3。是否可以在同一主机上安装多个glibcs​​?这是我在旧glibc上运行程序时遇到的错误:./myapp:/lib/i686/libc.so.6:version`GLIBC_2.3'notfound(requiredby./myapp)./myapp:/lib/i686/libpthread.so.0:version`GLIBC_2.3.2'notfound(requiredby./myapp)./myapp:/lib/i686/libc.so.6