syscare/0028-all-add-c-rust-compilation-options.patch
renoseven aaca4c9c5f update to 1.2.1-10
Signed-off-by: renoseven <dev@renoseven.net>
2024-08-16 16:44:21 +08:00

2284 lines
82 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From c02c494ce4018c6eb8377128e747eafe4fb187e2 Mon Sep 17 00:00:00 2001
From: ningyu <ningyu9@huawei.com>
Date: Wed, 5 Jun 2024 03:08:47 +0000
Subject: [PATCH] all: add c & rust compilation options
Signed-off-by: ningyu <ningyu9@huawei.com>
---
CMakeLists.txt | 13 ++-
upatch-diff/create-diff-object.c | 38 +++----
upatch-diff/elf-common.c | 8 +-
upatch-diff/elf-common.h | 14 +--
upatch-diff/elf-compare.c | 10 +-
upatch-diff/elf-correlate.c | 16 +--
upatch-diff/elf-create.c | 22 ++---
upatch-diff/elf-create.h | 4 +-
upatch-diff/elf-debug.c | 14 +--
upatch-diff/elf-insn.c | 4 +-
upatch-diff/insn/asm/inat.h | 4 +-
upatch-diff/insn/asm/insn.h | 6 +-
upatch-diff/insn/insn.c | 4 +-
upatch-diff/list.h | 2 +-
upatch-diff/running-elf.c | 11 +--
upatch-diff/upatch-elf.c | 6 +-
upatch-diff/upatch-elf.h | 2 +-
upatch-hijacker/hijacker/gnu-as-hijacker.c | 10 +-
.../hijacker/gnu-compiler-hijacker.c | 4 +-
upatch-hijacker/hijacker/hijacker.h | 4 +-
upatch-manage/arch/aarch64/insn.c | 12 +--
upatch-manage/arch/aarch64/insn.h | 4 +-
upatch-manage/arch/aarch64/ptrace.c | 53 +++++-----
upatch-manage/arch/aarch64/relocation.c | 98 +++++++++----------
upatch-manage/arch/x86_64/ptrace.c | 41 ++++----
upatch-manage/arch/x86_64/relocation.c | 5 +-
upatch-manage/arch/x86_64/resolve.c | 3 +-
upatch-manage/upatch-common.h | 4 +-
upatch-manage/upatch-elf.c | 16 +--
upatch-manage/upatch-elf.h | 12 +--
upatch-manage/upatch-manage.c | 24 ++---
upatch-manage/upatch-patch.c | 79 +++++++--------
upatch-manage/upatch-process.c | 33 ++++---
upatch-manage/upatch-process.h | 2 +-
upatch-manage/upatch-ptrace.c | 45 ++++-----
upatch-manage/upatch-ptrace.h | 25 ++---
upatch-manage/upatch-resolve.c | 17 ++--
upatch-manage/upatch-resolve.h | 2 +-
38 files changed, 324 insertions(+), 347 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c7838a8..4858ba5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -54,8 +54,15 @@ message("---------------------------------------------------------")
# Compile options
add_compile_options(-DBUILD_VERSION="${BUILD_VERSION}")
-add_compile_options(-g -Wall -O2 -fPIE)
-
+add_compile_options(-std=gnu99 -g -Wall -D_FORTIFY_SOURCE=2 -O2 -Werror -Wextra
+ -Wtrampolines -Wformat=2 -Wstrict-prototypes -Wdate-time -Wstack-usage=8192
+ -Wfloat-equal -Wswitch-default -Wshadow -Wconversion -Wcast-qual -Wcast-align
+ -Wunused -Wundef -funsigned-char -fstack-protector-all -fpic -fpie -ftrapv
+ -fstack-check -freg-struct-return -fno-canonical-system-headers -pipe
+ -fdebug-prefix-map=old=new)
+set(LINK_FLAGS "-pie -Wl,-z,relro,-z,now -Wl,-z,noexecstack -rdynamic -Wl,-Bsymbolic -Wl,-no-undefined")
+set(CMAKE_SHARED_LINKER_FLAGS "${LINK_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS "${LINK_FLAGS}")
# Subdirectories
add_subdirectory(upatch-diff)
add_subdirectory(upatch-manage)
@@ -67,7 +74,7 @@ add_custom_target(rust-executables ALL
COMMENT "Building rust executables..."
COMMAND ${CMAKE_COMMAND} -E env
"BUILD_VERSION=${BUILD_VERSION}"
- "RUSTFLAGS=--cfg unsound_local_offset"
+ "RUSTFLAGS=--cfg unsound_local_offset -C relocation_model=pic -D warnings -C link-arg=-s -C overflow_checks -W rust_2021_incompatible_closure_captures"
cargo build --release --target-dir ${CMAKE_CURRENT_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
diff --git a/upatch-diff/create-diff-object.c b/upatch-diff/create-diff-object.c
index 1a05869..6474b22 100644
--- a/upatch-diff/create-diff-object.c
+++ b/upatch-diff/create-diff-object.c
@@ -76,11 +76,11 @@ struct arguments {
};
static struct argp_option options[] = {
- {"debug", 'd', NULL, 0, "Show debug output"},
- {"source", 's', "source", 0, "Source object"},
- {"patched", 'p', "patched", 0, "Patched object"},
- {"running", 'r', "running", 0, "Running binary file"},
- {"output", 'o', "output", 0, "Output object"},
+ {"debug", 'd', NULL, 0, "Show debug output", 0},
+ {"source", 's', "source", 0, "Source object", 0},
+ {"patched", 'p', "patched", 0, "Patched object", 0},
+ {"running", 'r', "running", 0, "Running binary file", 0},
+ {"output", 'o', "output", 0, "Output object", 0},
{NULL}
};
@@ -136,7 +136,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
return 0;
}
-static struct argp argp = {options, parse_opt, args_doc, program_doc};
+static struct argp argp = {options, parse_opt, args_doc, program_doc, NULL, NULL, NULL};
/*
* Key point for chreate-diff-object:
@@ -266,7 +266,7 @@ static void bundle_symbols(struct upatch_elf *uelf)
list_for_each_entry(sym, &uelf->symbols, list) {
if (is_bundleable(sym)) {
if (sym->sym.st_value != 0 &&
- is_gcc6_localentry_bundled_sym(uelf, sym)) {
+ is_gcc6_localentry_bundled_sym(uelf)) {
ERROR("Symbol '%s' at offset %lu within section '%s', expected 0.",
sym->name, sym->sym.st_value, sym->sec->name);
}
@@ -301,7 +301,7 @@ static void detect_child_functions(struct upatch_elf *uelf)
if (!childstr)
continue;
- pname = strndup(sym->name, childstr - sym->name);
+ pname = strndup(sym->name, (size_t)(childstr - sym->name));
log_debug("symbol '%s', pname: '%s'\n", sym->name, pname);
if (!pname)
ERROR("detect_child_functions strndup failed.");
@@ -576,8 +576,8 @@ static void replace_section_syms(struct upatch_elf *uelf)
if (sym->type == STT_SECTION || sym->sec != rela->sym->sec)
continue;
- start = sym->sym.st_value;
- end = sym->sym.st_value + sym->sym.st_size;
+ start = (long)sym->sym.st_value;
+ end = (long)(sym->sym.st_value + sym->sym.st_size);
/* text section refer other sections */
if (is_text_section(relasec->base) &&
@@ -638,7 +638,7 @@ static void replace_section_syms(struct upatch_elf *uelf)
if (!found && !is_string_literal_section(rela->sym->sec) &&
strncmp(rela->sym->name, ".rodata", strlen(".rodata")) &&
strncmp(rela->sym->name, ".data", strlen(".data"))) {
- ERROR("%s+0x%x: Cannot find replacement symbol for '%s+%ld' reference.",
+ ERROR("%s+0x%lx: Cannot find replacement symbol for '%s+%ld' reference.",
relasec->base->name, rela->offset, rela->sym->name, rela->addend);
}
}
@@ -662,8 +662,8 @@ static void mark_ignored_sections(struct upatch_elf *uelf)
}
/* TODO: we do not handle it now */
-static void mark_ignored_functions_same(struct upatch_elf *uelf) {}
-static void mark_ignored_sections_same(struct upatch_elf *uelf) {}
+static void mark_ignored_functions_same(void) {}
+static void mark_ignored_sections_same(void) {}
/*
* For a local symbol referenced in the rela list of a changing function,
@@ -845,7 +845,7 @@ static void include_debug_sections(struct upatch_elf *uelf)
}
/* currently, there si no special section need to be handled */
-static void process_special_sections(struct upatch_elf *uelf) {}
+static void process_special_sections(void) {}
static void verify_patchability(struct upatch_elf *uelf)
{
@@ -973,8 +973,8 @@ int main(int argc, char*argv[])
mark_file_symbols(&uelf_source);
find_debug_symbol(&uelf_source, &relf);
- mark_ignored_functions_same(&uelf_patched);
- mark_ignored_sections_same(&uelf_patched);
+ mark_ignored_functions_same();
+ mark_ignored_sections_same();
upatch_elf_teardown(&uelf_source);
upatch_elf_free(&uelf_source);
@@ -990,7 +990,7 @@ int main(int argc, char*argv[])
include_debug_sections(&uelf_patched);
- process_special_sections(&uelf_patched);
+ process_special_sections();
upatch_print_changes(&uelf_patched);
@@ -1011,7 +1011,7 @@ int main(int argc, char*argv[])
upatch_create_intermediate_sections(&uelf_out, &relf);
- create_kpatch_arch_section(&uelf_out);
+ create_kpatch_arch_section();
upatch_build_strings_section_data(&uelf_out);
@@ -1029,7 +1029,7 @@ int main(int argc, char*argv[])
upatch_rebuild_relocations(&uelf_out);
- upatch_check_relocations(&uelf_out);
+ upatch_check_relocations();
upatch_create_shstrtab(&uelf_out);
diff --git a/upatch-diff/elf-common.c b/upatch-diff/elf-common.c
index f895e9b..a74da3a 100644
--- a/upatch-diff/elf-common.c
+++ b/upatch-diff/elf-common.c
@@ -74,8 +74,10 @@ bool is_normal_static_local(struct symbol *sym)
if (!strchr(sym->name, '.'))
return false;
- if (is_special_static(sym))
- return false;
+ /*
+ * TODO: Special static local variables should never be correlated and should always
+ * be included if they are referenced by an included function.
+ */
return true;
}
@@ -97,7 +99,7 @@ int offset_of_string(struct list_head *list, char *name)
}
// no need for X86
-bool is_gcc6_localentry_bundled_sym(struct upatch_elf *uelf, struct symbol *sym)
+bool is_gcc6_localentry_bundled_sym(struct upatch_elf *uelf)
{
switch(uelf->arch) {
case AARCH64:
diff --git a/upatch-diff/elf-common.h b/upatch-diff/elf-common.h
index 9e44a7c..f3d4308 100644
--- a/upatch-diff/elf-common.h
+++ b/upatch-diff/elf-common.h
@@ -103,7 +103,7 @@ static inline bool is_debug_section(struct section *sec)
!strncmp(name, ".eh_frame", 9);
}
-static inline struct symbol *find_symbol_by_index(struct list_head *list, size_t index)
+static inline struct symbol *find_symbol_by_index(struct list_head *list, unsigned int index)
{
struct symbol *sym;
@@ -174,16 +174,6 @@ static inline bool has_digit_tail(char *tail)
*/
int mangled_strcmp(char *, char *);
-
-/*
- * TODO: Special static local variables should never be correlated and should always
- * be included if they are referenced by an included function.
- */
-static inline bool is_special_static(struct symbol *sym){
- /* Not need it now. */
- return false;
-}
-
bool is_normal_static_local(struct symbol *);
static inline char *section_function_name(struct section *sec)
@@ -243,7 +233,7 @@ static inline bool is_local_sym(struct symbol *sym)
return sym->bind == STB_LOCAL;
}
-bool is_gcc6_localentry_bundled_sym(struct upatch_elf *, struct symbol *);
+bool is_gcc6_localentry_bundled_sym(struct upatch_elf *);
/*
* Mapping symbols are used to mark and label the transitions between code and
diff --git a/upatch-diff/elf-compare.c b/upatch-diff/elf-compare.c
index ef8dd23..851c25f 100644
--- a/upatch-diff/elf-compare.c
+++ b/upatch-diff/elf-compare.c
@@ -175,7 +175,7 @@ bool upatch_handle_redis_line(const char *symname)
}
/* TODO: let user support this list or generate by the compiler ? */
-bool check_line_func(struct upatch_elf *uelf, const char *symname)
+bool check_line_func(const char *symname)
{
if (!strncmp(basename(g_relf_name), "redis-server", 12))
return upatch_handle_redis_line(symname);
@@ -247,7 +247,7 @@ static bool _line_macro_change_only(struct upatch_elf *uelf, struct section *sec
continue;
/* TODO: we may need black list ? */
- if (check_line_func(uelf, rela->sym->name)) {
+ if (check_line_func(rela->sym->name)) {
found = true;
break;
}
@@ -292,8 +292,8 @@ static bool _line_macro_change_only_aarch64(struct upatch_elf *uelf, struct sect
continue;
/* verify it's a mov immediate to w1 */
- if ((*(int *)(start1 + offset) & ~mov_imm_mask) !=
- (*(int *)(start2 + offset) & ~mov_imm_mask))
+ if ((*(unsigned int *)(start1 + offset) & ~mov_imm_mask) !=
+ (*(unsigned int *)(start2 + offset) & ~mov_imm_mask))
return false;
found = false;
@@ -304,7 +304,7 @@ static bool _line_macro_change_only_aarch64(struct upatch_elf *uelf, struct sect
continue;
/* TODO: we may need black list ? */
- if (check_line_func(uelf, rela->sym->name)) {
+ if (check_line_func(rela->sym->name)) {
found = true;
break;
}
diff --git a/upatch-diff/elf-correlate.c b/upatch-diff/elf-correlate.c
index a0fe669..3e3a536 100644
--- a/upatch-diff/elf-correlate.c
+++ b/upatch-diff/elf-correlate.c
@@ -58,9 +58,10 @@ void upatch_correlate_symbols(struct upatch_elf *uelf_source, struct upatch_elf
sym_orig->type != sym_patched->type || sym_patched->twin)
continue;
- if (is_special_static(sym_orig))
- continue;
-
+ /*
+ * TODO: Special static local variables should never be correlated and should always
+ * be included if they are referenced by an included function.
+ */
/*
* The .LCx symbols point to string literals in
* '.rodata.<func>.str1.*' sections. They get included
@@ -140,11 +141,10 @@ void upatch_correlate_sections(struct upatch_elf *uelf_source, struct upatch_elf
sec_patched->twin)
continue;
- if (is_special_static(is_rela_section(sec_orig) ?
- sec_orig->base->secsym :
- sec_orig->secsym))
- continue;
-
+ /*
+ * TODO: Special static local variables should never be correlated and should always
+ * be included if they are referenced by an included function.
+ */
/*
* Group sections must match exactly to be correlated.
*/
diff --git a/upatch-diff/elf-create.c b/upatch-diff/elf-create.c
index 873b3a9..8ac212a 100644
--- a/upatch-diff/elf-create.c
+++ b/upatch-diff/elf-create.c
@@ -37,7 +37,7 @@
/* create text and relocation sections */
static struct section *create_section_pair(struct upatch_elf *uelf, char *name,
- int entsize, int nr)
+ unsigned int entsize, unsigned int nr)
{
char *relaname;
struct section *sec, *relasec;
@@ -131,7 +131,7 @@ void upatch_create_patches_sections(struct upatch_elf *uelf, struct running_elf
struct upatch_patch_func *funcs;
struct rela *rela;
struct lookup_result symbol;
- int nr = 0, index = 0;
+ unsigned int nr = 0, index = 0;
/* find changed func */
list_for_each_entry(sym, &uelf->symbols, list) {
@@ -197,7 +197,7 @@ void upatch_create_patches_sections(struct upatch_elf *uelf, struct running_elf
ERROR("sanity check failed in funcs sections. \n");
}
-static bool need_dynrela(struct upatch_elf *uelf, struct running_elf *relf,
+static bool need_dynrela(struct running_elf *relf,
struct section *relasec, struct rela *rela)
{
struct lookup_result symbol;
@@ -234,7 +234,7 @@ void upatch_create_intermediate_sections(struct upatch_elf *uelf, struct running
struct upatch_symbol *usyms;
struct upatch_relocation *urelas;
struct symbol *strsym, *usym_sec_sym;
- int nr = 0, index = 0;
+ unsigned int nr = 0, index = 0;
list_for_each_entry(relasec, &uelf->sections, list) {
if (!is_rela_section(relasec))
@@ -245,7 +245,7 @@ void upatch_create_intermediate_sections(struct upatch_elf *uelf, struct running
list_for_each_entry(rela, &relasec->relas, list) {
nr++;
- if (need_dynrela(uelf, relf, relasec, rela)){
+ if (need_dynrela(relf, relasec, rela)){
rela->need_dynrela = 1;
}
}
@@ -401,7 +401,7 @@ static void rebuild_rela_section_data(struct section *sec)
struct rela *rela;
GElf_Rela *relas;
size_t size;
- int nr = 0, index = 0;
+ unsigned int nr = 0, index = 0;
list_for_each_entry(rela, &sec->relas, list)
nr++;
@@ -438,13 +438,13 @@ void upatch_rebuild_relocations(struct upatch_elf *uelf)
list_for_each_entry(relasec, &uelf->sections, list) {
if (!is_rela_section(relasec))
continue;
- relasec->sh.sh_link = symtab->index;
- relasec->sh.sh_info = relasec->base->index;
+ relasec->sh.sh_link = (Elf64_Word)symtab->index;
+ relasec->sh.sh_info = (Elf64_Word)relasec->base->index;
rebuild_rela_section_data(relasec);
}
}
-void upatch_check_relocations(struct upatch_elf *uelf)
+void upatch_check_relocations(void)
{
log_debug("upatch_check_relocations does not work now.\n");
return;
@@ -558,7 +558,7 @@ void upatch_create_symtab(struct upatch_elf *uelf)
struct symbol *sym;
size_t size;
char *buf;
- int nr = 0, nr_local = 0;
+ unsigned int nr = 0, nr_local = 0;
unsigned long offset = 0;
symtab = find_section_by_name(&uelf->sections, ".symtab");
@@ -591,7 +591,7 @@ void upatch_create_symtab(struct upatch_elf *uelf)
if (!strtab)
ERROR("missing .strtab section in create symtab.");
- symtab->sh.sh_link = strtab->index;
+ symtab->sh.sh_link = (Elf64_Word)strtab->index;
symtab->sh.sh_info = nr_local;
}
diff --git a/upatch-diff/elf-create.h b/upatch-diff/elf-create.h
index 1b4dc6c..ce7f263 100644
--- a/upatch-diff/elf-create.h
+++ b/upatch-diff/elf-create.h
@@ -33,7 +33,7 @@ void upatch_create_patches_sections(struct upatch_elf *, struct running_elf *);
void upatch_create_intermediate_sections(struct upatch_elf *, struct running_elf *);
-static inline void create_kpatch_arch_section(struct upatch_elf *uelf) {}
+static inline void create_kpatch_arch_section(void) {}
void upatch_build_strings_section_data(struct upatch_elf *);
@@ -45,7 +45,7 @@ void upatch_reindex_elements(struct upatch_elf *);
void upatch_rebuild_relocations(struct upatch_elf *);
-void upatch_check_relocations(struct upatch_elf *);
+void upatch_check_relocations(void);
void upatch_create_shstrtab(struct upatch_elf *);
diff --git a/upatch-diff/elf-debug.c b/upatch-diff/elf-debug.c
index f9c5327..eaabfa1 100644
--- a/upatch-diff/elf-debug.c
+++ b/upatch-diff/elf-debug.c
@@ -60,7 +60,7 @@ void upatch_dump_kelf(struct upatch_elf *uelf)
goto next;
log_debug("rela section expansion\n");
list_for_each_entry(rela, &sec->relas, list) {
- log_debug("sym %d, offset %d, type %d, %s %s %ld \n",
+ log_debug("sym %d, offset %ld, type %d, %s %s %ld \n",
rela->sym->index, rela->offset,
rela->type, rela->sym->name,
(rela->addend < 0) ? "-" : "+",
@@ -107,7 +107,7 @@ void upatch_rebuild_eh_frame(struct section *sec)
struct rela *rela;
unsigned char *data, *data_end;
unsigned int hdr_length, hdr_id;
- unsigned int current_offset;
+ unsigned long current_offset;
unsigned int count = 0;
/* sanity check */
@@ -136,13 +136,13 @@ void upatch_rebuild_eh_frame(struct section *sec)
/* 8 is the offset of PC begin */
current_offset = 8;
list_for_each_entry(rela, &sec->rela->relas, list) {
- unsigned int offset = rela->offset;
+ unsigned long offset = rela->offset;
bool found_rela = false;
- log_debug("handle relocaton offset at 0x%x \n", offset);
+ log_debug("handle relocaton offset at 0x%lx \n", offset);
while (data != data_end) {
void *__src = data;
- log_debug("current handle offset is 0x%x \n", current_offset);
+ log_debug("current handle offset is 0x%lx \n", current_offset);
REQUIRE(skip_bytes(&data, data_end, 4), "no length to be read");
hdr_length = *(unsigned int *)(data - 4);
@@ -166,13 +166,13 @@ void upatch_rebuild_eh_frame(struct section *sec)
/* update rela offset to point to new offset, and also hdr_id */
if (found_rela) {
/* 4 is the offset of hdr_id and 8 is the offset of PC begin */
- *(unsigned int *)(eh_frame + frame_size + 4) = frame_size + 4;
+ *(unsigned long *)(eh_frame + frame_size + 4) = frame_size + 4;
rela->offset = frame_size + 8;
}
frame_size += (hdr_length + 4);
} else {
- log_debug("remove FDE at 0x%x \n", current_offset);
+ log_debug("remove FDE at 0x%lx \n", current_offset);
}
/* hdr_length(value) + hdr_length(body) */
diff --git a/upatch-diff/elf-insn.c b/upatch-diff/elf-insn.c
index 41252fe..11380d0 100644
--- a/upatch-diff/elf-insn.c
+++ b/upatch-diff/elf-insn.c
@@ -50,7 +50,7 @@ void rela_insn(const struct section *sec, const struct rela *rela, struct insn *
return;
}
- ERROR("can't find instruction for rela at %s+0x%x",
+ ERROR("can't find instruction for rela at %s+0x%lx",
sec->name, rela->offset);
}
@@ -75,7 +75,7 @@ long rela_target_offset(struct upatch_elf *uelf, struct section *relasec, struct
rela_insn(sec, rela, &insn);
add_off = (long)insn.next_byte -
(long)sec->data->d_buf -
- rela->offset;
+ (long)rela->offset;
} else {
ERROR("unable to handle rela type %d \n", rela->type);
}
diff --git a/upatch-diff/insn/asm/inat.h b/upatch-diff/insn/asm/inat.h
index 95811f3..f446ad8 100644
--- a/upatch-diff/insn/asm/inat.h
+++ b/upatch-diff/insn/asm/inat.h
@@ -171,9 +171,9 @@ static inline int inat_group_id(insn_attr_t attr)
return (attr & INAT_GRP_MASK) >> INAT_GRP_OFFS;
}
-static inline int inat_group_common_attribute(insn_attr_t attr)
+static inline insn_attr_t inat_group_common_attribute(insn_attr_t attr)
{
- return attr & ~INAT_GRP_MASK;
+ return attr & ~(insn_attr_t)INAT_GRP_MASK;
}
static inline int inat_has_immediate(insn_attr_t attr)
diff --git a/upatch-diff/insn/asm/insn.h b/upatch-diff/insn/asm/insn.h
index 041b351..fc4ae40 100644
--- a/upatch-diff/insn/asm/insn.h
+++ b/upatch-diff/insn/asm/insn.h
@@ -66,7 +66,7 @@ struct insn {
unsigned char x86_64;
const insn_byte_t *kaddr; /* kernel address of insn to analyze */
- const insn_byte_t *next_byte;
+ insn_byte_t *next_byte;
};
#define MAX_INSN_SIZE 16
@@ -97,7 +97,7 @@ struct insn {
#define X86_VEX_P(vex) ((vex) & 0x03) /* VEX3 Byte2, VEX2 Byte1 */
#define X86_VEX_M_MAX 0x1f /* VEX3.M Maximum value */
-extern void insn_init(struct insn *insn, const void *kaddr, int x86_64);
+extern void insn_init(struct insn *insn, void *kaddr, int x86_64);
extern void insn_get_prefixes(struct insn *insn);
extern void insn_get_opcode(struct insn *insn);
extern void insn_get_modrm(struct insn *insn);
@@ -116,7 +116,7 @@ static inline void insn_get_attribute(struct insn *insn)
extern int insn_rip_relative(struct insn *insn);
/* Init insn for kernel text */
-static inline void kernel_insn_init(struct insn *insn, const void *kaddr)
+static inline void kernel_insn_init(struct insn *insn, void *kaddr)
{
#ifdef CONFIG_X86_64
insn_init(insn, kaddr, 1);
diff --git a/upatch-diff/insn/insn.c b/upatch-diff/insn/insn.c
index 6dfca32..d9a356b 100644
--- a/upatch-diff/insn/insn.c
+++ b/upatch-diff/insn/insn.c
@@ -49,7 +49,7 @@
* @kaddr: address (in kernel memory) of instruction (or copy thereof)
* @x86_64: !0 for 64-bit kernel or 64-bit app
*/
-void insn_init(struct insn *insn, const void *kaddr, int x86_64)
+void insn_init(struct insn *insn, void *kaddr, int x86_64)
{
memset(insn, 0, sizeof(*insn));
insn->kaddr = kaddr;
@@ -250,7 +250,7 @@ void insn_get_modrm(struct insn *insn)
modrm->value = mod;
modrm->nbytes = 1;
if (inat_is_group(insn->attr)) {
- pfx_id = insn_last_prefix_id(insn);
+ pfx_id = (insn_byte_t)insn_last_prefix_id(insn);
insn->attr = inat_get_group_attribute(mod, pfx_id,
insn->attr);
if (insn_is_avx(insn) && !inat_accept_vex(insn->attr))
diff --git a/upatch-diff/list.h b/upatch-diff/list.h
index 6205a72..b3b28e1 100644
--- a/upatch-diff/list.h
+++ b/upatch-diff/list.h
@@ -49,7 +49,7 @@
*
*/
#define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
/**
diff --git a/upatch-diff/running-elf.c b/upatch-diff/running-elf.c
index 676880f..25b72b7 100644
--- a/upatch-diff/running-elf.c
+++ b/upatch-diff/running-elf.c
@@ -38,7 +38,7 @@
/* TODO: need to judge whether running_elf is a Position-Independent Executable file
* https://github.com/bminor/binutils-gdb/blob/master/binutils/readelf.c
*/
-static bool is_pie(struct Elf *elf)
+static bool is_pie(void)
{
return true;
}
@@ -50,7 +50,7 @@ static bool is_exec(struct Elf *elf)
if (!gelf_getehdr(elf, &ehdr))
ERROR("gelf_getehdr running_file failed for %s.", elf_errmsg(0));
- return ehdr.e_type == ET_EXEC || (ehdr.e_type == ET_DYN && is_pie(elf));
+ return ehdr.e_type == ET_EXEC || (ehdr.e_type == ET_DYN && is_pie());
}
void relf_init(char *elf_name, struct running_elf *relf)
@@ -59,7 +59,6 @@ void relf_init(char *elf_name, struct running_elf *relf)
Elf_Scn *scn = NULL;
Elf_Data *data;
GElf_Sym sym;
- unsigned int i;
relf->fd = open(elf_name, O_RDONLY);
if (relf->fd == -1)
@@ -83,12 +82,12 @@ void relf_init(char *elf_name, struct running_elf *relf)
if (!data)
ERROR("elf_getdata with error %s", elf_errmsg(0));
- relf->obj_nr = shdr.sh_size / shdr.sh_entsize;
- relf->obj_syms = calloc(relf->obj_nr, sizeof(struct debug_symbol));
+ relf->obj_nr = (int)(shdr.sh_size / shdr.sh_entsize);
+ relf->obj_syms = calloc((size_t)relf->obj_nr, sizeof(struct debug_symbol));
if (!relf->obj_syms)
ERROR("calloc with errno = %d", errno);
- for (i = 0; i < relf->obj_nr; i ++) {
+ for (int i = 0; i < relf->obj_nr; i ++) {
if (!gelf_getsym(data, i, &sym))
ERROR("gelf_getsym with error %s", elf_errmsg(0));
relf->obj_syms[i].name = elf_strptr(relf->elf, shdr.sh_link, sym.st_name);
diff --git a/upatch-diff/upatch-elf.c b/upatch-diff/upatch-elf.c
index fc4396a..ee38efc 100644
--- a/upatch-diff/upatch-elf.c
+++ b/upatch-diff/upatch-elf.c
@@ -106,7 +106,7 @@ static void create_symbol_list(struct upatch_elf *uelf)
INIT_LIST_HEAD(&sym->children);
sym->index = index;
- if (!gelf_getsym(symtab->data, index, &sym->sym))
+ if (!gelf_getsym(symtab->data, (int)index, &sym->sym))
ERROR("gelf_getsym with error %s", elf_errmsg(0));
index ++;
@@ -122,7 +122,7 @@ static void create_symbol_list(struct upatch_elf *uelf)
/* releated section located in extended header */
if (shndx == SHN_XINDEX &&
!gelf_getsymshndx(symtab->data, uelf->symtab_shndx,
- sym->index, &sym->sym, &shndx))
+ (int)sym->index, &sym->sym, &shndx))
ERROR("gelf_getsymshndx with error %s", elf_errmsg(0));
if ((sym->sym.st_shndx > SHN_UNDEF && sym->sym.st_shndx < SHN_LORESERVE) ||
@@ -206,7 +206,7 @@ static void create_rela_list(struct upatch_elf *uelf, struct section *relasec)
if (skip)
continue;
- log_debug("offset %d, type %d, %s %s %ld", rela->offset,
+ log_debug("offset %ld, type %d, %s %s %ld", rela->offset,
rela->type, rela->sym->name,
(rela->addend < 0) ? "-" : "+", labs(rela->addend));
if (rela->string) // rela->string is not utf8
diff --git a/upatch-diff/upatch-elf.h b/upatch-diff/upatch-elf.h
index b2d038b..3cbb59b 100644
--- a/upatch-diff/upatch-elf.h
+++ b/upatch-diff/upatch-elf.h
@@ -87,7 +87,7 @@ struct rela {
GElf_Rela rela;
struct symbol *sym;
unsigned int type;
- unsigned int offset;
+ unsigned long offset;
long addend;
char *string;
bool need_dynrela;
diff --git a/upatch-hijacker/hijacker/gnu-as-hijacker.c b/upatch-hijacker/hijacker/gnu-as-hijacker.c
index 789ddc2..860a84f 100644
--- a/upatch-hijacker/hijacker/gnu-as-hijacker.c
+++ b/upatch-hijacker/hijacker/gnu-as-hijacker.c
@@ -28,11 +28,9 @@
#define DEFSYM_MAX 64
-static const char *DEFSYM_FLAG = "--defsym";
-static const char *DEFSYM_VALUE = ".upatch_0x%x=";
+static char *DEFSYM_FLAG = "--defsym";
static const int APPEND_ARG_LEN = 2;
-static const char *OUTPUT_PATH = "%s/0x%x.o";
static const char *NULL_DEV_PATH = "/dev/null";
static char g_defsym[DEFSYM_MAX] = { 0 };
@@ -81,7 +79,7 @@ int main(int argc, char *argv[], char *envp[])
}
int new_argc = argc + APPEND_ARG_LEN + 1; // include terminator NULL
- const char **new_argv = calloc(1, new_argc * sizeof(char *));
+ char **new_argv = calloc(1, (unsigned long)new_argc * sizeof(char *));
if (new_argv == NULL) {
return execve(filename, argv, envp);
}
@@ -100,13 +98,13 @@ int main(int argc, char *argv[], char *envp[])
char *defsym_value = (char *)g_defsym;
char *new_output_file = (char *)g_new_output_file;
- snprintf(defsym_value, DEFSYM_MAX, DEFSYM_VALUE, tid);
+ snprintf(defsym_value, DEFSYM_MAX, ".upatch_0x%x=", tid);
new_argv[new_argc++] = DEFSYM_FLAG;
new_argv[new_argc++] = defsym_value;
new_argv[new_argc] = NULL;
// Handle output file
- snprintf(new_output_file, PATH_MAX, OUTPUT_PATH, output_dir, tid);
+ snprintf(new_output_file, PATH_MAX, "%s/0x%x.o", output_dir, tid);
new_argv[output_index] = new_output_file;
if (access(output_file, F_OK) == 0) {
diff --git a/upatch-hijacker/hijacker/gnu-compiler-hijacker.c b/upatch-hijacker/hijacker/gnu-compiler-hijacker.c
index d0410a2..d868467 100644
--- a/upatch-hijacker/hijacker/gnu-compiler-hijacker.c
+++ b/upatch-hijacker/hijacker/gnu-compiler-hijacker.c
@@ -16,7 +16,7 @@
#include "hijacker.h"
-static const char* APPEND_ARGS[] = {
+static char* APPEND_ARGS[] = {
"-gdwarf", /* obatain debug information */
"-ffunction-sections",
"-fdata-sections",
@@ -52,7 +52,7 @@ int main(int argc, char *argv[], char *envp[])
}
int new_argc = argc + APPEND_ARG_LEN + 1; // include terminator NULL
- const char **new_argv = calloc(1, new_argc * sizeof(char *));
+ char **new_argv = calloc(1, (unsigned long)new_argc * sizeof(char *));
if (new_argv == NULL) {
return execve(filename, argv, envp);
}
diff --git a/upatch-hijacker/hijacker/hijacker.h b/upatch-hijacker/hijacker/hijacker.h
index 2a41ab2..cc820ee 100644
--- a/upatch-hijacker/hijacker/hijacker.h
+++ b/upatch-hijacker/hijacker/hijacker.h
@@ -28,7 +28,7 @@ static const char *OUTPUT_FLAG_NAME = "-o";
static char g_filename[PATH_MAX] = { 0 };
-static inline char* get_current_exec()
+static inline char* get_current_exec(void)
{
ssize_t path_len = readlink(EXEC_SELF_PATH, (char *)g_filename, PATH_MAX);
if (path_len == -1) {
@@ -39,7 +39,7 @@ static inline char* get_current_exec()
return (char *)g_filename;
}
-static inline const char* get_hijacker_env()
+static inline const char* get_hijacker_env(void)
{
return getenv(UPATCH_ENV_NAME);
}
diff --git a/upatch-manage/arch/aarch64/insn.c b/upatch-manage/arch/aarch64/insn.c
index 8f78ae1..bb61f77 100644
--- a/upatch-manage/arch/aarch64/insn.c
+++ b/upatch-manage/arch/aarch64/insn.c
@@ -97,17 +97,17 @@ u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, u32 insn,
/* Update the immediate field. */
insn &= ~(mask << shift);
- insn |= (imm & mask) << shift;
+ insn |= (u32)(imm & mask) << shift;
return insn;
}
-u64 extract_insn_imm(s64 sval, int len, int lsb)
+s64 extract_insn_imm(s64 sval, int len, int lsb)
{
- u64 imm, imm_mask;
+ s64 imm, imm_mask;
imm = sval >> lsb;
- imm_mask = (BIT(lsb + len) - 1) >> lsb;
+ imm_mask = (s64)((BIT(lsb + len) - 1) >> lsb);
imm = imm & imm_mask;
log_debug("upatch: extract imm, X=0x%lx, X[%d:%d]=0x%lx\n", sval,
@@ -115,7 +115,7 @@ u64 extract_insn_imm(s64 sval, int len, int lsb)
return imm;
}
-u32 insert_insn_imm(enum aarch64_insn_imm_type imm_type, void *place, u64 imm)
+s32 insert_insn_imm(enum aarch64_insn_imm_type imm_type, void *place, u64 imm)
{
u32 insn, new_insn;
@@ -126,5 +126,5 @@ u32 insert_insn_imm(enum aarch64_insn_imm_type imm_type, void *place, u64 imm)
"upatch: insert imm, P=0x%lx, insn=0x%x, imm_type=%d, imm=0x%lx, "
"new_insn=0x%x\n",
(u64)place, insn, imm_type, imm, new_insn);
- return new_insn;
+ return (s32)new_insn;
}
diff --git a/upatch-manage/arch/aarch64/insn.h b/upatch-manage/arch/aarch64/insn.h
index 2b97e8d..76a9689 100644
--- a/upatch-manage/arch/aarch64/insn.h
+++ b/upatch-manage/arch/aarch64/insn.h
@@ -64,8 +64,8 @@ enum aarch64_insn_imm_type {
u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, u32 insn,
u64 imm);
-u64 extract_insn_imm(s64, int, int);
+s64 extract_insn_imm(s64, int, int);
-u32 insert_insn_imm(enum aarch64_insn_imm_type, void *, u64);
+s32 insert_insn_imm(enum aarch64_insn_imm_type, void *, u64);
#endif /* _ARCH_AARCH64_INSN_H */
diff --git a/upatch-manage/arch/aarch64/ptrace.c b/upatch-manage/arch/aarch64/ptrace.c
index c51a236..fdc7695 100644
--- a/upatch-manage/arch/aarch64/ptrace.c
+++ b/upatch-manage/arch/aarch64/ptrace.c
@@ -21,13 +21,14 @@
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <sys/syscall.h>
+#include <stdlib.h>
#include "insn.h"
#include "upatch-ptrace.h"
#define ORIGIN_INSN_LEN 16
-int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
+long upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
unsigned long arg1, unsigned long arg2,
unsigned long arg3, unsigned long arg4,
unsigned long arg5, unsigned long arg6,
@@ -38,10 +39,10 @@ int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
0x01, 0x00, 0x00, 0xd4, // 0xd4000001 svc #0 = syscall
0xa0, 0x00, 0x20, 0xd4, // 0xd42000a0 brk #5 = int3
};
- int ret;
+ long ret;
log_debug("Executing syscall %d (pid %d)...\n", nr, pctx->pid);
- regs.regs[8] = (unsigned long)nr;
+ regs.regs[8] = (unsigned long long)nr;
regs.regs[0] = arg1;
regs.regs[1] = arg2;
regs.regs[2] = arg3;
@@ -56,39 +57,45 @@ int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
return ret;
}
-int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
+long upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
const unsigned char *code, size_t codelen,
struct user_regs_struct *pregs,
int (*func)(struct upatch_ptrace_ctx *pctx,
const void *data),
const void *data)
{
+ long ret;
struct user_regs_struct orig_regs, regs;
struct iovec orig_regs_iov, regs_iov;
+ struct upatch_process *proc = pctx->proc;
+ unsigned long libc_base = proc->libc_base;
+ unsigned char *orig_code = (unsigned char *)malloc(sizeof(*orig_code) * codelen);
+
+ if (orig_code == NULL) {
+ log_error("Malloc orig_code failed\n");
+ return -1;
+ }
orig_regs_iov.iov_base = &orig_regs;
orig_regs_iov.iov_len = sizeof(orig_regs);
regs_iov.iov_base = &regs;
regs_iov.iov_len = sizeof(regs);
- unsigned char orig_code[codelen];
- int ret;
- struct upatch_process *proc = pctx->proc;
- unsigned long libc_base = proc->libc_base;
-
ret = ptrace(PTRACE_GETREGSET, pctx->pid, (void *)NT_PRSTATUS,
(void *)&orig_regs_iov);
if (ret < 0) {
log_error("can't get regs - %d\n", pctx->pid);
+ free(orig_code);
return -1;
}
ret = upatch_process_mem_read(proc, libc_base,
(unsigned long *)orig_code, codelen);
if (ret < 0) {
log_error("can't peek original code - %d\n", pctx->pid);
+ free(orig_code);
return -1;
}
- ret = upatch_process_mem_write(proc, (unsigned long *)code, libc_base,
+ ret = upatch_process_mem_write(proc, code, libc_base,
codelen);
if (ret < 0) {
log_error("can't poke syscall code - %d\n", pctx->pid);
@@ -132,6 +139,7 @@ int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
poke_back:
upatch_process_mem_write(proc, (unsigned long *)orig_code, libc_base,
codelen);
+ free(orig_code);
return ret;
}
@@ -162,41 +170,26 @@ void copy_regs(struct user_regs_struct *dst, struct user_regs_struct *src)
#undef COPY_REG
}
-size_t get_origin_insn_len()
+size_t get_origin_insn_len(void)
{
return ORIGIN_INSN_LEN;
}
#define UPATCH_INSN_LEN 8
#define UPATCH_ADDR_LEN 8
-size_t get_upatch_insn_len()
+size_t get_upatch_insn_len(void)
{
return UPATCH_INSN_LEN;
}
-size_t get_upatch_addr_len()
+size_t get_upatch_addr_len(void)
{
return UPATCH_ADDR_LEN;
}
// for long jumper
-unsigned long get_new_insn(struct object_file *obj, unsigned long old_addr,
- unsigned long new_addr)
+unsigned long get_new_insn(void)
{
unsigned int insn0 = 0x58000051; // ldr x17, #8
unsigned int insn4 = 0xd61f0220; // br x17
return (unsigned long)(insn0 | ((unsigned long)insn4 << 32));
-}
-
-#if 0
-unsigned long get_new_insn(struct object_file *obj, unsigned long old_addr,
- unsigned long new_addr)
-{
- unsigned char b_insn[] = { 0x00, 0x00, 0x00, 0x00 }; /* ins: b IMM */
-
- *(unsigned int *)(b_insn) = (unsigned int)(new_addr - old_addr) / 4;
- b_insn[3] &= 0x3;
- b_insn[3] |= 0x14;
-
- return *(unsigned int *)b_insn;
-}
-#endif
+}
\ No newline at end of file
diff --git a/upatch-manage/arch/aarch64/relocation.c b/upatch-manage/arch/aarch64/relocation.c
index 0019388..3951135 100644
--- a/upatch-manage/arch/aarch64/relocation.c
+++ b/upatch-manage/arch/aarch64/relocation.c
@@ -39,15 +39,15 @@ static inline s64 calc_reloc(enum aarch64_reloc_op op, void *place, u64 val)
switch (op) {
case RELOC_OP_ABS:
// S + A
- sval = val;
+ sval = (s64)val;
break;
case RELOC_OP_PREL:
// S + A - P
- sval = val - (u64)place;
+ sval = (s64)(val - (u64)place);
break;
case RELOC_OP_PAGE:
// Page(S + A) - Page(P)
- sval = (val & ~0xfff) - ((u64)place & ~0xfff);
+ sval = (s64)((val & ~(u64)0xfff) - ((u64)place & ~(u64)0xfff));
break;
default:
log_error("upatch: unknown relocation operation %d\n", op);
@@ -92,7 +92,7 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
sym_name = uelf->strtab + sym->st_name;
/* val corresponds to (S + A) */
- val = (s64)(sym->st_value + rel[i].r_addend);
+ val = (unsigned long)sym->st_value + (unsigned long)rel[i].r_addend;
log_debug(
"upatch: reloc symbol, name=%s, k_addr=0x%lx, u_addr=0x%lx, "
"r_offset=0x%lx, st_value=0x%lx, r_addend=0x%lx \n",
@@ -113,13 +113,13 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
result = calc_reloc(RELOC_OP_ABS, uloc, val);
if (result < -(s64)BIT(31) || result >= (s64)BIT(32))
goto overflow;
- *(s32 *)loc = result;
+ *(s32 *)loc = (s32)result;
break;
case R_AARCH64_ABS16:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
if (result < -(s64)BIT(15) || result >= (s64)BIT(16))
goto overflow;
- *(s16 *)loc = result;
+ *(s16 *)loc = (s16)result;
break;
case R_AARCH64_PREL64:
result = calc_reloc(RELOC_OP_PREL, uloc, val);
@@ -129,13 +129,13 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
result = calc_reloc(RELOC_OP_PREL, uloc, val);
if (result < -(s64)BIT(31) || result >= (s64)BIT(32))
goto overflow;
- *(s32 *)loc = result;
+ *(s32 *)loc = (s32)result;
break;
case R_AARCH64_PREL16:
result = calc_reloc(RELOC_OP_PREL, uloc, val);
if (result < -(s64)BIT(15) || result >= (s64)BIT(16))
goto overflow;
- *(s16 *)loc = result;
+ *(s16 *)loc = (s16)result;
break;
/* Immediate instruction relocations. */
case R_AARCH64_LD_PREL_LO19:
@@ -144,8 +144,8 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 19, 2);
result = insert_insn_imm(AARCH64_INSN_IMM_19, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_ADR_PREL_LO21:
result = calc_reloc(RELOC_OP_PREL, uloc, val);
@@ -153,8 +153,8 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 21, 0);
result = insert_insn_imm(AARCH64_INSN_IMM_ADR, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_ADR_PREL_PG_HI21:
result = calc_reloc(RELOC_OP_PAGE, uloc, val);
@@ -162,51 +162,51 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 21, 12);
result = insert_insn_imm(AARCH64_INSN_IMM_ADR, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_ADR_PREL_PG_HI21_NC:
result = calc_reloc(RELOC_OP_PAGE, uloc, val);
result = extract_insn_imm(result, 21, 12);
result = insert_insn_imm(AARCH64_INSN_IMM_ADR, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_ADD_ABS_LO12_NC:
case R_AARCH64_LDST8_ABS_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 12, 0);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_LDST16_ABS_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 11, 1);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_LDST32_ABS_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 10, 2);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_LDST64_ABS_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 9, 3);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_LDST128_ABS_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 8, 4);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TSTBR14:
result = calc_reloc(RELOC_OP_PREL, uloc, val);
@@ -214,15 +214,15 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 14, 2);
result = insert_insn_imm(AARCH64_INSN_IMM_14, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_CONDBR19:
result = calc_reloc(RELOC_OP_PREL, uloc, val);
result = extract_insn_imm(result, 19, 2);
result = insert_insn_imm(AARCH64_INSN_IMM_19, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_JUMP26:
case R_AARCH64_CALL26:
@@ -243,8 +243,8 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
}
result = extract_insn_imm(result, 26, 2);
result = insert_insn_imm(AARCH64_INSN_IMM_26, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_ADR_GOT_PAGE:
result = calc_reloc(RELOC_OP_PAGE, uloc, val);
@@ -252,8 +252,8 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 21, 12);
result = insert_insn_imm(AARCH64_INSN_IMM_ADR, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_LD64_GOT_LO12_NC:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
@@ -261,24 +261,24 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
// sometimes, result & 7 != 0, it works fine.
result = extract_insn_imm(result, 9, 3);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- result = ALIGN(TCB_SIZE, uelf->relf->tls_align) + val;
- if (result < 0 || result >= BIT(24))
+ result = (long)(ALIGN(TCB_SIZE, uelf->relf->tls_align) + val);
+ if (result < 0 || result >= (s64)BIT(24))
goto overflow;
result = extract_insn_imm(result, 12, 12);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- result = ALIGN(TCB_SIZE, uelf->relf->tls_align) + val;
+ result = (long)(ALIGN(TCB_SIZE, uelf->relf->tls_align) + val);
result = extract_insn_imm(result, 12, 0);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSDESC_ADR_PAGE21:
result = calc_reloc(RELOC_OP_PAGE, uloc, val);
@@ -286,23 +286,23 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
goto overflow;
result = extract_insn_imm(result, 21, 12);
result = insert_insn_imm(AARCH64_INSN_IMM_ADR, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSDESC_LD64_LO12:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
// don't check result & 7 == 0.
result = extract_insn_imm(result, 9, 3);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSDESC_ADD_LO12:
result = calc_reloc(RELOC_OP_ABS, uloc, val);
result = extract_insn_imm(result, 12, 0);
result = insert_insn_imm(AARCH64_INSN_IMM_12, loc,
- result);
- *(__le32 *)loc = cpu_to_le32(result);
+ (unsigned long)result);
+ *(__le32 *)loc = cpu_to_le32((__le32)result);
break;
case R_AARCH64_TLSDESC_CALL:
// this is a blr instruction, don't need to modify
diff --git a/upatch-manage/arch/x86_64/ptrace.c b/upatch-manage/arch/x86_64/ptrace.c
index d824d92..3d6dd72 100644
--- a/upatch-manage/arch/x86_64/ptrace.c
+++ b/upatch-manage/arch/x86_64/ptrace.c
@@ -19,6 +19,7 @@
*/
#include <string.h>
+#include <stdlib.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
@@ -26,7 +27,7 @@
#include "upatch-ptrace.h"
-int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
+long upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
unsigned long arg1, unsigned long arg2,
unsigned long arg3, unsigned long arg4,
unsigned long arg5, unsigned long arg6,
@@ -38,11 +39,11 @@ int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
0x0f, 0x05, /* syscall */
0xcc, /* int3 */
};
- int ret;
+ long ret;
memset(&regs, 0, sizeof(struct user_regs_struct));
log_debug("Executing syscall %d (pid %d)...\n", nr, pctx->pid);
- regs.rax = (unsigned long)nr;
+ regs.rax = (unsigned long long)nr;
regs.rdi = arg1;
regs.rsi = arg2;
regs.rdx = arg3;
@@ -57,7 +58,7 @@ int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *pctx, int nr,
return ret;
}
-int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
+long upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
const unsigned char *code, size_t codelen,
struct user_regs_struct *pregs,
int (*func)(struct upatch_ptrace_ctx *pctx,
@@ -65,23 +66,30 @@ int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
const void *data)
{
struct user_regs_struct orig_regs, regs;
- unsigned char orig_code[codelen];
- int ret;
+ long ret;
struct upatch_process *proc = pctx->proc;
unsigned long libc_base = proc->libc_base;
+ unsigned char *orig_code = (unsigned char *)malloc(sizeof(*orig_code) * codelen);
+
+ if (orig_code == NULL) {
+ log_error("Malloc orig_code failed\n");
+ return -1;
+ }
ret = ptrace(PTRACE_GETREGS, pctx->pid, NULL, &orig_regs);
if (ret < 0) {
log_error("can't get regs - %d\n", pctx->pid);
+ free(orig_code);
return -1;
}
ret = upatch_process_mem_read(proc, libc_base,
(unsigned long *)orig_code, codelen);
if (ret < 0) {
log_error("can't peek original code - %d\n", pctx->pid);
+ free(orig_code);
return -1;
}
- ret = upatch_process_mem_write(proc, (unsigned long *)code, libc_base,
+ ret = upatch_process_mem_write(proc, code, libc_base,
codelen);
if (ret < 0) {
log_error("can't poke syscall code - %d\n", pctx->pid);
@@ -122,6 +130,7 @@ int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
poke_back:
upatch_process_mem_write(proc, (unsigned long *)orig_code, libc_base,
codelen);
+ free(orig_code);
return ret;
}
@@ -165,22 +174,8 @@ size_t get_upatch_addr_len()
}
-unsigned long get_new_insn(struct object_file *obj, unsigned long old_addr,
- unsigned long new_addr)
+unsigned long get_new_insn(void)
{
char jmp_insn[] = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00};
return *(unsigned long *)jmp_insn;
-}
-
-#if 0
-unsigned long get_new_insn(struct object_file *obj, unsigned long old_addr,
- unsigned long new_addr)
-{
- char jmp_insn[] = { 0xe9, 0x00, 0x00, 0x00, 0x00 }; /* jmp IMM */
-
- *(unsigned int *)(jmp_insn + 1) =
- (unsigned int)(new_addr - old_addr - 5);
-
- return *(unsigned long *)jmp_insn;
-}
-#endif
+}
\ No newline at end of file
diff --git a/upatch-manage/arch/x86_64/relocation.c b/upatch-manage/arch/x86_64/relocation.c
index bb9cf32..657f014 100644
--- a/upatch-manage/arch/x86_64/relocation.c
+++ b/upatch-manage/arch/x86_64/relocation.c
@@ -63,7 +63,7 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
(int)GELF_R_TYPE(rel[i].r_info), sym->st_value,
rel[i].r_addend, (u64)loc);
- val = sym->st_value + rel[i].r_addend;
+ val = sym->st_value + (unsigned long)rel[i].r_addend;
switch (GELF_R_TYPE(rel[i].r_info)) {
case R_X86_64_NONE:
break;
@@ -95,7 +95,8 @@ int apply_relocate_add(struct upatch_elf *uelf, unsigned int symindex,
if (sym->st_value == 0)
goto overflow;
/* G + GOT + A*/
- val = sym->st_value + rel[i].r_addend;
+ val = sym->st_value + (unsigned long)rel[i].r_addend;
+ /* fallthrough*/
case R_X86_64_PC32:
case R_X86_64_PLT32:
if (*(u32 *)loc != 0)
diff --git a/upatch-manage/arch/x86_64/resolve.c b/upatch-manage/arch/x86_64/resolve.c
index 5432b20..0f8623d 100644
--- a/upatch-manage/arch/x86_64/resolve.c
+++ b/upatch-manage/arch/x86_64/resolve.c
@@ -30,7 +30,7 @@ struct upatch_jmp_table_entry {
unsigned long addr;
};
-unsigned int get_jmp_table_entry()
+unsigned int get_jmp_table_entry(void)
{
return sizeof(struct upatch_jmp_table_entry);
}
@@ -84,6 +84,7 @@ unsigned long insert_plt_table(struct upatch_elf *uelf, struct object_file *obj,
unsigned long jmp_addr;
unsigned long elf_addr = 0;
+ (void)r_type;
if (upatch_process_mem_read(obj->proc, addr, &jmp_addr,
sizeof(jmp_addr))) {
log_error("copy address failed\n");
diff --git a/upatch-manage/upatch-common.h b/upatch-manage/upatch-common.h
index ab4084a..bc694d6 100644
--- a/upatch-manage/upatch-common.h
+++ b/upatch-manage/upatch-common.h
@@ -33,7 +33,7 @@
list_add(&(_new)->list, (_list)); \
}
-static inline int page_shift(int n)
+static inline int page_shift(long n)
{
int res = -1;
@@ -52,7 +52,7 @@ static inline int page_shift(int n)
#endif
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define ALIGN(x, a) (((x) + (a)-1) & (~((a)-1)))
-#define PAGE_ALIGN(x) ALIGN((x), PAGE_SIZE)
+#define PAGE_ALIGN(x) ALIGN((x), (unsigned long)PAGE_SIZE)
#define ROUND_DOWN(x, m) ((x) & ~((m)-1))
#define ROUND_UP(x, m) (((x) + (m)-1) & ~((m)-1))
diff --git a/upatch-manage/upatch-elf.c b/upatch-manage/upatch-elf.c
index 78c7fd7..1038ef9 100644
--- a/upatch-manage/upatch-elf.c
+++ b/upatch-manage/upatch-elf.c
@@ -30,14 +30,14 @@
#include "upatch-elf.h"
#include "upatch-ptrace.h"
-static int read_from_offset(int fd, void **buf, int len, off_t offset)
+static int read_from_offset(int fd, void **buf, unsigned long len, off_t offset)
{
*buf = malloc(len);
if (*buf == NULL) {
return -errno;
}
- int size = pread(fd, *buf, len, offset);
+ ssize_t size = pread(fd, *buf, len, offset);
if (size == -1) {
return -errno;
}
@@ -47,7 +47,7 @@ static int read_from_offset(int fd, void **buf, int len, off_t offset)
static int open_elf(struct elf_info *einfo, const char *name)
{
- int ret = 0, fd = -1, i;
+ int ret = 0, fd = -1;
char *sec_name;
struct stat st;
@@ -65,7 +65,7 @@ static int open_elf(struct elf_info *einfo, const char *name)
goto out;
}
- ret = read_from_offset(fd, (void **)&einfo->patch_buff, st.st_size, 0);
+ ret = read_from_offset(fd, (void **)&einfo->patch_buff, (unsigned long)st.st_size, 0);
if (ret != 0) {
log_error("Failed to read file '%s'\n", name);
goto out;
@@ -73,7 +73,7 @@ static int open_elf(struct elf_info *einfo, const char *name)
einfo->name = name;
einfo->inode = st.st_ino;
- einfo->patch_size = st.st_size;
+ einfo->patch_size = (unsigned long)st.st_size;
einfo->hdr = (void *)einfo->patch_buff;
einfo->shdrs = (void *)einfo->hdr + einfo->hdr->e_shoff;
einfo->shstrtab = (void *)einfo->hdr + einfo->shdrs[einfo->hdr->e_shstrndx].sh_offset;
@@ -85,7 +85,7 @@ static int open_elf(struct elf_info *einfo, const char *name)
goto out;
}
- for (i = 0; i < einfo->hdr->e_shnum; ++i) {
+ for (unsigned int i = 0; i < einfo->hdr->e_shnum; ++i) {
sec_name = einfo->shstrtab + einfo->shdrs[i].sh_name;
if (streql(sec_name, BUILD_ID_NAME) && einfo->shdrs[i].sh_type == SHT_NOTE) {
einfo->num_build_id = i;
@@ -116,7 +116,7 @@ int upatch_init(struct upatch_elf *uelf, const char *name)
return ret;
}
- for (int i = 1; i < uelf->info.hdr->e_shnum; ++i) {
+ for (unsigned int i = 1; i < uelf->info.hdr->e_shnum; ++i) {
char *sec_name = uelf->info.shstrtab + uelf->info.shdrs[i].sh_name;
if (uelf->info.shdrs[i].sh_type == SHT_SYMTAB) {
uelf->num_syms = uelf->info.shdrs[i].sh_size / sizeof(GElf_Sym);
@@ -165,7 +165,7 @@ int binary_init(struct running_elf *relf, const char *name)
return ret;
}
- for (int i = 1; i < relf->info.hdr->e_shnum; i++) {
+ for (unsigned int i = 1; i < relf->info.hdr->e_shnum; i++) {
char *sec_name = relf->info.shstrtab + relf->info.shdrs[i].sh_name;
if (relf->info.shdrs[i].sh_type == SHT_SYMTAB) {
log_debug("Found section '%s', idx=%d\n", SYMTAB_NAME, i);
diff --git a/upatch-manage/upatch-elf.h b/upatch-manage/upatch-elf.h
index 481fec9..499287a 100644
--- a/upatch-manage/upatch-elf.h
+++ b/upatch-manage/upatch-elf.h
@@ -56,7 +56,7 @@ struct upatch_info {
unsigned long size; // upatch_info and upatch_info_func size
unsigned long start; // upatch vma start
unsigned long end; // upatch vma end
- unsigned int changed_func_num;
+ unsigned long changed_func_num;
// upatch_header_func
};
@@ -65,15 +65,15 @@ struct upatch_layout {
void *kbase;
void *base;
/* Total size. */
- unsigned int size;
+ unsigned long size;
/* The size of the executable code. */
- unsigned int text_size;
+ unsigned long text_size;
/* Size of RO section of the module (text+rodata) */
- unsigned int ro_size;
+ unsigned long ro_size;
/* Size of RO after init section, not use it now */
- unsigned int ro_after_init_size;
+ unsigned long ro_after_init_size;
/* The size of the info. */
- unsigned int info_size;
+ unsigned long info_size;
};
struct upatch_patch_func {
diff --git a/upatch-manage/upatch-manage.c b/upatch-manage/upatch-manage.c
index 8a7ba60..965af35 100644
--- a/upatch-manage/upatch-manage.c
+++ b/upatch-manage/upatch-manage.c
@@ -54,14 +54,14 @@ struct arguments {
};
static struct argp_option options[] = {
- { "verbose", 'v', NULL, 0, "Show verbose output" },
- { "uuid", 'U', "uuid", 0, "the uuid of the upatch" },
- { "pid", 'p', "pid", 0, "the pid of the user-space process" },
- { "upatch", 'u', "upatch", 0, "the upatch file" },
- { "binary", 'b', "binary", 0, "the binary file" },
- { "cmd", 0, "patch", 0, "Apply a upatch file to a user-space process" },
+ { "verbose", 'v', NULL, 0, "Show verbose output", 0 },
+ { "uuid", 'U', "uuid", 0, "the uuid of the upatch", 0 },
+ { "pid", 'p', "pid", 0, "the pid of the user-space process", 0 },
+ { "upatch", 'u', "upatch", 0, "the upatch file", 0 },
+ { "binary", 'b', "binary", 0, "the binary file", 0 },
+ { "cmd", 0, "patch", 0, "Apply a upatch file to a user-space process", 0 },
{ "cmd", 0, "unpatch", 0,
- "Unapply a upatch file to a user-space process" },
+ "Unapply a upatch file to a user-space process", 0 },
{ NULL }
};
@@ -135,7 +135,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
return 0;
}
-static struct argp argp = { options, parse_opt, args_doc, program_doc };
+static struct argp argp = { options, parse_opt, args_doc, program_doc, NULL, NULL, NULL };
int patch_upatch(const char *uuid, const char *binary_path, const char *upatch_path, int pid)
{
@@ -163,7 +163,7 @@ out:
return ret;
}
-int unpatch_upatch(const char *uuid, const char *binary_path, const char *upatch_path, int pid)
+int unpatch_upatch(const char *uuid, int pid)
{
int ret = 0;
@@ -176,7 +176,7 @@ int unpatch_upatch(const char *uuid, const char *binary_path, const char *upatch
return 0;
}
-int info_upatch(const char *binary_path, const char *upatch_path, int pid)
+int info_upatch(int pid)
{
int ret = process_info(pid);
if (ret != 0) {
@@ -210,10 +210,10 @@ int main(int argc, char *argv[])
ret = patch_upatch(args.uuid, args.binary, args.upatch, args.pid);
break;
case UNPATCH:
- ret = unpatch_upatch(args.uuid, args.binary, args.upatch, args.pid);
+ ret = unpatch_upatch(args.uuid, args.pid);
break;
case INFO:
- ret = info_upatch(args.binary, args.upatch, args.pid);
+ ret = info_upatch(args.pid);
break;
default:
ERROR("Unknown command");
diff --git a/upatch-manage/upatch-patch.c b/upatch-manage/upatch-patch.c
index ab972ac..cbdbbe1 100644
--- a/upatch-manage/upatch-patch.c
+++ b/upatch-manage/upatch-patch.c
@@ -51,7 +51,7 @@ static GElf_Off calculate_load_address(struct running_elf *relf,
bool check_code)
{
int i;
- GElf_Off min_addr = -1;
+ GElf_Off min_addr = (unsigned long)-1;
/* TODO: for ET_DYN, consider check PIE */
if (relf->info.hdr->e_type != ET_EXEC &&
@@ -78,7 +78,7 @@ out:
static unsigned long calculate_mem_load(struct object_file *obj)
{
struct obj_vm_area *ovma;
- unsigned long load_addr = -1;
+ unsigned long load_addr = (unsigned long)-1;
list_for_each_entry(ovma, &obj->vma, list) {
if (ovma->inmem.prot & PROT_EXEC) {
@@ -120,29 +120,20 @@ static int rewrite_section_headers(struct upatch_elf *uelf)
return 0;
}
-/* Additional bytes needed by arch in front of individual sections */
-unsigned int arch_mod_section_prepend(struct upatch_elf *uelf,
- unsigned int section)
+static unsigned long get_offset(unsigned long *size,
+ GElf_Shdr *sechdr)
{
- /* default implementation just returns zero */
- return 0;
-}
+ unsigned long ret;
-static long get_offset(struct upatch_elf *uelf, unsigned int *size,
- GElf_Shdr *sechdr, unsigned int section)
-{
- long ret;
-
- *size += arch_mod_section_prepend(uelf, section);
- ret = ALIGN(*size, sechdr->sh_addralign ?: 1);
- *size = ret + sechdr->sh_size;
+ ret = ALIGN(*size, (unsigned long)(sechdr->sh_addralign ?: 1));
+ *size = (unsigned long)ret + sechdr->sh_size;
return ret;
}
static void layout_upatch_info(struct upatch_elf *uelf)
{
GElf_Shdr *upatch_func = uelf->info.shdrs + uelf->index.upatch_funcs;
- int num = upatch_func->sh_size / sizeof(struct upatch_patch_func);
+ unsigned long num = upatch_func->sh_size / sizeof(struct upatch_patch_func);
uelf->core_layout.info_size = uelf->core_layout.size;
uelf->core_layout.size += sizeof(struct upatch_info) +
@@ -189,7 +180,7 @@ static void layout_sections(struct upatch_elf *uelf)
continue;
s->sh_entsize =
- get_offset(uelf, &uelf->core_layout.size, s, i);
+ get_offset(&uelf->core_layout.size, s);
log_debug("\tm = %d; %s: sh_entsize: 0x%lx\n", m, sname,
s->sh_entsize);
}
@@ -214,13 +205,14 @@ static void layout_sections(struct upatch_elf *uelf)
uelf->core_layout.size =
PAGE_ALIGN(uelf->core_layout.size);
break;
+ default:
+ break;
}
}
}
/* TODO: only included used symbol */
-static bool is_upatch_symbol(const GElf_Sym *src, const GElf_Shdr *sechdrs,
- unsigned int shnum)
+static bool is_upatch_symbol(void)
{
return true;
}
@@ -237,12 +229,11 @@ static void layout_symtab(struct upatch_elf *uelf)
GElf_Shdr *strsect = uelf->info.shdrs + uelf->index.str;
/* TODO: only support same arch as kernel now */
const GElf_Sym *src;
- unsigned int i, nsrc, ndst, strtab_size = 0;
+ unsigned long i, nsrc, ndst, strtab_size = 0;
/* Put symbol section at end of init part of module. */
symsect->sh_flags |= SHF_ALLOC;
- symsect->sh_entsize = get_offset(uelf, &uelf->core_layout.size, symsect,
- uelf->index.sym);
+ symsect->sh_entsize = get_offset(&uelf->core_layout.size, symsect);
log_debug("\t%s\n", uelf->info.shstrtab + symsect->sh_name);
src = (void *)uelf->info.hdr + symsect->sh_offset;
@@ -250,8 +241,7 @@ static void layout_symtab(struct upatch_elf *uelf)
/* Compute total space required for the symbols' strtab. */
for (ndst = i = 0; i < nsrc; i++) {
- if (i == 0 || is_upatch_symbol(src + i, uelf->info.shdrs,
- uelf->info.hdr->e_shnum)) {
+ if (i == 0 || is_upatch_symbol()) {
strtab_size +=
strlen(&uelf->strtab[src[i].st_name]) + 1;
ndst++;
@@ -270,8 +260,7 @@ static void layout_symtab(struct upatch_elf *uelf)
/* Put string table section at end of init part of module. */
strsect->sh_flags |= SHF_ALLOC;
- strsect->sh_entsize = get_offset(uelf, &uelf->core_layout.size, strsect,
- uelf->index.str);
+ strsect->sh_entsize = get_offset(&uelf->core_layout.size, strsect);
uelf->core_layout.size = PAGE_ALIGN(uelf->core_layout.size);
log_debug("\t%s\n", uelf->info.shstrtab + strsect->sh_name);
}
@@ -288,8 +277,8 @@ static void *upatch_alloc(struct object_file *obj, size_t sz)
addr = upatch_mmap_remote(proc2pctx(obj->proc), addr, sz,
PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1,
- 0);
+ MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
+ (unsigned long)-1, 0);
if (addr == 0) {
return NULL;
}
@@ -308,7 +297,7 @@ static void *upatch_alloc(struct object_file *obj, size_t sz)
}
static void upatch_free(struct object_file *obj, void *base,
- unsigned int size)
+ unsigned long size)
{
log_debug("Free patch memory %p\n", base);
if (upatch_munmap_remote(proc2pctx(obj->proc), (unsigned long)base, size)) {
@@ -378,7 +367,7 @@ static int post_memory(struct upatch_elf *uelf, struct object_file *obj)
{
int ret = 0;
- log_debug("Post kbase %lx(%x) to base %lx\n",
+ log_debug("Post kbase %lx(%lx) to base %lx\n",
(unsigned long)uelf->core_layout.kbase,
uelf->core_layout.size,
(unsigned long)uelf->core_layout.base);
@@ -396,7 +385,7 @@ out:
static int complete_info(struct upatch_elf *uelf, struct object_file *obj, const char *uuid)
{
- int ret = 0, i;
+ int ret = 0;
struct upatch_info *uinfo =
(void *)uelf->core_layout.kbase + uelf->core_layout.info_size;
struct upatch_patch_func *upatch_funcs_addr =
@@ -414,7 +403,7 @@ static int complete_info(struct upatch_elf *uelf, struct object_file *obj, const
memcpy(uinfo->id, uuid, strlen(uuid));
log_normal("Changed insn:\n");
- for (i = 0; i < uinfo->changed_func_num; ++i) {
+ for (unsigned int i = 0; i < uinfo->changed_func_num; ++i) {
struct upatch_info_func *upatch_func =
(void *)uelf->core_layout.kbase +
uelf->core_layout.info_size +
@@ -433,8 +422,7 @@ static int complete_info(struct upatch_elf *uelf, struct object_file *obj, const
goto out;
}
- upatch_func->new_insn = get_new_insn(obj, upatch_func->old_addr,
- upatch_func->new_addr);
+ upatch_func->new_insn = get_new_insn();
log_normal("\t0x%lx(0x%lx -> 0x%lx)\n", upatch_func->old_addr,
upatch_func->old_insn[0], upatch_func->new_insn);
@@ -446,10 +434,10 @@ out:
static int unapply_patch(struct object_file *obj,
struct upatch_info_func *funcs,
- unsigned int changed_func_num)
+ unsigned long changed_func_num)
{
log_normal("Changed insn:\n");
- for (int i = 0; i < changed_func_num; ++i) {
+ for (unsigned int i = 0; i < changed_func_num; ++i) {
log_normal("\t0x%lx(0x%lx -> 0x%lx)\n", funcs[i].old_addr,
funcs[i].new_insn, funcs[i].old_insn[0]);
@@ -467,7 +455,8 @@ static int unapply_patch(struct object_file *obj,
static int apply_patch(struct upatch_elf *uelf, struct object_file *obj)
{
- int ret = 0, i;
+ int ret = 0;
+ unsigned int i;
struct upatch_info *uinfo =
(void *)uelf->core_layout.kbase + uelf->core_layout.info_size;
@@ -617,10 +606,10 @@ static int upatch_apply_patches(struct upatch_process *proc,
layout_symtab(uelf);
layout_upatch_info(uelf);
- log_debug("calculate core layout = %x\n", uelf->core_layout.size);
+ log_debug("calculate core layout = %lx\n", uelf->core_layout.size);
log_debug(
- "Core layout: text_size = %x, ro_size = %x, ro_after_init_size = "
- "%x, info = %x, size = %x\n",
+ "Core layout: text_size = %lx, ro_size = %lx, ro_after_init_size = "
+ "%lx, info = %lx, size = %lx\n",
uelf->core_layout.text_size, uelf->core_layout.ro_size,
uelf->core_layout.ro_after_init_size,
uelf->core_layout.info_size, uelf->core_layout.size);
@@ -699,7 +688,7 @@ static void upatch_time_tick(int pid) {
return;
}
- unsigned long frozen_time = GET_MICROSECONDS(end_tv, start_tv);
+ long frozen_time = GET_MICROSECONDS(end_tv, start_tv);
log_normal("Process %d frozen time is %ld microsecond(s)\n",
pid, frozen_time);
}
@@ -751,7 +740,7 @@ int process_patch(int pid, struct upatch_elf *uelf, struct running_elf *relf, co
* stored in the patch are valid for the original object.
*/
// 解析process的mem-maps获得各个块的内存映射以及phdr
- ret = upatch_process_map_object_files(&proc, NULL);
+ ret = upatch_process_map_object_files(&proc);
if (ret < 0) {
log_error("Failed to read process memory mapping\n");
goto out_free;
@@ -871,7 +860,7 @@ int process_unpatch(int pid, const char *uuid)
* stored in the patch are valid for the original object.
*/
// 解析process的mem-maps获得各个块的内存映射以及phdr
- ret = upatch_process_map_object_files(&proc, NULL);
+ ret = upatch_process_map_object_files(&proc);
if (ret < 0) {
log_error("Failed to read process memory mapping\n");
goto out_free;
@@ -950,7 +939,7 @@ int process_info(int pid)
goto out_free;
}
- ret = upatch_process_map_object_files(&proc, NULL);
+ ret = upatch_process_map_object_files(&proc);
if (ret < 0) {
log_error("Failed to read process memory mapping\n");
goto out_free;
diff --git a/upatch-manage/upatch-process.c b/upatch-manage/upatch-process.c
index c368165..3b8db3b 100644
--- a/upatch-manage/upatch-process.c
+++ b/upatch-manage/upatch-process.c
@@ -65,7 +65,7 @@ static int lock_process(int pid)
return fd;
}
-static void unlock_process(int pid, int fdmaps)
+static void unlock_process(int fdmaps)
{
int errsv = errno;
close(fdmaps);
@@ -141,7 +141,7 @@ int upatch_process_init(struct upatch_process *proc, int pid)
return 0;
out_unlock:
- unlock_process(pid, fdmaps);
+ unlock_process(fdmaps);
out_err:
return -1;
}
@@ -192,7 +192,7 @@ static void upatch_process_memfree(struct upatch_process *proc)
void upatch_process_destroy(struct upatch_process *proc)
{
- unlock_process(proc->pid, proc->fdmaps);
+ unlock_process(proc->fdmaps);
upatch_process_memfree(proc);
}
@@ -345,12 +345,12 @@ static int object_add_vm_area(struct object_file *o, struct vm_area *vma,
}
static struct object_file *
-process_new_object(struct upatch_process *proc, dev_t dev, int inode,
+process_new_object(struct upatch_process *proc, dev_t dev, ino_t inode,
const char *name, struct vm_area *vma, struct vm_hole *hole)
{
struct object_file *o;
- log_debug("Creating object file '%s' for %lx:%d...", name, dev, inode);
+ log_debug("Creating object file '%s' for %lx:%lu...", name, dev, inode);
o = malloc(sizeof(*o));
if (!o) {
@@ -389,7 +389,7 @@ process_new_object(struct upatch_process *proc, dev_t dev, int inode,
* Returns: 0 if everything is ok, -1 on error.
*/
static int process_add_object_vma(struct upatch_process *proc, dev_t dev,
- int inode, char *name, struct vm_area *vma,
+ ino_t inode, char *name, struct vm_area *vma,
struct vm_hole *hole)
{
int object_type;
@@ -407,7 +407,7 @@ static int process_add_object_vma(struct upatch_process *proc, dev_t dev,
*/
list_for_each_entry_reverse(o, &proc->objs, list) {
if ((dev && inode && o->dev == dev &&
- o->inode == inode) ||
+ o->inode == (ino_t)inode) ||
(dev == 0 && !strcmp(o->name, name))) {
return object_add_vm_area(o, vma, hole);
}
@@ -512,9 +512,9 @@ int upatch_process_parse_proc_maps(struct upatch_process *proc)
vma.prot = perms2prot(perms);
/* Hole must be at least 2 pages for guardians */
- if (start - hole_start > 2 * PAGE_SIZE) {
- hole = process_add_vm_hole(proc, hole_start + PAGE_SIZE,
- start - PAGE_SIZE);
+ if (start - hole_start > (unsigned long)(2 * PAGE_SIZE)) {
+ hole = process_add_vm_hole(proc, hole_start + (unsigned long)PAGE_SIZE,
+ start - (unsigned long)PAGE_SIZE);
if (hole == NULL) {
log_error("Failed to add vma hole");
goto error;
@@ -557,8 +557,7 @@ error:
return -1;
}
-int upatch_process_map_object_files(struct upatch_process *proc,
- const char *patch_id)
+int upatch_process_map_object_files(struct upatch_process *proc)
{
// we can get plt/got table from mem's elf_segments
// Now we read them from the running file
@@ -618,7 +617,7 @@ static int process_list_threads(struct upatch_process *proc, int **ppids,
*ppids = pids;
- return *npids;
+ return (int)*npids;
dealloc:
if (dir) {
@@ -761,8 +760,10 @@ static inline unsigned long hole_size(struct vm_hole *hole)
int vm_hole_split(struct vm_hole *hole, unsigned long alloc_start,
unsigned long alloc_end)
{
- alloc_start = ROUND_DOWN(alloc_start, PAGE_SIZE) - PAGE_SIZE;
- alloc_end = ROUND_UP(alloc_end, PAGE_SIZE) + PAGE_SIZE;
+ unsigned long page_size = (unsigned long)PAGE_SIZE;
+
+ alloc_start = ROUND_DOWN(alloc_start, page_size) - page_size;
+ alloc_end = ROUND_UP(alloc_end, page_size) + page_size;
if (alloc_start > hole->start) {
struct vm_hole *left = NULL;
@@ -856,7 +857,7 @@ unsigned long object_find_patch_region(struct object_file *obj, size_t memsize,
return -1UL;
}
- region_start = (region_start >> PAGE_SHIFT) << PAGE_SHIFT;
+ region_start = (region_start >> (unsigned long)PAGE_SHIFT) << (unsigned long)PAGE_SHIFT;
log_debug("Found patch region for '%s' at 0x%lx\n", obj->name,
region_start);
diff --git a/upatch-manage/upatch-process.h b/upatch-manage/upatch-process.h
index 39909db..be44cb5 100644
--- a/upatch-manage/upatch-process.h
+++ b/upatch-manage/upatch-process.h
@@ -133,7 +133,7 @@ void upatch_process_print_short(struct upatch_process *);
int upatch_process_mem_open(struct upatch_process *, int);
-int upatch_process_map_object_files(struct upatch_process *, const char *);
+int upatch_process_map_object_files(struct upatch_process *);
int upatch_process_attach(struct upatch_process *);
diff --git a/upatch-manage/upatch-ptrace.c b/upatch-manage/upatch-ptrace.c
index 1309a6e..03296bc 100644
--- a/upatch-manage/upatch-ptrace.c
+++ b/upatch-manage/upatch-ptrace.c
@@ -37,16 +37,16 @@ int upatch_process_mem_read(struct upatch_process *proc, unsigned long src,
{
ssize_t r = pread(proc->memfd, dst, size, (off_t)src);
- return r != size ? -1 : 0;
+ return r != (ssize_t)size ? -1 : 0;
}
static int upatch_process_mem_write_ptrace(struct upatch_process *proc,
- void *src, unsigned long dst, size_t size)
+ const void *src, unsigned long dst, size_t size)
{
- int ret;
+ long ret;
while (ROUND_DOWN(size, sizeof(long)) != 0) {
- ret = ptrace(PTRACE_POKEDATA, proc->pid, dst, *(unsigned long *)src);
+ ret = ptrace(PTRACE_POKEDATA, proc->pid, dst, *(const unsigned long *)src);
if (ret) {
return -1;
}
@@ -56,10 +56,10 @@ static int upatch_process_mem_write_ptrace(struct upatch_process *proc,
}
if (size) {
- unsigned long tmp;
+ long tmp;
tmp = ptrace(PTRACE_PEEKDATA, proc->pid, dst, NULL);
- if (tmp == (unsigned long)-1 && errno) {
+ if (tmp == -1 && errno) {
return -1;
}
memcpy(&tmp, src, size);
@@ -73,7 +73,7 @@ static int upatch_process_mem_write_ptrace(struct upatch_process *proc,
return 0;
}
-int upatch_process_mem_write(struct upatch_process *proc, void *src,
+int upatch_process_mem_write(struct upatch_process *proc, const void *src,
unsigned long dst, size_t size)
{
static int use_pwrite = 1;
@@ -87,7 +87,7 @@ int upatch_process_mem_write(struct upatch_process *proc, void *src,
return upatch_process_mem_write_ptrace(proc, src, dst, size);
}
- return w != size ? -1 : 0;
+ return w != (ssize_t)size ? -1 : 0;
}
static struct upatch_ptrace_ctx* upatch_ptrace_ctx_alloc(
@@ -168,19 +168,20 @@ int upatch_ptrace_attach_thread(struct upatch_process *proc, int tid)
int wait_for_stop(struct upatch_ptrace_ctx *pctx, const void *data)
{
- int ret, status = 0, pid = (int)(uintptr_t)data ?: pctx->pid;
+ long ret;
+ int status = 0, pid = (int)(uintptr_t)data ?: pctx->pid;
log_debug("wait_for_stop(pctx->pid=%d, pid=%d)\n", pctx->pid, pid);
while (1) {
ret = ptrace(PTRACE_CONT, pctx->pid, NULL, (void *)(uintptr_t)status);
if (ret < 0) {
- log_error("Cannot start tracee %d, ret=%d\n", pctx->pid, ret);
+ log_error("Cannot start tracee %d, ret=%ld\n", pctx->pid, ret);
return -1;
}
ret = waitpid(pid, &status, __WALL);
if (ret < 0) {
- log_error("Cannot wait tracee %d, ret=%d\n", pid, ret);
+ log_error("Cannot wait tracee %d, ret=%ld\n", pid, ret);
return -1;
}
@@ -217,7 +218,7 @@ int upatch_ptrace_detach(struct upatch_ptrace_ctx *pctx)
return 0;
}
-int upatch_execute_remote(struct upatch_ptrace_ctx *pctx,
+long upatch_execute_remote(struct upatch_ptrace_ctx *pctx,
const unsigned char *code, size_t codelen,
struct user_regs_struct *pregs)
{
@@ -226,13 +227,13 @@ int upatch_execute_remote(struct upatch_ptrace_ctx *pctx,
}
unsigned long upatch_mmap_remote(struct upatch_ptrace_ctx *pctx,
- unsigned long addr, size_t length, int prot,
- int flags, int fd, off_t offset)
+ unsigned long addr, size_t length, unsigned long prot,
+ unsigned long flags, unsigned long fd, unsigned long offset)
{
- int ret;
+ long ret;
unsigned long res = 0;
- log_debug("mmap_remote: 0x%lx+%lx, %x, %x, %d, %lx\n", addr, length,
+ log_debug("mmap_remote: 0x%lx+%lx, %lx, %lx, %lu, %lx\n", addr, length,
prot, flags, fd, offset);
ret = upatch_arch_syscall_remote(pctx, __NR_mmap, (unsigned long)addr,
length, prot, flags, fd, offset, &res);
@@ -240,16 +241,16 @@ unsigned long upatch_mmap_remote(struct upatch_ptrace_ctx *pctx,
return 0;
}
if (ret == 0 && res >= (unsigned long)-MAX_ERRNO) {
- errno = -(long)res;
+ errno = -(int)res;
return 0;
}
return res;
}
int upatch_mprotect_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
- size_t length, int prot)
+ size_t length, unsigned long prot)
{
- int ret;
+ long ret;
unsigned long res;
log_debug("mprotect_remote: 0x%lx+%lx\n", addr, length);
@@ -259,7 +260,7 @@ int upatch_mprotect_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
if (ret < 0)
return -1;
if (ret == 0 && res >= (unsigned long)-MAX_ERRNO) {
- errno = -(long)res;
+ errno = -(int)res;
return -1;
}
@@ -269,7 +270,7 @@ int upatch_mprotect_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
int upatch_munmap_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
size_t length)
{
- int ret;
+ long ret;
unsigned long res;
log_debug("munmap_remote: 0x%lx+%lx\n", addr, length);
@@ -278,7 +279,7 @@ int upatch_munmap_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
if (ret < 0)
return -1;
if (ret == 0 && res >= (unsigned long)-MAX_ERRNO) {
- errno = -(long)res;
+ errno = -(int)res;
return -1;
}
return 0;
diff --git a/upatch-manage/upatch-ptrace.h b/upatch-manage/upatch-ptrace.h
index 0c88434..b88c656 100644
--- a/upatch-manage/upatch-ptrace.h
+++ b/upatch-manage/upatch-ptrace.h
@@ -43,7 +43,7 @@ struct upatch_ptrace_ctx {
int upatch_process_mem_read(struct upatch_process *proc, unsigned long src,
void *dst, size_t size);
-int upatch_process_mem_write(struct upatch_process *, void *, unsigned long,
+int upatch_process_mem_write(struct upatch_process *, const void *, unsigned long,
size_t);
int upatch_ptrace_attach_thread(struct upatch_process *, int);
@@ -54,31 +54,32 @@ int wait_for_stop(struct upatch_ptrace_ctx *, const void *);
void copy_regs(struct user_regs_struct *, struct user_regs_struct *);
-int upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
+long upatch_arch_execute_remote_func(struct upatch_ptrace_ctx *pctx,
const unsigned char *code, size_t codelen,
struct user_regs_struct *pregs,
int (*func)(struct upatch_ptrace_ctx *pctx,
const void *data),
const void *data);
-int upatch_arch_syscall_remote(struct upatch_ptrace_ctx *, int, unsigned long,
+long upatch_arch_syscall_remote(struct upatch_ptrace_ctx *, int, unsigned long,
unsigned long, unsigned long, unsigned long,
unsigned long, unsigned long, unsigned long *);
-unsigned long upatch_mmap_remote(struct upatch_ptrace_ctx *, unsigned long,
- size_t, int, int, int, off_t);
+unsigned long upatch_mmap_remote(struct upatch_ptrace_ctx *pctx,
+ unsigned long addr, size_t length, unsigned long prot,
+ unsigned long flags, unsigned long fd, unsigned long offset);
-int upatch_mprotect_remote(struct upatch_ptrace_ctx *, unsigned long, size_t,
- int);
+int upatch_mprotect_remote(struct upatch_ptrace_ctx *pctx, unsigned long addr,
+ size_t length, unsigned long prot);
int upatch_munmap_remote(struct upatch_ptrace_ctx *, unsigned long, size_t);
-int upatch_execute_remote(struct upatch_ptrace_ctx *, const unsigned char *,
+long upatch_execute_remote(struct upatch_ptrace_ctx *, const unsigned char *,
size_t, struct user_regs_struct *);
-size_t get_origin_insn_len();
-size_t get_upatch_insn_len();
-size_t get_upatch_addr_len();
-unsigned long get_new_insn(struct object_file *, unsigned long, unsigned long);
+size_t get_origin_insn_len(void);
+size_t get_upatch_insn_len(void);
+size_t get_upatch_addr_len(void);
+unsigned long get_new_insn(void);
#endif
diff --git a/upatch-manage/upatch-resolve.c b/upatch-manage/upatch-resolve.c
index 0e992da..197ea2f 100644
--- a/upatch-manage/upatch-resolve.c
+++ b/upatch-manage/upatch-resolve.c
@@ -50,7 +50,7 @@ static unsigned long resolve_rela_dyn(struct upatch_elf *uelf,
* some rela don't have the symbol index, use the symbol's value and
* rela's addend to find the symbol. for example, R_X86_64_IRELATIVE.
*/
- if (rela_dyn[i].r_addend != patch_sym->st_value) {
+ if (rela_dyn[i].r_addend != (long)patch_sym->st_value) {
continue;
}
}
@@ -110,7 +110,7 @@ static unsigned long resolve_rela_plt(struct upatch_elf *uelf,
* some rela don't have the symbol index, use the symbol's value and
* rela's addend to find the symbol. for example, R_X86_64_IRELATIVE.
*/
- if (rela_plt[i].r_addend != patch_sym->st_value) {
+ if (rela_plt[i].r_addend != (long)patch_sym->st_value) {
continue;
}
} else {
@@ -140,7 +140,7 @@ static unsigned long resolve_rela_plt(struct upatch_elf *uelf,
}
static unsigned long resolve_dynsym(struct upatch_elf *uelf,
- struct object_file *obj, const char *name, GElf_Sym *patch_sym)
+ struct object_file *obj, const char *name)
{
unsigned long elf_addr = 0;
struct running_elf *relf = uelf->relf;
@@ -178,8 +178,7 @@ static unsigned long resolve_dynsym(struct upatch_elf *uelf,
return elf_addr;
}
-static unsigned long resolve_sym(struct upatch_elf *uelf,
- struct object_file *obj, const char *name, GElf_Sym *patch_sym)
+static unsigned long resolve_sym(struct upatch_elf *uelf, const char *name)
{
unsigned long elf_addr = 0;
struct running_elf *relf = uelf->relf;
@@ -217,7 +216,7 @@ static unsigned long resolve_sym(struct upatch_elf *uelf,
}
static unsigned long resolve_patch_sym(struct upatch_elf *uelf,
- struct object_file *obj, const char *name, GElf_Sym *patch_sym)
+ const char *name, GElf_Sym *patch_sym)
{
unsigned long elf_addr = 0;
struct running_elf *relf = uelf->relf;
@@ -265,17 +264,17 @@ static unsigned long resolve_symbol(struct upatch_elf *uelf,
/* resolve from dynsym */
if (!elf_addr) {
- elf_addr = resolve_dynsym(uelf, obj, name, &patch_sym);
+ elf_addr = resolve_dynsym(uelf, obj, name);
}
/* resolve from sym */
if (!elf_addr) {
- elf_addr = resolve_sym(uelf, obj, name, &patch_sym);
+ elf_addr = resolve_sym(uelf, name);
}
/* resolve from patch sym */
if (!elf_addr) {
- elf_addr = resolve_patch_sym(uelf, obj, name, &patch_sym);
+ elf_addr = resolve_patch_sym(uelf, name, &patch_sym);
}
if (!elf_addr) {
diff --git a/upatch-manage/upatch-resolve.h b/upatch-manage/upatch-resolve.h
index 324c49e..9b31dce 100644
--- a/upatch-manage/upatch-resolve.h
+++ b/upatch-manage/upatch-resolve.h
@@ -29,7 +29,7 @@
/* jmp table, solve limit for the jmp instruction, Used for both PLT/GOT */
struct upatch_jmp_table_entry;
-unsigned int get_jmp_table_entry();
+unsigned int get_jmp_table_entry(void);
unsigned long insert_plt_table(struct upatch_elf *, struct object_file *,
unsigned long, unsigned long);
--
2.34.1