your change "bfd_find_nearest_line without debug info"

Jan Beulich JBeulich@suse.com
Fri Oct 18 07:27:00 GMT 2013


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;




More information about the Binutils mailing list