From c893dc3d31aaf381b1d511bd24912cf6311968d2 Mon Sep 17 00:00:00 2001 From: Zhou Kang Date: Wed, 28 Jun 2023 01:59:03 +0000 Subject: [PATCH] add debug info for find symbol --- .gitignore | 2 + Cargo.lock | 91 +++++++++++++++++++++++++++++++++++++ src/binfmt_rto/Makefile | 4 ++ src/binfmt_rto/binfmt_rto.c | 8 ++++ src/elf_link_common.c | 18 +++++++- 5 files changed, 122 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bc0df00..1f546ea 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ target .idea/ libs vendor +Cargo.lock + diff --git a/Cargo.lock b/Cargo.lock index 3313537..275c7ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,6 +166,36 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "flate2" version = "1.0.26" @@ -211,6 +241,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -278,6 +314,26 @@ dependencies = [ "libc", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + [[package]] name = "itoa" version = "1.0.6" @@ -322,6 +378,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "lock_api" version = "0.4.10" @@ -549,6 +611,20 @@ dependencies = [ "bitflags", ] +[[package]] +name = "rustix" +version = "0.37.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "ryu" version = "1.0.13" @@ -704,9 +780,24 @@ dependencies = [ "inotify", "log", "serde", + "tempfile", "toml", ] +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys", +] + [[package]] name = "thiserror" version = "1.0.40" diff --git a/src/binfmt_rto/Makefile b/src/binfmt_rto/Makefile index 583c8b5..851b88b 100644 --- a/src/binfmt_rto/Makefile +++ b/src/binfmt_rto/Makefile @@ -6,6 +6,10 @@ PWD := $(shell pwd) modules: $(MAKE) -C $(KDIR) M=$(PWD) modules +install: + rmmod binfmt_rto || true + insmod binfmt_rto.ko use_rto=1 debug=1 + .PHONEY: clean clean: diff --git a/src/binfmt_rto/binfmt_rto.c b/src/binfmt_rto/binfmt_rto.c index c797848..f1a1fe4 100644 --- a/src/binfmt_rto/binfmt_rto.c +++ b/src/binfmt_rto/binfmt_rto.c @@ -60,6 +60,11 @@ static bool use_rto = false; module_param(use_rto, bool, 0600); MODULE_PARM_DESC(use_rto, "use rto featue"); +/* debug mode only process rto format */ +static int debug = 0; +module_param(debug, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(debug, "debug mode"); + #ifndef EF_AARCH64_AOT #define EF_AARCH64_AOT (0x00010000U) #endif @@ -1158,6 +1163,7 @@ static int load_elf_binary(struct linux_binprm *bprm) load_rto: retval = -ENOEXEC; + /* close feature to rmmod this ko */ if (!use_rto) { goto out; @@ -1186,6 +1192,8 @@ load_rto: if (elf_ex->e_flags & EF_AARCH64_AOT) { if (!try_replace_file(bprm)) goto load_rto; + } else if (debug) { + goto out; } #endif diff --git a/src/elf_link_common.c b/src/elf_link_common.c index 394ff77..39685e8 100644 --- a/src/elf_link_common.c +++ b/src/elf_link_common.c @@ -85,6 +85,19 @@ unsigned long get_new_addr_by_symbol_mapping(elf_link_t *elf_link, char *symbol_ return NOT_FOUND; } +void show_symbol_mapping(elf_link_t *elf_link) +{ + int len = elf_link->symbol_mapping_arr->len; + elf_symbol_mapping_t *sym_maps = elf_link->symbol_mapping_arr->data; + elf_symbol_mapping_t *sym_map = NULL; + + printf("symbol_name symbol_addr\n"); + for (int i = 0; i < len; i++) { + sym_map = &sym_maps[i]; + printf("%-32s %016lx\n", sym_map->symbol_name, sym_map->symbol_addr); + } +} + static void append_symbol_mapping_by_name(elf_link_t *elf_link, char *key, elf_file_t *ef, char *sym_name) { unsigned long old_sym_addr = find_sym_old_addr(ef, sym_name); @@ -554,8 +567,11 @@ static unsigned long _get_new_addr_by_sym_name(elf_link_t *elf_link, char *sym_n goto out; } - if (is_share_mode(elf_link) == false) + if (is_share_mode(elf_link) == false) { + si_log_set_global_level(SI_LOG_LEVEL_DEBUG); + show_symbol_mapping(elf_link); si_panic("not found symbol %s\n", sym_name); + } out: if (ELF64_ST_TYPE(sym->st_info) == STT_GNU_IFUNC) -- Gitee