【问题标题】:Does symbol table contain library name for each undefined symbol?符号表是否包含每个未定义符号的库名称?
【发布时间】:2019-05-15 16:19:20
【问题描述】:

假设我们有一个依赖于另一个共享库 libB 的共享库 libA。我们以这种方式构建 libA:

$ g++ -I/header/files/of/libB -lB libA.cpp -o libA.so

libB 导出的符号存储在 libA 的符号表中。但是库名称“libB.so”存储在哪里?它是否也存储在符号表中?我可以为每个未定义的 libA 符号(例如使用 nm 工具)查看相应的库名称吗?

如果 libA 依赖于 libB、libC、libD,我希望看到这样的内容:

undefined_symbol_1 - libB.so
undefined_symbol_2 - libC.so
undefined_symbol_3 - libD.so

等

【问题讨论】:

    标签: c++ gcc g++ nm


    【解决方案1】:

    在 ELF 可执行文件中,它存储在可执行文件的 a 符号表中,是的(尽管与函数名称所在的符号表不同!这就是 nm 会给你的)。

    可执行文件中有足够的信息告诉运行时链接器需要哪些动态库,以及预期在动态库中可以找到哪些符号。

    readelf 会告诉你更多。

    将/必须有其他可执行格式的等价物,但我无法告诉您有关它们的详细信息。

    【讨论】:

    • 谢谢。可执行文件是否仅包含所需库的列表,或者是否存在从未定义符号到该符号来自的库名称的映射?
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多