diff --git a/src/elf_hugepage.c b/src/elf_hugepage.c index ae4a21d4e7ad0140e1f857cc270e62902397124d..bc61d2b2667ae0e7806b08226acb7b55c046017c 100644 --- a/src/elf_hugepage.c +++ b/src/elf_hugepage.c @@ -62,20 +62,27 @@ error_elf: return ret; } -static int _elf_set_flags(char *path, unsigned int flags) +static int _elf_write_read_flags(char *path, unsigned int *flags, bool set) { + bool is_readonly = !*flags; elf_file_t *ef = malloc(sizeof(elf_file_t)); if (ef == NULL) { SI_LOG_ERR("malloc fail\n"); - return -1; + return -12; } - int ret = elf_read_file(path, ef, false); + int ret = elf_read_file(path, ef, is_readonly); if (ret != 0) { - return -1; + return ret; } - ef->hdr->e_flags |= flags; + if (!is_readonly) { + if (set) + ef->hdr->e_flags |= *flags; + else + ef->hdr->e_flags &= (0xffffffffU ^ *flags); + } + *flags = ef->hdr->e_flags; elf_close_file(ef); free(ef); @@ -83,25 +90,33 @@ static int _elf_set_flags(char *path, unsigned int flags) return 0; } -static int _elf_unset_flags(char *path, unsigned int flags) +static int _elf_set_flags(char *path, unsigned int flags) { - elf_file_t *ef = malloc(sizeof(elf_file_t)); - if (ef == NULL) { - SI_LOG_ERR("malloc fail\n"); - return -1; - } + if (!flags) + return -22; + return _elf_write_read_flags(path, &flags, true); +} - int ret = elf_read_file(path, ef, false); - if (ret != 0) { - return -1; - } +static int _elf_unset_flags(char *path, unsigned int flags) +{ + if (!flags) + return -22; + return _elf_write_read_flags(path, &flags, false); +} - ef->hdr->e_flags &= (0xffffffffU ^ flags); +/* + * return 1 means flags are set, 0 means flags are *not all* set; + * negative means error. +*/ +static int _elf_test_flags(char *path, unsigned int flags) +{ + unsigned int all_flags = 0; + int ret; + ret = _elf_write_read_flags(path, &all_flags, 0); + if (ret) + return ret; - elf_close_file(ef); - free(ef); - ef = NULL; - return 0; + return ((all_flags & flags) == flags); } int elf_set_rto(char *path, bool state) @@ -112,6 +127,19 @@ int elf_set_rto(char *path, bool state) return _elf_unset_flags(path, OS_SPECIFIC_FLAG_RTO); } +int elf_get_rto(char *path) +{ + int ret = _elf_test_flags(path, OS_SPECIFIC_FLAG_RTO); + if (ret < 0) + return ret; + + if (ret) + SI_LOG_INFO("%s FLAG RTO is set\n", path); + else + SI_LOG_INFO("%s FLAG RTO is not set\n", path); + return 0; +} + void elf_set_hugepage(elf_link_t *elf_link) { int i, exec_only = 1; diff --git a/src/elf_hugepage.h b/src/elf_hugepage.h index 93ed00c9f2cce6f610ba1b375f37496b9d457b3f..54651f49e40402070e5ff6424e4eec7c4af865ca 100644 --- a/src/elf_hugepage.h +++ b/src/elf_hugepage.h @@ -19,6 +19,7 @@ void elf_set_hugepage(elf_link_t *elf_link); int elf_set_symbolic_link(char *path, bool state); int elf_set_rto(char *path, bool state); +int elf_get_rto(char *path); #define RTO_LOAD_FLAG_LOAD 0x1 #define RTO_LOAD_FLAG_PRELOAD 0x2 diff --git a/src/elf_read_elf.c b/src/elf_read_elf.c index 3a1796b14a24feef128d303f4c23d6cdb2dabb7f..612400811e860f6c28e52b37d401c451177f449f 100644 --- a/src/elf_read_elf.c +++ b/src/elf_read_elf.c @@ -676,8 +676,8 @@ int elf_read_file(char *file_name, elf_file_t *ef, bool is_readonly) // The build_id may not exist if (!ef->build_id) { - SI_LOG_ERR("check build_id fail, build_id in %s is NULL.\n", file_name); - return -1; + SI_LOG_INFO("check build_id fail, build_id in %s is NULL.\n", file_name); + // return -1; } // check elf arch diff --git a/src/main.c b/src/main.c index 3927b3ce8ab453d9e29b85a28067722465ac87c9..fcd79da900c9eb1e344db63c11c92e395b842aaa 100644 --- a/src/main.c +++ b/src/main.c @@ -45,17 +45,19 @@ int main(int argc, char *argv[]) } static struct option long_options[] = { - {"output", required_argument, NULL, 'o'}, - {"debug", no_argument, NULL, 'd'}, - {"set", required_argument, NULL, 's'}, - {"unset", required_argument, NULL, 'u'}, - {"set-rto", required_argument, NULL, '1'}, - {"unset-rto", required_argument, NULL, '0'}, - {"hook", no_argument, NULL, 'h'}, - {ELF_LINK_STATIC_S, no_argument, NULL, 'S'}, - {ELF_LINK_STATIC_NOLIBC_S, no_argument, NULL, 'N'}, - {ELF_LINK_STATIC_NOLD_S, no_argument, NULL, 'I'}, - {NULL, 0, NULL, 0} + {"output", required_argument, NULL, 'o'}, + {"debug", no_argument, NULL, 'd'}, + {"set", required_argument, NULL, 's'}, + {"unset", required_argument, NULL, 'u'}, + {"get", required_argument, NULL, 'g'}, + {"set-rto", required_argument, NULL, '1'}, + {"unset-rto", required_argument, NULL, '0'}, + {"get-rto", required_argument, NULL, '2'}, + {"hook", no_argument, NULL, 'h'}, + {ELF_LINK_STATIC_S, no_argument, NULL, 'S'}, + {ELF_LINK_STATIC_NOLIBC_S, no_argument, NULL, 'N'}, + {ELF_LINK_STATIC_NOLD_S, no_argument, NULL, 'I'}, + {NULL, 0, NULL, 0} }; int option_index = 0; @@ -82,6 +84,9 @@ int main(int argc, char *argv[]) return -1; } return elf_set_symbolic_link(tmp, false); + case 'g': + SI_LOG_ERR("not supported now, fix me\n"); + return -1; case '1': str_ret = realpath(optarg, tmp); if (!str_ret) { @@ -96,6 +101,13 @@ int main(int argc, char *argv[]) return -1; } return elf_set_rto(tmp, false); + case '2': + str_ret = realpath(optarg, tmp); + if (!str_ret) { + SI_LOG_ERR("get realpath fail: %s\n", optarg); + return -1; + } + return elf_get_rto(tmp); case 'h': elf_link->hook_func = true; SI_LOG_INFO("hook func\n");