From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13402 invoked by alias); 11 Apr 2005 14:30:28 -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 13262 invoked from network); 11 Apr 2005 14:30:17 -0000 Received: from unknown (HELO gizmo11bw.bigpond.com) (144.140.70.21) by sourceware.org with SMTP; 11 Apr 2005 14:30:17 -0000 Received: (qmail 15892 invoked from network); 11 Apr 2005 14:30:15 -0000 Received: from unknown (HELO bwmam12.bigpond.com) (144.135.24.103) by gizmo11bw.bigpond.com with SMTP; 11 Apr 2005 14:30:15 -0000 Received: from cpe-144-136-221-26.sa.bigpond.net.au ([144.136.221.26]) by bwmam12.bigpond.com(MAM REL_3_4_2a 189/54142453) with SMTP id 54142453; Tue, 12 Apr 2005 00:30:15 +1000 Received: by bubble.modra.org (Postfix, from userid 500) id 46EA41A094F; Tue, 12 Apr 2005 00:00:15 +0930 Date: Mon, 11 Apr 2005 14:30:00 -0000 From: Alan Modra To: binutils@sources.redhat.com Cc: Anton Blanchard , Paul Mackerras Subject: AS_NEEDED failure Message-ID: <20050411143015.GB861@bubble.modra.org> Mail-Followup-To: binutils@sources.redhat.com, Anton Blanchard , Paul Mackerras Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2005-04/txt/msg00237.txt.bz2 On powerpc64, I've hit the following during an X11 server build .../libdl.so.2: undefined reference to _rtld_global@GLIBC_PRIVATE This symbol is defined in ld64.so.1, and ld64.so.1 is being searched, but the following conspires to make the link fail: - libc.so contains AS_NEEDED (ld64.so.1) - one or more of the X11 libs has DT_NEEDED libdl.so.2 - libdl.so.2 has DT_NEEDED ld64.so.1 The libc.so AS_NEEDED() causes symbols from ld64.so.1 to be loaded, but no regular object file needs them so all the ld64.so.1 syms are set back to bfd_link_hash_new, effectively removing them. The X11 lib is loaded, and its DT_NEEDED entry noted. libdl.so.2 is loaded, but ld decides that ld64.so.1 has already been looked at, so doesn't load it again. It should do, because AS_NEEDED lib symbols aren't really loaded. * emultempl/elf32.em (gld${EMULATION_NAME}_stat_needed): Ignore as_needed libs that were not needed. (gld${EMULATION_NAME}_check_needed): Likewise. Applied mainline. I think this should go on 2.16, but after some more testing.. Index: ld/emultempl/elf32.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/elf32.em,v retrieving revision 1.138 diff -u -p -r1.138 elf32.em --- ld/emultempl/elf32.em 4 Apr 2005 11:27:15 -0000 1.138 +++ ld/emultempl/elf32.em 11 Apr 2005 14:23:08 -0000 @@ -230,6 +230,9 @@ gld${EMULATION_NAME}_stat_needed (lang_i return; if (s->the_bfd == NULL) return; + if (s->as_needed + && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0) + return; if (bfd_stat (s->the_bfd, &st) != 0) { @@ -737,6 +740,13 @@ gld${EMULATION_NAME}_check_needed (lang_ if (global_found) return; + /* If this input file was an as-needed entry, and wasn't found to be + needed at the stage it was linked, then don't say we have loaded it. */ + if (s->as_needed + && (s->the_bfd == NULL + || (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)) + return; + if (s->filename != NULL) { const char *f; -- Alan Modra IBM OzLabs - Linux Technology Centre