我们正在构建一个针对Ubuntu 18.04 LTS和所有后续版本的GTK 3应用程序.但是当我们在Ubuntu 20.04版中构建应用程序时,该应用程序无法在旧版Ubuntu上运行.它说

Libc.so.6:找不到版本`GLIBC_2.31‘(.source需要)

但如果我在Ubuntu 18.04上构建一个应用程序,它将在所有后来的Ubuntu版本上运行.默认情况下,Ubuntu 18.04的GLIBC版本为2.27,该版本将在所有后续版本上运行.

那么,有没有办法告诉我的应用程序,该应用程序是使用GLIBC 2.27构建的,而不管构建该应用程序的操作系统具有什么版本?在构建过程中,有没有办法将GLIBC版本的信息提供给应用程序?

推荐答案

如何告诉可执行文件链接到GLIBC的特定版本

can't.

安东尼奥·佩特里卡(Antonio Petricca)(和其他地方)提供的黑客攻击可能会引入非常微妙的漏洞,它是ill-advised.

解决这个问题的正确方法是对您需要运行的GLIBC的minimal版本执行编译和链接.这可以通过以下方式完成

  • 在较旧的系统上构建
  • chroot个环境中构建
  • 在 docker 集装箱中建造
  • 创建一个从Linux到旧Linux的交叉编译器,并使用它来构建程序.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

C++中矢量类型定义和数据保护的高效解决方案

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

为什么我的Hello World EFI程序构建不正确?

这个计算C中阶乘的函数正确吗?

C中的FREE函数正在触发断点

我的C函数起作用了,但我不确定为什么

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

指向不同类型的指针是否与公共初始序列规则匹配?

获取前2个连续1比特的索引的有效方法

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

覆盖读取函数,但当文件描述符为3或4时,我有问题

如何将大写/小写土耳其字母相互转换?

令人困惑的返回和 scanf 问题相关

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?

如何在 C 中编辑 struct 体中的多个变量