• 使用readelf和objdump查看ELF常见段


    一、查看可重定位目标文件中的段

    可重定位目标文件中给出了其中常见的段,解释了每个段的含义和用途。目标文件里有什么(ELF文件结构)中对这些段又做了详细的解释,用到的时候只需查询即可。

    列举常用命令:

    • readelf -h elf-file:查看ELF文件头
    • readelf -S objdump -h elf-file:查看段表结构,即一个文件有那些段。
    • objdump -s elf-file:将所有段的内容以16进制打印出来。
    • objdump -d elf-file:将所有代码段的内容反汇编,段表中flagsAX的都为代码段。
    • readelf -p sh_name elf-file:查看字符串表,即sh_name的typeSTRTAB的段的内容。

    查看代码段相关的内容只需要objdump -d反汇编即可;查看数据段相关的值需要objdump -s将16进制打印出来;。

    二、查看静态链接中的段

    静态链接就是就是将几个输入目标文件加工后合并成一个输出文件,整个链接过程分两步:空间与地址分配、符号解析与重定位。

    列举常用命令:

    • objdump -r elf-file:查看重定位表中的内容,rel.*rela.*开头的段(type为RELA)均为重定位表。
    • readelf -r elf-file:也可以看查看重定位表中的信息。
    • readelf -sobjdump -tnm elf-file:查看符号表

    三、查看动态链接中的段

    动态链接的3大步骤:启动动态链接器本身 → 装载所有需要的共享对象 → 重定位和初始化。

    相关的段有.interp(动态链接器的位置).dynamic(动态链接所需信息).dynstr(动态符号表)以及动态链接重定位表

    列举常用命令:

    • readelf -l elf-file:查看程序头。
    • readelf -d elf-file:查看.dynamic段中的内容。
    • readelf -sD elf-file:查看ELF文件的动态符号表及其哈希表。
    • objdump -R elf-file:查看动态重定位信息,也可以使用readelf -s查看。

    四、readelf常用命令

    在这里插入图片描述

    五、objdump常用命令

    用法:objdump <选项> <文件>
        显示对象<file>的信息
        至少要给出以下开关之一:
        -a, --archive-headers 显示档案头信息
        -f, --file-headers 显示整个文件头的内容
        -p, --private-headers 显示特定对象格式的文件头内容
        -P, --private=OPT,OPT... 显示对象格式的具体内容
        -h, --[section-]headers 显示section headers的内容
        -x, --all-headers 显示所有头文件的内容
        -d, --disassemble 显示可执行部分的汇编器内容
        -D, --disassemble-all 显示所有部分的汇编内容
        -S, --source 将源代码与反汇编混合在一起
        -s, --full-contents 显示所有要求的部分的完整内容
        -g, --debugging 显示对象文件中的调试信息
        -e, --debugging-tags 使用ctags样式显示调试信息
        -G, --stabs 显示(原始形式)文件中的任何STABS信息
        -W[lLiaprmfFsoRt] 或
        --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames、
              =frames-interp,=str,=loc,=Ranges,=pubtypes、
              =gdb_index,=trace_info,=trace_abbrev,=trace_aranges、
              =addr,=cu_index] 显示文件中的DWARF信息
        -t, --syms 显示符号表的内容(s)。
        -T, --dynamic-syms 显示动态符号表的内容
        -r, --reloc 显示文件中的重定位条目
        -R, --dynamic-reloc 显示文件中的动态重定位条目 @<file><file>读取选项
        -v, --version 显示这个程序的版本号
        -i, --info 列出支持的对象格式和架构
        -H, --help 显示这些信息
    
     下面的开关是可选的:
        -b, --target=BFDNAME 将目标对象格式指定为BFDNAME
        -m, --architecture=MACHINE 指定目标架构为 MACHINE
        -j, --section=NAME 只显示NAME部分的信息
        -M, --disassembler-options=OPT 将文本OPT传给反汇编程序
        -EB --endian=big 在反汇编时假定为大的endian格式
        --EL --endian=little 在反汇编时假定为小恩典格式
          --file-start-context 从文件的开头列入上下文(与-S一起)。
        -I, --include=DIR 将DIR加入源文件的搜索列表中
        -l, --line-numbers 在输出中包括行号和文件名
        -F, --file-offsets 在显示信息时包括文件的偏移量
        -C, --demangle[=STYLE] 解码经过处理的符号名称,如果指定STYLE,可以是`auto'、`gnu'、
            `lucid', `arm', `hp', `edg', `gnu-v3', `java'或 "gnat"。
        -w, --wide 格式化80列以上的输出
        -z, --disassemble-zeroes 在反汇编时不跳过零块。
          --start-address=ADDR 只处理地址大于等于ADDR的数据
          --stop-address=ADDR 只处理地址为<=ADDR的数据
          --prefix-addresses 在反汇编的同时打印完整的地址
          --[no-]show-raw-insn 在符号反汇编的同时显示十六进制。
          --insn-width=WIDTH 在单行上显示WIDTH字节,用于 -d
          --adjust-vma=OFFSET 在所有显示的部分地址上增加OFFSET
          --special-syms 在符号转储中包括特殊符号
          --prefix=PREFIX 在绝对路径中增加PREFIX,用于-S
          --prefix-strip=LEVEL 剥离-S的初始目录名称
          --dwarf-depth=N 不显示深度为N或以上的DIEs
          --dwarf-start=N 显示以N开头的DIE,在相同的深度上或更深
          --dwarf-check 做额外的矮人内部一致性检查。     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    Redis缓存过期和和内存淘汰策略
    差分隐私(Differential Privacy)
    MAC地址学习和老化
    阅读android中frameworks层代码的几种方式
    Git 查看当前分支是基于哪个分支拉取(源头分支)
    微服务【同步和异步通讯详解】第6章
    shell脚本语句控制命令(exit、break、continue)
    linux c语言密码验证
    改变数组形状(shape、transpose)--numpy
    java计算机毕业设计闲置物品线上交易系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/qq_42570601/article/details/127360128