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我用另一种方法补充了我的答案,以达到预期的目标,这可能也很有用。