【问题标题】:How to view symbols in object files?如何查看目标文件中的符号?
【发布时间】:2010-10-07 10:55:01
【问题描述】:

如何查看 .o 文件中的符号? nm 对我不起作用。我使用 g++/linux。

【问题讨论】:

  • nm 正是您要使用的。你能解释一下它为什么不适合你吗?
  • 上面写着:nm: Lib1.o: File format not recognized
  • @nakiya:运行file Lib1.o 并告诉我们输出是什么。
  • @nakiya 您无法运行 .o 文件。如果你编译一个头文件,你会生成带有最新 gcc 版本的预编译头文件,而不是目标文件。您应该编译 .cpp 文件而不是头文件。
  • @nakiya:你不能运行它,你真的应该在你的shell中输入文本“file Lib1.o”。名为file 的工具会告诉您Lib1.o 的文件类型,即它是否真的是目标文件。我对此表示怀疑。

标签: c++ linux g++ object-files


【解决方案1】:

您可以使用强大的objdump 来代替nm。有关详细信息,请参见手册页。试试objdump -t myfileobjdump -T myfile。使用-C 标志,您还可以像nm 那样对C++ 名称进行分解。

【讨论】:

  • 我也试过 ObjDump。结果相同:objdump: Lib1.o: File format not recognized
  • 试试objdump -t Lib1.o
【解决方案2】:

您是否一直在为其他平台使用交叉编译器?如果是这样,您需要使用各自的nmobjdump 命令。

例如,如果你使用XXX-YYY-gcc编译.o文件,你需要使用XXX-YYY-nmXXX-YYY-objdump来处理文件。

【讨论】:

    【解决方案3】:

    有一个命令可以查看目标文件或库或可执行文件中包含哪些函数:

    nm
    

    【讨论】:

    • OP直接表示不能使用nm
    • @ivan_pozdeev 虽然这是真的,但我想有些人(至少是我)只是通过搜索如何查看目标文件中的符号来解决这个问题,而在我的情况下,nm 非常适合我的需求,所以我认为在这种情况下这是一个很好的答案。
    【解决方案4】:

    只需运行:nm you_obj_file.o | c++filt

    【讨论】:

      【解决方案5】:

      您可以使用nm -C .o/lib/exe,例如:

      xiongyu@ubuntu:~/tmp/build$ nm -C libfile1.a 
      
      file1.cpp.o:
      0000000000000000 T f()
      0000000000000000 W int fun<int>(int)
      

      使用nm -C会更易读,如果你只使用nm

      xiongyu@ubuntu:~/tmp/build$ nm libfile1.a 
      
      file1.cpp.o:
      0000000000000000 T _Z1fv
      0000000000000000 W _Z3funIiET_S0_
      

      正如我们所见,它不那么可读。

      下面是我的file1.cpp 喜欢的:

      xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
      #include "head.h"
      void f()  {
           int i = fun<int>(42);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多