From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6317 invoked by alias); 18 Oct 2013 07:27:56 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 6304 invoked by uid 89); 18 Oct 2013 07:27:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: nat28.tlf.novell.com Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Fri, 18 Oct 2013 07:27:55 +0000 Received: from EMEA1-MTA by nat28.tlf.novell.com with Novell_GroupWise; Fri, 18 Oct 2013 08:27:51 +0100 Message-Id: <5260FF1602000078000FBF97@nat28.tlf.novell.com> Date: Fri, 18 Oct 2013 07:27:00 -0000 From: "Jan Beulich" To: "Alan Modra" Cc: Subject: your change "bfd_find_nearest_line without debug info" Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-SW-Source: 2013-10/txt/msg00258.txt.bz2 Alan, while I realize that this went in well over a year ago, I got puzzled by the odd extra file symbols only pretty recently, in particular by them accumulating in build models involving multiple levels of "ld -r" (like Linux or Xen do). While I got the impression that one way to deal with this would be to suppress emission of the extra symbols generally for relocatable links, I think deferring the emission as done below (tested on 2.23.2 only for now, but appears to apply fine to mainline too) would cover an even broader range of cases, and at the same time would take care of the eventual case of a relocatable link also converting a global symbol to a local one. Jan --- binutils-2.23.2/bfd/elflink.c +++ 2.23.2/bfd/elflink.c @@ -7457,6 +7457,7 @@ struct elf_outext_info bfd_boolean localsyms; bfd_boolean need_second_pass; bfd_boolean second_pass; + bfd_boolean file_sym_done; struct elf_final_link_info *flinfo; }; =20 @@ -8660,6 +8661,22 @@ elf_link_output_extsym (struct bfd_hash_ || h->root.type =3D=3D bfd_link_hash_defweak) && h->root.u.def.section->output_section !=3D NULL)) return TRUE; + + if (!eoinfo->file_sym_done + && (eoinfo->second_pass ? eoinfo->flinfo->filesym_count =3D=3D 1 + : eoinfo->flinfo->filesym_count > 1)) + { + /* Output a FILE symbol so that following locals are not associated + with the wrong input file. */ + memset (&sym, 0, sizeof (sym)); + sym.st_info =3D ELF_ST_INFO (STB_LOCAL, STT_FILE); + sym.st_shndx =3D SHN_ABS; + if (!elf_link_output_sym (eoinfo->flinfo, NULL, &sym, + bfd_und_section_ptr, NULL)) + return FALSE; + + eoinfo->file_sym_done =3D TRUE; + } } else { @@ -10907,17 +10924,6 @@ bfd_elf_final_link (bfd *abfd, struct bf } } =20 - /* Output a FILE symbol so that following locals are not associated - with the wrong input file. */ - memset (&elfsym, 0, sizeof (elfsym)); - elfsym.st_info =3D ELF_ST_INFO (STB_LOCAL, STT_FILE); - elfsym.st_shndx =3D SHN_ABS; - - if (flinfo.filesym_count > 1 - && !elf_link_output_sym (&flinfo, NULL, &elfsym, - bfd_und_section_ptr, NULL)) - return FALSE; - /* Output any global symbols that got converted to local in a version script or due to symbol visibility. We do this in a separate step since ELF requires all local symbols to appear @@ -10929,15 +10935,11 @@ bfd_elf_final_link (bfd *abfd, struct bf eoinfo.localsyms =3D TRUE; eoinfo.need_second_pass =3D FALSE; eoinfo.second_pass =3D FALSE; + eoinfo.file_sym_done =3D FALSE; bfd_hash_traverse (&info->hash->table, elf_link_output_extsym, &eoinfo); if (eoinfo.failed) return FALSE; =20 - if (flinfo.filesym_count =3D=3D 1 - && !elf_link_output_sym (&flinfo, NULL, &elfsym, - bfd_und_section_ptr, NULL)) - return FALSE; - if (eoinfo.need_second_pass) { eoinfo.second_pass =3D TRUE;