kpatch/0004-create-diff-object-allow-changing-subsections.patch
Zhipeng Xie 428b311440 sync code to openeuler
sync latest code to openeuler

Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
2019-12-30 15:59:18 +08:00

76 lines
2.4 KiB
Diff

From 942cc3ace7edb7c15f40f931dd6f47a934b9fc77 Mon Sep 17 00:00:00 2001
From: Artem Savkov <asavkov@redhat.com>
Date: Tue, 12 Jun 2018 17:33:17 +0200
Subject: [PATCH] create-diff-object: allow changing subsections
gcc8 can place functions to .text.unlikely and .text.hot subsections
during optimizations. Allow symbols to change subsections instead of
failing.
Signed-off-by: Artem Savkov <asavkov@redhat.com>
backport from:
https://github.com/jpoimboe/kpatch/commit/35cc6ff0162fc8008c4c639fdfcabd61b38a982f
---
kpatch-build/create-diff-object.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
index 2ddd00d..61ce74f 100644
--- a/kpatch-build/create-diff-object.c
+++ b/kpatch-build/create-diff-object.c
@@ -68,6 +68,12 @@
char *childobj;
+enum subsection {
+ SUBSECTION_NORMAL,
+ SUBSECTION_HOT,
+ SUBSECTION_UNLIKELY
+};
+
enum loglevel loglevel = NORMAL;
#ifndef EM_X86_64
@@ -708,6 +714,22 @@ static void kpatch_compare_sections(struct list_head *seclist)
}
}
+static enum subsection kpatch_subsection_type(struct section *sec)
+{
+ if (!strncmp(sec->name, ".text.unlikely.", 15))
+ return SUBSECTION_UNLIKELY;
+
+ if (!strncmp(sec->name, ".text.hot.", 10))
+ return SUBSECTION_HOT;
+
+ return SUBSECTION_NORMAL;
+}
+
+static int kpatch_subsection_changed(struct section *sec1, struct section *sec2)
+{
+ return kpatch_subsection_type(sec1) != kpatch_subsection_type(sec2);
+}
+
static void kpatch_compare_correlated_symbol(struct symbol *sym)
{
struct symbol *sym1 = sym, *sym2 = sym->twin;
@@ -720,10 +742,12 @@ static void kpatch_compare_correlated_symbol(struct symbol *sym)
/*
* If two symbols are correlated but their sections are not, then the
* symbol has changed sections. This is only allowed if the symbol is
- * moving out of an ignored section.
++ * moving out of an ignored section, or moving between normal/hot/unlikely
++ * subsections.
*/
if (sym1->sec && sym2->sec && sym1->sec->twin != sym2->sec) {
- if (sym2->sec->twin && sym2->sec->twin->ignore)
+ if ((sym2->sec->twin && sym2->sec->twin->ignore) ||
+ kpatch_subsection_changed(sym1->sec, sym2->sec))
sym->status = CHANGED;
else if (sym1->name[0] == '$') /* reserved symbols in aarch64 */
log_debug("maping symbols: %s", sym1->name); /* do nothing just ignogre */
--
2.19.1