问题标签 [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 投票
3 回答
4369 浏览

python - python 如何使用 setattr 或 exec 创建私有类变量?

我刚刚遇到了一种情况,即私有类成员名称在使用setattror时不会被破坏exec

我也尝试过exec("self.__%s = %s" % (k, v))同样的结果:

self.__dict__["_%s__%s" % (self.__class__.__name__, k)] = v会工作,但__dict__它是一个只读属性。

有没有另一种方法可以动态创建这些私有类成员(在名称修改中没有硬编码)?


表达我的问题的更好方法:

当遇到设置的双下划线 ( self.__x) 属性时,python 在“幕后”做了什么?是否有用于进行修饰的魔术功能?

0 投票
4 回答
4520 浏览

c - 无法防止名称修改

我正在尝试构建一个用 C 编写的 dll,它将由其他也用 C 编写的程序导入。

因此,dll 正在导出的所有函数都在 .dll 中定义,“没有 __declspec(dllexport)”(有意)。我已经定义了一个 .def 文件,其中只有一个导出部分和我要导出的函数的名称(未损坏的名称)。

我正在使用 vc71/vs2003 来构建它,但我仍然得到错误的名称(如果我在记事本中打开 .lib 可以看到)。同样为了澄清起见,Visual Studio 也会导致 C 代码中的名称混淆(我能找到的大多数资源都提到它是仅 C++ 的问题)。

我怎样才能防止这个名字被篡改?

更多的信息:

错位名称的格式为“functionName@integer”,其中整数表示以字节为单位的参数大小(而不是序数)。例如,

来自 .lib: _PrepareSeverResponse@8

.h 中的函数声明: char* PrepareSeverResponse(unsigned int* size ,handshake* ws_handshake);

.def: 导出 PrepareSeverResponse

调用约定: __stdcall(/Gz)

希望这能让它更清楚。

0 投票
1 回答
94 浏览

windows - 应该使用“__imp__ApiName@N”还是“_ApiName@N”?

我已经使用 DUMPBIN 转储了一个 Windows SDK .lib 文件 (kernel32.lib),输出显示每个 API 名称都有两个“版本”,例如:

_imp _ExitProcess @4

_ExitProcess@4

那么,为什么会有两个相同但名称不同的 mangling 呢?. 假设我想从 NASM 调用 ExitProcess,我应该在声明 EXTERN 时使用它们中的哪一个?,我的实践告诉我我可以调用它们中的任何一个,但我不知道哪个是“正确”或“首选”坚持下去。

0 投票
3 回答
9482 浏览

c++ - 如何从装饰名称中取消装饰名称?

在 Raymond Chen 的一个帖子中,他似乎可以从修饰名称中知道函数的未修饰名称。我不知道他怎么能这样做。

以这个装饰的名字,

?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@@Z

每个组件是什么意思?

0 投票
2 回答
14717 浏览

c++ - objdump 可以取消 C++ 模板函数的名称吗?

我有一个 C++ 目标文件,其中包含一些 C++ 模板函数的实例化。有问题的目标文件为模板参数的几个不同组合实例化了相同的函数。我正在尝试调试一个问题,并希望查看模板函数的特定实例化的反汇编(即,我知道要检查的函数的模板参数)。我通常会使用objdump反汇编目标文件来执行此操作,但它(至少在默认情况下)无法对 C++ 函数名称进行分解。有没有办法做到这一点?目标文件是使用 gcc 4.6.1 创建的。

0 投票
0 回答
772 浏览

java - 用于 C++ 名称修饰/去修饰的 java 库?

(类似于这个问题:C++ Name Mangling Library for Python

我正在尝试使用 Java 中的一些静态分析工具来进行 C++ 反汇编操作。我知道有“c++filt”,但我想避免与外部程序交互,而且 c++filt 只做demangling,而我想同时做 mangling 和 demangling 。

是否有一个 Java 库具有与此类似的方法:

0 投票
1 回答
97 浏览

c++ - 现有库中的名称修改 - 冲突

我们有很多已编译的 C++ 工具,包括一些静态链接的 C++ 库。我们扩展了一些库,当然还重新编译了它 -> 现在新的 dll 与旧的 C++ 工具不兼容!

错误:

TransceiveDataRaw@CCommonUtils@RegTestAPI@@QAEIPAEH0AAHPBD2@Z 在动态链接库 IFX_CC_RegTestBase.dll 中找不到

有没有办法在不重新编译我们的工具(有数百个工具)的情况下忽略这个名字的修改?

0 投票
2 回答
5017 浏览

c++ - 为什么名称修饰不标准化

我只是想知道为什么名称修饰从未被 C++ 标准标准化。显然,拥有不同的名称修饰算法会损害互操作性[1],而且我看不出让它实现定义的任何优势。

也就是说,与调用约定或原语大小相反,机器本身并不关心甚至不知道函数是如何被调用的。那么为什么它没有标准化,为什么它仍然没有标准化呢?编译器在过去无论如何都更改了版本之间的规则。

[1] 所有那些将功能输出为extern "C"说话量的人。

0 投票
1 回答
777 浏览

c++ - CUDA 驱动程序 API 和函数处理

我有一个需要 C++11 的项目,因此我将文件分为两类:使用 C++11 的文件,以及使用 C++03 并因此与 nvcc 编译器兼容的文件。当我有一个不是模板函数的内核时,很容易加载模块并使用cuModuleGetDataEx. 但是,当内核是模板时,函数名称在显式特化后会被破坏。这使得在使用 CUDA 驱动程序 API 加载模块后很难获得函数的句柄。例如,考虑这个函数。

p>

在我将它编译成 PTX 代码后,损坏的名称是_Z10vector_addIfjEvPKT_S2_PS0_T0_. 如何从我的主机代码中轻松查找和加载模板内核函数,而无需在文件中手动找到它们并复制它们的名称?

0 投票
1 回答
2712 浏览

c++ - 避免在 linux 下对共享对象 C 接口进行名称修改

在 Windows 下,我们有一个 C 接口 (extern "C" { // interface }) 到我们的 C++ 库,它使用模块定义文件 (.def) 导出未损坏的函数。

我正在尝试在我相对缺乏经验的 linux 下重新创建相同的东西。据我了解,在 NIX 系统下,所有功能都是默认导出的。考虑到这一点,我创建了一个共享对象,我通过 nm 命令运行了它。

我很惊讶地发现,与 Windows 不同,我的函数名称被弄乱了!

请问我该如何防止这种情况?