Pra*_*rav 154
&&是gcc的扩展,用于获取当前函数中定义的标签的地址.
void *p = &&abc 在标准C99和C++中是非法的.
这用g ++编译.
Fla*_*ius 96
这是标签的地址,它是GCC特有的功能.
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过测试自己想出来:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC在这种情况下说:
错误:标签'a'已使用但未定义
你需要知道汇编程序才能真正理解这一点,但我会试着解释一下标签的地址是什么意思.
操作系统从磁盘加载.exe文件后,操作系统的一个组件称为"加载器"(windows有"PE加载器",linux有"ELF加载器"或者甚至是其他组件,如果它们是在内核),它对该程序进行"虚拟化",将其转化为一个过程.
这个过程认为它是RAM中唯一的一个,它可以访问整个RAM(即32位机器上的0x00000000-0xFFFFFFFF).
(以上只是对发生的事情的简短概述,你真的需要学习装配才能完全理解它,所以请耐心等待)
现在,源代码中的标签基本上是一个地址."转到标签;" 除了跳转到该地址之外别无其他(想想汇编中的指令指针).此标签存储此RAM地址,您可以通过该地址找到该地址.
在学习了ASM之后,您将意识到该地址指向.text可执行文件部分中的指令.该.text部分是保存程序(二进制)代码的部分.
你可以用以下方法检查:
objdump -x a.out
如GCC中所述,您可以使用它来初始化跳转表.一些扫描仪生成像re2c(见-g参数)使用,以产生更紧凑的扫描仪.也许甚至还有一个使用相同技术的解析器生成器.
| 归档时间: |
|
| 查看次数: |
5416 次 |
| 最近记录: |