我的应用程序建立在较旧的环境上,不支持更新(特定)的系统调用.我不能因为我无法透露的原因而升级它们,但不是让它编译时间(这会损失任何'好处')我想知道是否有办法在内联汇编.例如:
#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)
有没有办法检查汇编中的系统调用支持并使用它(第一次)?
如果系统调用不存在,则会因错误而失败ENOSYS
(函数未实现).因此,测试系统调用是否存在的最简单方法是调用它并假设它存在,如果它没有失败ENOSYS
.您不需要为此编写汇编代码,只需使用syscall
函数from 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 */
Run Code Online (Sandbox Code Playgroud)
检查名为的函数getrandom
是否可用.确保不会意外地正确引用符号,getrandom
否则您的程序将不会在没有它的平台上链接.当然,getrandom
在字符串中提及并不重要.
归档时间: |
|
查看次数: |
171 次 |
最近记录: |