问题标签 [name-mangling]

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 投票
2 回答
1866 浏览

c++ - g ++模板名称修改

我需要在 g++ 内联程序集中使用模板类成员的地址(作为编译时常量值)。可以表达这个吗?(我认为我需要 的损坏名称T<U>::x)。

0 投票
1 回答
147 浏览

c++ - 如果重载ac函数名,找不到c++函数名?

我试图func用接受不同参数的 C++ 风格函数覆盖库中的 C 风格函数 ( ),如下面的代码所示。

我将 test.cpp 编译成一个共享库 libtest.so,并编译 main.cpp 并将其与 libtest.so 库链接。这一切都有效,直到我得到的链接步骤 undefined reference to 'func(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'

有人可以解释一下为什么链接器无法解析 C++ 函数吗?我用 nm 检查了这两个函数确实在库中。intel 和 g++ 编译器都会出现链接器错误。

测试.h:

测试.cpp:

主.cpp:

0 投票
1 回答
2284 浏览

visual-studio-2008 - 使用 Visual Studio 2008 在 C++ 中链接错误和名称修改

我在 64 位版本的 Windows 上使用 64 位版本的 Visual Studio 2008。我有一个链接到库(OpenCV 2.1)的项目。我使用相同的编译器从源代码编译了 OpenCV。我的问题发生在发布和调试模式下。

在“属性”窗格或我的项目中,我在 C/C++ ->“其他包含目录”下添加了包含头文件的目录。我已将包含 .lib 文件的目录添加到“附加库目录”中,并且已将库的名称添加到链接器 -> 输入下的“附加依赖项”条目中。

当我编译和链接时,我得到这种风格的错误:错误 LNK2019: unresolved external symbol _cvFloodFill referenced in function "int __cdecl Label(class cvImage &)" (?Label@@YAHAAV?$cvImage@M@@@Z)

在 Linker->Command Line -> Additional options 下,我添加了标签:/verbose:lib,我在编译器输出窗口中看到它正在搜索并查找应该包含函数的库 (cv210d.lib)。(我查看了 OpenCV 的源代码,发现有问题的函数是在这个库中定义的)

1>链接...
1>搜索库
1> 搜索 C:\Program Files\OpenCV2.1\lib\cv210d.lib:

在 OpenCV 源代码中,它具有 extern "C" 声明,其中包含相关函数的声明。

我在库文件上运行了 dumpbin /all,我看到定义了以下符号。(我已经安装了 Windows 的 gnu 工具链,所以我可以使用 grep)。

C:\Program Files\OpenCV2.1\lib>dumpbin /all cv210d.lib | grep cvFloodFill
732B4 __imp_cvFloodFill
732B4 cvFloodFill
1CA __imp_cvFloodFill
1CA cvFloodFill

因此,如您所见,链接器正在寻找符号 _cvFloodFill,但未定义。只定义了 cvFloodFill 和 __imp_cvFloodFill ,所以看起来发生了一些有趣的事情,当我编译库与尝试链接它时,名称修改不同。

所以这就是我卡住的地方。我是否正确解释了这些信息?我需要做些什么来影响名称修改吗?我是否需要使用某种不同的标志来编译库?

0 投票
3 回答
809 浏览

dll - 导出的函数符号名称修改

我有一个 D DLL,它由我无法控制的 C++ 程序加载。程序 LoadLibrarys 我的 DLL 并使用 GetProcAddress 找到一个名为“extension_load”的函数,该函数接受一个参数(一个指针)。在我的 D DLL 中,我有:

并且这个名字需要导出为ex​​tension_load,但它被导出为ex​​tension_load@4,所以GetProcAddress 找不到它。如何在不修改名称的情况下使其成为普通的 extension_load?

0 投票
3 回答
18823 浏览

c++ - 用于g ++的C ++名称修饰解码器?

是否有任何用于 g++ 的 C++ 名称修饰解码器?

0 投票
1 回答
1764 浏览

gcc - 为什么 std:string + int 不给出编译错误?

我们刚刚发现我们的同事认为他可以向 std::string 添加一个整数,并在他的代码中到处使用这样的操作。

我们没有看到此操作的任何编译器错误,我不明白为什么:没有operator+ (const string& lhs, int rhs);. int 是否被默默地转换为 char?(使用 gcc Red Hat 4.1.2 和 -Wall 开关编译)。

而且,最重要的是,我们如何找到将 int 添加到 std::string 的所有行?

0 投票
2 回答
13061 浏览

c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改

我试图为 dll 导出一个简单的测试函数,以便与将调用约定指定为的应用程序(仅供参考:mIRC)一起使用:

现在,要从应用程序中调用它,我将使用test_func但我注意到由于名称修饰它并不像我想象的那么简单。

通过此处的类似主题,我了解到将extern "C"__declspec(dllexport)结合使用是一种等效的(在某种程度上)消除对模块定义 (.def) 的修改的方法。但是,当使用 extern/dllexport 方法时,我的函数(例如)始终是_test_func@numbers而 .def 删除了所有需要与我需要导出到的应用程序一起使用的修改。

有人可以解释这是为什么吗?我只是对这两种方法感到好奇。谢谢!

0 投票
4 回答
4114 浏览

python - 手动修改 C++ 名称

我正在使用该插件在 Python 中为IDA Pro反汇编程序编写脚本。idapython使用它,我能够填补 IDA 自动分析不足的空白。

让我难过的一个领域是用(为了更好的术语)“漂亮的名字”来命名位置/功能。我的意思的一个例子如下所示:

IDA 漂亮名字示例截图

idapython而 IDA Pro 本身只允许我输入基本的 C-ish 函数名称。如果我输入不允许的符号(例如范围解析运算符),它们将被下划线替换。但是,如果我手动输入一个错误的名称(例如__ZN9IOService15powerChangeDoneEm),IDA Pro为我美化它。

因此我的问题是:我怎样才能生成经过修改的名称idapython?是否有可用的名称修饰库?在 Python 中可用吗?我唯一的希望是摆脱重整功能g++并解决这个问题吗?

0 投票
3 回答
15303 浏览

c++ - 破坏/破坏功能的功能

之前,在这里,我已经证明 C++ 函数不容易在汇编中表示。现在我有兴趣以一种或另一种方式阅读它们,因为 Callgrind 是 Valgrind 的一部分,在组装时显示它们被破坏。

所以我想要么破坏 Valgrind 函数输出,要么破坏函数的程序集名称。有人尝试过这样的事情吗?我正在查看一个网站,发现以下内容:

有没有人尝试过这样的事情?我想在 C.

我的编译器是 gcc 4.x。

0 投票
2 回答
2416 浏览

c - 使用 MinGW 防止在 C(不是 C++)中进行名称修改以进行动态符号搜索

我有一个 C 程序,我在其中通过函数名称“动态”获取函数指针(即,我将函数名称作为字符串传递并获取指向函数的指针)。我已经在 Linux 中使用 dlopen 和 dlsym 做到了这一点,我想它也可以在任何其他类 Unix 中使用dlfcn

当我尝试使用 MinGW 将该程序移植到 Windows 时,问题就开始了。当我尝试使用“GetProcAddress(handle, symbol_name)”查找名称时,其中“symbol_name”是我的回调函数的名称,“handle”是“GetModuleHandle(NULL)”返回的当前可执行文件的句柄,我什么也没得到因为 MinGW 名称修饰在我的符号名称中添加了一个“_”。

显而易见的解决方案(在我想要的符号前加上“_”)对于可移植性似乎有点“危险”(编译器可以为其中一些添加两个下划线吗?我不知道),所以,我问:

  • 有更好的方法来防止编译器对我的符号进行名称修改吗?(或其中的一个子集,只有我需要动态查找的回调);

  • 或者一种让 GetProcAddress 即使在损坏时也能找到它们的方法?

我还尝试了选项-fno-leading-underscore,但它也删除了所有外部符号的修饰,使程序无法与 stdlib 等链接(另外,文档上的警告有点吓人)。

另外,请注意我使用的是纯 C——我的代码的任何部分都没有 C++——我所有的代码都存在于一个“.exe”中。

TIA