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

Re: [Minios-devel] [UNIKRAFT PATCH] plat: Fix ostensibly random crashes during boot



Hi Florian,

Thanks a lot for the fix, this was causing a number of strange crashes with no 
output (e.g., increasing the debug output level in KVM, even when using just 
the hello world application). 

-- Felipe

Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx>

On 07.05.19, 17:00, "Minios-devel on behalf of Florian Schmidt" 
<minios-devel-bounces@xxxxxxxxxxxxxxxxxxxx on behalf of 
florian.schmidt@xxxxxxxxx> wrote:

    By putting the ALIGN inside the .preinit_array and .init_array sections
    in the linker scripts, the sections would always be aligned and never
    empty, so they would be created even when there were no constructors
    inside. This for some reason completely breaks the proper loading of the
    data section, leading to a large number of seemingly unrelated bugs
    during boot with lots of static data structures with effectively random
    content.
    
    I have to admit I don't fully understand all the moving parts here,
    especially why this so trashes the contents of the data section. Also,
    a minimal example with just a hello world application does not trigger
    the problems, but they appear as soon as you replace nolibc with newlib.
    It boots again properly if you add a constructor.
    
    Signed-off-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>
    ---
     plat/kvm/arm/link64.lds.S | 4 ++--
     plat/kvm/x86/link64.lds   | 4 ++--
     plat/xen/arm/link32.lds   | 4 ++--
     plat/xen/x86/link64.lds   | 4 ++--
     4 files changed, 8 insertions(+), 8 deletions(-)
    
    diff --git a/plat/kvm/arm/link64.lds.S b/plat/kvm/arm/link64.lds.S
    index f0da7768..f62b9a01 100644
    --- a/plat/kvm/arm/link64.lds.S
    +++ b/plat/kvm/arm/link64.lds.S
    @@ -108,16 +108,16 @@ SECTIONS {
        }
     
        /* Constructor tables (read-only) */
    +   . = ALIGN(0x8);
        _ctors = .;
        .preinit_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__preinit_array_start = .);
                KEEP (*(.preinit_array))
                PROVIDE_HIDDEN (__preinit_array_end = .);
        }
     
    +   . = ALIGN(0x8);
        .init_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__init_array_start = .);
                KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
                KEEP (*(.init_array .ctors))
    diff --git a/plat/kvm/x86/link64.lds b/plat/kvm/x86/link64.lds
    index c96f7501..9cad5e16 100644
    --- a/plat/kvm/x86/link64.lds
    +++ b/plat/kvm/x86/link64.lds
    @@ -54,16 +54,16 @@ SECTIONS
        _erodata = .;
     
        /* Constructor tables (read-only) */
    +   . = ALIGN(0x8);
        _ctors = .;
        .preinit_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__preinit_array_start = .);
                KEEP (*(.preinit_array))
                PROVIDE_HIDDEN (__preinit_array_end = .);
        }
     
    +   . = ALIGN(0x8);
        .init_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__init_array_start = .);
                KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
                KEEP (*(.init_array .ctors))
    diff --git a/plat/xen/arm/link32.lds b/plat/xen/arm/link32.lds
    index 522df30c..bc4e0dec 100644
    --- a/plat/xen/arm/link32.lds
    +++ b/plat/xen/arm/link32.lds
    @@ -86,16 +86,16 @@ SECTIONS
        }
        . = ALIGN(4096);
     
    +   . = ALIGN(0x8);
        _ctors = .;
        .preinit_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__preinit_array_start = .);
                KEEP (*(.preinit_array))
                PROVIDE_HIDDEN (__preinit_array_end = .);
        }
     
    +   . = ALIGN(0x8);
        .init_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__init_array_start = .);
                KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
                KEEP (*(.init_array .ctors))
    diff --git a/plat/xen/x86/link64.lds b/plat/xen/x86/link64.lds
    index 82ab653a..9823f469 100644
    --- a/plat/xen/x86/link64.lds
    +++ b/plat/xen/x86/link64.lds
    @@ -49,16 +49,16 @@ SECTIONS
        . = ALIGN(4096);
        _erodata = .;
     
    +   . = ALIGN(0x8);
        _ctors = .;
        .preinit_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__preinit_array_start = .);
                KEEP (*(.preinit_array))
                PROVIDE_HIDDEN (__preinit_array_end = .);
        }
     
    +   . = ALIGN(0x8);
        .init_array : {
    -           . = ALIGN(0x8);
                PROVIDE_HIDDEN (__init_array_start = .);
                KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
                KEEP (*(.init_array .ctors))
    -- 
    2.21.0
    
    
    _______________________________________________
    Minios-devel mailing list
    Minios-devel@xxxxxxxxxxxxxxxxxxxx
    https://lists.xenproject.org/mailman/listinfo/minios-devel

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

 


Rackspace

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