zoukankan      html  css  js  c++  java
  • linux下的a.out文件

     
     当然这里,我更重要的是强调这个什么段,什么段。这以前就知道。但其实是对一个可以执行的c语言程序的分析。就好比你分析一篇作文。有标题。有段落。

    .out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。
    在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。执行时必须键入命令 ./a.out,即要带上扩展名,如果键入./a 则不正确,因为它寻找a这个文件,而不是a.out这个文件。

    a.out是由OMAGIC, NMAGIC, QMAGIC, 或者 ZMAGIC发展过来的一种可执行文件格式.
    OMAGIC :在文件头之后就是各个段,但是部分文本段和数据段.
    NMAGIC:和OMAGIC差不多,但是数据段在代码段之后加载之后就立即加载数据段,并且将代码段标示位只读.
    ZMAGIC:只是增加了对页需求的支持.
    QMAGIC:这种格式可以将文件头和代码段的第一页合并起来,这样可以节省空间.它一般会在虚拟地址的最低地址加载一页,来处里NULL地址引起的段错误.

    一个典型的a.out文件由一下7部分组成,按顺序有这些段:
    exec header:文件头
       这一段中含有一些参数,内核利用其中一些参数来把二进制文件加载到内存中并执行.ld利用另外一些参数来连接其它的二进制文件.这个段是唯一含有命令参数的.

    text segment:代码段
       包括在程序执行时加载到内存中的机器码和相关数据.有可能是只读的.

    data segment:数据段
       包括初始化过的数据变量.通常是加载到内存中的可写去中.

    text relocations:代码重定向
       包含编译连接二进制文件时的记录,这些记录使用来更新代码段中的指针.

    data relocations:数据重定向
       和代码重定向相似,区别是它针对于数据段的指针.

    symbol table:符号表
       包含连接器对不同二进制文件中的变量,函数和地址之间的对应关系的记录.

    string table:字符串表
       包含和符号名字相一致的字符串.

    每一种二进制文件都是以这样的一个数据结构开始的:
               struct exec {
                       unsigned long   a_midmag;
                       unsigned long   a_text;
                       unsigned long   a_data;
                       unsigned long   a_bss;
                       unsigned long   a_syms;
                       unsigned long   a_entry;
                       unsigned long   a_trsize;
                       unsigned long   a_drsize;
               };
    a_midmag:保存的是主机字节序, I由这些宏来访问其中的部分bit位: N_GETFLAG(), N_GETMID(), N_GETMAGIC(), 由宏 N_SETMAGIC().来设置这个字段.
    a_text    代码段的大小Contains the size of the text segment in bytes.

    a_data    数据段的大小Contains the size of the data segment in bytes.

    a_bss     bss segment中字节数和被内核用来初始化数据段之后的BRK (bss = block started by symbol)//这里的理解还是有点问题

    a_syms    符号表的大小

    a_entry   保存在程序被内核加载到内存中后程序的起始地址,内核由此地址开始执行程序

    a_trsize 代码重定向表的大小

    a_drsize 数据重定向表的大小
  • 相关阅读:
    Ubuntu18.04下使用pip3.8报错subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-ze
    解决报错:ModuleNotFoundError: No module named ‘_sqlite3‘
    shell命令中find的用法
    Ubuntu 中卸载软件
    git使用
    django celery 使用
    Django 学习中遇到的问题
    1
    Mac 下安装brew(文末方法亲测有效)
    经典类与新式类的继承顺序
  • 原文地址:https://www.cnblogs.com/zhangfeionline/p/5967671.html
Copyright © 2011-2022 走看看