检查内联汇编中的特定系统调用支持

标签 c linux assembly

我的应用程序建立在较旧的环境之上,不支持较新的(特定的)系统调用。由于我无法透露的原因,我不能升级它们,但我没有让它编译时间(这会失去任何“好处”)我想知道是否有一种方法可以在内联汇编中进行。例如:

#include <syscall.h> 
static int function() {
int z;
#ifdef SYS_some_system_call
    do_this(some_newer_syscall);
    z=1; 
#else
    do_that(older_syscall);
    z=0; 
#endif
}

有没有办法检查汇编中的系统调用支持并改用它(第一次)?

最佳答案

如果系统调用不存在,它将失败并返回错误 ENOSYS(功能未实现)。因此,测试系统调用是否存在的最简单方法是调用它并假设它存在,如果它没有因 ENOSYS 而失败。您不需要为此编写汇编代码,只需使用 unistd.h 中的 syscall 函数即可。

通常这是因为系统调用号由 Linux 内核项目管理。虽然人们可能会添加自己的系统调用,但系统调用的编号可能会与 future 可能发生的系统调用发生冲突,但我不认为这是可能的。以这种方式修改系统的人应对此类行为的结果负责。

通常适用于库函数的另一种方法是使用 dlsymdlfunc 检查所需系统调用的符号是否可用。例如,您可能想要执行以下操作:

ssize_t (*getrandom)(void *, size_t, unsigned);

getrandom = (ssize_t (*)(void *, size_t unsigned))dlfunc(RTLD_DEFAULT, "getrandom");
if (getrandom != NULL)
    /* getrandom is available */
else
    /* getrandom is not available */

检查名为getrandom 的函数是否可用。确保不要意外地正常引用符号 getrandom ,否则您的程序将无法链接到没有它的平台。当然,在字符串中提及 getrandom 不算数。

关于检查内联汇编中的特定系统调用支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680640/

相关文章:

c - 在非标准位置构建 gcc-4.3.4 时遇到问题

c++ - 如果我在未使用的 pthread_t 上调用 pthread_join() 会发生什么?

linux - 在centOS上安装ruby on Rails

c - C程序调用execl()后如何控制父进程的执行?

c - 系统调用API,系统调用指令和异常机制(中断)之间的关系

将 C 代码转换为 MIPS 汇编语言

c - 如何在gdb中获取结构的基本数据类型

C 对 float 进行四舍五入

java - Tomcat APR native 库*甚至*在存在并配置时未加载

assembly - 在 Arm 中,参数在堆栈中存储的顺序是什么?