项目地址:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
gprof是一个 可以通过运行程序,确定程序函数的执行时间。
这个程序依赖gcc -g -pg ,通过这个可以获取丰富的调试信息,供我们以后代码优化使用。
» Read more: GPROF 使用
项目地址:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
gprof是一个 可以通过运行程序,确定程序函数的执行时间。
这个程序依赖gcc -g -pg ,通过这个可以获取丰富的调试信息,供我们以后代码优化使用。
» Read more: GPROF 使用
1.gcc -o1
gcc -o2 使程序全面优化
最近要编写供自己使用的library,library是以.so结尾的文件。类似于windows下面的dll文件。
在编写so文件之前,我们要先熟悉ldd命令与ldconfig命令
在上一篇博客中我写道ld主要是为了从library中寻找特定的库函数并加载到ld.so.cache与GOT表中,ldconfig在/sbin/下。
ldconfig为在命令行中说明的目录或文件/etc/ld.so.config中指定的目录或一些可信任的目录 (象/usr/lib, /lib)中的最新的动态连接库创建必要的连接和绶存。这些绶存起来的数据会被动态连接器ld.so 或 ld-linux.so所使用。ldconfig会检查它所遇到的动态库文件的名称与版本号,以决定那些动态库的连接要进行更新。
» Read more: 编写Share Object Library
最近学习了一些调试工具,包括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文件载入流程。