【问题标题】:get list of static libraries in c/cpp from .so/.o files从 .so/.o 文件中获取 c/cpp 中的静态库列表
【发布时间】:2020-02-11 19:33:13
【问题描述】:

我一直在尝试从文件中获取静态和动态依赖项。我有源代码和 unstipped bin 文件, 为了获得所有动态依赖项,我使用了这一行及其工作

readelf -d $1 | grep "NEEDED\|RPATH" | perl  -pe 's/.*\[(.*)\]/$1/

当我使用命令时,我的问题在于静态库:

nm path/to/so

我得到的是函数的名称,而不是文件的名称。 有没有办法查看每个二进制文件的静态依赖关系?

【问题讨论】:

  • 据我所知,答案是:不。静态库只是目标文件的存档。链接静态库与链接不同的目标文件相同。
  • 也许找到了某种方式,我现在的脚本是:"readelf -d $1 | grep "NEEDED\|RPATH" | perl -pe 's/.*[(.*)]/$1/ '|sort -u | tee DynamicDep_$2\.txt " 用于动态和 " 字符串 -a $1 | grep -E '\.h' | sort -u | sed "s,\x1B[[0-9;]*[ a-zA-Z],,g" | tee StaticDep_$2\.txt" 用于静态

标签: c++ c linux binary linker


【解决方案1】:

动态库 (.so) 不能具有“静态依赖项”,因为它们已经链接。

目标文件 (.o) 和静态库 (.a) 定义了它们导出的符号(供他人使用)和它们自己使用的符号。

您可以使用nm 命令列出目标文件的符号。例如:

$ nm lukas.o
                 U __cxa_atexit
                 U __dso_handle
0000000000000000 V DW.ref.__gxx_personality_v0
                 U _GLOBAL_OFFSET_TABLE_
00000000000003a8 t _GLOBAL__sub_I__Z15double_from_strRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
                 U __gxx_personality_v0
00000000000001d5 T main
                 U __stack_chk_fail
                 U _Unwind_Resume

U 关键字标记了未定义的符号,即目标文件的静态依赖项

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2010-11-10
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多