我已经c++filt命令解码一个符号,相反的工具是什么,并修改一个符号名称?
如果我想调用dlsym()一个受损的C++函数名,这将非常有用.我宁愿不对代码中的名称进行硬编码,因为由于新的编译器版本或新编译器品牌的使用或目前由于编译多个平台而导致其随着时间的推移而发生变化.
是否有一种编程方式来获取在运行时表示C++函数的字符串,以便代码独立于编译器?可能这样做的一种方法是在编译时调用实用程序,为正在使用的编译器执行名称修改,并将适当的受损的C++符号名称插入到字符串中dlsym()以供使用.
这是我在这个站点上找到的最接近解决方案的方法,它通过使用固定的C样式名称来间接到您希望在库中定义的C++符号来实现dlsym(),但是如果您无法控制该库的内容提供,这不是一个选择.
#include <iostream>
void do_something(void) {
std::cout << "blah blah" << std::endl;
auto lambda_func = [](void){
std::cout << "in lambda" << std::endl;
return;
};
lambda_func();
std::cout << "..." << std::endl;
return;
}
int main(int argc, char **argv) {
do_something();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个示例程序中,如果你编译(g++ gdb-call-lambda.cpp --std=c++11 -g)然后在gdb(gdb ./a.out)中运行它,你可以让GDB调用任何"普通"函数.例:
(gdb) break main
Breakpoint 1 at 0x4008e7: file gdb-call-lambda.cpp, line 20.
(gdb) r
Starting program: /home/keithb/dev/mytest/gdb-call-lambda/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffdfb8) at gdb-call-lambda.cpp:20
20 do_something();
(gdb) call do_something()
blah blah …Run Code Online (Sandbox Code Playgroud) 我以前,这里,已经表明,C++函数不容易在装配表示.现在我有兴趣阅读这种或那种方式,因为callgrind,valgrind的一部分,显示它们已经解组,而在汇编时它们被显示为损坏,所以我想要破坏valgrind函数输出或者取消函数的汇编名称.有没有尝试过类似的东西?我正在查看一个网站,发现以下内容:
Run Code Online (Sandbox Code Playgroud)Code to implement demangling is part of the GNU Binutils package; see libiberty/cplus-dem.c and include/demangle.h.
有人曾尝试过类似的东西,我想在C中进行demangle/mangle吗?我的编译器是gcc 4.x.
嗨,我需要从c ++应用程序本身确定一个函数的错位名称.__FUNCDNAME__在g ++中有没有与宏相同的东西?
如何从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
Run Code Online (Sandbox Code Playgroud)
我有一个客户端程序,可以加载实现该接口的插件:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
如何编写get_mangled_name函数来计算函数的错位名称foo并将其作为字符串返回?
想到的一种方法是编译interface.o和使用nm -A interface.o | …
在C++中,是否可以在执行时加载共享库?
我希望用户选择在运行时加载哪个共享库,而无需重新编译整个程序.
dlopen() 是C的解决方案,但我的程序是用C++/Qt编写的,要提取的符号是Qt风格的类,是否有更多的"c ++"方法.