使用不同的 glibc 运行静态链接的二进制文件

使用不同的 glibc 运行静态链接的二进制文件

我有一个静态链接的二进制文件工具我正在尝试在 RHLE4 上运行。该工具抱怨 glibc。需要2.4,系统里的是2.3。这是它吐出的消息:

./wkhtmltoimage-i386: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./wkhtmltoimage-i386)

有没有办法构建 glibc2.4 并将其仅用于此工具,而不替换系统中的 glibc2.3 ?在构建 glibc2.4 时,我应该使用什么前缀进行配置?

答案1

由于此 wkhtmltoimage 工具的源代码可用,我建议您 重新编译使用系统原生的 glibc 从源代码编译它。这可能比重新编译 glibc 还要快,而重新编译 glibc 可不是件容易的事。

A静态链接可执行文件已经包含了它需要进行的所有 C 库调用的代码,因此您无法单独编译新的 glibc 并将可执行文件链接到它。然而,使用 glibc 的程序从来都不是完全静态的:一些库调用(所有与“名称服务”连接的库调用,即,getuid()以及类似的)仍然使用动态加载的模块(libnss*.so通常在 下找到的文件/lib)。这可能就是程序失败的原因:它正在寻找某些 NSS 模块,但只能找到这些glibc2.3模块。

如果你绝对想走上重新编译 glibc 的道路,下面的方法可能会起作用(警告:未经测试!):

  1. 配置glibc2.4安装在非系统目录,eg /usr/local/glibc2.4,然后编译安装;

  2. wkhtmlto*通过将其指定为动态链接器搜索路径 ( ) 中的第一个组件来运行LD_LIBRARY_PATH

    env LD_LIBRARY_PATH=/usr/local/glibc2.4/lib wkhtmltoimage ...

更新:事实证明这并不那么容易:系统上有两个不同的 libc 需要的不仅仅是重新编译/安装,因为 libc 将在固定位置查找运行时链接器和动态加载 NSS 模块。这RTDI程序允许在单个 Linux 系统上安装不同版本的 GNU libc;它的网页有说明(但这是一项专家级任务,因此它们绝对不是一步一步的演练)。

让我再次强调,重新编译的工作量会少得多wkhtmltoimage......

相关内容