--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: g++-4.6: inline causes virtual methods not to be considered on armel
- From: George Danchev <danchev@spnet.net>
- Date: Thu, 26 May 2011 22:49:33 +0300
- Message-id: <20110526194933.27813.98418.reportbug@sid>
Package: g++-4.6
Version: 4.6.0-9
Severity: normal
Meanningless inline requests should be ignored by the compiler,
but this is not the case on armel (armv5tel), symbols disappear
instead.
class C {
public:
C();
private:
virtual void foo();
};
inline C::C() {
}
#ifdef inline_this_virtual
inline
#endif
void C::foo() {
}
$ g++-4.6 -fPIC -shared -Wl,-z,defs -o testinl.so testinl.cc
$ objdump -T testinl.so | c++filt
testinl.so: file format elf32-littlearm
DYNAMIC SYMBOL TABLE:
00000524 l d .init 00000000 .init
00008678 l d .jcr 00000000 .jcr
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DO *UND* 00000000 CXXABI_1.3 vtable for __cxxabiv1::__class_type_info
00000000 w DF *UND* 00000000 GLIBC_2.4 __cxa_finalize
00000660 g DO .rodata 00000003 Base typeinfo name for C
0000868c g DO .data.rel.ro 00000008 Base typeinfo for C
00008680 g DO .data.rel.ro 0000000c Base vtable for C
000087c0 g D *ABS* 00000000 Base _bss_end__
000087c0 g D *ABS* 00000000 Base _end
000087bc g D *ABS* 00000000 Base _edata
000087c0 g D *ABS* 00000000 Base __bss_end__
000087bc g D *ABS* 00000000 Base __bss_start
00000638 g DF .text 0000001c Base C::foo()
00000524 g DF .init 00000000 Base _init
00000654 g DF .fini 00000000 Base _fini
000087bc g D *ABS* 00000000 Base __bss_start__
000087c0 g D *ABS* 00000000 Base __end__
$ g++-4.6 -fPIC -shared -Wl,-z,defs -o testinl.so testinl.cc -Dinline_this_virtual
$ objdump -T testinl.so | c++filt
testinl.so: file format elf32-littlearm
DYNAMIC SYMBOL TABLE:
000003b4 l d .init 00000000 .init
000084e0 l d .jcr 00000000 .jcr
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 w DF *UND* 00000000 GLIBC_2.4 __cxa_finalize
0000860c g D *ABS* 00000000 Base _bss_end__
0000860c g D *ABS* 00000000 Base _end
00008608 g D *ABS* 00000000 Base _edata
0000860c g D *ABS* 00000000 Base __bss_end__
00008608 g D *ABS* 00000000 Base __bss_start
000003b4 g DF .init 00000000 Base _init
000004c8 g DF .fini 00000000 Base _fini
00008608 g D *ABS* 00000000 Base __bss_start__
0000860c g D *ABS* 00000000 Base __end__
Now, C::foo() is gone.
Note, that this subtlety is specific to the armel architecture only,
anywhere else C::foo() is not silently dropped.
References:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=602817
http://gcc.gnu.org/ml/gcc-help/2011-05/msg00352.html
-- System Information:
Debian Release: wheezy/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.37-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages g++-4.6 depends on:
ii gcc-4.6 4.6.0-9 The GNU C compiler
ii gcc-4.6-base 4.6.0-9 The GNU Compiler Collection (base
ii libc6 2.13-4 Embedded GNU C Library: Shared lib
ii libcloog-ppl0 0.15.9-3 the Chunky Loop Generator (runtime
ii libgmp10 2:5.0.1+dfsg-7 Multiprecision arithmetic library
ii libgmpxx4ldbl 2:5.0.1+dfsg-7 Multiprecision arithmetic library
ii libmpc2 0.9-3 multiple precision complex floatin
ii libmpfr4 3.0.1-3 multiple precision floating-point
ii libppl-c4 0.11.2-3 Parma Polyhedra Library (C interfa
ii libppl9 0.11.2-3 Parma Polyhedra Library (runtime l
ii libstdc++6-4.6-dev 4.6.0-9 The GNU Standard C++ Library v3 (d
ii zlib1g 1:1.2.3.4.dfsg-3 compression library - runtime
g++-4.6 recommends no packages.
Versions of packages g++-4.6 suggests:
ii g++-4.6-multilib 4.6.0-9 The GNU C++ compiler (multilib fil
pn gcc-4.6-doc <none> (no description available)
pn libstdc++6-4.6-dbg <none> (no description available)
-- no debconf information
--- End Message ---