[Crash-utility] 7.2.8: Failure when using PPC64 extensions on a PPC64 build from X86_64

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Fri Sep 11 07:43:53 UTC 2020


Hi Arun,

-----Original Message-----
> Hi,
> 
> I was trying to debug a PPC64 crash from a X86_64 machine. I got crash (7.2.8) to work with a "make
> target=PPC64", but when I tried to load an extension I got this error:
> 
> 
> 	crash> extend /root/misc/builds/mpykdump-v3.2.1-g4308a70/Extension/mpykdump.so
> 	extend: /root/misc/builds/mpykdump-v3.2.1-g4308a70/Extension/mpykdump.so: not an ELF format object
> file
> 
> 
> I tried other sample extensions (like dminfo) with the same result.
> 
> A little debugging shows that "is_shared_object()" is returning FALSE leading to this. Just commenting the
> call makes the extension work as expected.
> 
> gdb of is_shared_object():
> 
> 	3852            } else if ((elf64->e_ident[EI_CLASS] == ELFCLASS64) &&
> 	(gdb)
> 	3854                    switch (swap16(elf64->e_machine, swap))
> 	(gdb) p elf64
> 	$6 = (Elf64_Ehdr *) 0x7fffffffca40
> 	(gdb) p *elf64
> 	$7 = {e_ident = "\177ELF\002\001\001\000\000\000\000\000\000\000\000", e_type = 3, e_machine = 62,
> 	  e_version = 1, e_entry = 511360, e_phoff = 64, e_shoff = 20379704, e_flags = 0, e_ehsize = 64,
> 	  e_phentsize = 56, e_phnum = 7, e_shentsize = 64, e_shnum = 31, e_shstrndx = 28}
> 	(gdb) p/x *elf64
> 	$8 = {e_ident = {0x7f, 0x45, 0x4c, 0x46, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> 	  e_type = 0x3, e_machine = 0x3e, e_version = 0x1, e_entry = 0x7cd80, e_phoff = 0x40, e_shoff =
> 0x136f838,
> 	  e_flags = 0x0, e_ehsize = 0x40, e_phentsize = 0x38, e_phnum = 0x7, e_shentsize = 0x40, e_shnum
> = 0x1f,
> 	  e_shstrndx = 0x1c}
> 	(gdb) n
> 	3867                            if (machine_type("X86_64") || machine_type("ARM64"))
> 	(gdb)
> 	3877                            if (machine_type("ARM64"))
> 	(gdb)
> 	3887                    if (CRASHDEBUG(1))
> 	(gdb) p swap
> 	$9 = 0
> 	(gdb) p machine_type("X86_64")
> 	$10 = 0
> 	(gdb) p machine_type("PPC64")
> 	$11 = 1
> 
> 	(gdb) n
> 	3793                    return FALSE;
> 
> 
> 
> It appears like the fix should be something like this (which does fix the issue), but I'd leave it to experts
> how to fix this correctly:
> 
> 	 # diff -up symbols.c.org   symbols.c
> 	--- symbols.c.org         2020-09-02 11:28:33.855265712 -0700
> 	+++ symbols.c   2020-09-02 11:28:36.964274966 -0700
> 	@@ -3864,7 +3864,8 @@ is_shared_object(char *file)
> 	                        break;
> 
> 	                case EM_X86_64:
> 	-                       if (machine_type("X86_64") || machine_type("ARM64"))
> 	+                       if (machine_type("X86_64") || machine_type("ARM64") ||
> 	+                                       machine_type("PPC64"))
> 	                                return TRUE;
> 	                        break;
> 

Thank you for catching this.  And this patch looks good to me.
Could you post a formal patch?

Thanks,
Kazu






More information about the Crash-utility mailing list