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

时间:2018-08-03 22:10:26

标签: 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
}

有没有一种方法可以检查程序集中的系统调用支持并改为使用(第一次)?

1 个答案:

答案 0 :(得分:6)

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

通常这可以工作,因为系统调用号由Linux内核项目控制。尽管人们可能会添加自己的系统调用,而其数字与将来可能的系统调用相冲突,但我不认为这是可能的。像这样修改系统的人应对这种行为的结果负责。

通常对库函数起作用的另一种方法是使用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并不重要。