在Windows上列出*.lib中的函数。

5
当我运行lib /list mylib.lib时,我可以看到一些包含的.obj文件,但没有类似于以下函数的信息:
Path\file1.obj
Path\file2.obj
Path\file3.obj

如果我将.lib文件作为一个压缩包打开,我可以看到除了目标文件之外还有许多文件1.txt, ..., n.txt。这些txt文件似乎包含有关.obj文件中函数信息的格式:
:
Path\file1.obj    ?function_name@...
:

因此,可以通过这种方式检索一些信息。
但是,有没有更好的方法来获取函数信息?例如使用 lib.exedumpbin.exe 或其他工具?而且以更可读/解码的格式呈现?到目前为止,我还没有找到这个方法。
有一个相关的问题在这里,但它没有讨论如何处理包含在 .lib 文件中的对象文件。

我的回答是否展示了如何使用dumpbin或其他工具undname来回答你的问题? - Phil
这个回答解决了你的问题吗?如何查看Windows库文件(*.lib)的内容 - StayOnTarget
2个回答

10
你需要使用 dumpbin。(有关更多信息,请参见MSDN上的dumpbin。)
dumpbin /symbols /exports mylib.lib

你也可以使用dumpbin命令,在其后跟上undname命令。(参见undname。)例如:

dumpbin /all /exports mylib.lib > mylib.txt
undname mylib.txt

当然,您需要从命令提示符中执行此操作,并确保Visual Studio工具在您的路径中。对于我的安装,dumpbin和undname位于以下位置:

(当然,您需要从命令提示符中执行此操作,并确保Visual Studio工具在您的路径中。对于我的安装,dumpbin和undname位于以下位置:)

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\amd64\dumpbin.EXE
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\amd64\undname.EXE

从程序菜单中可以找到Visual Studio命令提示符,但我只需调用以下命令即可获取:
"%VS120COMNTOOLS%..\..\vc\vcvarsall" amd64

dumpbin /symbols /exports 命令的唯一输出是 File Type: LIBRARY。这在我链接的问题中已经提到,但对我没有帮助。 - Zitrax
这个库是为dll设计的吗?如果是,那么你只会导出你明确导出的符号。我通常使用“__declspec(dllexport)”来实现这一点。尝试在“%VS120COMNTOOLS%....\vc\lib”中使用dumpbin来查看MS提供的msvcrt.lib。 - Phil

3
GNU nm可以满足您的需求,只要您不使用/LTCG编译选项,它也可以与MSVC对象一起使用。
$ nm ssleay32MT.lib 
tmp32/tls_srp.obj:
[...]
00000000 R ??_C@_0BA@IKHGPLLJ@?4?2ssl?2tls_srp?4c?$AA@
         U @__security_check_cookie@4
00e0797d a @comp.id
80000191 a @feat.00
         U ___security_cookie
         U __chkstk
         U _BN_bin2bn
         U _BN_bn2bin
         U _BN_clear_free
         U _BN_copy
         U _BN_dup
         U _BN_free
         U _BN_num_bits
         U _BN_ucmp
         U _BUF_strdup
         U _CRYPTO_free
         U _CRYPTO_malloc
         U _ERR_put_error
         U _OPENSSL_cleanse
         U _RAND_bytes
         U _SRP_Calc_A
00000000 T _SRP_Calc_A_param
         U _SRP_Calc_B
         U _SRP_Calc_client_key
         U _SRP_Calc_server_key
         U _SRP_Calc_u
         U _SRP_Calc_x
         U _SRP_check_known_gN_param
         U _SRP_create_verifier_BN
00000000 T _SRP_generate_client_master_secret
00000000 T _SRP_generate_server_master_secret
[...]

当在文件上运行nm命令时,我会得到所包含的目标文件列表,然后跟着显示“:文件格式无法识别”。 - Zitrax
@Zitrax:你是否禁用了LTCG(链接时间代码生成)? - Thomas
无论选择什么选项,我都会得到相同的输出。 - Zitrax
@Zitrax:对我来说它有效,看看我的更新答案。确保你的nm是为x86_64目标构建的。 - Thomas
嗯,我确实有32位版本,但是经过一些查找,我找不到预构建的64位nm二进制文件。 - Zitrax
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接