On Wed, Feb 4, 2015 at 2:47 PM, Bernhard Reutner-Fischer <rep.dot....@gmail.com> wrote: > On February 4, 2015 11:37:01 PM GMT+01:00, "H.J. Lu" <hjl.to...@gmail.com> > wrote: >>On Wed, Feb 4, 2015 at 1:53 PM, Sriraman Tallam <tmsri...@google.com> >>wrote: >>> On Wed, Feb 4, 2015 at 10:57 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Wed, Feb 4, 2015 at 10:51 AM, Sriraman Tallam >><tmsri...@google.com> wrote: >>>>> On Wed, Feb 4, 2015 at 10:45 AM, H.J. Lu <hjl.to...@gmail.com> >>wrote: >>>>>> On Wed, Feb 4, 2015 at 10:42 AM, Jakub Jelinek <ja...@redhat.com> >>wrote: >>>>>>> On Wed, Feb 04, 2015 at 10:38:48AM -0800, H.J. Lu wrote: >>>>>>>> Common symbol should be resolved locally for PIE. >>>>>>> >>>>>>> binds_local_p yes, binds_to_current_def_p no. >>>>>>> >>>>>> >>>>>> Is SYMBOL_REF_LOCAL_P set to binds_local_p or >>>>>> binds_to_current_def_p? >>>>> >>>>> Looks like binds_local_p: >>>>> >>>>> varasm.c: >>>>> void >>>>> default_encode_section_info (tree decl, rtx rtl, int first >>ATTRIBUTE_UNUSED) >>>>> { >>>>> ... >>>>> if (targetm.binds_local_p (decl)) >>>>> flags |= SYMBOL_FLAG_LOCAL; >>>>> >>>> >>>> Why is SYMBOL_REF_LOCAL_P false? >>> >>> In varasm.c, default_binds_local_p_1 >>> >>> >>> /* Default visibility weak data can be overridden by a strong symbol >>> in another module and so are not local. */ >>> else if (DECL_WEAK (exp) >>> && !resolved_locally) >> ^^^^^^^^^^^^^^^^^^^ >>Why is resolved_locally false? It should be true for common >>symbol when compiling for PIE. >> >>> local_p = false; >>> >>> For weak definition, it is set to false here. > > Yea and i think this is still wrong and known as > http://gcc.gnu.org/PR32219 >
Try this. -- H.J.
diff --git a/gcc/varasm.c b/gcc/varasm.c index eb65b1f..c95eebd 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -6826,7 +6826,15 @@ default_binds_local_p_1 (const_tree exp, int shlib) && (TREE_STATIC (exp) || DECL_EXTERNAL (exp))) { varpool_node *vnode = varpool_node::get (exp); - if (vnode && (resolution_local_p (vnode->resolution) || vnode->in_other_partition)) + /* If not building shared library, common or initialized symbols + are also resolved locally, regardless they are weak or not. */ + if ((!shlib + && (DECL_COMMON (exp) + || (DECL_INITIAL (exp) != NULL + && (in_lto_p + || DECL_INITIAL (exp) != error_mark_node)))) + || (vnode && (resolution_local_p (vnode->resolution) + || vnode->in_other_partition))) resolved_locally = true; if (vnode && resolution_to_local_definition_p (vnode->resolution))