我的应用程序建立在较旧的环境之上,不支持较新的(特定的)系统调用。由于我无法透露的原因,我不能升级它们,但我没有让它编译时间(这会失去任何“好处”)我想知道是否有一种方法可以在内联汇编中进行。例如:
#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 可能发生的系统调用发生冲突,但我不认为这是可能的。以这种方式修改系统的人应对此类行为的结果负责。
通常适用于库函数的另一种方法是使用 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
不算数。
关于检查内联汇编中的特定系统调用支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680640/