Dumping C and Assembly with objdump
I just came across the objdump “–source” option, which will display the C source code from a program along with the assembly instructions that were generated from the C code. The following example shows a snippet of what is produced during a typical run:
$ objdump –source curl
08050ed0 <homedir >:
/* return the home directory of the current user as an allocated string */
char *homedir(void)
{
8050ed0: 55 push %ebp
char *home;
home = GetEnv("CURL_HOME", FALSE);
8050ed1: 31 d2 xor %edx,%edx
8050ed3: 89 e5 mov %esp,%ebp
8050ed5: b8 01 d0 05 08 mov $0x805d001,%eax
8050eda: 53 push %ebx
8050edb: 83 ec 04 sub $0x4,%esp
8050ede: e8 bd ff ff ff call 8050ea0
if(home)
8050ee3: 85 c0 test %eax,%eax
8050ee5: 89 c3 mov %eax,%ebx
8050ee7: 74 08 je 8050ef1
return home;
home = GetEnv("HOME", FALSE);
if(home)
return home;
#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
{
struct passwd *pw = getpwuid(geteuid());
if (pw) {
#ifdef VMS
home = decc$translate_vms(pw->pw_dir);
#else
home = pw->pw_dir;
#endif
if (home && home[0])
home = strdup(home);
}
}
#endif /* PWD-stuff */
#ifdef WIN32
home = GetEnv("APPDATA", TRUE);
if(!home)
home = GetEnv("%USERPROFILE%\\Application Data", TRUE); /* Normally only
on Win-2K/XP */
#endif /* WIN32 */
return home;
}
8050ee9: 89 d8 mov %ebx,%eax
8050eeb: 83 c4 04 add $0x4,%esp
8050eee: 5b pop %ebx
8050eef: 5d pop %ebp
8050ef0: c3 ret
8050ef1: 31 d2 xor %edx,%edx
8050ef3: b8 06 d0 05 08 mov $0x805d006,%eax
8050ef8: e8 a3 ff ff ff call 8050ea0
8050efd: 85 c0 test %eax,%eax
8050eff: 89 c3 mov %eax,%ebx
8050f01: 75 e6 jne 8050ee9
8050f03: e8 3c 89 ff ff call 8049844
8050f08: 89 04 24 mov %eax,(%esp)
8050f0b: e8 54 85 ff ff call 8049464
8050f10: 85 c0 test %eax,%eax
8050f12: 74 d5 je 8050ee9
8050f14: 8b 58 14 mov 0x14(%eax),%ebx
8050f17: 85 db test %ebx,%ebx
8050f19: 74 ce je 8050ee9
8050f1b: 80 3b 00 cmpb $0x0,(%ebx)
8050f1e: 89 f6 mov %esi,%esi
8050f20: 74 c7 je 8050ee9
8050f22: 89 1c 24 mov %ebx,(%esp)
8050f25: e8 7a 87 ff ff call 80496a4 <__strdup@plt>
8050f2a: 89 c3 mov %eax,%ebx
8050f2c: eb bb jmp 8050ee9
8050f2e: 90 nop
8050f2f: 90 nop
This is neat!








nak on October 22nd, 2011
The binary has to be compiled with the gcc `-g` option for this to work, thanks for the post!