繁体   English   中英

void *p = &&abc; 中的 && 是什么意思

[英]What does && mean in void *p = &&abc;

我遇到了一段代码void *p = &&abc; . &&这里的意义是什么? 我知道右值引用,但我认为在这种情况下使用的&&是不同的。 void *p = &&abc;中的&&表示什么 ?

&&是gcc的扩展,用来获取当前function中定义的label的地址。

void *p = &&abc在标准 C99 和 C++ 中是非法的。

与 g++ 一起编译。

如何找到它

这是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM