diff mbox series

[livepatch-build-tools,part2,v2,2/6] common: Add is_referenced_section() helper function

Message ID 20190807114907.74530-1-wipawel@amazon.de (mailing list archive)
State New, archived
Headers show
Series None | expand

Commit Message

Wieczorkiewicz, Pawel Aug. 7, 2019, 11:49 a.m. UTC
This function checks if given section has an included corresponding
RELA section and/or any of the symbols table symbols references the
section. Section associated symbols are ignored here as there is
always such a symbol for every section.

Signed-off-by: Pawel Wieczorkiewicz <wipawel@amazon.de>
Reviewed-by: Andra-Irina Paraschiv <andraprs@amazon.com>
Reviewed-by: Bjoern Doebel <doebel@amazon.de>
Reviewed-by: Norbert Manthey <nmanthey@amazon.de>
---
v2:
* Keep lines to 80 chars
---
 common.c | 23 ++++++++++++++++++++++-
 common.h |  2 ++
 2 files changed, 24 insertions(+), 1 deletion(-)

Comments

Ross Lagerwall Aug. 16, 2019, 9:43 a.m. UTC | #1
On 8/7/19 12:49 PM, Pawel Wieczorkiewicz wrote:
> This function checks if given section has an included corresponding
> RELA section and/or any of the symbols table symbols references the
> section. Section associated symbols are ignored here as there is
> always such a symbol for every section.
> 
> Signed-off-by: Pawel Wieczorkiewicz <wipawel@amazon.de>
> Reviewed-by: Andra-Irina Paraschiv <andraprs@amazon.com>
> Reviewed-by: Bjoern Doebel <doebel@amazon.de>
> Reviewed-by: Norbert Manthey <nmanthey@amazon.de>
> ---

Reviewed-by: Ross Lagerwall <ross.lagerwall@citrix.com>
diff mbox series

Patch

diff --git a/common.c b/common.c
index 1fb07cb..0ddc9fa 100644
--- a/common.c
+++ b/common.c
@@ -15,7 +15,7 @@ 
 
 int is_rela_section(struct section *sec)
 {
-	return (sec->sh.sh_type == SHT_RELA);
+	return sec && (sec->sh.sh_type == SHT_RELA);
 }
 
 int is_local_sym(struct symbol *sym)
@@ -270,6 +270,27 @@  int is_standard_section(struct section *sec)
 	}
 }
 
+int is_referenced_section(const struct section *sec,
+			  const struct kpatch_elf *kelf)
+{
+	struct symbol *sym;
+
+	if (is_rela_section(sec->rela) && sec->rela->include)
+		return true;
+
+	list_for_each_entry(sym, &kelf->symbols, list) {
+		if (!sym->include || !sym->sec)
+			continue;
+		/* Ignore section associated sections */
+		if (sym->type == STT_SECTION)
+			continue;
+		if (sym->sec->index == sec->index)
+			return true;
+	}
+
+	return false;
+}
+
 /* returns the offset of the string in the string table */
 int offset_of_string(struct list_head *list, char *name)
 {
diff --git a/common.h b/common.h
index cda690d..06e19e7 100644
--- a/common.h
+++ b/common.h
@@ -151,6 +151,8 @@  int is_text_section(struct section *sec);
 int is_debug_section(struct section *sec);
 int is_rela_section(struct section *sec);
 int is_standard_section(struct section *sec);
+int is_referenced_section(const struct section *sec,
+			  const struct kpatch_elf *kelf);
 int is_local_sym(struct symbol *sym);
 
 void rela_insn(struct section *sec, struct rela *rela, struct insn *insn);