从C++内部获取损坏的符号名称
get mangled symbol name from inside C++
如何从C++程序中获取函数的损坏名称?
例如,假设我有一个标题:
// interface.h
#ifndef INTERFACE_H
#define INTERFACE_H
typedef void (*FooFunc)(int x, int y, double z, ...more complicated stuff...);
void foo(int x, int y, double z, ...more complicated stuff...);
#endif
我有一个客户端程序,可以加载实现接口的插件:
// client.h
#include "interface.h"
void call_plugin(so_filename)
{
void *lib = dlopen(so_filename, ...);
// HOW DO I IMPLEMENT THE NEXT LINE?
static const char *mangled_name = get_mangled_name(foo);
FooFunc func = (FooFunc)dlsym(lib, mangled_name);
func(x, y, z, ...);
dlclose(lib);
}
如何编写get_mangled_name
函数来计算foo
函数的损坏名称并将其作为字符串返回?
想到的一种方法是编译interface.o
并使用nm -A interface.o | grep foo
获得损坏的名称,然后将其作为硬编码字符串复制并粘贴到client.h
中,但这感觉是错误的方法。
想到的另一种方法是强制interface.h
成为纯C接口,在这里我将所有C++数据整理成一个通过C接口发送的大blob,然后在另一侧重建C++对象。这也让人感觉不太理想。
编辑
请注意,这实际上是一个不同于从混乱的名称中获取混乱的名称的问题。我想知道如何在编译时,从编译器可用的类型信息中,仅给定C++标识符的名称,从C++本身内部获取损坏的值。
您可以通过将函数声明为extern "C"
:来防止损坏
// interface.h
#ifndef INTERFACE_H
#define INTERFACE_H
typedef void (*FooFunc)(int x, int y, double z, ...more complicated stuff...);
extern "C" void foo(int x, int y, double z, ...more complicated stuff...);
#endif
并确保在组成共享库的所有源文件中都包含该头文件,因为此声明会影响编译器发出的相关函数的定义和引用。请注意,函数签名仍然可以使用非POD类型,例如std::string。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 将大双精度转换为无符号 int 期间堆栈损坏
- 双精度为“无符号长长”会导致内存(堆栈?)损坏
- OSX "ld" : 如何显示未解析符号的损坏名称?如何获取地图文件?
- 从C++内部获取损坏的符号名称
- 为什么返回类型中的decltype表达式必须在符号名称中损坏