【问题标题】:Checking linux version in compile time or runtime在编译时或运行时检查 linux 版本
【发布时间】:2014-04-23 08:11:58
【问题描述】:

我使用 Linux 2.1.57 中引入的函数 'prctl'。 我执行以下操作:

... // 函数 'prctl' 仅适用于 linux 并在版本中引入 #ifdef __linux__ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,57) prctl(PR_SET_PDEATHSIG,SIGKILL); #万一 #万一 ...

但是如果我在较低版本的 linux 中运行我的二进制文件会发生什么? 程序会崩溃还是无法加载?

我是否需要通过运行时替换编译时间检查(使用 utsname()->release ) 或者同时使用编译和运行时检查

感谢您的帮助!

【问题讨论】:

  • Linux 2.1.57 是一个相当老的版本(1999 年)。大多数 linux 内核都比这更新。我只是假设,在 Linux 上,prctl 存在......
  • uname 函数可能是一个好的开始。
  • Basile,是的,您的建议原则上是合适的。但我有点不明白如果我在旧版本上运行程序会崩溃(segfault)?
  • 你怎么知道编译你的程序的 linux 版本和它实际运行的版本是一样的?
  • 如果我在低版本的 linux 上运行我的二进制文件 - 首先,你必须为这个版本的 Linux 编译你的程序。

标签: c linux linux-kernel runtime compile-time


【解决方案1】:

如果您在现代 Linux 上编译程序,但尝试在较旧的 Linux 上运行,则有两种可能:

  1. 程序是动态编译的。在这种情况下,它很可能甚至不会加载 - 因为它将链接到现代 glibc 版本,而旧 Linux 系统上不存在该版本。
  2. 程序是静态编译的(这意味着必要的 glibc 调用与您的可执行文件捆绑在一起,使其更大)。在这种情况下,它会加载,但很可能会崩溃、过早退出或只是跳过有问题的调用。

无论如何,它不会正常工作。

【讨论】:

  • 它是动态编译的。是的,你是对的,我忘记了旧 linux 上的旧版本 glibc。现在我决定只使用
    __linux__
     宏而不检查版本。无论如何,我的代码是临时的,将来我会尝试用一些兼容的 posix 替换它。感谢大家的帮助。帖子可以关闭。
  • 这个问题对您和社区都有一定的价值——为什么要关闭它?如果您认为这个答案对您有帮助,那么您应该接受它 - 接受也会增加您的声誉
猜你喜欢
  • 2011-09-30
  • 2018-05-29
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多