问题标签 [nm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
710 浏览

objective-c - Objective-C 错位名称(_OBJC_CLASS_ vs .objc_class_name_)

我试图在链接库时修复一些未解析的引用,并注意到缺少的类被定义为

nm. 但是,如果我检查定义此类的库,我发现:

_OBJC_CLASS_所以这是一个问题 - b/w 前缀和有什么区别.objc_class_name_?它似乎没有帮助链接器正确解析符号。

任何链接也将不胜感激。

0 投票
1 回答
209 浏览

c++ - 标头包含标准 C++ 库后的未定义符号

我在预处理器运行后使用命令g++ -E main.cpp来获取这个编译单元。经过预处理后,它包含大约 20k 行。它包含这部分代码,定义为operator<<(double __f).

接下来,运行 g++ -c main.cppnm main.o

_ZNSolsEd是损坏的名称,operator<<(double)并且该行具有"U" The symbol is undefined. 但是这个运算符的定义是在编译的源代码中。这是什么原因?

0 投票
0 回答
902 浏览

c++ - 调试 C++ 链接器错误

首先,我将提供有关我遇到的问题的具体细节,然后我将介绍我在尝试调试问题时从 nm 获得的有趣结果。希望纳米大师能够解释这些结果。

我已将 Casablanca C++ REST SDK 静态编译到库 libcpprest.a。这很好用,但是当我使用以下命令链接我的代码时:

我得到错误:

似乎 _extract_json(bool) 是在 http_msg.cpp 中定义的,当我查看制作 libcpprest.a 的详细输出时,它似乎也已编译。现在,运行 nm -e --demangle libcpprest.a 我得到以下两行(由数千行分隔):

我是使用 nm 的新手,但在我看来 _extract_json(bool) 既在代码部分中,也在未定义符号列表中。有没有更好的方法来解释 nm 结果?

顺便说一句,当我将 cpprest 编译为动态库并链接到它时,一切正常,但由于各种原因,我必须创建 dcodr_service 的静态二进制文件。

编辑:跟进来自πάντα ῥεῖ的评论,_extract_json(bool) 在以下上下文中使用:

也就是说,它在 lambda 函数中使用。这会导致链接器错误吗?

0 投票
2 回答
7348 浏览

c++ - 如何将 llvm::outs() 重定向到文件?

我正在使用一些 LLVM 工具(如llvm-nm)作为静态库。即我复制了源llvm-nm.cpp,重命名main(..)llvm_nm(..)并将其编译为静态库。我想将标准输出转发到我的文件。

我尝试使用下一种方法:

问题是它没有被转发(如果我添加printf()nm 源代码但不用于nm输出,它可以工作)。我查看了源代码,我可以看到输出是使用llvm::outs()流完成的:

它是通过下一种方式实现的:

如何将该输出重定向到我的文件?

0 投票
1 回答
32 浏览

linker - 两个依赖库之间的未定义符号

首先对不起标题,但我真的不知道该怎么说。您有什么更好的想法可以随时编辑。

其次,我进行了广泛的研究,但找不到解决方案。如果您在 google 上找到解决方案,请不要生气。我找了也没找到(或者我很笨,这也是可能的)


对于我的问题:

我正在尝试编译一个程序,该程序hacc在他的众多依赖项中具有diytess. 此外,diy也是 的依赖项之一tess

我被diy编译成libdiy.a

我被tess编译成libtess.a

当我尝试编译时hacc出现错误提示

nm 告诉我:

hacc使用链接标志编译

我在哪里做错了什么?我应该尝试tess通过包含依赖项中的所有符号来编译libtess.a吗?

0 投票
1 回答
82 浏览

c++ - Boost.Exception 符号出现在“nm”输出中是什么意思?它们会导致 ODR 违规吗?

我在第 3 方静态链接库上运行它。我认为由于它是一个仅标头库(某些 MSVC 版本除外),它不会出现。也许我误解了 nm 应该显示的内容。我真正想知道的是,如果我链接到使用不同版本的 Boost 编译的库,它们是否会导致 ODR 违规。

见输出:http ://codepad.org/kJ86hiQg

一个简短的抽样:

0 投票
1 回答
1448 浏览

ios - 在 OS X 上使用 nm(1) 列出为 arm64 构建的目标文件中的符号

有谁知道如何从我为 arm64 架构构建的目标文件中列出符号?

我尝试使用nm,但它给了我一个错误:

是否可以使用 做同样的事情otool

0 投票
1 回答
1309 浏览

gdb - 如何区分 GDB 中不同对象文件中的同名符号?

我有两个源文件(在 C 中),它们具有同名的全局变量。全局变量是静态的。如果我使用nm从目标文件中转储符号,我可以看到包含调试信息:

但是,如果我在链接完成后从 ELF 文件中转储符号,则这些重复符号的调试信息似乎已被删除。这是正常的行为吗?即这里描述的是自动发生的吗?

请注意,并非所有调试信息都被剥离——对于像app_gpiote_user_enable. 如果我尝试打印其中一个副本,例如m_user_array_size,gdb 告诉我,No symbol "m_user_array_size" in current context.但是,如果我 print app_gpiote_user_enable,gdb 对此感到满意。

  1. 我应该如何在 gdb 中打印重复的符号?我必须使用地址而不是符号吗?
  2. .5782重复符号末尾的 等数字是什么?这会帮助我将符号映射回目标文件吗?

注意:我不只是重命名变量——它们都是在第 3 方库中定义的。

0 投票
1 回答
214 浏览

c++ - 模板基类的静态成员不会导出到共享库

我有一个从模板类“TModelManager”派生的“ModelManager”类。他们的声明如下:

有两个共享库,“shared”和“server”。

在“共享”库中,DLLNETWORK 相当于 linux 系统上的 '__attribute__((visibility("default")))',用于导出类。模板类的成员是这样定义的(在 cpp 文件中):

在“服务器”库中,DLLNETWORK 是一个空定义,以确保类被导入。“服务器”库与“共享”库链接。

这编译得很好。

在运行时,“服务器”库被动态加载,这也导致“共享”库被加载。但是,这会导致以下错误:

我在“服务器”库上使用了“ldd”实用程序,它确认它与“共享”库链接,并且可以找到它。

然后,我使用“nm”实用程序查找与 TModelManager 类相关的所有符号。这是结果:

一切都在那里,除了“m_marked”成员。“m_models”-member 被发现两次,但地址不同。

我真的完全不明白,'m_marked'-member 的定义方式与'm_models'-member 相同,那为什么不导出呢?为什么“m_models”成员出现两次?

// 编辑:

我没有注意到“m_models”的 nm 结果前面的“U”,这意味着它们是未定义的。

我对它们的定义有问题吗?

0 投票
1 回答
92 浏览

c - 从编程的角度来看,这些符号是什么意思?

我必须创建一个 C 文件,该文件在编译时返回nm类型为ABV的符号输出。我已经阅读了手册页nm并在线搜索,但都没有帮助我弄清楚这些类型的符号是如何创建的。从编程的角度来看,这些符号是什么意思?还有我应该看的好的参考资料吗?