This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: [Proposed binutils PATCH] Re: Diagnosing an intricate C++ problem


On Tue, 25 Jul 2000, Loren James Rittle wrote:
> In light of this analysis, the warning feature you desire would be in
> GNU ld not gcc.  I have no idea if it is practical but, we C++
> programmers would want the linker to check that all pruned functions
> are indeed identical copies.

That sounds great!

> 2000-07-25  Loren J. Rittle  <ljrittle@acm.org>
> 
> 	* ldlang.c (section_already_linked): Implement check for
> 	the SEC_LINK_DUPLICATES_SAME_CONTENTS case.
> 
> 2000-07-25  Loren J. Rittle  <ljrittle@acm.org>
> 
> 	* elf.c (_bfd_elf_make_section_from_shdr): Enable the checking
> 	of the section contents.

I built binutils 2.10 with these two patches and, on top of that,
GCC mainline on FreeBSD 4.1.

That toolchain nicely diagnoses my original problem, but this one seems
to be more serious than I originally thought, the problem being standard
libraries like libstdc++.

> I can also imagine that the linking process could slow down under
> heavily-templated code.  However, for all the small, multi-file STL
> examples that I had lying around, (1) I found no measurable slowdown
> and (2) no false warnings unless I compiled some files with
> -fomit-frame-pointer and some without (interestingly, even adding -O
> didn't change the linkonce sections as I expected it might).
> 
> Gerald, I'm sure you have some production-strength, heavily-templated
> code.  Have at it and please report your findings.

Yes (and sorry that it took that long): My production stuff linked
successfully, but produced tons of warnings.

Here is a minimal test case

---- cut: x.cc ----
#include <string>
#include <vector>

main() {
    vector<string> w;

    w.push_back("Hello");
    }
---- cut: x.cc----

for which a simple `g++ x.cc` generates the following warnings:

/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.replace(unsigned int, unsigned int, char const *, unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.clone(void)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.rep(void) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.__dl(void *)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.release(void)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.data(void)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.repup(basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep *)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.data(void) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.length(void) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.capacity(void) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.max_size(void) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.grab(void)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.__as(basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> > const &)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.(basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> > const &)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.assign(char const *, unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.assign(char const *)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.(char const *)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.gnu.linkonce.t._$_t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.excess_slop(unsigned int, unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::gnu.linkonce.t.check_realloc(unsigned int) const' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.frob_size(unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.__nw(unsigned int, unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.create(unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.copy(unsigned int, char const *, unsigned int)' has different size
/sw/test/gcc/binutils/bin/ld: /sw/test/gcc/FreeBSD/lib/gcc-lib/i386-unknown-freebsd4.1/2.96/libstdc++.a(cstrmain.o): warning: duplicate section `.basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::Rep::gnu.linkonce.t.move(unsigned int, char const *, unsigned int)' has different size

Gerald
-- 
Gerald "Jerry" pfeifer@dbai.tuwien.ac.at http://www.dbai.tuwien.ac.at/~pfeifer/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]