Print this page
3436 relocatable objects also need sloppy relocation
3439 discarded sections shouldn't end up on output lists

*** 849,858 **** --- 849,865 ---- DBG_CALL(Dbg_sec_redirected(ofl->ofl_lml, isp, oname)); } } /* + * When building relocatable objects, we must not redirect COMDAT + * section names into their outputs, such that our output object may + * be successfully used as an input object also requiring COMDAT + * processing + */ + + /* * GNU section names may follow the convention: * * .gnu.linkonce.* * * The .gnu.linkonce is a section naming convention that indicates a
*** 861,877 **** * discarded or retained. The comparison of is_name[1] with 'g' * is an optimization to skip using strncmp() too much. This is safe, * because we know the name is not NULL, and therefore must have * at least one character plus a NULL termination. */ ! if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && ! (isp->is_name == oname) && (isp->is_name[1] == 'g') && (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE), isp->is_name, MSG_SCN_GNU_LINKONCE_SIZE) == 0)) { ! if ((oname = ! (char *)gnu_linkonce_sec(isp->is_name)) != isp->is_name) { ! DBG_CALL(Dbg_sec_redirected(ofl->ofl_lml, isp, oname)); } /* * Explicitly identify this section type as COMDAT. Also, * enable relaxed relocation processing, as this is typically --- 868,886 ---- * discarded or retained. The comparison of is_name[1] with 'g' * is an optimization to skip using strncmp() too much. This is safe, * because we know the name is not NULL, and therefore must have * at least one character plus a NULL termination. */ ! if ((isp->is_name == oname) && (isp->is_name[1] == 'g') && (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE), isp->is_name, MSG_SCN_GNU_LINKONCE_SIZE) == 0)) { ! if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) { ! if ((oname = (char *)gnu_linkonce_sec(isp->is_name)) != ! isp->is_name) { ! DBG_CALL(Dbg_sec_redirected(ofl->ofl_lml, isp, ! oname)); ! } } /* * Explicitly identify this section type as COMDAT. Also, * enable relaxed relocation processing, as this is typically
*** 892,911 **** * This convention is used when defining SHT_GROUP sections of type * COMDAT. Thus, any group processing will have discovered any group * sections, and this identification can be triggered by a pattern * match section names. */ ! if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && ! (isp->is_name == oname) && (isp->is_flags & FLG_IS_COMDAT) && ((sname = gnu_comdat_sym(ifl, isp)) != NULL)) { size_t size = sname - isp->is_name; if ((oname = libld_malloc(size + 1)) == NULL) return ((Os_desc *)S_ERROR); (void) strncpy(oname, isp->is_name, size); oname[size] = '\0'; DBG_CALL(Dbg_sec_redirected(ofl->ofl_lml, isp, oname)); /* * Enable relaxed relocation processing, as this is * typically a requirement with GNU COMDAT sections. */ --- 901,921 ---- * This convention is used when defining SHT_GROUP sections of type * COMDAT. Thus, any group processing will have discovered any group * sections, and this identification can be triggered by a pattern * match section names. */ ! if ((isp->is_name == oname) && (isp->is_flags & FLG_IS_COMDAT) && ((sname = gnu_comdat_sym(ifl, isp)) != NULL)) { size_t size = sname - isp->is_name; + if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) { if ((oname = libld_malloc(size + 1)) == NULL) return ((Os_desc *)S_ERROR); (void) strncpy(oname, isp->is_name, size); oname[size] = '\0'; DBG_CALL(Dbg_sec_redirected(ofl->ofl_lml, isp, oname)); + } /* * Enable relaxed relocation processing, as this is * typically a requirement with GNU COMDAT sections. */
*** 1197,1206 **** --- 1207,1217 ---- /* * Sections of type SHT_GROUP are added to the ofl->ofl_osgroups list, * so that they can be updated as a group later. */ if ((shdr->sh_type == SHT_GROUP) && + ((isp->is_flags & FLG_IS_DISCARD) == 0) && (aplist_append(&ofl->ofl_osgroups, osp, AL_CNT_OFL_OSGROUPS) == NULL)) return ((Os_desc *)S_ERROR); /*