【问题标题】:nm: how to show object file of a symbol in a shared library?nm:如何在共享库中显示符号的目标文件?
【发布时间】:2012-11-13 17:10:36
【问题描述】:

我有 25 个目标文件,它们组合成一个共享库。我已经用 gcc 生成了共享库,当我用 nm -D libmylib.so 寻找暴露的符号时,我发现了两个名为 i 的不受欢迎的暴露符号和y 位于 .bss 部分。我试图在我的源文件中找到它们,但我找不到它们,所以如果有人能告诉我是否有某种方法可以找到哪个 .o 文件恰好具有这些不希望的暴露符号?我可以用 nm 做还是需要其他工具?

任何帮助将不胜感激。

【问题讨论】:

    标签: c linker shared-libraries elf objdump


    【解决方案1】:

    一旦共享库被链接,您就无法再分辨它的哪些部分来自哪个目标文件。

    您可以搜索构建库的各个对象:

    find . -name '*.o' -print0 | xargs -0 nm -A | egrep ' (i|y)$'
    

    你可以让链接器告诉你什么时候定义的:

    $(CC) -fPIC -shared -o libmy.so $(OBJS) -Wl,-y,i,-y,y
    

    如果你使用-g 编译的对象构建库,你可能会问GDB i 和y 来自哪里:

    gdb -q libmy.so
    (gdb) info var ^i$
    (gdb) info var ^y$
    

    【讨论】:

      【解决方案2】:

      在您的目标文件所在的目录中,您可以运行:

      find . -name '*.o' -exec nm -D {} \; -print
      

      这应该打印符号,然后是文件名

      【讨论】:

      • nm -D 不适用于可重定位对象——它们没有动态符号表。
      猜你喜欢
      • 2021-07-22
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2010-11-18
      • 2013-09-12
      相关资源
      最近更新 更多