マングルされたシンボルのデマングル

アセンブルリストに出てくるマングルされたシンボルの羅列があまりにつからったので、ちょろっと調べてデマングルするためのコードを書いてみた。…だがしかし…

#include <cxxabi.h>
#include <cstdio>
#include <cstdlib>

int main(int argn, char **args) {
  if (argn > 1) {
    int status = 0 ;
    char *realname = abi::__cxa_demangle(args[1], 0, 0, &status);
    if (realname != NULL) {
      puts(realname);
      free(realname);
      return 0;
    } else {
      return 1;
    }
  } else {
    return 2;
  }
}

こんなんわざわざ書かなくても c++filt という便利コマンドがあった。

$ echo _ZN7android16LoadNativeBridgeEPKcPKNS_28NativeBridgeRuntimeCallbacksE |c++filt 
android::LoadNativeBridge(char const*, android::NativeBridgeRuntimeCallbacks const*)

objdump -d でディスアセンブルした出力をパイプで c++filt に流せば、可能な範囲でぜんぶデマングルしてくれる。