我的应用程序基于较旧的环境构建,并且不支持较新的(特定的)系统调用。我不能出于无法披露的原因而升级它们,但是我没有在编译时间(这会浪费任何“好处”),而是想知道是否有一种方法可以进行内联汇编。例如:
#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
}
有没有一种方法可以检查程序集中的系统调用支持并改为使用(第一次)?
答案 0 :(得分:6)
如果系统调用不存在,它将失败,并显示错误ENOSYS
(未实现功能)。因此,测试系统调用是否存在的最简单方法是调用它,并假设它在ENOSYS
中没有失败时就存在。您无需为此编写汇编代码,只需使用syscall
中的unistd.h
函数。
通常这可以工作,因为系统调用号由Linux内核项目控制。尽管人们可能会添加自己的系统调用,而其数字与将来可能的系统调用相冲突,但我不认为这是可能的。像这样修改系统的人应对这种行为的结果负责。
通常对库函数起作用的另一种方法是使用dlsym
或dlfunc
检查所需系统调用的符号是否可用。例如,您可能想要做:
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
并不重要。