Test is on x86, 32-bit Linux. I am using g++
4.6.3 and objdump
2.22
Here is a simple C++ code I am working on:
#include <iostream>
using namespace std;
main()
{
cout << "Hello World!" << endl;
return 0;
}
When I compile it into assembly code using :
gcc -S hello.cc
I can find out a ctors
section in the hello.s below:
.section .ctors,"aw",@progbits
.align 4
.long _GLOBAL__sub_I_main
.weakref _ZL20__gthrw_pthread_oncePiPFvvE,pthread_once
.weakref _ZL27__gthrw_pthread_getspecificj,pthread_getspecific
.weakref _ZL27__gthrw_pthread_setspecificjPKv,pthread_setspecific
.weakref _ZL22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create
.weakref _ZL20__gthrw_pthread_joinmPPv,pthread_join
.weakref _ZL21__gthrw_pthread_equalmm,pthread_equal
.weakref _ZL20__gthrw_pthread_selfv,pthread_self
.weakref _ZL22__gthrw_pthread_detachm,pthread_detach
.weakref _ZL22__gthrw_pthread_cancelm,pthread_cancel
.weakref _ZL19__gthrw_sched_yieldv,sched_yield
.weakref _ZL26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock
.weakref _ZL29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock
.weakref _ZL31__gthrw_pthread_mutex_timedlockP15pthread_mutex_tPK8timespec,pthread_mutex_timedlock
.weakref _ZL28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock
.weakref _ZL26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init
.weakref _ZL29__gthrw_pthread_mutex_destroyP15pthread_mutex_t,pthread_mutex_destroy
.weakref _ZL30__gthrw_pthread_cond_broadcastP14pthread_cond_t,pthread_cond_broadcast
.weakref _ZL27__gthrw_pthread_cond_signalP14pthread_cond_t,pthread_cond_signal
.weakref _ZL25__gthrw_pthread_cond_waitP14pthread_cond_tP15pthread_mutex_t,pthread_cond_wait
.weakref _ZL30__gthrw_pthread_cond_timedwaitP14pthread_cond_tP15pthread_mutex_tPK8timespec,pthread_cond_timedwait
.weakref _ZL28__gthrw_pthread_cond_destroyP14pthread_cond_t,pthread_cond_destroy
.weakref _ZL26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create
.weakref _ZL26__gthrw_pthread_key_deletej,pthread_key_delete
.weakref _ZL30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init
.weakref _ZL33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype
.weakref _ZL33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy
However, when I assembly the asm code, producing an exe file and use the objdump
produce the ctors
section's contain like this:
objdump -Dr -j .ctors hellocpp
All I can get is like this:
hellocpp: file format elf32-i386
Disassembly of section .ctors:
08049efc <__CTOR_LIST__>:
8049efc: ff (bad)
8049efd: ff (bad)
8049efe: ff (bad)
8049eff: ff 00 incl (%eax)
08049f00 <__CTOR_END__>:
8049f00: 00 00 add %al,(%eax)
...
Currently I am trying to recover the content of some ELF binaries compiled from c++
program..
So I am wondering if there is a way to get the content of ctors
which equals to what g++
produced?
Update:
Thanks a lot for @Igor's help. But I am still trapped in looking for class's
constructor
and destructor
info from ELF binary.
When evolving class
definition, g++ would produce these info in the .ctors
section:
.globl _ZN8ComputerC1Ev
.set _ZN8ComputerC1Ev,_ZN8ComputerC2Ev
.globl _ZN8ComputerD1Ev
.set _ZN8ComputerD1Ev,_ZN8ComputerD2Ev
Generally _ZN8ComputerC2Ev
is the name of a class's constructor while _ZN8ComputerD2Ev
is its destructor.
However, I just can not find corresponding info in the objdump
dumped .ctors
or .init_array
sections.. I also tried .eh_frame
and gcc_except_table
, but the information dumped is massive.. I can not figure out the meaning of those information..
Could anyone give me guide?