[英]What does && mean in void *p = &&abc;
我遇到了一段代码void *p = &&abc;
. &&
这里的意义是什么? 我知道右值引用,但我认为在这种情况下使用的&&
是不同的。 void *p = &&abc;
中的&&
表示什么 ?
这是 label 的地址,它是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 说:
错误:label 'a' 已使用但未定义
您需要了解汇编程序才能真正理解这一点,但我将尝试向您解释 label 的地址是什么意思。
操作系统从磁盘加载 .exe 文件后,操作系统的一个组件称为“加载器”(windows 有“PE 加载器”,linux 有“ELF 加载器”或者甚至其他,如果它们在内核),它对该程序进行“虚拟化”,将其变成一个进程。
这个进程认为它是 RAM 中唯一的一个并且它可以访问整个 RAM(即 32 位机器上的 0x00000000-0xFFFFFFFF)。
(以上只是对正在发生的事情的简短概述,您确实需要学习汇编才能完全理解它,所以请多多包涵)
现在,源代码中的label基本上是一个地址。 “转到 label;” 除了跳转到该地址之外什么都不做(想想汇编中的指令指针)。 这个 label 存储了这个 RAM 地址,这就是你可以找到那个地址的方法。
在学习了 ASM 之后,您会意识到该地址指向可执行文件的.text
部分中的一条指令。 .text
部分是保存您要执行的程序(二进制)代码的部分。
您可以通过以下方式检查:
objdump -x a.out
如GCC中所述,您可以使用它来初始化跳转表。 一些扫描仪生成器,如re2c (参见-g
参数)使用它来生成更紧凑的扫描仪。 也许甚至还有一个使用相同技术的解析器生成器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.