This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
your change "bfd_find_nearest_line without debug info"
- From: "Jan Beulich" <JBeulich at suse dot com>
- To: "Alan Modra" <amodra at gmail dot com>
- Cc: <binutils at sourceware dot org>
- Date: Fri, 18 Oct 2013 08:27:50 +0100
- Subject: your change "bfd_find_nearest_line without debug info"
- Authentication-results: sourceware.org; auth=none
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;
};
@@ -8660,6 +8661,22 @@ elf_link_output_extsym (struct bfd_hash_
|| h->root.type == bfd_link_hash_defweak)
&& h->root.u.def.section->output_section != NULL))
return TRUE;
+
+ if (!eoinfo->file_sym_done
+ && (eoinfo->second_pass ? eoinfo->flinfo->filesym_count == 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 = ELF_ST_INFO (STB_LOCAL, STT_FILE);
+ sym.st_shndx = SHN_ABS;
+ if (!elf_link_output_sym (eoinfo->flinfo, NULL, &sym,
+ bfd_und_section_ptr, NULL))
+ return FALSE;
+
+ eoinfo->file_sym_done = TRUE;
+ }
}
else
{
@@ -10907,17 +10924,6 @@ bfd_elf_final_link (bfd *abfd, struct bf
}
}
- /* Output a FILE symbol so that following locals are not associated
- with the wrong input file. */
- memset (&elfsym, 0, sizeof (elfsym));
- elfsym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
- elfsym.st_shndx = 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 = TRUE;
eoinfo.need_second_pass = FALSE;
eoinfo.second_pass = FALSE;
+ eoinfo.file_sym_done = FALSE;
bfd_hash_traverse (&info->hash->table, elf_link_output_extsym, &eoinfo);
if (eoinfo.failed)
return FALSE;
- if (flinfo.filesym_count == 1
- && !elf_link_output_sym (&flinfo, NULL, &elfsym,
- bfd_und_section_ptr, NULL))
- return FALSE;
-
if (eoinfo.need_second_pass)
{
eoinfo.second_pass = TRUE;