在 C 程序的宏预处理器中调用内联函数
Calling Inline Function in Macro Preprocessor of a C Program
我对以下宏预处理器定义感到困惑:
#define HOOK_SYSCALL(NAME) original_##NAME = get_sys_call_table_addr()[__NR_##NAME];
名为get_sys_call_table_addr()的函数代码如下:
ssize_t *sys_call_table = (ssize_t *)NULL;
void** get_sys_call_table_addr(void)
{
void *swi_addr=(long *)0xffff0008;
unsigned long offset=0;
unsigned long *vector_swi_addr=0;
offset=((*(long *)swi_addr)&0xfff)+8;
vector_swi_addr=*(unsigned long *)(swi_addr+offset);
while(vector_swi_addr++)
{
if(((*(unsigned long *)vector_swi_addr)& 0xfffff000)==0xe28f8000)
{
offset=((*(unsigned long *)vector_swi_addr)& 0xfff)+8;
sys_call_table=(void *)vector_swi_addr+offset;
break;
}
}
return (void **) sys_call_table;
}
我想问一下这个具体线路是否:
get_sys_call_table_addr()[__NR_##NAME];
是否将内联函数作为数组调用?就像我们对普通数组所做的那样,例如阵列[3];
谢谢!!
##
用于连接预处理器标记。假设 NAME
是 exit
。然后 get_sys_call_table_addr()[__NR_##NAME]
将是
get_sys_call_table_addr()[__NR_exit]
。这意味着 get_sys_call_table_addr()
被调用并且计算结果将是一个指针。
记住 arr[x]
是 *(arr + x)
。假设 __NR_exit
是一个值为 1
的常量。然后,函数返回的结果指针移动 1
,然后取消引用。现在将其分配给变量 original_exit
.
令牌## 用于将两个令牌连接成一个。例如在上面的例子中 __NR_##NAME 变成了 __NR_NAME。
函数get_sys_call_table_addr() returns a table sys_call_table,这是一个双指针。此 table 应用作数组变量并指向 [__NR_NAME] 指向的地址。
换句话说,get_sys_call_table_addr()[__NR_##NAME] 变为 sys_call_table[__NR_NAME];
我对以下宏预处理器定义感到困惑:
#define HOOK_SYSCALL(NAME) original_##NAME = get_sys_call_table_addr()[__NR_##NAME];
名为get_sys_call_table_addr()的函数代码如下:
ssize_t *sys_call_table = (ssize_t *)NULL;
void** get_sys_call_table_addr(void)
{
void *swi_addr=(long *)0xffff0008;
unsigned long offset=0;
unsigned long *vector_swi_addr=0;
offset=((*(long *)swi_addr)&0xfff)+8;
vector_swi_addr=*(unsigned long *)(swi_addr+offset);
while(vector_swi_addr++)
{
if(((*(unsigned long *)vector_swi_addr)& 0xfffff000)==0xe28f8000)
{
offset=((*(unsigned long *)vector_swi_addr)& 0xfff)+8;
sys_call_table=(void *)vector_swi_addr+offset;
break;
}
}
return (void **) sys_call_table;
}
我想问一下这个具体线路是否:
get_sys_call_table_addr()[__NR_##NAME];
是否将内联函数作为数组调用?就像我们对普通数组所做的那样,例如阵列[3];
谢谢!!
##
用于连接预处理器标记。假设 NAME
是 exit
。然后 get_sys_call_table_addr()[__NR_##NAME]
将是
get_sys_call_table_addr()[__NR_exit]
。这意味着 get_sys_call_table_addr()
被调用并且计算结果将是一个指针。
记住 arr[x]
是 *(arr + x)
。假设 __NR_exit
是一个值为 1
的常量。然后,函数返回的结果指针移动 1
,然后取消引用。现在将其分配给变量 original_exit
.
令牌## 用于将两个令牌连接成一个。例如在上面的例子中 __NR_##NAME 变成了 __NR_NAME。
函数get_sys_call_table_addr() returns a table sys_call_table,这是一个双指针。此 table 应用作数组变量并指向 [__NR_NAME] 指向的地址。
换句话说,get_sys_call_table_addr()[__NR_##NAME] 变为 sys_call_table[__NR_NAME];