标签: name-mangling

防止Ada DLL中的错位名称

在创建Ada DLL时,是否有一种简单的方法可以防止Ada名称被破坏?

这是我的.adb代码

with Ada.Text_IO;
package body testDLL is
   procedure Print_Call is
   begin
      Ada.Text_IO.Put_Line("Hello World");
   end Print_Call;

   function Add_Nums(A,B : in Integer) return Integer is
   begin
      return A + B;
   end Add_Nums;

end testDLL;
Run Code Online (Sandbox Code Playgroud)

我的.ads

package testDLL is
   procedure Print_Call;
   pragma export (dll, Print_Call, "Print_Call");

   function Add_Nums(A,B : in Integer) return Integer;
   pragma export (dll, Add_Nums, "Add_Nums");
end testDLL;
Run Code Online (Sandbox Code Playgroud)

我的python

import ctypes

TestDLL = ctypes.WinDLL ("libTestDLL.dll")
Print_Call = getattr(TestDLL, "Print_Call@0")
Print_Call()
Run Code Online (Sandbox Code Playgroud)

你可以看到我必须在函数名的末尾添加'@ 0',但是当我将相同的代码移动到不同的编译器时,这似乎会改变.这给我带来了一些问题.我需要一个标准的修改格式或一种方法来删除整个修改.

python dll ada name-mangling

3
推荐指数
1
解决办法
320
查看次数

求STL-aware c ++ filt

在我的开发环境中,我正在使用GNU C++ 3.4.6编译代码库.代码正在开发中,不幸的是偶尔崩溃.很高兴能够通过demangler运行回溯,我使用c ++ filt 3.4.当函数具有许多STL参数时,问题就来了.考虑

My_callback::operator()(
   Status&,
   std::set<std::string> const&,
   std::vector<My_parameter*> const&,
   My_attribute_set const&,
   std::vector<My_parameter_base*> const&,
   std::vector<My_parameter> const&,
   std::set<std::string> const&
)
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

当此函数在回溯中时,我平台上的错位输出是:

(_ZN30My_callbackclER11StatusRKSt3setISsSt4lessISsESaISsEERKSt6vectorIP13My_parameterSaISB_EERK17My_attribute_setRKS9_IP18My_parameter_baseSaISK_EERKS9_ISA_SaISA_EES8_+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)

c ++ filt巧妙地将其解析为

(My_callback::operator()(Status&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<My_parameter*, std::allocator<My_parameter*> > const&, My_attribute_set const&, std::vector<My_parameter_base*, std::allocator<My_parameter_base*> > const&, std::vector<My_parameter, std::allocator<My_parameter> > const&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)

这与使用模板时遇到的编译器错误相同.但是,STL是一个相当规则且可识别的模板包.所以我希望有人在那里创建了一个增强版的c …

c++ stl name-mangling c++filt demangler

2
推荐指数
1
解决办法
347
查看次数

在范围内重用标识符的任何方法?

通常使用相同的标识符(如变量名称)作为同一范围内的另一个变量之类的东西会通过编译器生成错误.是否有任何技术实际向编译器指示在此范围内此特定点此名称有其自己的用途并且是用来引用这个变量,但是在这一点之后,同一个名称会引用另一个其他目的的另一个变量吗?

c++ compiler-construction scope name-mangling

2
推荐指数
2
解决办法
1719
查看次数

c 中的全局静态/非静态变量是如何被破坏的?

我可以想象var一个函数内的静态变量func被命名为var@func

全局静态和非静态变量呢?

c name-mangling

2
推荐指数
1
解决办法
1871
查看次数

如何在使用jQuery和ASP.NET用户控件时处理元素ID

我在ASP.NET中有一些用户控件,我使用的只是HTML,也就是说,没有任何代码隐藏.

我有一个控件,我有一个具有固定ID的元素,我用一些jQuery客户端脚本指向它.例如:

<div id="slider-section"></div>

<script type="text/javascript" language="javascript">
    $(document).ready(function () {
        var slider = $('#slider-section');
        // ... do something with the jQuery Object
    });
</script>
Run Code Online (Sandbox Code Playgroud)

这非常好,没有任何问题.但是这有副作用.事实上,如果我在我的页面上添加两个相同用户控件的实例,我将有两个具有相同ID的元素.

您认为哪种方法可以处理这种情况?

谢谢

asp.net jquery user-controls name-mangling name-matching

2
推荐指数
1
解决办法
6526
查看次数

命名静态对象的名称

我在C++中看到了关于动态链接的这篇文章.

我们可以创建一个C++工厂,它将返回我们感兴趣的类的对象.此外,我们应该在工厂的文件范围内创建一个静态对象,以便可以使用它来定位它dlsym().(文章建议静态对象不会受到名称损坏.)

为什么静态对象没有名称损坏?

c++ static-members name-mangling dynamic-linking

2
推荐指数
1
解决办法
149
查看次数

如何布局将C与C++混合的函数原型

我有一个标题,我想包含.c和.cpp文件.

所以我知道名字错误和外部"C"所以......

#ifdef __cplusplus
extern "C"
{
    int isPrime(int64_t p);
}
#endif
Run Code Online (Sandbox Code Playgroud)

但是当我在.c文件中包含它时,由于它没有看到该函数 #ifdef __cplusplus

所以我最终制作了2份:

 #ifdef __cplusplus
    extern "C"
    {
        int isPrime(int64_t p);
    }
 #else
     int isPrime(int64_t p);
 #endif
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点...我想要制作另一个名为prototypes.h的标题,并将其包含在那两个地方......但是我有什么简单的遗漏吗?

c c++ name-mangling extern-c

2
推荐指数
2
解决办法
181
查看次数

在同一个编译器 (vc12) 上编译时,是什么导致了重命名的差异?

我目前正在尝试编译 CppUTest 库并将其与我的项目链接。我使用 CMake 为 CppUTest 库创建了一个 Visual Studio 2013 解决方案并构建了它。

但是,当我将创建的 CppUTest.lib 链接到我的应用程序时,我收到一个链接器错误,告诉我它找不到多个符号,例如

??0Utest@@QAE@XZ)

或者

?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z

现在,当我在 lib 和选项 /LINKERMEMBER 上使用 dumpbin.exe 时,我会得到库中包含名称的符号列表

??0Utest@@QEAA@XZ

?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z

所以实际存在的名称与我的项目期望的名称略有不同,我不知道是什么导致了这个问题。是否有任何编译选项会导致这些更改,或者我是否使用不同的编译器,尽管我认为它是相同的?

c++ linker-errors name-mangling cpputest visual-studio-2013

2
推荐指数
1
解决办法
514
查看次数

ZTV,ZTS,ZTI在gdb x/nfu"vtable_address"的结果中意味着什么?

代码

class Parent {
 public:
  virtual void Foo() {}
  virtual void FooNotOverridden() {}
};

class Derived : public Parent {
 public:
  void Foo() override {}
};

int main() {
  Parent p1, p2;
  Derived d1, d2;
}
Run Code Online (Sandbox Code Playgroud)

2. gdb命令

(gdb) x/300xb 0x400b30
Run Code Online (Sandbox Code Playgroud)

0x400b30 是d vtable的第一个地址.

3. gdb结果

0x400b30 <_ZTV7Derived>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x400b38 <_ZTV7Derived+8>:  0x80    0x0b    0x40    0x00    0x00    0x00    0x00    0x00
0x400b40 <_ZTV7Derived+16>: 0x60    0x0a    0x40    0x00    0x00    0x00    0x00    0x00
0x400b48 <_ZTV7Derived+24>: 0x70    0x0a …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gdb name-mangling vtable

2
推荐指数
1
解决办法
236
查看次数

如果重载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 ++编译器时会发生链接器错误.

test.h:

extern "C" {
int func( char* str, int size  );
}
#include <string>
int func( std::string str );
Run Code Online (Sandbox Code Playgroud)

TEST.CPP:

#include <stdio.h>
#include <string>
#include "test.h"

int func( char *buf, int size )
{
   return snprintf( buf, size, "c-style func" );
}

int func( std::string& str )
{
    str = "c++-style func";
    return str.size();
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <iostream>
#include <string>
#include "test.h"

int main()
{
   char …
Run Code Online (Sandbox Code Playgroud)

c c++ linker name-mangling

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