Archive for November, 2013

GPROF 使用

November 29th, 2013

项目地址:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

gprof是一个 可以通过运行程序,确定程序函数的执行时间。

这个程序依赖gcc -g -pg ,通过这个可以获取丰富的调试信息,供我们以后代码优化使用。
» Read more: GPROF 使用

优化程序性能(读书笔记)

November 28th, 2013

1.gcc -o1
gcc -o2 使程序全面优化

» Read more: 优化程序性能(读书笔记)

编写Share Object Library

November 22nd, 2013

最近要编写供自己使用的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的使用

November 22nd, 2013

最近学习了一些调试工具,包括ltrace strace ftrace。这些都属于不同层级的调试工具。
下面是我画的简易的层次关系图。

   App
   |
   |  <--------ltrace
   |
 libc ld  < -------strace
   |
   |     <----------systemtap
  kernel  <---------ftrace

» Read more: 调试工具ltrace strace ftrace的使用

ELF文件的加载

November 21st, 2013

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文件载入流程。

» Read more: ELF文件的加载