如何阅读nm命令:nm选项-T和-U(未定义)的含义是什么?

3
我有链接错误,怀疑是由于 'libsimint.a' 引起的。
Linker messages (if any) follow...
/home/.../simint/lib/libsimint.a(shell.c.o): In function `simint_copy_shell':
shell.c:(.text+0x126): undefined reference to `__intel_ssse3_rep_memcpy'
/home/.../simint/lib/libsimint.a(shell.c.o): In function`simint_normalize_shells':
shell.c:(.text+0x4e3): undefined reference to `__svml_pow4'

我尝试使用 nm 命令来搞清楚:

>> nm libsimint.a |grep __intel_ssse3_rep_memcpy
U __intel_ssse3_rep_memcpy

>> nm libsimint.a |grep simint_copy_shell
0000000000000090 T simint_copy_shell

根据上面的理解(借助于nm手册),代码中提到了simint_copy_shell函数,但是__intel_ssse3_rep_memcpy在我们编译的另一个库中没有定义。有人能够验证这一点或者提供任何澄清吗?谢谢。
(我正在使用gcc编译和链接一个大型代码,该代码是用icpc编译的,但现在不再使用icpc了。)

1
提示:man nm - Jesper Juhl
尝试了查找,但提供的信息有限。 - MadHatter
2个回答

7

U表示“未定义”——对象具有对符号的引用,但没有定义

T表示在文本段中全局定义——对象定义并导出符号

手册页面(man nm)列出了所有这些类型代码。


0
ELF符号是对某种数据或代码的象征性引用,如全局变量或函数。 "nm"(名称混淆[1])允许我们打印出ELF文件中的所有符号。在其默认调用中,“nm”的输出包括三列,并且对于每个符号,它按照下面给出的相同顺序显示以下信息:
  • 符号值:默认以十六进制格式表示。
  • 符号类型:我们可以看到下面的一些符号类型。如果符号类型是小写字母,则符号通常是局部的;如果是大写字母,则表示符号是全局的(外部的)。
    • "B" / "b":符号位于BSS(块起始符号)数据段。
    • "D" / "d":符号位于已初始化的数据段。
    • "R" / "r":符号位于只读数据段。
    • "T" / "t":符号位于文本(代码)段。
    • "N":符号是调试符号。
    • "U":符号未定义。
  • 符号名称:符号名称。版本字符串显示为符号名称的后缀。版本字符串可以附加 "@""@@"。附加 "@" 的版本字符串表示符号的版本;如果该版本字符串还表示符号的默认版本,则附加 "@@",这意味着当调用该符号时没有显式指定版本时,将使用该符号的那个版本。

工具“nm”的示例输出:

    $ nm 'example_program'
    000005d4    t    print_error_message
    --------    U    strlen@@GLIBC_2.4
    --------    U    syscall@@GLIBC_2.4
    00011008    b    device_list
    000005f9    t    send_message_to_device
    000006e5    T    main
    ...

更多信息,请参考nm的man页面[2]

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