如何确定在(linux)中定义了哪个符号库

时间:2019-02-20 20:32:04

标签: linux compilation shared-libraries

我有一个小的开源程序,可以作为apache的共享模块进行编译,但是当apache尝试加载它时,它拒绝加载,并抱怨:“未定义符号:ap_log_rerror”。 在共享库上运行ldd会生成大约十二个依赖项的列表,因此我知道这些函数未定义。我如何找到哪个库提供此功能? 我的问题不是如何列出符号-我知道如何使用nm。我的问题是在哪里可以找到包含我想要的符号的文件?有什么有效,简便的方法来识别正确的文件?

更新:我通过重新编译程序来解决此问题。因此,尽管我的核心问题仍未得到解答,但现在可以加载。

1 个答案:

答案 0 :(得分:0)

我可能知道你的意思。在Windows上,我们可以使用“ dumpbin / ALL [executable]”来获取所有可用信息(请参阅dumpbin),其中包括定义了可执行文件符号的位置的信息(请参见下文),但我没有在Linux中找到与之等效的东西。

ksh-3.2$ dumpbin /ALL test.exe > all.sym
ksh-3.2$ sed -n "3155,3172p" all.sym
    api-ms-win-crt-heap-l1-1-0.dll
             14000E1D8 Import Address Table
             14000E730 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                           8 _callnewh
                          19 malloc
                          18 free
                          16 _set_new_mode

    api-ms-win-crt-math-l1-1-0.dll
             14000E2B0 Import Address Table
             14000E808 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                           9 __setusermatherr