【问题标题】:My c++filt doesn't seem to work properly, no output changes我的 c++filt 似乎无法正常工作,没有输出更改
【发布时间】:2017-02-20 10:07:45
【问题描述】:

在我的 linux 上,我有一个 .cpp 文件

void f(){}
struct C{void f(){}};

我编译了它并将二进制文件串起来,尝试对函数名进行解构:

$c++filt __Z1gv
__Z1gv
$c++filt __ZN1C1fEv
__ZN1C1fEv

嗯,它似乎没有像我预期的那样工作。我这里有什么问题吗?我是否必须添加一些字母或删除一些字母才能使其工作?

请注意,这些名称是 clang 符号,似乎 c++filt 仅适用于我的 gcc 版本?或者 c++filt 应该有更新的版本来支持这两种编译器?

【问题讨论】:

  • 你如何得到这些错位的名字?
  • 使用nm 而不是stringsnm -C 打印已解构的符号。

标签: c++ linux function compilation c++filt


【解决方案1】:

您可能需要传递-_ 标志。

$ c++filt -_ __Z1gv
g()
$ c++filt -_ __ZN1C1fEv
C::f()

-_
--strip-underscore

在某些系统上,C 和 C++ 编译器都会在每个名称前加上下划线。例如,C 名称“foo”获取低级名称“_foo”。此选项删除初始下划线。 c++filt 是否默认去除下划线取决于目标。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    相关资源
    最近更新 更多