标签: name-mangling

1511
推荐指数
11
解决办法
72万
查看次数

如何在.so文件中列出符号

如何列出从.so文件导出的符号?如果可能的话,我也想知道它们的来源(例如,如果它们是从静态库中引入的).

我正在使用gcc 4.0.2,如果这有所不同.

c c++ gcc symbols name-mangling

444
推荐指数
10
解决办法
34万
查看次数

为什么我们需要在C++中使用extern"C"{#include <foo.h>}?

为什么我们需要使用:

extern "C" {
#include <foo.h>
}
Run Code Online (Sandbox Code Playgroud)

特别:

  • 我们什么时候应该使用它?

  • 在编译器/链接器级别发生了什么,需要我们使用它?

  • 如何在编译/链接方面解决了需要我们使用它的问题?

c++ name-mangling linkage extern-c

133
推荐指数
10
解决办法
8万
查看次数

为什么C函数不能被命名?

我最近接受了一次采访,问了一个问题是extern "C"C++代码的用法是什么.我回答说它是在C++代码中使用C函数,因为C不使用名称修改.我被问到为什么C不使用名称错误,说实话我无法回答.

我知道当C++编译器编译函数时,它为函数提供了一个特殊的名称,主要是因为我们可以在C++中使用同名的重载函数,这些函数必须在编译时解析.在C中,函数的名称将保持不变,或者在它之前使用_.

我的疑问是:允许C++编译器破坏C函数有什么问题?我原以为编译器给它们的名称无关紧要.我们在C和C++中以相同的方式调用函数.

c c++ name-mangling extern-c

133
推荐指数
8
解决办法
1万
查看次数

解开std :: type_info :: name的结果

我目前正在研究一些日志代码,它们应该 - 除其他外 - 打印有关调用函数的信息.这应该相对容易,标准C++有一个type_info类.它包含typeid'd类/函数/ etc的名称.但它被破坏了.它不是很有用.即typeid(std::vector<int>).name()回归St6vectorIiSaIiEE.

有没有办法从中产生有用的东西?就像std::vector<int>上面的例子一样.如果它只适用于非模板类,那也没关系.

该解决方案应该适用于gcc,但如果我可以移植它会更好.这是为了记录所以它不是那么重要,它不能被关闭,但它应该有助于调试.

c++ gcc name-mangling

85
推荐指数
6
解决办法
4万
查看次数

Scala:如何动态实例化对象并使用反射调用方法?

在Scala中,动态实例化对象并使用反射调用方法的最佳方法是什么?

我想做Scala - 相当于以下Java代码:

Class class = Class.forName("Foo");
Object foo = class.newInstance();
Method method = class.getMethod("hello", null);
method.invoke(foo, null);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,类名和方法名都是动态传递的.上面的Java机制可能用于Foohello(),但Scala类型与Java的一对一不匹配.例如,可以为单个对象隐式声明类.Scala方法也允许各种符号作为其名称.两者都通过名称修改来解决.请参阅Java和Scala之间的Interop.

另一个问题似乎是通过解决重载和自动装箱来匹配参数,如Scala - Heaven和Hell的反思所述.

reflection scala name-mangling

50
推荐指数
5
解决办法
5万
查看次数

从demangled名称中获取受损的名称

有没有办法从g ++中的demangled名称中找回受损的名称.

例如,我有demangled名称func(char*, int),我该怎么做才能获得受损的名称,即_Z4funcPci返回?

我的问题是g ++特定的.

c++ g++ name-mangling

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

什么是名称错误,它是如何工作的?

请解释什么是名称修改,它是如何工作的,它解决了什么问题,以及使用了哪些上下文和语言.名称修改策略(例如编译器选择的名称和原因)加号.

language-agnostic name-mangling

42
推荐指数
4
解决办法
1万
查看次数

如何在linux上看到(C和C++)二进制符号?

你们使用哪些工具?demangle c ++符号如何能够将它传递给探查器工具,例如opannotate

谢谢

c c++ performance profiling name-mangling

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

是否可以显式调用名称损坏的函数?

假设我有一些类似的东西

struct Foo {
    void goo() {printf("Test");}
}

external void _ZN3Foo3gooEv(Foo *f);

int main() {
        Foo f;
        _ZN3Foo3gooEv(&f);
}
Run Code Online (Sandbox Code Playgroud)

是否可以在这里通过函数的名称修改版本调用 Foo::goo() ?

编辑:

作为澄清,这只是一个实验,看看是否可以显式调用名称损坏的函数。这里没有进一步的目标。

我认为所有成员函数基本上都将 this 指针作为它们的第一个参数。

我知道这不会链接,但我不明白为什么。我认为名称修改发生在编译时,当链接器运行时,它会解析对名称修改函数的调用。(这就是为什么我想如果我们将 _ZN3Foo3gooEv 保留为 extern,它会去符号表中查找)。

我在这里误解了什么吗?

c++ name-mangling function-call

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