diff --git a/librz/bin/bin_demangle.c b/librz/bin/bin_demangle.c index 1d92be7329..b086e07282 100644 --- a/librz/bin/bin_demangle.c +++ b/librz/bin/bin_demangle.c @@ -106,6 +106,8 @@ RZ_API RZ_OWN char *rz_bin_demangle(RZ_NULLABLE RzBin *bin, RZ_NULLABLE const ch return rz_demangler_rust(mangled, flags); case RZ_BIN_LANGUAGE_CXX: return rz_demangler_cxx(mangled, flags); + case RZ_BIN_LANGUAGE_DLANG: + return rz_demangler_dlang(mangled, flags); default: break; } diff --git a/librz/bin/bin_language.c b/librz/bin/bin_language.c index a7ce794a38..daf480c72d 100644 --- a/librz/bin/bin_language.c +++ b/librz/bin/bin_language.c @@ -19,10 +19,7 @@ static inline bool check_objc(RzBinSymbol *sym) { } static inline bool check_dlang(RzBinSymbol *sym) { - if (!strncmp(sym->name, "_D2", 3)) { - return true; - } - return !strncmp(sym->name, "_D4", 3); + return !strncmp(sym->name, "_D", 2) && IS_DIGIT(sym->name[2]); } static inline bool check_swift(RzBinSymbol *sym) { diff --git a/librz/demangler/demangler.c b/librz/demangler/demangler.c index 42df2927c7..90c66197a0 100644 --- a/librz/demangler/demangler.c +++ b/librz/demangler/demangler.c @@ -26,6 +26,7 @@ DEFINE_DEMANGLER_PLUGIN(java, "java", "LGPL3", "deroad", libdemangle_handler_jav DEFINE_DEMANGLER_PLUGIN(msvc, "msvc", "LGPL3", "inisider", libdemangle_handler_msvc); DEFINE_DEMANGLER_PLUGIN(objc, "objc", "LGPL3", "pancake", libdemangle_handler_objc); DEFINE_DEMANGLER_PLUGIN(pascal, "pascal", "LGPL3", "deroad", libdemangle_handler_pascal); +DEFINE_DEMANGLER_PLUGIN(dlang, "dlang", "LGPL3", "historicattle", libdemangle_handler_d); static RzDemanglerPlugin *demangler_static_plugins[] = { RZ_DEMANGLER_STATIC_PLUGINS }; @@ -73,6 +74,13 @@ RZ_API RZ_OWN char *rz_demangler_msvc(RZ_NONNULL const char *symbol, RzDemangler return libdemangle_handler_msvc(symbol, (RzDemangleOpts)flags); } +/** + * \brief Demangles DLang symbols + */ +RZ_API RZ_OWN char *rz_demangler_dlang(RZ_NONNULL const char *symbol, RzDemanglerFlag flags) { + return libdemangle_handler_d(symbol, (RzDemangleOpts)flags); +} + /** * \brief Initializes the plugin list and returns a RzDemangler struct */ diff --git a/librz/demangler/meson.build b/librz/demangler/meson.build index cc76e21103..132eed606d 100644 --- a/librz/demangler/meson.build +++ b/librz/demangler/meson.build @@ -4,7 +4,8 @@ demangler_plugins_list = [ 'objc', 'pascal', 'cpp', - 'rust' + 'rust', + 'dlang', ] demangler_plugins = { diff --git a/librz/include/rz_demangler.h b/librz/include/rz_demangler.h index f69d9c1a5a..433d47157a 100644 --- a/librz/include/rz_demangler.h +++ b/librz/include/rz_demangler.h @@ -43,6 +43,7 @@ RZ_API RZ_OWN char *rz_demangler_objc(RZ_NONNULL const char *symbol, RzDemangler RZ_API RZ_OWN char *rz_demangler_pascal(RZ_NONNULL const char *symbol, RzDemanglerFlag flags); RZ_API RZ_OWN char *rz_demangler_rust(RZ_NONNULL const char *symbol, RzDemanglerFlag flags); RZ_API RZ_OWN char *rz_demangler_msvc(RZ_NONNULL const char *symbol, RzDemanglerFlag flags); +RZ_API RZ_OWN char *rz_demangler_dlang(RZ_NONNULL const char *symbol, RzDemanglerFlag flags); RZ_API RZ_OWN RzDemangler *rz_demangler_new(void); RZ_API void rz_demangler_free(RZ_NULLABLE RzDemangler *demangler); diff --git a/subprojects/libdemangle.wrap b/subprojects/libdemangle.wrap index 5c78977306..8633659070 100644 --- a/subprojects/libdemangle.wrap +++ b/subprojects/libdemangle.wrap @@ -1,4 +1,4 @@ [wrap-git] url = https://github.com/rizinorg/rz-libdemangle.git -revision = e633061e901208a20ed90f8aaf0b64f25caf73eb +revision = d86b1c1514a0ad19762feb596e99b691e49e7730 depth = 1 diff --git a/test/db/formats/demangling_bin b/test/db/formats/demangling_bin index 86a93ed184..c434d95411 100644 --- a/test/db/formats/demangling_bin +++ b/test/db/formats/demangling_bin @@ -530,3 +530,12 @@ EXPECT=< String EOF RUN + +NAME=elf dlang demangling +FILE=bins/elf/analysis/class_dlang +CMDS=is~0x00089b24 +EXPECT=<