[PATCH] BFD: Handle copying of absolute section symbols

Maciej W. Rozycki macro@linux-mips.org
Tue Apr 10 10:17:00 GMT 2012


 Some MIPS ELF files contain a special symbol called _DYNAMIC_LINKING that 
is created as an absolute global section symbol; it appears as follows:

    63: 0000000000000001     0 SECTION GLOBAL DEFAULT  ABS _DYNAMIC_LINKING

in readelf output of .symtab or .dynsym.  I'm not sure why it is arranged 
as such; in particular an IRIX reference on the Internet says:

"Some symbols have a DSO-specific meaning.  That is, a query of the
value within a DSO can get a DSO-specific value:  the values are not
global, but specific to the main program or DSO taking the address of
the symbol.  The DSO-specific symbols are:  _gp, _gp_disp,
_procedure_table, _procedure_table_size, _procedure_string_table,
_rt_symbol_table, _rt_symbol_table_size, _rt_symbol_string_table,
All the other symbols are global and therefore a single value (that of
the main program) will be seen from all DSOs and the main program
because of the global symbol resolution rules."

and then:

"* _DYNAMIC_LINKING and _DYNAMIC_LINK are identical.  If referred to,
   they have special value generated by the linker:  0 means this code
   is non-shared, 1 means the code is in a KPIC executable, and 2 means
   the code is in a DSO."

so it looks to me the symbol should really be marked as local and probably 
object; there's no further explanation in our sources and any input as to 
why we create this symbol with such attributes will be appreciated.  I 
have no idea what the actual use of this symbol is either.

 Anyway, this attribute arrangement causes this symbol to be always 
discarded whenever a binary containing a definition is objcopied in any 
way, e.g. verbatim, like with:

FAIL: simple objcopy of executable

in the binutils test suite.

 I have tracked it down to ignore_section_sym in bfd/elf.c that considers 
the section the symbol is associated with not to be owned by the output 
BFD.  Arguably the special absolute section should be treated as "owned" 
by any BFD, because any symbols defined there are really detached from any 
input section and the only sensible action that can be done about them 
here is to copy them verbatim.

 Here's a change that fixes the problem for me and the binutils test 
failure quoted above.  Any objections or other comments?

2012-04-10  Maciej W. Rozycki  <macro@linux-mips.org>

	* elf.c (ignore_section_sym): Handle absolute section symbols.
	(elf_map_symbols): Likewise.


Index: binutils/bfd/elf.c
--- binutils.orig/bfd/elf.c
+++ binutils/bfd/elf.c
@@ -3250,7 +3250,8 @@ ignore_section_sym (bfd *abfd, asymbol *
   return ((sym->flags & BSF_SECTION_SYM) != 0
 	  && !(sym->section->owner == abfd
 	       || (sym->section->output_section->owner == abfd
-		   && sym->section->output_offset == 0)));
+		   && sym->section->output_offset == 0)
+	       || bfd_is_abs_section (bfd_get_section (sym))));
 static bfd_boolean
@@ -3294,7 +3295,8 @@ elf_map_symbols (bfd *abfd)
       if ((sym->flags & BSF_SECTION_SYM) != 0
 	  && sym->value == 0
-	  && !ignore_section_sym (abfd, sym))
+	  && !ignore_section_sym (abfd, sym)
+	  && !bfd_is_abs_section (bfd_get_section (sym)))
 	  asection *sec = sym->section;

More information about the Binutils mailing list