Python源码剖析笔记.pdf
文本预览下载声明
目 录
Python源码剖析笔记0-C语言基础回顾
Python源码剖析笔记1-Python对象初见
Python源码剖析笔记2-Python整数对象
Python源码剖析笔记3-Python执行原理初探
Python源码剖析笔记4-内建数据类型
Python源码剖析笔记5-模块机制
Python源码剖析笔记6-函数机制
Python源码剖析笔记7-类机制
本文档使用 看云 构建 - 2 -
Python源码剖析笔记0-C语言基础回顾
Python源码剖析笔记0-C语言基础回顾
1 关于ELF文件
2 关于指针
2.1 指针易错点
2.2 指针和数组
3 关于typedef和#define
4 关于结构体
4.1 不完全类型
4.2 不完全类型结构体
4.3 结构体初始化和大小
4.4 柔性数组
5 总结
6 参考资料
要分析python源码 ,C语言的基础不能少 ,特别是指针和结构体等知识。这篇文章先回顾
C语言基础 ,方便后续代码的阅读。
1 关于ELF文件
linux中的C编译得到的目标文件和可执行文件都是ELF格式的 ,可执行文件中以segment来
划分 ,目标文件中 ,我们是以section划分。一个segment包含一个或多个section ,通过
readelf命令可以看到完整的section和segment信息。看一个栗子 :
char pear[40];
static double peach;
int mango 13;
char *str hello;
static long melon 2001;
int main()
{
int i 3, j;
pear[5] i;
peach 2.0 * mango;
return 0;
}
本文档使用 看云 构建 - 3 -
Python源码剖析笔记0-C语言基础回顾
这是个简单的C语言代码 ,现在分析下各个变量存储的位置。其中mango ,melon属于data
section ,pear和peach属于common section中 ,而且peach和melon加了static ,说明只
能本文件使用。而str对应的字符串helloworld存储在rodata section中。main函数归属于
text section ,函数中的局部变量i,j在运行时在栈中分配空间。注意到前面说的全局未初始化
变量peach和pear是在common section中 ,这是为了强弱符号而设置的。那其实最终链接
成为可执行文件后 ,会归于BSS segment。同样的 ,text section和rodata section在可执行
文件中都属于同一个segment。
更多ELF内容参见 《程序猿的自我修养》一书。
2 关于指针
想当年学习C语言最怕的就是指针了 ,当然 《c与指针》和 《c专家编程》以及 《高质量C编
程》里面对指针都有很好的讲解 ,系统回顾还是看书吧 ,这里我总结了一些基础和易错的
点。环境是ubuntu14.10的32位系统 ,编译工具GCC。
2.1 指针易错点
/***
指针易错示例1 demo1.c
***/
int main()
{
char *str helloworld; //[1]
str[1] M; //[2] 会报错
char arr[] hello; //[3]
arr[1] M;
return 0;
}
demo1.c中 ,我们定义了一个指针和数组分别指向了一个字符串 ,然后修改字符串中某个字
符的值。编译后运行会发现[2]处会报错 ,这是为什么呢 ?用命令 ` gcc -S demo1.c ` 生
显示全部