lkml.org 
[lkml]   [2017]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:core/urgent] objtool: Fix object file corruption
    Commit-ID:  3eed2fa7cb2118234cdc89fb6b2bef82b0c9ca81
    Gitweb: http://git.kernel.org/tip/3eed2fa7cb2118234cdc89fb6b2bef82b0c9ca81
    Author: Josh Poimboeuf <jpoimboe@redhat.com>
    AuthorDate: Fri, 15 Sep 2017 02:17:11 -0500
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Fri, 15 Sep 2017 10:30:31 +0200

    objtool: Fix object file corruption

    Arnd Bergmann reported that a randconfig build was failing with the
    following link error:

    built-in.o: member arch/x86/kernel/time.o in archive is not an object

    It turns out the link failed because the time.o file had been corrupted
    by objtool:

    nm: arch/x86/kernel/time.o: File format not recognized

    In certain rare cases, when a .o file's ORC table is very small, the
    .data section size doesn't change because it's page aligned. Because
    all the existing sections haven't changed size, libelf doesn't detect
    any section header changes, and so it doesn't update the section header
    table properly. Instead it writes junk in the section header entries
    for the new ORC sections.

    Make sure libelf properly updates the section header table by setting
    the ELF_F_DIRTY flag in the top level elf struct.

    Reported-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Reviewed-by: Don Zickus <dzickus@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 627fce14809b ("objtool: Add ORC unwind table generation")
    Link: http://lkml.kernel.org/r/e650fd0f2d8a209d1409a9785deb101fdaed55fb.1505459813.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    tools/objtool/elf.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
    index b4cd8bc..2446015 100644
    --- a/tools/objtool/elf.c
    +++ b/tools/objtool/elf.c
    @@ -563,6 +563,7 @@ int elf_write(struct elf *elf)
    struct section *sec;
    Elf_Scn *s;

    + /* Update section headers for changed sections: */
    list_for_each_entry(sec, &elf->sections, list) {
    if (sec->changed) {
    s = elf_getscn(elf->elf, sec->idx);
    @@ -570,13 +571,17 @@ int elf_write(struct elf *elf)
    WARN_ELF("elf_getscn");
    return -1;
    }
    - if (!gelf_update_shdr (s, &sec->sh)) {
    + if (!gelf_update_shdr(s, &sec->sh)) {
    WARN_ELF("gelf_update_shdr");
    return -1;
    }
    }
    }

    + /* Make sure the new section header entries get updated properly. */
    + elf_flagelf(elf->elf, ELF_C_SET, ELF_F_DIRTY);
    +
    + /* Write all changes to the file. */
    if (elf_update(elf->elf, ELF_C_WRITE) < 0) {
    WARN_ELF("elf_update");
    return -1;
    \
     
     \ /
      Last update: 2017-09-15 10:48    [W:5.598 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site