• 使用readelf,objdump,nm,ar解析目标文件


    https://www.jianshu.com/p/863b279c941e

    通过使用工具readelf、objdump对目标文件进行解析

    objdump -x -s -d 

    https://www.cnblogs.com/wliangde/p/3806944.html

    1、nm [options] file    列出file中的所有符号

    选项/属性:
    -a或--debug-syms:显示调试符号。
    -B:等同于--format=bsd,用来兼容MIPS的nm。
    -C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
    -D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
    -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
    -g或--extern-only:仅显示外部符号。
    -n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
    -p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。
    -P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
    -s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
    -r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。
    --size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
    -t radix或--radix=radix:使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。
    --target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
    -u或--undefined-only:仅显示没有定义的符号(那些外部符号)。
    -l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
    -V或--version:显示nm的版本号。
    --help:显示nm的任选项。

     

    nm [option(s)] [file(s)]

    有用的options:

    -A 在每个符号信息的前面打印所在对象文件名称;
    -C 输出demangle过了的符号名称;
    -D 打印动态符号;
    -l 使用对象文件中的调试信息打印出所在源文件及行号;
    -n 按照地址/符号值来排序;
    -u 打印出那些未定义的符号;

    常见的符号类型:

    A 该符号的值在今后的链接中将不再改变;
    B 该符号放在BSS段中,通常是那些未初始化的全局变量;
    D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
    T 该符号放在代码段中,通常是那些全局非静态函数;
    U 该符号未定义过,需要自其他对象文件中链接进来;
    W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

     

     

     

    2、ar {dmpqrtx} [member] archive file    用于操作高度结构化的存档文件(.a)

    经常用法:

      • ar -t libname.a //显示所有对象文件(.o文件)的列表.例: # ar t libtest.a
        libtest1.o
        libtest2.o
      • ar -rv libname.a  objfile1.o objfile2.o ... objfilen.o  //把objfile1.o--objfilen.o打包成一个库文件

    ar 选项

    d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。
    m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。
    p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。
    q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。
    r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
    t:显示库的模块表清单。一般只显示模块名。
    x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。
      下面在看看可与操作选项结合使用的任选项:

    a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。
    b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。
    c:创建一个库。不管库是否存在,都将创建。
    f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。
    i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。
    l:暂未使用
    N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。
    o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。
    P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。
    s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。
    S:不创建目标文件索引,这在创建较大的库时能加快时间。
    u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项。
    v:该选项用来显示执行操作选项的附加信息。
    V:显示ar的版本.

     

    3、ldd [options] file    列出file运行所需的共享库

        [options]

        -d    执行重定位并报告所有丢失的函数

        -r    执行对函数和对象的重定位并报告丢失的任何函数或对象

     

    4、 ldconfig [options] [libs]    决定位于目录/usr/lib和/lib下的共享库所需的运行的链接,这些链接由[libs]指定并被保存到/etc/ld.so.conf中

        [options]

        -p    打印文件/etc/ld.so.conf的内容

        -v    更新/etc/ld.so.conf

     

    5、 ld.so    动态链接/加载器

        ld.so使用的两个环境变量

        $LD_LIBRARY_PATH 告诉ld.so去哪里查找保存在非标准目录下的共享库,冒号分隔,对应文件/etc/ld.so.conf

        $LD_PRELOAD告诉ld.so用户指定的在所有库加载之前加载的库所在的目录,空格分隔,对应文件/etc/ld.so.preload

  • 相关阅读:
    Java获取一年里某季、某月、某周的第一天及最后一天时间的完整代码如下:
    django 将数组交给前台
    模板标签
    django 变量交给前台模板
    内核解密 | Oracle 18c 数据库安装ORA-12754的两种解决方案
    浅谈大型web系统架构
    浅谈大型web系统架构
    浅谈大型web系统架构
    浅谈大型web系统架构
    微信小程序把玩(三十二)Image API
  • 原文地址:https://www.cnblogs.com/sinferwu/p/12101184.html
Copyright © 2020-2023  润新知