Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查内联程序集中的特定系统调用支持_C_Linux_Assembly - Fatal编程技术网

C 检查内联程序集中的特定系统调用支持

C 检查内联程序集中的特定系统调用支持,c,linux,assembly,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_sy

我的应用程序构建在较旧的环境上,不支持较新的(特定的)系统调用。我不能去升级它们,原因我不能透露,但我不想让它在编译时(这会失去任何“好处”),我想知道是否有办法在内联汇编中完成。例如:

#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
}
#包括
静态int函数(){
intz;
#ifdef系统调用某些系统调用
这样做(一些较新的系统调用);
z=1;
#否则
这样做(旧的系统调用);
z=0;
#恩迪夫
}

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

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

通常,这是因为系统调用号由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
并不重要。

您的意思是直接调用syscall,即:if(syscall(399等)?@user1016031是的,完全正确。什么指令集?例如,我想到了getrandom。您的旧系统支持vDSO吗?如果支持vDSO,您可以从内核导出的vDSO相关函数中获取系统调用信息。@user1016031我用另一种方法补充了我的答案,以达到预期的目标,这可能也很有用。