在Linux中使用GNU Libc编译并在eglibc上运行的危险?

在Linux中使用GNU Libc编译并在eglibc上运行的危险?,linux,ubuntu,libc,eglibc,Linux,Ubuntu,Libc,Eglibc,我有一个几乎只依赖于libc的可执行文件。ldd的输出为: libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b53156b9000) libutil.so.1 => /lib64/libutil.so.1 (0x00002b53158d5000) librt.so.1 => /lib64/librt.so.1 (0x00002b5315ad8000) libdl.so.2 => /lib64/libdl.so.2 (0x

我有一个几乎只依赖于libc的可执行文件。ldd的输出为:

libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b53156b9000)
libutil.so.1 => /lib64/libutil.so.1 (0x00002b53158d5000)
librt.so.1 => /lib64/librt.so.1 (0x00002b5315ad8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5315ce2000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5315ee6000)
libc.so.6 => /lib64/libc.so.6 (0x00002b5316169000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a06600000)
我在旧的CentOS 6上编译了这个。运行
/lib64/libc.so.6
说明:

GNU C Library stable release version 2.5, by Roland McGrath et al.
...

在任何其他版本的linux上运行此可执行文件有多安全?具体来说,在Ubuntu和Debian机器上运行是否安全?这些机器都有
eglibc
?我编译的可执行文件似乎在12.04 LTS上运行良好,但我能相信它没有细微的错误,也能在这些发行版的其他版本上运行吗?

EGLIBC被设计为与GLIB兼容的API和ABI,正如您在its中读到的,因此只要您使用它的默认配置,就不会有任何问题(像Debian版本)-也就是说,您没有使用比GLIBC功能更少的有限版本

特别是,您可以阅读。请记住,如果Debian与GLIBC不完全兼容,那么从Debian切换到EGLIBC是不合理的,因为它可能破坏了遗留二进制文件,或者只是来自Debian存储库的软件


如果您使用的是有限版本的EGLIBC,除非您使用从库中删除的某些功能,否则不会出现问题。例如,使用GLIBC编译的二进制文件在没有套接字的EGLIBC版本中应该可以正常工作,只要它不使用套接字。

@javidcf是正确的,因为EGLIBC和GLIBC是ABI兼容的一般来说,在eglibc上运行glibc编译的东西不应该有问题

但是,您可能会遇到与glibc vs.eglibc无关的问题,而与glibc version skew有关。某些glibc函数在其末尾用一个版本进行标记(如“printf@@glibc_2.2.5”,当nm查看时,或通过在二进制文件上运行字符串并对glibc进行grepping)。我相信这代表了运行生成的二进制文件的最低glibc版本要求。简单程序可能很少(或根本没有)这些类型的函数。复杂程序可能有多种要求。以下是在Ubuntu 14.04上的firefox二进制文件上运行字符串的结果:

$ strings /usr/lib/firefox/firefox | grep GLIBC
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBC_2.3.4
GLIBC_2.17
GLIBCXX_3.4
这意味着我需要至少2.17版的glibc库来解析运行该程序所需的符号

这样做的结果是,在旧发行版上编译的二进制文件很有可能在新发行版上工作;但在新发行版上编译的二进制文件,与新的glibc版本相比,可能使用具有更高最低要求的新版本的函数,可能无法在旧系统上工作。例如,CentOS 6二进制文件可能无法在CentOS 5或Ubuntu 10.04上运行;但可能在CentOS 7和Ubuntu 12.04/14.04上运行良好


如果你想要一个真正可移植的二进制文件,静态链接是一个更好的选择。

这取决于你的可执行文件实际在做什么……@BasileStarynkevitch怎么回事?一件有趣的事情是EGLIBC目前正在消亡。项目页面宣布了它的最新版本2.19。用户(包括debian)很快就要回到GLIBC了。@EartEngine是的,这是另一个问题。然而,从他们的陈述来看,尽管他们不进行积极的开发,但他们一直在合并对GLIBC的提交。无论如何,正如您所说,Debian可能迟早需要回到GLIBC。确实如此。不过,这是一个版本问题,当加载程序启动时会出现加载二进制文件,对吗?我的意思是,您在尝试执行程序时可能会收到一个错误(有趣的是,我昨天就遇到了一个错误),但是,为了澄清这一点,如果您的程序正确加载并开始运行(没有未解析的符号),它将完全像GLIBC一样运行-也就是说,不会有“细微的错误”.正确。只要符号解决了问题,你就不会有任何问题。