标签: name-mangling

由于名称损坏而未解决的外部符号

我将XERCES函数从2.6升级到2.8时面临链接器错误

unresolved external symbol (?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QBG0@Z)
Run Code Online (Sandbox Code Playgroud)

我检查了xerces-c_2.8.lib,发现名称lib与我的.obj文件中的名称有点不同它如图所示

?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QB_W0@Z
Run Code Online (Sandbox Code Playgroud)

所以我理解链接器不会找到匹配并抛出错误.

但我无法理解为什么我的.obj文件包含不同的签名.

代码包括正确的头文件和来自仍然不正确的名称的lib.

任何帮助,将不胜感激.

c++ linker name-mangling

5
推荐指数
1
解决办法
1201
查看次数

全局常量变量的 G++ 名称修改

有人可以帮助我理解 gcc 名称修改约定吗?

考虑以下测试代码

#include <stdio.h>

const int x = 42;
int y = 42;

int main( int argc, const char* argv[] )
{
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行时,nm我得到以下(令人惊讶的?)结果:

0000000000000000 T main
0000000000000000 D y
0000000000000000 r _ZL1x
Run Code Online (Sandbox Code Playgroud)

这表明编译器只修改放置在只读部分中的全局变量。我希望编译器要么破坏 ALL 要么没有全局变量

这是预期的行为吗?对我来说,它看起来不一致。

c c++ gcc g++ name-mangling

5
推荐指数
1
解决办法
2236
查看次数

如何通过禁用名称修改来 PInvoke 实例方法

给定 foo.dll 中的以下 c++ 类

class a{
  private:
    int _answer;

  public:
    a(int answer) { _answer = answer; }
    __declspec(dllexport) int GetAnswer() { return _answer; }
}
Run Code Online (Sandbox Code Playgroud)

我想要来自 C# 的 pInvoke GetAnswer。为此,我使用以下方法:

[DllImport("foo.dll", CallingConvention = CallingConvention.ThisCall, EntryPoint= "something")]
public static extern int GetAnswer(IntPtr thisA);
Run Code Online (Sandbox Code Playgroud)

我传入一个指向 a 的 IntPtr(我从其他地方得到的,这并不重要)。 CallingConvention = CallingConvention.ThisCall确保正确处理

这个问题很酷的是,我知道到目前为止我是对的,因为它已经很好用了! 使用 Depends.exe,我可以看到“GetAnswer”被导出为 ?GetAnswer@a@@UAEHXZ (或者接近的东西 - 关键是它的名称被破坏了)。当我将损坏的名称插入 EntryPoint 的“某物”时,一切正常!我花了大约一天的时间才意识到使用 Depends.exe,所以我将把它留在这里作为对任何有类似问题的人的帮助。

我真正的问题是: 有什么方法可以在 GetAnswer 上禁用 C++ 名称重整,这样我就不需要将重整名称作为我的入口点。将重整名称放在那里似乎可能会中断,因为我对名称重整的理解是,如果编译器更改,它会更改。此外,对于我想要 pInvoke 的每个实例方法使用 Depends.exe 也很麻烦。

编辑:忘记添加我尝试过的内容:我似乎无法将 extern "C" 放在函数声明中,尽管我可以将其粘贴在定义上。虽然这似乎没有帮助(当你考虑它时这很明显)

我能想到的唯一其他解决方案是一个 c 风格的函数,它包装了实例方法并将 a …

c# c++ pinvoke name-mangling

5
推荐指数
1
解决办法
2007
查看次数

gcc中是否有与__cxa_demangle等效的Microsoft VC ++?

我已经尝试过UnDecorateSymbolName()。

例如:

    #include <windows.h> 
    #include <tchar.h>
    #include <iostream>
    #pragma comment(lib,"dbghelp.lib")     

    int main(int argc, _TCHAR* argv[])  
    {  
      TCHAR szUndecorateName[256];  
      memset(szUndecorateName,0,256);  
      if (2==argc)  
      {  
        ::UnDecorateSymbolName(argv[1],szUndecorateName,256,0);  
        std::cout<<szUndecorateName<<std::endl;  
      }  
      return 0;  
    }
Run Code Online (Sandbox Code Playgroud)

我修改了例子。它可以很好地工作。

reflection name-mangling visual-c++

5
推荐指数
1
解决办法
835
查看次数

打印给定类型名称的模板

我想打印类型的名称以进行调试,所以我创建了一个函数来实现这个目的(事实上,我从另一个答案借用了它,我现在找不到),该函数如下所示:

template <typename T> std::string TypeName(T)
{
    auto name = typeid(T).name();
    int status = 0;

    std::unique_ptr<char, void(*)(void*)> res {
        abi::__cxa_demangle(name, NULL, NULL, &status),
        std::free
    };

    return ((status == 0) ? res.get() : name);
}
Run Code Online (Sandbox Code Playgroud)

Live Demo

它工作正常:

int i = 0;
float f = 0.f;

std::cout << TypeName(i) << '\n'; // int
std::cout << TypeName(f) << '\n'; // float, so far so good

std::cout << TypeName(&i) << '\n'; // int *
std::cout << TypeName(&f) << '\n'; // float *, as …
Run Code Online (Sandbox Code Playgroud)

c++ templates name-mangling

5
推荐指数
1
解决办法
263
查看次数

如何从未修饰的stdcall DLL自动生成导入库?

处理从DLL创建LIB的一般方法在如何在有.dll文件和头文件的情况下创建.lib文件中描述- 仍然是为具有未修饰stdcall函数的DLL创建导入库(例如核心WinAPI DLL kernel32.dll等) .),一个要经过一个相当漫长和复杂的过程(如例如描述这里).对于具有许多功能的DLL,此过程非常耗时且容易出错 - 当原始DLL发生更改时(例如,由于供应商更新),它在自动渲染情况下也很容易失败.

有没有一种有效的自动化方法?

c++ dll name-mangling stdcall

5
推荐指数
1
解决办法
872
查看次数

命名为用于分析和调试的C ++ lambda

我们在代码中使用了很多C ++ 11 lambda,但发现这样做会带来性能分析和调试工具的困难。例如,MSVC分析器将lambda显示为:

`anonymous namespace'::<lambda0>::operator()(void)const     
`anonymous namespace'::<lambda1>::operator()(double,double)const    
...
Run Code Online (Sandbox Code Playgroud)

乍看之下,这实际上无助于在stacktrace或事件探查器摘要中标识lambda。

有什么办法可以给lambda一个名称来进行调试(它应该是定义它的作用域的错误名称,恕我直言)?我对特定于平台的解决方案(#pragma?)和hack没问题。

特殊的名称空间可以工作,但需要从常规名称空间跳到一些障碍。

c++ debugging lambda profiling name-mangling

5
推荐指数
0
解决办法
650
查看次数

链接到不带 .lib 的 .dll 文件

我需要将一些 Delphi 代码重写为 C++,并且我们需要链接到动态库TMLComm2004.dll。事实证明,我们没有任何.lib文件,因此我们决定使用以下命令行生成它:

dumpbin /EXPORTS C:\Users\fayard\Desktop\TMLComm2004.dll > C:\Users\fayard\Desktop\TMLComm2004.txt
Run Code Online (Sandbox Code Playgroud)

我们得到如下文件

Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file C:\Users\fayard\Desktop\TMLComm2004.dll

File Type: DLL

  Section contains the following exports for TMLcomm.dll

    00000000 characteristics
    401F6AD5 time date stamp Tue Feb  3 10:33:09 2004
        0.00 version
          1 ordinal base
          27 number of functions
          27 number of names

    ordinal hint RVA      name

          1    0 00001122 _MSK_COFFDownloadFlash@16
          2    1 0000114F _MSK_COFFDownloadRAM@20
          3    2 0000106E …
Run Code Online (Sandbox Code Playgroud)

c dll name-mangling

5
推荐指数
1
解决办法
2201
查看次数

GNU 链接器:适应名称修改算法的更改

我正在尝试重新编译现有的 C++ 应用程序。不幸的是,我必须依赖一个专有库,我只有一个预编译的静态存档。

我使用 g++ 版本 7.3.0 和 ld 版本 2.30。
无论它是用什么 GCC 版本编译的,它都是古老的。

头文件定义了方法:

class foo {
    int bar(int & i);
}
Run Code Online (Sandbox Code Playgroud)

如图nm lib.a所示,库存档包含相应的导出函数:

T bar__4fooRi
Run Code Online (Sandbox Code Playgroud)

nm app.o显示了我最近使用不同类型的名称修饰的编译器:

U _ZN4foo9barERi
Run Code Online (Sandbox Code Playgroud)

因此,链接器无法解析库提供的符号。

是否有任何选项可以选择名称修饰算法?
我可以引入地图或明确定义损坏的名称吗?

c++ name-mangling ld

5
推荐指数
1
解决办法
1108
查看次数

如何检查标识符是否为 dunder 或类私有(即将被破坏)?

我正在编写一个项目,提供有关变量名称的建议,并且我希望它能够判断名称是否与任何保留的标识符类匹配。第一个(“private”)非常简单,只是name.startswith('_'),但 dunder 和类私有名称更复杂。有没有内置函数可以告诉我?如果不是,Python 使用的内部规则是什么?

对于 dunder,检查name.startswith('__') and name.endswith('__')不起作用,因为它会匹配'__'。也许像这样的正则表达式^__\w+__$会起作用?

对于类私有,name.startswith('__')不起作用,因为 dunder 名称不会被破坏,也不会像 那样只包含下划线的名称'___'。所以看来我必须检查名称是否以两个下划线开头,不以两个下划线结尾,并且至少包含一个非下划线字符。是对的吗?在代码中:

name.startswith('__') and not name.endswith('__') and any(c != '_' for c in name)
Run Code Online (Sandbox Code Playgroud)

我最关心的是边缘情况,所以我想确保我的规则 100% 正确。我读过对象名称之前的单下划线和双下划线的含义是什么?但细节还不够。

python identifier name-mangling magic-methods

5
推荐指数
1
解决办法
973
查看次数