全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
继续之前的学习笔记,整理一下最近看过的一点stabs资料。
这一页中有一半的信息是Fortran专用的,直接跳过。参数的符号修饰符是p,结合英文单词很容易理解记忆。
这一页描述了参数传递往寄存器传递的情况,其实这个在我现在接触的x86的平台上是没有的。但是,通过之前看过的资料可以知道其实现在比较流行的RISC-V其实是采用了这样的模式。
1. 函数调用约定中,参数明确的只有两个,因此会有一些信息不能够直接得出。
2. 关于类型的描述中,内置类型其实主要就是基础C语言中的元类型。
类型信息在描述信息开始的段。
这一页刚开始看的时候,可能由于最前面几页中b表征过布尔类型,因此有一点先入为主的错误理解。这其实是内置的缩写。而布尔量的表达,其实还真有一点“悬案”的感觉,定义不是很清晰。看到这一页的后半段其实正好也提到了这部分。
这里是关于数组的stabs信息生成,例子中的数组其实有3个元素,但是生成的信息由编译器加工后进行了4字节对齐,因此在实际的场景中占用了4个字节的信息。
至于字符串,这个在C语言中没有的原始类型,其实本质上还是数组处理那一套。
类型描述符号中使用e来代表枚举类型,T描述结构体。关于结构体的部分,通过计算可以看得出来后面的数值其实是代表了空间的占用量。
联合的描述中没有包含作用于信息,这里的例子中能够看到一些标志等基础信息。其中,有一个-20指出来了在堆栈中的偏移量。
其实,数据结构或者类型这类信息跟数据对象本身不同,不会有作用域的信息存在。
这一页前的两个基础信息其实跟之前看到的信息类似,了解就好。这里有一个实际操作的说明,使用onjdump –stabs可以提取目标文件中分区信息。其他的编译器可能没有提供这个好用的工具,GNU的工具中是带的。
这样,这一份文档的简单整理就结束了。剩下的额篇章还有很多,但是主要是C++以及附录。而我看这个文档本来也就是为了寻找一个行号表述的答案而已,其余的信息不去深究了。