Print this page
11057 hidden undefined weak symbols should not leave relocations
11058 libld entrance descriptor assertions get NDEBUG check backwards

*** 777,787 **** * R_SPARC_TLS_DTPOFF* relocations. */ if (orsp->rel_rtype == M_R_DTPMOD) raddend = 0; ! relbits = (char *)relosp->os_outdata->d_buf; rea.r_info = ELF_R_INFO(ndx, ELF_R_TYPE_INFO(RELAUX_GET_TYPEDATA(orsp), orsp->rel_rtype)); rea.r_offset = roffset; rea.r_addend = raddend; --- 777,805 ---- * R_SPARC_TLS_DTPOFF* relocations. */ if (orsp->rel_rtype == M_R_DTPMOD) raddend = 0; ! /* ! * Note that the other case which writes out the relocation, above, is ! * M_R_REGISTER specific and so does not need this check. ! */ ! if ((orsp->rel_rtype != M_R_NONE) && ! (orsp->rel_rtype != M_R_REGISTER) && ! (orsp->rel_rtype != M_R_RELATIVE)) { ! if (ndx == 0) { ! Conv_inv_buf_t inv_buf; ! Is_desc *isp = orsp->rel_isdesc; ! ! ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_NOSYMBOL), ! conv_reloc_type(ofl->ofl_nehdr->e_machine, ! orsp->rel_rtype, 0, &inv_buf), ! isp->is_file->ifl_name, EC_WORD(isp->is_scnndx), ! isp->is_name, EC_XWORD(roffset)); ! return (S_ERROR); ! } ! } rea.r_info = ELF_R_INFO(ndx, ELF_R_TYPE_INFO(RELAUX_GET_TYPEDATA(orsp), orsp->rel_rtype)); rea.r_offset = roffset; rea.r_addend = raddend;
*** 791,800 **** --- 809,820 ---- /* * Assert we haven't walked off the end of our relocation table. */ assert(relosp->os_szoutrels <= relosp->os_shdr->sh_size); + relbits = (char *)relosp->os_outdata->d_buf; + (void) memcpy((relbits + relosp->os_szoutrels), (char *)&rea, sizeof (Rela)); relosp->os_szoutrels += (Xword)sizeof (Rela); /*
*** 1409,1418 **** --- 1429,1452 ---- */ if (OFL_IS_STATIC_EXEC(ofl)) return (1); /* + * If the symbol will be reduced, we can't leave outstanding + * relocations against it, as nothing will ever be able to satisfy them + * (and the symbol won't be in .dynsym + */ + if ((sdp != NULL) && + (sdp->sd_sym->st_shndx == SHN_UNDEF) && + (rsp->rel_rtype != M_R_NONE) && + (rsp->rel_rtype != M_R_REGISTER) && + (rsp->rel_rtype != M_R_RELATIVE)) { + if (ld_sym_reducable(ofl, sdp)) + return (1); + } + + /* * Certain relocations do not make sense in a 64bit shared object, * if building a shared object do a sanity check on the output * relocations being created. */ if (ofl->ofl_flags & FLG_OF_SHAROBJ) {