<<程序员自我修有-链接,转载库>>读书笔记之Linux目标文件调试说明

来源:互联网 发布:海鼎软件 编辑:程序博客网 时间:2024/05/29 18:47

 1,OBJ文件的概念:

       ELF文件格式(可重定向文件(obj),可执行文件,共享文件(so),核心存储文件(core dump file)),use command "file" to show

the file's information.

     ELF header,text section 放代码段,data section:全局赋值变量 , bss:局部静态,未定义。... Symbol table  

     debug command: 与tool-chain有关系1) objdump[-h,-d,-s,-x]   nm{查看文件中有多少函数,-l 可以查案具体属于哪个文件中}

                                      OS linux:2) size  3) readelf  [-h,-s] 

    GCC  attribute  use: http://gong301.blog.163.com/blog/static/18388590720117215204552/

    GCC build command :-g{show debug info} -strip{decrease debug info}

    每个目标文件,其因为没有分配虚拟地址,都是互相独立,从0x00000000

2, OBJ之间的静态链接

     build command:ld  -static 

    link static library:-l[lib name]

    GCC compiler:use "-verbose"可以将整个编译链接过程中间步骤打印出来。

    debug command: 查看lib库是由哪几个.o组成,可以使用ar{tool-chain有关系}【-t/-x】来查看。

                                     objdump/nm/readelf是可以作用所有elf文件格式。

    缺陷:其因为这个文件中包含所有.o的一份copy,size上会比较大。如果lib中的一个.o修改了,那么就需要

更新整个lib,这样子维护都比较麻烦。因为其生成lib之后就很容易确定他在虚拟地址的空间,所以很容易定位。

3,OBJ之间的动态链接

    概念:该lib库可以指出需要使用的.o,在运行的时候采取链接载入。具有了一定灵活性,且修改.o只需要更新

该.o就可以。不同的lib可以共享同一个o文件。

    地址空间:因为不知道他真正地址,转载时候才知道,所以其地址是从0x00000000开始。

   不同进程使用同一共享库:其会将该共享库copy一份到进程地址空间,所以最原始的共享库中断数据量并没有改变,

修改的只是该so的一份备份,所以如果so中有全局变量,这个时候不同进程并不会同时影响这个全局变量,只是影响

该so的备份中的全局变量。 所以,进程之间如果要共享so中全局变量,必须时候特别的共享方式。

4, 程序的装载

     一个执行程序需要运行,那么就需要将其载入到memory中去执行相关性的机器指令集。

    1 )  查看进程中每个process中各个库使用VM的情况:cat  /proc/${PID}/maps .

    2 ) 使用了虚拟地址空间,采用的是分页映射机制载入。

   3 )其实装载过程就是去动态运行可执行文件,也可以理解为进程的运行,那么让一进程工作,需要做什么:

       step1,为进程创建一个独立的虚拟地址空间。

       step2,读取装载的可执行文件头,并且建立虚拟地址空间与可执行文件的映射关系。

       step3,将CPU指令就成年期设定为可执行文件的入口地址,启动运行。 

       因此,一个进程只有一个路口地址(表现为main)。 

      http://mqzhuang.iteye.com/blog/901602【process 虚拟内存分布】

   

0 0
原创粉丝点击