PATCH: PR ld/13195: -ffunction-sections -Wl,--gc-sections failure with C++ code

H.J. Lu hongjiu.lu@intel.com
Fri Sep 16 22:57:00 GMT 2011


Fix for:

http://sourceware.org/bugzilla/show_bug.cgi?id=13177

caused:

http://www.sourceware.org/bugzilla/show_bug.cgi?id=13195

The problem is we don't always set dynamic_def when setting def_dynamic.
We can fix it by

1. Always set dynamic_def when setting def_dynamic.  Or
2. Check both dynamic_def and def_dynamic.

I am enclosing both patches here.  Is any of them OK to install?

Thanks.


H.J.
-------------- next part --------------
2011-09-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13195
	* elflink.c (elf_link_output_extsym): Also check def_dynamic
	for local symbol referenced by DSO.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index 9ccf37d..4dfa192 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -8637,6 +8637,7 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
       && (! finfo->info->shared)
       && h->forced_local
       && h->ref_dynamic
+      && !h->def_dynamic
       && !h->dynamic_def
       && !h->dynamic_weak
       && ! elf_link_check_versioned_symbol (finfo->info, bed, h))
-------------- next part --------------
2011-09-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13195
	* elflink.c (_bfd_elf_merge_symbol): Don't set dynamic_def when
	clearing def_dynamic.
	(elf_link_add_object_symbols): Likewise.  Set dynamic_def when
	setting def_dynamic.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index 9ccf37d..fb42b84 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -1238,7 +1238,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
 	{
 	  h->def_dynamic = 0;
 	  h->ref_dynamic = 1;
-	  h->dynamic_def = 1;
 	}
       /* FIXME: Should we check type and size for protected symbol?  */
       h->size = 0;
@@ -4353,7 +4352,6 @@ error_free_dyn:
 		    {
 		      h->def_dynamic = 0;
 		      h->ref_dynamic = 1;
-		      h->dynamic_def = 1;
 		    }
 		}
 	      if (! info->executable
@@ -4366,7 +4364,10 @@ error_free_dyn:
 	      if (! definition)
 		h->ref_dynamic = 1;
 	      else
-		h->def_dynamic = 1;
+		{
+		  h->def_dynamic = 1;
+		  h->dynamic_def = 1;
+		}
 	      if (h->def_regular
 		  || h->ref_regular
 		  || (h->u.weakdef != NULL


More information about the Binutils mailing list