[Crash-utility] Getting dissassembly from .o or .ko file
Ahmed Al-Mehdi
ahmedalmehdi at gmail.com
Sun Feb 17 12:11:56 UTC 2013
Fantastic. I liked how you used "objdump -r" to get the function call
name. I can do that on a system that does not have source code
(specifially code related my loaded module) on it to narrow down the
location of the panic. I found the adding the "-d" in addition very
helpful, "objdump -d -r <*.ko>"
Thank you very much for taking time to respond to my questions in such
detail, much appreciated.
--Ahmed.
On Thu, Feb 14, 2013 at 2:05 PM, Dave Anderson <anderson at redhat.com> wrote:
>
> Another way to determine what's being called is to dump
> the relocation information. Again, in the nfs_cache_destroy()
> function below, there are two callq instructions, one at
> the very beginning of the function at 0x0000000000016750,
> and the other one at 0x0000000000016759:
>
> (gdb) disass nfs_cache_destroy
> Dump of assembler code for function nfs_cache_destroy:
> 0x0000000000016750 <+0>: callq 0x16755 <nfs_cache_destroy+5>
> 0x0000000000016755 <+5>: push %rbp
> 0x0000000000016756 <+6>: mov %rsp,%rbp
> 0x0000000000016759 <+9>: callq 0x1675e <nfs_cache_destroy+14>
> 0x000000000001675e <+14>: pop %rbp
> 0x000000000001675f <+15>: retq
> End of assembler dump.
> (gdb)
>
> The callq instructions consist of a one-byte "e8" opcode
> followed by 4 bytes of relative displacement, so in the
> example above, those 4 bytes would be located at addresses
> 0x0000000000016751 and 0x000000000001675a respectively.
> (i.e., the callq site plus 1)
>
> So then if you dump the relocation information from the
> object file, you can see that __fentry__() is called at the
> beginning of the function (generated by the ftrace facility,
> and appearing at the beginning of all functions if it's
> configured), but more importangly, sunrpc_destroy_cache_detail()
> is the target of the second callq:
>
> $ objdump --reloc nfs.ko
> ... [ cut ] ...
> 0000000000016741 R_X86_64_PC32 __fentry__-0x0000000000000004
> 000000000001674a R_X86_64_PC32
> sunrpc_init_cache_detail-0x0000000000000004
> 0000000000016751 R_X86_64_PC32 __fentry__-0x0000000000000004
> 000000000001675a R_X86_64_PC32
> sunrpc_destroy_cache_detail-0x0000000000000004
> 0000000000016761 R_X86_64_PC32 __fentry__-0x0000000000000004
> 0000000000016769 R_X86_64_32S .data+0x0000000000000720
> ...
>
> which is what the list command showed:
>
> (gdb) list *0x0000000000016759
> 0x16759 is in nfs_cache_destroy (fs/nfs/cache_lib.c:164).
> 159 sunrpc_init_cache_detail(cd);
> 160 }
> 161
> 162 void nfs_cache_destroy(struct cache_detail *cd)
> 163 {
> 164 sunrpc_destroy_cache_detail(cd);
> 165 }
> (gdb)
>
> The ftrace-generated call to __fentry__() will never be shown in
> the text listing.
>
> Dave
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20130217/78a792df/attachment.htm>
More information about the Crash-utility
mailing list