[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [livepatch-build-tools part2 6/6] create-diff-object: Do not include all .rodata sections



Starting with the "2af6f1aa6233 Fix patch creation with GCC 6.1+" commit
all .rodata sections are included by default (regardless of whether they
are needed or not).
During stacked hotpatch builds it leads to unnecessary duplication of
the .rodata sections as each and every consecutive hotpatch contains all
the .rodata section of previous hotpatches.

To prevent this situation, mark the .rodata section for inclusion only
if they are referenced by any of the current hotpatch symbols (or a
corresponding RELA section).

Extend patchability verification to detect all non-standard, non-rela,
non-debug and non-special sections that are not referenced by any of
the symbols or RELA sections.

Signed-off-by: Pawel Wieczorkiewicz <wipawel@xxxxxxxxx>
Reviewed-by: Andra-Irina Paraschiv <andraprs@xxxxxxxxxx>
Reviewed-by: Bjoern Doebel <doebel@xxxxxxxxx>
Reviewed-by: Norbert Manthey <nmanthey@xxxxxxxxx>
---
 create-diff-object.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/create-diff-object.c b/create-diff-object.c
index f6060cd..f7eb421 100644
--- a/create-diff-object.c
+++ b/create-diff-object.c
@@ -1341,7 +1341,7 @@ static void kpatch_include_standard_elements(struct 
kpatch_elf *kelf)
 
        list_for_each_entry(sec, &kelf->sections, list) {
                /* include these sections even if they haven't changed */
-               if (is_standard_section(sec) || 
should_include_str_section(sec->name)) {
+               if (is_standard_section(sec)) {
                        sec->include = 1;
                        if (sec->secsym)
                                sec->secsym->include = 1;
@@ -1352,6 +1352,19 @@ static void kpatch_include_standard_elements(struct 
kpatch_elf *kelf)
        list_entry(kelf->symbols.next, struct symbol, list)->include = 1;
 }
 
+static void kpatch_include_standard_string_elements(struct kpatch_elf *kelf)
+{
+       struct section *sec;
+
+       list_for_each_entry(sec, &kelf->sections, list) {
+               if (should_include_str_section(sec->name) && 
is_referenced_section(sec, kelf)) {
+                       sec->include = 1;
+                       if (sec->secsym)
+                               sec->secsym->include = 1;
+               }
+       }
+}
+
 #define inc_printf(fmt, ...) \
        log_debug("%*s" fmt, recurselevel, "", ##__VA_ARGS__);
 
@@ -1531,6 +1544,16 @@ static void kpatch_verify_patchability(struct kpatch_elf 
*kelf)
                        errs++;
                }
 
+               if (sec->include) {
+                       if (!is_standard_section(sec) && !is_rela_section(sec) 
&&
+                           !is_debug_section(sec) && !is_special_section(sec)) 
{
+                               if (!is_referenced_section(sec, kelf)) {
+                                       log_normal("section %s included, but 
not referenced\n", sec->name);
+                                       errs++;
+                               }
+                       }
+               }
+
                /*
                 * ensure we aren't including .data.* or .bss.*
                 * (.data.unlikely is ok b/c it only has __warned vars)
@@ -2062,6 +2085,8 @@ int main(int argc, char *argv[])
        kpatch_include_debug_sections(kelf_patched);
        log_debug("Include hook elements\n");
        kpatch_include_hook_elements(kelf_patched);
+       log_debug("Include standard string elements\n");
+       kpatch_include_standard_string_elements(kelf_patched);
        log_debug("Include new globals\n");
        new_globals_exist = kpatch_include_new_globals(kelf_patched);
        log_debug("new_globals_exist = %d\n", new_globals_exist);
-- 
2.16.5




Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrer: Christian Schlaeger, Ralf Herbrich
Ust-ID: DE 289 237 879
Eingetragen am Amtsgericht Charlottenburg HRB 149173 B



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.