问题标签 [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.
objective-c - Objective-C 错位名称(_OBJC_CLASS_ vs .objc_class_name_)
我试图在链接库时修复一些未解析的引用,并注意到缺少的类被定义为
由nm
. 但是,如果我检查定义此类的库,我发现:
_OBJC_CLASS_
所以这是一个问题 - b/w 前缀和有什么区别.objc_class_name_
?它似乎没有帮助链接器正确解析符号。
任何链接也将不胜感激。
c++ - 标头包含标准 C++ 库后的未定义符号
我在预处理器运行后使用命令g++ -E main.cpp
来获取这个编译单元。经过预处理后,它包含大约 20k 行。它包含这部分代码,定义为operator<<(double __f)
.
接下来,运行
g++ -c main.cpp
并nm main.o
_ZNSolsEd
是损坏的名称,operator<<(double)
并且该行具有"U" The symbol is undefined
. 但是这个运算符的定义是在编译的源代码中。这是什么原因?
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 函数中使用。这会导致链接器错误吗?
c++ - 如何将 llvm::outs() 重定向到文件?
我正在使用一些 LLVM 工具(如llvm-nm
)作为静态库。即我复制了源llvm-nm.cpp,重命名main(..)
为llvm_nm(..)
并将其编译为静态库。我想将标准输出转发到我的文件。
我尝试使用下一种方法:
问题是它没有被转发(如果我添加printf()
nm 源代码但不用于nm
输出,它可以工作)。我查看了源代码,我可以看到输出是使用llvm::outs()
流完成的:
它是通过下一种方式实现的:
如何将该输出重定向到我的文件?
linker - 两个依赖库之间的未定义符号
首先对不起标题,但我真的不知道该怎么说。您有什么更好的想法可以随时编辑。
其次,我进行了广泛的研究,但找不到解决方案。如果您在 google 上找到解决方案,请不要生气。我找了也没找到(或者我很笨,这也是可能的)
对于我的问题:
我正在尝试编译一个程序,该程序hacc
在他的众多依赖项中具有diy
和tess
. 此外,diy
也是 的依赖项之一tess
。
我被diy
编译成libdiy.a
我被tess
编译成libtess.a
当我尝试编译时hacc
出现错误提示
nm 告诉我:
hacc
使用链接标志编译
我在哪里做错了什么?我应该尝试tess
通过包含依赖项中的所有符号来编译libtess.a
吗?
c++ - Boost.Exception 符号出现在“nm”输出中是什么意思?它们会导致 ODR 违规吗?
我在第 3 方静态链接库上运行它。我认为由于它是一个仅标头库(某些 MSVC 版本除外),它不会出现。也许我误解了 nm 应该显示的内容。我真正想知道的是,如果我链接到使用不同版本的 Boost 编译的库,它们是否会导致 ODR 违规。
见输出:http ://codepad.org/kJ86hiQg
一个简短的抽样:
ios - 在 OS X 上使用 nm(1) 列出为 arm64 构建的目标文件中的符号
有谁知道如何从我为 arm64 架构构建的目标文件中列出符号?
我尝试使用nm
,但它给了我一个错误:
是否可以使用 做同样的事情otool
?
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 对此感到满意。
- 我应该如何在 gdb 中打印重复的符号?我必须使用地址而不是符号吗?
.5782
重复符号末尾的 等数字是什么?这会帮助我将符号映射回目标文件吗?
注意:我不只是重命名变量——它们都是在第 3 方库中定义的。
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”,这意味着它们是未定义的。
我对它们的定义有问题吗?
c - 从编程的角度来看,这些符号是什么意思?
我必须创建一个 C 文件,该文件在编译时返回nm
类型为A、B和V的符号输出。我已经阅读了手册页nm
并在线搜索,但都没有帮助我弄清楚这些类型的符号是如何创建的。从编程的角度来看,这些符号是什么意思?还有我应该看的好的参考资料吗?