From 4897885c5c22fc1ff19dd6439afcc2594545577f Mon Sep 17 00:00:00 2001 From: Khairul Azhar Kasmiran Date: Sun, 5 Jul 2026 22:33:25 +0800 Subject: [PATCH] Uniquify function flag realnames (#6601) --- librz/bin/p/bin_elf.inc | 14 ++- librz/core/analysis_tp.c | 3 +- librz/core/cbin.c | 27 +++- librz/include/rz_bin.h | 3 +- test/db/cmd/cmd_ag | 72 +++++------ test/db/cmd/cmd_flags | 2 +- test/db/cmd/cmd_pd | 2 +- test/db/cmd/cmd_pd2 | 2 +- test/db/cmd/cmd_pde | 2 +- test/db/formats/elf/elf-rel-x86_64 | 20 +-- test/db/formats/elf/elf-relaarch64 | 94 +++++++------- test/db/formats/elf/elf-relarm | 194 ++++++++++++++--------------- test/db/formats/elf/reloc | 106 +++++++++++----- test/db/formats/elf/riscv-relocs | 136 ++++++++++---------- 14 files changed, 370 insertions(+), 307 deletions(-) diff --git a/librz/bin/p/bin_elf.inc b/librz/bin/p/bin_elf.inc index 7695553467..5f32a8132f 100644 --- a/librz/bin/p/bin_elf.inc +++ b/librz/bin/p/bin_elf.inc @@ -361,11 +361,15 @@ static void destroy(RzBinFile *bf) { } static int get_file_type(RzBinFile *bf) { - struct Elf_(rz_bin_elf_obj_t) *obj = bf->o->bin_obj; - char *type = Elf_(rz_bin_elf_get_file_type(obj)); - int res = type ? ((!strncmp(type, "CORE", 4)) ? RZ_BIN_TYPE_CORE : RZ_BIN_TYPE_DEFAULT) : -1; - free(type); - return res; + ELFOBJ *bin = rz_bin_file_get_elf(bf); + switch (bin->ehdr.e_type) { + case ET_REL: + return RZ_BIN_TYPE_REL; + case ET_CORE: + return RZ_BIN_TYPE_CORE; + default: + return RZ_BIN_TYPE_DEFAULT; + } } static char *regstate(RzBinFile *bf) { diff --git a/librz/core/analysis_tp.c b/librz/core/analysis_tp.c index 7b781a804d..40205677e3 100644 --- a/librz/core/analysis_tp.c +++ b/librz/core/analysis_tp.c @@ -684,7 +684,8 @@ void propagate_types_among_used_variables(RzCore *core, HtUP *op_cache, RzAnalys } else if (aop->ptr != UT64_MAX) { RzFlagItem *flag = rz_flag_get_by_spaces(core->flags, aop->ptr, RZ_FLAGS_FS_IMPORTS, NULL); if (flag && flag->realname) { - full_name = flag->realname; + char *reloc_prefix = (char *)rz_str_rstr(flag->realname, "reloc."); + full_name = reloc_prefix ? reloc_prefix + 6 : flag->realname; callee_addr = aop->ptr; } } diff --git a/librz/core/cbin.c b/librz/core/cbin.c index 31b03258d6..c665d5dd64 100644 --- a/librz/core/cbin.c +++ b/librz/core/cbin.c @@ -1250,27 +1250,42 @@ static void reloc_set_flag(RzCore *core, RzBinReloc *reloc, const char *prefix, free(reloc_name); return; } + char *flag_prefix = NULL; char *flag_name = NULL; if (core->bin->prefix) { - flag_name = rz_str_newf("%s.%s.%s", core->bin->prefix, prefix, reloc_name); + flag_prefix = rz_str_newf("%s.%s", core->bin->prefix, prefix); } else { - flag_name = rz_str_newf("%s.%s", prefix, reloc_name); + flag_prefix = strdup(prefix); } + flag_name = rz_str_newf("%s.%s", flag_prefix, reloc_name); rz_name_filter(flag_name, 0, true); RzFlagItem *existing = rz_flag_get(core->flags, flag_name); if (existing && existing->offset == flag_addr) { // Mostly important for target flags. // We don't want hundreds of reloc.target.. flags at the same location - free(reloc_name); - free(flag_name); - return; + goto beach; } RzFlagItem *fi = rz_flag_set_next(core->flags, flag_name, flag_addr, bin_reloc_size(reloc)); if (fi) { - rz_flag_item_set_realname(fi, reloc_name); + RzBinFile *binfile = rz_bin_cur(core->bin); + RzBinPlugin *plugin = rz_bin_file_cur_plugin(binfile); + if (plugin && binfile && plugin->file_type && + (plugin->file_type(binfile) != RZ_BIN_TYPE_REL || strcmp(prefix, "reloc.target"))) { + char *suffix = ""; + if (strcmp(flag_name, fi->name)) { // there is a suffix + suffix = strrchr(fi->name, '.'); + } + char *prefixed_reloc_name = rz_str_newf("%s.%s%s", flag_prefix, reloc_name, suffix); + rz_flag_item_set_realname(fi, prefixed_reloc_name); + free(prefixed_reloc_name); + } else { + rz_flag_item_set_realname(fi, reloc_name); + } } +beach: free(reloc_name); + free(flag_prefix); free(flag_name); } diff --git a/librz/include/rz_bin.h b/librz/include/rz_bin.h index 67e6e1b285..3350ed64bd 100644 --- a/librz/include/rz_bin.h +++ b/librz/include/rz_bin.h @@ -185,7 +185,8 @@ typedef enum { enum { RZ_BIN_TYPE_DEFAULT = 0, - RZ_BIN_TYPE_CORE = 1 + RZ_BIN_TYPE_CORE = 1, + RZ_BIN_TYPE_REL = 2 }; #define RZ_BIN_STRING_SEARCH_MIN_STRING 4 diff --git a/test/db/cmd/cmd_ag b/test/db/cmd/cmd_ag index 7f89988e35..69ff532ea0 100644 --- a/test/db/cmd/cmd_ag +++ b/test/db/cmd/cmd_ag @@ -792,34 +792,34 @@ agf json_disasm agf sdb EOF EXPECT=<dH\x8b\U00000004%(" -\ 0x00005b08 ff150ac30100 call qword [reloc.__libc_start_main] ; [reloc.__libc_start_main:8]=0x23708 reloc.target.__libc_start_main +\ 0x00005b08 ff150ac30100 call qword [reloc.__libc_start_main] ; [0x21e18:8]=0x23708 reloc.target.__libc_start_main EOF RUN diff --git a/test/db/cmd/cmd_pd2 b/test/db/cmd/cmd_pd2 index c2a6a77350..6f12bccbfd 100644 --- a/test/db/cmd/cmd_pd2 +++ b/test/db/cmd/cmd_pd2 @@ -341,7 +341,7 @@ EXPECT=< 0x8d4890f4 ; likely ,==< 0x00005b04 7f08 jnle 0x5b0e ; rip=0x5b0e -> 0x8d4890f4 ; likely ,===< 0x00005b06 eb00 jmp 0x5b08 ; rip=0x5b08 -> 0xc30a15ff - `---> 0x00005b08 ff150ac30100 call qword [reloc.__libc_start_main] ; [reloc.__libc_start_main:8]=0x23708 reloc.target.__libc_start_main ; rsp=0xfffffffffffffff8 ; rip=0x23708 -> 0x464c457f reloc.target.__libc_start_main + `---> 0x00005b08 ff150ac30100 call qword [reloc.__libc_start_main] ; [0x21e18:8]=0x23708 reloc.target.__libc_start_main ; rsp=0xfffffffffffffff8 ; rip=0x23708 -> 0x464c457f reloc.target.__libc_start_main EOF RUN diff --git a/test/db/cmd/cmd_pde b/test/db/cmd/cmd_pde index 880903ed49..3f64438ba2 100644 --- a/test/db/cmd/cmd_pde +++ b/test/db/cmd/cmd_pde @@ -113,7 +113,7 @@ EXPECT=< 0x08000038 jal loc._x.0 ; RELOC 0 bar @ 0x08000034 nth paddr vaddr bind type size lib name -------------------------------------------------------- @@ -184,13 +184,13 @@ ir EOF EXPECT=< 0x08000044 jal loc._x.0 ; RELOC 0 bar @ 0x08000040 nth paddr vaddr bind type size lib name -------------------------------------------------------- @@ -214,11 +214,11 @@ is ir EOF EXPECT=< 0x0800004e addi a0, a0, 0xf ; RELOC TARGET 0 .LBB0_2 @ 0x0800004e @@ -720,13 +720,13 @@ EXPECT=< 0x0800005a addiw a0, a0, 0xf ; RELOC TARGET 0 .LBB0_2 @ 0x0800005a ; arg1 @@ -767,7 +767,7 @@ ir EOF EXPECT=<