Answers:
void*
。
__forceinline
?__declspec(naked)
?我最喜欢的MSVCism之一是:template<typename T> class X { friend T; }
,它是无效的C ++ 03。
那是标签的地址,这是GCC特有的功能。
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
您可以通过测试自己弄清楚:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
在这种情况下,GCC会说:
错误:使用了标签“ a”但未定义
您需要知道汇编程序才能真正理解这一点,但是我将尽力向您解释标签地址的含义。
操作系统从磁盘加载.exe文件后,操作系统的一个组件称为“加载程序”(Windows具有“ PE加载程序”,Linux具有“ ELF加载程序”,甚至其他,如果它们是在内核),它将对该程序进行“虚拟化”,然后将其变成一个进程。
该进程认为它是RAM中唯一的一个,并且可以访问整个RAM(即32位计算机上的0x00000000-0xFFFFFFFF)。
(以上只是对情况的简短介绍,您确实需要学习汇编才能完全理解它,所以请多多包涵)
现在,源代码中的标签基本上是一个地址。“转到标签;” 除了跳转到该地址外,别无其他(想想汇编中的指令指针)。该标签存储该RAM地址,这就是您找出该地址的方法。
学习了ASM之后,您将意识到该地址指向.text
可执行文件部分中的一条指令。该.text
部分是保存要执行的程序(二进制)代码的部分。
您可以使用以下方法进行检查:
objdump -x a.out
如GCC中所述,您可以使用它来初始化跳转表。一些扫描仪生成器(如re2c(请参阅-g
参数))使用它来生成更紧凑的扫描仪。也许甚至有使用相同技术的解析器生成器。