Switching between interfaces without knowing derived object.
Hardeep Singh
hardy_hardeep@yahoo.co.in
Thu Aug 20 11:28:00 GMT 2009
Thanks John,
Your hint made me look into the symbol information exposed by a library. I found out that by giving -rdynamic flag to the linker while building the application, resolved the problem. It includes the dynamic symbol information into the executable. See below the email. For this sample program it does increase the executable size by 500 bytes.
Can someone comment on cons of passing this flag to the linker.
Does it increase search time in look-up tables?
Should i even worry about it ?
Thanks
-hardy
objdump -T -C ./test
./test: file format elf32-i386
DYNAMIC SYMBOL TABLE:
08048c7c w DO .rodata 00000008 Base typeinfo for Itf1
00000000 DF *UND* 00000582 GLIBCXX_3.4 std::ios_base::Init::Init()
08049e80 g DO .bss 0000008c GLIBCXX_3.4 std::cout
08049d44 g DO *ABS* 00000000 Base _DYNAMIC
08048c84 w DO .rodata 00000006 Base typeinfo name for Itf1
08048c64 g DO .rodata 00000004 Base _fp_hw
00000000 DF *UND* 0000008a GLIBC_2.0 dlsym
00000000 DF *UND* 0000026a GLIBCXX_3.4 std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
08048bd0 g DF .text 0000004c Base __libc_csu_fini
00000000 DF *UND* 0000003b GLIBC_2.1.3 __cxa_atexit
0804883c g DF .init 00000000 Base _init
08049f10 w DO .bss 0000002c CXXABI_1.3 vtable for __cxxabiv1::__class_type_info
08048c6c w DO .rodata 00000008 Base typeinfo for Itf2
08048950 g DF .text 00000000 Base _start
08048c74 w DO .rodata 00000006 Base typeinfo name for Itf2
08048b70 g DF .text 00000053 Base __libc_csu_init
08049e80 g D *ABS* 00000000 Base __bss_start
08048a60 g DF .text 00000105 Base main
00000000 DF *UND* 00000259 GLIBC_2.0 dlerror
00000000 DF *UND* 000000cc GLIBC_2.0 __libc_start_main
08049e74 w D .data 00000000 Base data_start
08048c48 g DF .fini 00000000 Base _fini
00000000 DF *UND* 00000045 GLIBC_2.0 dlclose
00000000 DF *UND* 000000db GLIBC_2.0 exit
08049e80 g D *ABS* 00000000 Base _edata
08049f44 g D *ABS* 00000000 Base _end
00000000 DF *UND* 00000117 CXXABI_1.3 __dynamic_cast
08048c68 g DO .rodata 00000004 Base _IO_stdin_used
00000000 DF *UND* 00000054 GLIBCXX_3.4 std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
08049e74 g D .data 00000000 Base __data_start
00000000 w D *UND* 00000000 _Jv_RegisterClasses
08048904 DF *UND* 00000410 CXXABI_1.3 __gxx_personality_v0
00000000 DF *UND* 0000009d GLIBCXX_3.4 std::ios_base::Init::~Init()
00000000 w D *UND* 00000000 __gmon_start__
00000000 DF *UND* 0000005e GLIBC_2.1 dlopen
________________________________
From: John (Eljay) Love-Jensen <eljay@adobe.com>
To: Hardeep Singh <hardy_hardeep@yahoo.co.in>; GCC-help <gcc-help@gcc.gnu.org>
Sent: Wednesday, 19 August, 2009 10:27:43 AM
Subject: Re: Switching between interfaces without knowing derived object.
Hi Hardeep,
Just a guess...
The cause of the problem *MAY* be that there may be multiple copies of the
RTTI information.
But the operator== of the RTTI information, as used by dynamic_cast, only
compares the pointers as being the same, it does not compare the RTTI
structure for equality.
If that is the issue, it may be fixed by making sure you have exported all
the relevant RTTI information, by decorating the classes with
__attribute__((visibility("default"))), or by using the -fvisibility=default
switch as a sweeping first-stab fix.
You may also need to make sure you are not using early binding.
HTH,
--Eljay
DISCLAIMER: I don't have Mandriva Linux release 2006 (although I was a big
Mandrake fan back in the day).
Love Cricket? Check out live scores, photos, video highlights and more. Click here http://cricket.yahoo.com
More information about the Gcc-help
mailing list