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

use*_*031 2 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
}
Run Code Online (Sandbox Code Playgroud)

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

fuz*_*fuz 6

如果系统调用不存在,则会因错误而失败ENOSYS(函数未实现).因此,测试系统调用是否存在的最简单方法是调用它并假设它存在,如果它没有失败ENOSYS.您不需要为此编写汇编代码,只需使用syscall函数from 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 */
Run Code Online (Sandbox Code Playgroud)

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