From c978474553629c8a2a0186b155a93a3859ac318f Mon Sep 17 00:00:00 2001 From: Zhou Kang Date: Mon, 19 Jun 2023 06:57:02 +0000 Subject: [PATCH] add static-nold mode --- Cargo.lock | 38 ++++++++++++++++++++++++++ devops-env.sh | 2 +- src/elf_hugepage.c | 2 +- src/elf_link_common.c | 2 -- src/elf_link_common.h | 8 +++++- src/elf_link_elf.c | 27 ++++++++++++++++--- src/elf_link_elf.h | 1 + src/elf_read_elf.c | 6 ++--- src/elf_read_elf_xz.c | 14 +++++----- src/main.c | 62 ++++++++++++++++++++----------------------- 10 files changed, 111 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96767e4..3313537 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -188,6 +188,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "goblin" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27c1b4369c2cd341b5de549380158b105a04c331be5db9110eef7b6d2742134" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -475,6 +486,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "proc-macro2" version = "1.0.60" @@ -544,6 +561,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "serde" version = "1.0.164" @@ -663,6 +700,7 @@ version = "1.1.0" dependencies = [ "basic", "daemonize", + "goblin", "inotify", "log", "serde", diff --git a/devops-env.sh b/devops-env.sh index 7ba5464..2ab7655 100644 --- a/devops-env.sh +++ b/devops-env.sh @@ -2,4 +2,4 @@ set -x # install tools -sudo yum install -y gcc cargo xz-devel +sudo yum install -y gcc meson cargo xz-devel diff --git a/src/elf_hugepage.c b/src/elf_hugepage.c index 43f553d..0fa87ed 100644 --- a/src/elf_hugepage.c +++ b/src/elf_hugepage.c @@ -19,7 +19,7 @@ #endif #ifndef EF_AARCH64_AOT -#define EF_AARCH64_AOT (0x00010000U) +#define EF_AARCH64_AOT (0x00010000U) #endif #ifndef EF_AARCH64_HUGEPAGE diff --git a/src/elf_link_common.c b/src/elf_link_common.c index 1a49cf5..0be5b63 100644 --- a/src/elf_link_common.c +++ b/src/elf_link_common.c @@ -91,7 +91,6 @@ static void append_symbol_mapping_by_name(elf_link_t *elf_link, char *key, elf_f append_symbol_mapping(elf_link, key, new_sym_addr); } - static void init_ifunc_symbol_addr(elf_link_t *elf_link) { (void)elf_link; @@ -569,7 +568,6 @@ static unsigned long _get_ifunc_new_addr_by_dl(elf_link_t *elf_link, elf_file_t return get_new_addr_by_old_addr(elf_link, ef, old_addr); } - static char *ifunc_mapping[][2] = { {"memmove", "__memmove_generic"}, {"memchr", "__memchr_generic"}, diff --git a/src/elf_link_common.h b/src/elf_link_common.h index aa5616f..3c26479 100644 --- a/src/elf_link_common.h +++ b/src/elf_link_common.h @@ -3,8 +3,8 @@ #define _ELF_LINK_COMMON_H #include -#include #include +#include #include "elf_read_elf.h" #include @@ -24,10 +24,16 @@ #define LIBHOOK "libhook.so" +#define ELF_LINK_SHARE_S "share" +#define ELF_LINK_STATIC_S "static" +#define ELF_LINK_STATIC_NOLIBC_S "static-nolibc" +#define ELF_LINK_STATIC_NOLD_S "static-nold" + enum RtoMode { ELF_LINK_SHARE = 0, ELF_LINK_STATIC, ELF_LINK_STATIC_NOLIBC, + ELF_LINK_STATIC_NOLD, }; #define SYSBOOST_DATA_ALIGN (8) diff --git a/src/elf_link_elf.c b/src/elf_link_elf.c index 50f7bb9..ae801a0 100644 --- a/src/elf_link_elf.c +++ b/src/elf_link_elf.c @@ -12,9 +12,9 @@ #include "elf_check_elf.h" #include "elf_hugepage.h" +#include "elf_link_elf.h" #include "elf_relocation.h" #include "elf_write_elf.h" -#include "elf_link_elf.h" #include "si_array.h" #include #include @@ -60,15 +60,32 @@ elf_link_t *elf_link_new() return elf_link; } +char *elf_link_mode_str(unsigned int mode) +{ + switch (mode) { + case ELF_LINK_STATIC: + return ELF_LINK_STATIC_S; + case ELF_LINK_STATIC_NOLIBC: + return ELF_LINK_STATIC_NOLIBC_S; + case ELF_LINK_STATIC_NOLD: + return ELF_LINK_STATIC_NOLD_S; + default: + return ELF_LINK_SHARE_S; + } +} + int elf_link_set_mode(elf_link_t *elf_link, unsigned int mode) { elf_file_t *ef = NULL; - if (mode != ELF_LINK_STATIC && mode != ELF_LINK_STATIC_NOLIBC) { + elf_link->link_mode = mode; + if (mode == ELF_LINK_SHARE) { + return 0; + } + if (mode > ELF_LINK_STATIC_NOLD) { return -1; } - elf_link->link_mode = mode; elf_link->direct_call_optimize = true; // TODO: feature, probe AUX parameter elf_link->direct_vdso_optimize = false; @@ -78,6 +95,10 @@ int elf_link_set_mode(elf_link_t *elf_link, unsigned int mode) return -1; } + if (mode == ELF_LINK_STATIC_NOLD) { + return 0; + } + // static mode use template if (mode == ELF_LINK_STATIC_NOLIBC) { ef = elf_link_add_infile(elf_link, RELOCATION_ROOT_DIR "/sysboost_static_template.relocation"); diff --git a/src/elf_link_elf.h b/src/elf_link_elf.h index b066aad..ded84ec 100644 --- a/src/elf_link_elf.h +++ b/src/elf_link_elf.h @@ -8,6 +8,7 @@ #include elf_link_t *elf_link_new(void); +char *elf_link_mode_str(unsigned int mode); int elf_link_set_mode(elf_link_t *elf_link, unsigned int mode); elf_file_t *elf_link_add_infile(elf_link_t *elf_link, char *name); int elf_link_write(elf_link_t *elf_link); diff --git a/src/elf_read_elf.c b/src/elf_read_elf.c index d4b09fc..85849d3 100644 --- a/src/elf_read_elf.c +++ b/src/elf_read_elf.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -10,7 +11,6 @@ #include #include #include -#include #include "elf_read_elf.h" #include @@ -374,8 +374,8 @@ void read_elf_sections(elf_file_t *ef) ef->dynstr_sec = &sechdrs[index_str]; ef->dynstr_data = (char *)hdr + sechdrs[index_str].sh_offset; } else if (strcmp(elf_get_section_name(ef, &sechdrs[i]), ".note.gnu.build-id") == 0) { - nhdr = (Elf64_Nhdr *)((void*)hdr + sechdrs[i].sh_offset); - ef->build_id = (char *)((void*)hdr + sechdrs[i].sh_offset + sizeof(Elf64_Nhdr) + nhdr->n_namesz); + nhdr = (Elf64_Nhdr *)((void *)hdr + sechdrs[i].sh_offset); + ef->build_id = (char *)((void *)hdr + sechdrs[i].sh_offset + sizeof(Elf64_Nhdr) + nhdr->n_namesz); } } } diff --git a/src/elf_read_elf_xz.c b/src/elf_read_elf_xz.c index be8c0d8..2bf2a42 100644 --- a/src/elf_read_elf_xz.c +++ b/src/elf_read_elf_xz.c @@ -1,11 +1,11 @@ /* SPDX-License-Identifier: MulanPSL-2.0 */ #include -#include -#include +#include #include #include #include -#include +#include +#include #include "elf_read_elf.h" #include @@ -42,8 +42,8 @@ static int xz_uncompress(lzma_stream *strm, elf_file_t *ef) void *p = NULL; size_t total = 0; - strm->avail_in = 0; - strm->next_out = out_buf; + strm->avail_in = 0; + strm->next_out = out_buf; strm->avail_out = sizeof(out_buf); while (true) { @@ -53,7 +53,7 @@ static int xz_uncompress(lzma_stream *strm, elf_file_t *ef) ret = -errno; goto out; } - strm->next_in = in_buf; + strm->next_in = in_buf; strm->avail_in = rdret; if (rdret == 0) action = LZMA_FINISH; @@ -83,7 +83,7 @@ static int xz_uncompress(lzma_stream *strm, elf_file_t *ef) ef->hdr = p; ef->length = total; return 0; - out: +out: free(p); return ret; } diff --git a/src/main.c b/src/main.c index 2f68e14..f106651 100644 --- a/src/main.c +++ b/src/main.c @@ -3,8 +3,6 @@ #include #include #include -#include -#include #include #include #include @@ -13,7 +11,11 @@ #include #include +#include +#include + #include "elf_hugepage.h" +#include "elf_link_common.h" #include "elf_link_elf.h" #include "elf_read_elf.h" @@ -24,21 +26,21 @@ int main(int argc, char *argv[]) elf_link_t *elf_link = elf_link_new(); char *str_ret; bool debug = false; - bool static_mode = false; - bool static_nolibc_mode = false; + enum RtoMode mode = ELF_LINK_SHARE; static struct option long_options[] = { {"debug", no_argument, NULL, 'd'}, {"set", required_argument, NULL, 's'}, {"unset", required_argument, NULL, 'u'}, {"hook", no_argument, NULL, 'h'}, - {"static", no_argument, NULL, 'S'}, - {"static-nolibc", no_argument, NULL, 'N'}, + {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; int c; - while ((c = getopt_long(argc, argv, "ds:u:hSN", long_options, &option_index)) != -1) { + while ((c = getopt_long(argc, argv, "ds:u:hSNI", long_options, &option_index)) != -1) { switch (c) { case 'd': debug = true; @@ -46,29 +48,32 @@ int main(int argc, char *argv[]) case 's': str_ret = realpath(optarg, tmp); if (!str_ret) { - SI_LOG_ERR("get realpath fail: %s\n", optarg); - return -1; + SI_LOG_ERR("get realpath fail: %s\n", optarg); + return -1; } return elf_set_aot(tmp, true); case 'u': str_ret = realpath(optarg, tmp); if (!str_ret) { - SI_LOG_ERR("get realpath fail: %s\n", optarg); - return -1; + SI_LOG_ERR("get realpath fail: %s\n", optarg); + return -1; } return elf_set_aot(tmp, false); case 'h': elf_link->hook_func = true; SI_LOG_INFO("hook func\n"); - break; - case 'S': - static_mode = true; - break; - case 'N': - static_nolibc_mode = true; - break; + break; + case 'S': + mode = ELF_LINK_STATIC; + break; + case 'N': + mode = ELF_LINK_STATIC_NOLIBC; + break; + case 'I': + mode = ELF_LINK_STATIC_NOLD; + break; default: - return -1; + return -1; } } @@ -78,19 +83,11 @@ int main(int argc, char *argv[]) si_log_set_global_level(SI_LOG_LEVEL_INFO); } - if (static_mode) { - ret = elf_link_set_mode(elf_link, ELF_LINK_STATIC); - if (ret < 0) { - return -1; - } - SI_LOG_INFO("static mode\n"); - } else if (static_nolibc_mode) { - ret = elf_link_set_mode(elf_link, ELF_LINK_STATIC_NOLIBC); - if (ret < 0) { - return -1; - } - SI_LOG_INFO("static-nolibc mode\n"); + ret = elf_link_set_mode(elf_link, mode); + if (ret < 0) { + return -1; } + SI_LOG_INFO("%s mode\n", elf_link_mode_str(mode)); for (int i = optind; i < argc; i++) { if (*argv[i] == '0') { @@ -99,7 +96,7 @@ int main(int argc, char *argv[]) str_ret = realpath(argv[i], tmp); if (!str_ret) { SI_LOG_ERR("get realpath fail: %s\n", argv[i]); - return -1; + return -1; } elf_file_t *ef = elf_link_add_infile(elf_link, tmp); if (ef == NULL) { @@ -116,4 +113,3 @@ int main(int argc, char *argv[]) SI_LOG_INFO("OK\n"); return 0; } - -- Gitee