相关疑难解决方法(0)

什么是Linux实用程序来破坏C++符号名称?

我已经c++filt命令解码一个符号,相反的工具是什么,并修改一个符号名称?

如果我想调用dlsym()一个受损的C++函数名,这将非常有用.我宁愿不对代码中的名称进行硬编码,因为由于新的编译器版本或新编译器品牌的使用或目前由于编译多个平台而导致其随着时间的推移而发生变化.

是否有一种编程方式来获取在运行时表示C++函数的字符串,以便代码独立于编译器?可能这样做的一种方法是在编译时调用实用程序,为正在使用的编译器执行名称修改,并将适当的受损的C++符号名称插入到字符串中dlsym()以供使用.

这是我在这个站点找到的最接近解决方案的方法,它通过使用固定的C样式名称来间接到您希望在库中定义的C++符号来实现dlsym(),但是如果您无法控制该库的内容提供,这不是一个选择.

c++ compiler-construction dlsym demangler

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

在GDB中调用lambda函数

#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)

lambda gdb c++11

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

功能到mangle/demangle函数

我以前,这里,已经表明,C++函数不容易在装配表示.现在我有兴趣阅读这种或那种方式,因为callgrind,valgrind的一部分,显示它们已经解组,而在汇编时它们被显示为损坏,所以我想要破坏valgrind函数输出或者取消函数的汇编名称.有没有尝试过类似的东西?我正在查看一个网站,发现以下内容:

 Code to implement demangling is part of the GNU Binutils package; 
see libiberty/cplus-dem.c and include/demangle.h.
Run Code Online (Sandbox Code Playgroud)

有人曾尝试过类似的东西,我想在C中进行demangle/mangle吗?我的编译器是gcc 4.x.

c c++ assembly function name-mangling

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

C++获取函数/方法的错位名称

嗨,我需要从c ++应用程序本身确定一个函数的错位名称.__FUNCDNAME__在g ++中有没有与宏相同的东西?

c++ g++ name-mangling

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

从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
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++ linux g++

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

C++在Linux平台上加载共享库并在运行时提取类实现

在C++中,是否可以在执行时加载共享库?

我希望用户选择在运行时加载哪个共享库,而无需重新编译整个程序.

dlopen() 是C的解决方案,但我的程序是用C++/Qt编写的,要提取的符号是Qt风格的类,是否有更多的"c ++"方法.

c++ linux qt qt4 shared-libraries

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