【问题标题】:Build a Linux c++ application runnable on system having libc >= 2.31构建可在 libc >= 2.31 的系统上运行的 Linux c++ 应用程序
【发布时间】:2021-12-20 17:46:55
【问题描述】:

我想构建一个可以在所有具有 libc >= 2.31 的 Linux 系统上启动的 C++ 应用程序。在我的构建系统(Ubuntu)上,我有 libc 2.34。 这是我的(空)应用程序:

int main() {
  return 0;
}

我使用g++ -o app app.cpp 构建它,根据以下结果,我了解到我的应用程序需要 libc >= 2.34 才能运行。我的理解正确吗?

$ nm -D app
                 w __cxa_finalize@GLIBC_2.2.5
                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34

如何为 libc __asm__ (".symver __libc_start_main, __libc_start_main@GLIBC_2.2.5");”(基于我对this post的理解),但它并没有改变任何东西。

【问题讨论】:

  • 可能最简单的解决方案是在 docker 中安装较旧的 Ubuntu 版本,然后在那里编译。
  • 您需要一个symver 指令来处理程序使用的每个 符号。一旦你离开玩具阶段,这就是棘手的。您需要以某种方式或方式按照 HolyBlackCat 的建议进行操作。

标签: c++ libc


【解决方案1】:

Docker 镜像 ubuntu:20.04 安装了 libc 2:31。你可以在那里编译你的应用程序:

$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 bash -c 'apt-get update && apt-get -y install g++ && g++ -o app app.cpp'
$ docker run --rm -v $PWD:/work -w /work ubuntu:20.04 ./app
$ ./app
$ nm -D app
             w _ITM_deregisterTMCloneTable
             w _ITM_registerTMCloneTable
             w __cxa_finalize@GLIBC_2.2.5
             w __gmon_start__
             U __libc_start_main@GLIBC_2.2.5

您可以静态链接您的应用程序,删除对标准库的所有依赖项。

您可以将您的应用程序与 libc 库一起分发。

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2021-05-22
    • 2021-01-23
    • 2020-04-10
    • 2013-08-15
    相关资源
    最近更新 更多