最近学习了一些调试工具,包括ltrace strace ftrace。这些都属于不同层级的调试工具。
下面是我画的简易的层次关系图。
App | | <--------ltrace | libc ld < -------strace | | <----------systemtap kernel <---------ftrace
最近学习了一些调试工具,包括ltrace strace ftrace。这些都属于不同层级的调试工具。
下面是我画的简易的层次关系图。
App | | <--------ltrace | libc ld < -------strace | | <----------systemtap kernel <---------ftrace
linux 中用户态与内核态的联系是通过system call进行调用的。最近由于学习了不同的调式工具,以及解析elf文件的objdump,正好可以来熟练一下载入流程。
首先,我先介绍一下ELF文件格式:
#define EI_NIDENT 16 typedef struct{ unsigned char e_ident[EI_NIDENT]; //目标文件标识信息 Elf32_Half e_type; //目标文件类型 Elf32_Half e_machine; //目标体系结构类型 Elf32_Word e_version; //目标文件版本 Elf32_Addr e_entry; //程序入口的虚拟地址,若没有,可为0 Elf32_Off e_phoff; //程序头部表格(Program Header Table)的偏移量(按字节计算),若没有,可为0 Elf32_Off e_shoff; //节区头部表格(Section Header Table)的偏移量(按字节计算),若没有,可为0 Elf32_Word e_flags; //保存与文件相关的,特定于处理器的标志。标志名称采用 EF_machine_flag的格式。 Elf32_Half e_ehsize; //ELF 头部的大小(以字节计算)。 Elf32_Half e_phentsize; //程序头部表格的表项大小(按字节计算)。 Elf32_Half e_phnum; //程序头部表格的表项数目。可以为 0。 Elf32_Half e_shentsize; //节区头部表格的表项大小(按字节计算)。 Elf32_Half e_shnum; //节区头部表格的表项数目。可以为 0。 Elf32_Half e_shstrndx; //节区头部表格中与节区名称字符串表相关的表项的索引。如果文件没有节区名称字符串表,此参数可以为 SHN_UNDEF。 }Elf32_Ehdr;
我们先用一个最简单的hello world来说明elf文件载入流程。
注:程序概要分析工具是分析代码性能的工具。
最近重新学习了一下gdb的使用,以前我只是熟悉特定的命令。现在配合听课和ppt。对于functions载入内存的过程有了一定的了解,结合我前面写的assemble笔记中那个linux中程序的栈帧分配图,会达到一个很好的效果。http://lizhaozhong.sinaapp.com/?p=458
我们在C语言中调用一个函数,直接写出函数名与参数就可以一直没有深入了解这一过程的汇编实现,今天晚上木有妹子,正好仔细研习了这一块知识。 » Read more: Assemble函数栈帧结构详解