Commit:     ef7320edb1dd2cf6c969d1dcef4a9499a42f24da
Parent:     7e8767dddf3ad863a7013c334392e09177b48e2c
Author:     Michael Ellerman <[EMAIL PROTECTED]>
AuthorDate: Fri Jul 6 02:39:49 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri Jul 6 10:23:43 2007 -0700

    Fix elf_core_dump() when writing arch specific notes (spu coredumps)
    elf_core_dump() supports dumping arch specific ELF notes, via the #define
    ELF_CORE_WRITE_EXTRA_NOTES.  Currently the only user of this is the powerpc
    spu coredump code.
    There is a bug in the handling of foffset WRT the arch notes, which causes
    us to erroneously increment foffset by the size of the arch notes, leaving
    a block of zeroes in the file, and causing all subsequent data in the file
    to be at <supposed position> + <arch note size>.  eg:
      LOAD  0x050000 0x00100000 0x00000000 0x20000 0x20000 R E 0x10000
    Tells us we should have a chunk of data at 0x50000.  The truth is the data
    is at 0x90dbc = 0x50000 + 0x40dbc (the size of the arch notes).
    This bug prevents gdb from reading the core file correctly.
    The simplest fix is to simply remember the size of the arch notes, and add
    it to foffset after we've written the arch notes.  The only drawback is
    that if the arch code doesn't write as many bytes as it said it would, we
    end up with a broken core dump again.  For now I think that's a reasonable
    Tested on a Cell blade, gdb no longer complains about the core file being
    While I'm here I should point out that the spu coredump code does not work
    if we're dumping to a pipe - we'll have to wait for 23 to fix that.
    Signed-off-by: Michael Ellerman <[EMAIL PROTECTED]>
    Acked-by: Arnd Bergmann <[EMAIL PROTECTED]>
    Acked-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]>
    Acked-by: Paul Mackerras <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
 fs/binfmt_elf.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index fa8ea33..08e4414 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1499,6 +1499,9 @@ static int elf_core_dump(long signr, struct pt_regs 
*regs, struct file *file)
        int thread_status_size = 0;
        elf_addr_t *auxv;
+       int extra_notes_size;
         * We no longer stop all VM operations.
@@ -1628,7 +1631,8 @@ static int elf_core_dump(long signr, struct pt_regs 
*regs, struct file *file)
                sz += thread_status_size;
-               sz += ELF_CORE_EXTRA_NOTES_SIZE;
+               extra_notes_size = ELF_CORE_EXTRA_NOTES_SIZE;
+               sz += extra_notes_size;
                fill_elf_note_phdr(&phdr, sz, offset);
@@ -1674,6 +1678,7 @@ static int elf_core_dump(long signr, struct pt_regs 
*regs, struct file *file)
+       foffset += extra_notes_size;
        /* write out the thread status notes section */
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to