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查找错误。