第6章,运行时数据结构

a.out及其传说

a这个名字不是偶然的

可执行文件可以有几种不同的格式。但所有这些不同格式都据哟一个共同的概念,那就是段。但大家千万不要把这个端和Inter x86架构中段的概念混淆。这个段只是表示一个二进制文件相关的内容块。

在一个可执行文件中运行中运行size命令时,它会告诉你文件中的三个段(文本段,数据段和bss段)的大小

下图显示了编译器和链接器分别在这些段中分别写入的东西

操作系统在a.out文件里干了些什么?

大家想没想为什么a.out要以段的形式组织?因为段可以方便映射到进程的虚拟地址空间中。载入器载入程序的时候是按每个文件中的每个段进行载入的,所以这样组织是很有效率的。

C语言运行时系统在a.out里干了些什么?

堆栈段

alloca是在函数里面分配内存,函数执行完就马上释放的。和malloc不同的

当函数被调用时发生了什么:过程活动记录

详情可以看我的C和指针运行时环境那一章

软件信条:C语言中的所有函数在词法层次中位于最顶层,我们不能在函数内部再定义函数。

auto关键字

在函数内部的变量默认类型是auto类型,然后当函数结束后,变量就不复存在了。因而我们不应该从函数中返回一个指向该函数局部自动变量的指针。

控制线程

setjmp和longjmp

UNIX中的堆栈段

小tips:用grep调试内核

有时候我们可以把一个二进制文件进行反汇编得出ascii文件。然后再根据之前的二进制文件(可执行文件)得出的错误信息,用grep查找错误。

你可能感兴趣的:(第6章,运行时数据结构)