From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2365 invoked by alias); 31 Jan 2005 22:02:31 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 2216 invoked from network); 31 Jan 2005 22:02:15 -0000 Received: from unknown (HELO rwcrmhc11.comcast.net) (204.127.198.35) by sourceware.org with SMTP; 31 Jan 2005 22:02:15 -0000 Received: from lucon.org ([24.6.212.230]) by comcast.net (rwcrmhc11) with ESMTP id <2005013122021401300khab6e>; Mon, 31 Jan 2005 22:02:14 +0000 Received: by lucon.org (Postfix, from userid 1000) id 2BFFD63FD1; Mon, 31 Jan 2005 14:02:14 -0800 (PST) Date: Mon, 31 Jan 2005 22:02:00 -0000 From: "H. J. Lu" To: binutils@sources.redhat.com Cc: amodra@bigpond.net.au Subject: PATCH: ELF linker is broken Message-ID: <20050131220214.GA28324@lucon.org> References: <20050130192249.GA21997@lucon.org> <20050131000227.GF11595@bubble.modra.org> <20050131071308.GH11595@bubble.modra.org> <20050131212203.GA27701@lucon.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050131212203.GA27701@lucon.org> User-Agent: Mutt/1.4.1i X-SW-Source: 2005-01/txt/msg00573.txt.bz2 On Mon, Jan 31, 2005 at 01:22:03PM -0800, H. J. Lu wrote: > On Mon, Jan 31, 2005 at 05:43:08PM +1030, Alan Modra wrote: > > On Mon, Jan 31, 2005 at 10:32:27AM +1030, Alan Modra wrote: > > > On Sun, Jan 30, 2005 at 11:22:49AM -0800, H. J. Lu wrote: > > > > /usr/lib/crt1.o:(.dynamic+0x0): multiple definition of `_DYNAMIC' > > > [snip] > > > > The 2005-01-24 binutils is OK. It may have something to do with > > > > > > > > http://sources.redhat.com/ml/binutils/2005-01/msg00405.html > > > > > > Possible, I suppose. An as-needed shared lib will define syms whether > > > or not the lib is actually linked. It will be linked if any symbol it > > > defines satisfies an undefined reference, and conversely it isn't linked > > > then there are no references to its symbols. That should make it safe > > > to leave its symbols in the symbol table, so long as we properly treat > > > them in _bfd_elf_merge_symbol. If there is a problem, it's likely to be > > > in _bfd_elf_merge_symbol. > > > > I'm testing the following on powerpc and x86 to ensure I haven't made > > any silly mistakes. It's a big hammer approach but cleaner than what we > > had before, I think. Rather than tweaking _bfd_elf_merge_symbol and > > other places to specially handle symbols defined in unused --as-needed > > libs, I've munged all such symbols back to their new state. Hopefully > > this won't break too many back-end elf_link_hash_traverse functions.. > > > > Would you please test this on ia64? I don't have access to ia64 > > hardware, so testing this isn't so easy. > > I am enclosing a testcase here. I saw the same problem on ia32, ia64 > and x86_64: > This patch works for me. H.J. ---- 2005-01-31 H.J. Lu * elflink.c (_bfd_elf_link_create_dynamic_sections): Discard previous "_DYNAMIC" before creating the new one. --- bfd/elflink.c.dynamic 2005-01-31 12:19:55.000000000 -0800 +++ bfd/elflink.c 2005-01-31 13:59:00.463355292 -0800 @@ -216,7 +216,19 @@ _bfd_elf_link_create_dynamic_sections (b linker script, but we only want to define it if we are, in fact, creating a .dynamic section. We don't want to define it if there is no .dynamic section, since on some ELF platforms the start up - code examines it to decide how to initialize the process. */ + code examines it to decide how to initialize the process. + + _DYNAMIC is a special symbol. We used to create it before reading + symbol tables from shared libraries. But now it is delayed. We + discard any previous definition from shared library before we + create this one. */ + h = elf_link_hash_lookup (elf_hash_table (info), "_DYNAMIC", FALSE, + FALSE, FALSE); + if (h) + { + h->root.type = bfd_link_hash_undefined; + h->root.u.undef.abfd = abfd; + } bh = NULL; if (! (_bfd_generic_link_add_one_symbol (info, abfd, "_DYNAMIC", BSF_GLOBAL, s, 0, NULL, FALSE,