【问题标题】:How to explore the functions in .A library file如何探索 .A 库文件中的函数
【发布时间】:2015-07-03 15:21:53
【问题描述】:

我从 mingw 创建了一个 .A 和一个相应的 .dll 文件。这将在 Windows 上运行。现在,我正在尝试从不同的组件连接和使用 .A 库中的函数,但出现链接器错误。我想确定我的函数是否正确导出。因此,我关注了this 链接并决定这样做

> lib.exe /list libSomeLibrary.a

结果我得到了这样的东西

d001861.o
d001862.o
d001863.o
d001864.o
d001865.o
d001866.o
d001867.o
d001868.o
d001869.o
d001870.o
d001871.o
d001872.o
d001873.o
d001874.o
d001875.o
d001876.o
d001877.o
d001878.o
d001879.o
d001880.o
d001881.o
d001882.o
d001883.o
....
....

这是正确的。有没有办法让我真正获得 lib 文件中函数的名称。

【问题讨论】:

    标签: c++ windows dll mingw


    【解决方案1】:

    由于您使用的是MinGW,您可以使用nm 命令列出任何libfoo.a 归档文件的内容;如此使用:

    nm -A libfoo.a | more
    

    (或者更好的是,如果你有 less 命令,例如在 MinGW 的 MSYS shell 环境中):

    nm -A libfoo.a | less
    

    它将列出存档中指定的所有符号,按提供每个符号的嵌入对象文件的名称进行分组和限定。

    【讨论】:

      【解决方案2】:

      .a 库文件包含多个单独的对象文件,它们组合在一起形成一个库存档。实际上包含符号和代码的是单独的.o 目标文件。

      您应该能够使用 dumpbin 工具检查 Windows 系统上的库。 /exports 选项应该显示导出的符号。我对这个工具没有任何经验,但上面的页面暗示它应该能够直接在 windows lib 文件上操作。

      您声明您使用的是 GNU Binutils 附带的 MingW,包括 nmobjdump,两者都可用于检查目标文件。要使用这些工具,您可能会发现从 .a 文件中提取 .o 文件更为方便,您可以使用 ar 命令来完成。如果您不这样做,那么它将列出存档中所有目标文件中的所有信息。

      示例(在 Linux 系统上显示,但如果使用 MingW,这些工具在 Windows 中的工作方式应该相同):

      从 libbfd.a 中提取 corefile.o

      $ ar x /usr/lib64/libbfd.a corefile.o
      

      检查 corefile.o 中的全局(外部)符号

      $ nm -g corefile.o 
      0000000000000000 T bfd_core_file_failing_command
      0000000000000030 T bfd_core_file_failing_signal
      0000000000000060 T bfd_core_file_pid
                       U bfd_set_error
      0000000000000090 T core_file_matches_executable_p
                       U filename_cmp
      00000000000000d0 T generic_core_file_matches_executable_p
                       U _GLOBAL_OFFSET_TABLE_
                       U strrchr
      

      【讨论】:

      • 当使用nmobjdump 时,无需从lib*.a 档案中提取目标文件;两者在*.a 档案中同样有效,(尽管objdump 可能过于冗长,因为它会分解档案中的每个对象)。要列出嵌入的目标文件,它们的符号,只需使用nm -A libfoo.a,并将输出通过more(或者更好的是less,如果你有的话),阅读它更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2014-01-15
      相关资源
      最近更新 更多