Print this page
10346 ld(1) should not reduce symbol visibility of COMDAT symbols when producing relocatable objects
*** 989,998 ****
--- 989,1001 ----
sdflags |= FLG_SY_EXPORT;
break;
case STV_SINGLETON:
sdflags |= FLG_SY_SINGLE;
break;
+ case STV_HIDDEN:
+ sdflags |= FLG_SY_HIDDEN;
+ break;
}
/*
* Determine whether a symbol definition already exists, and if so
* obtain the visibility.
*** 1514,1524 ****
*
* Also refer to make_mvsections() in sunwmove.c
*/
if ((sym->st_shndx == SHN_COMMON) &&
(((oflags & FLG_OF_RELOBJ) == 0) ||
! (SYM_IS_HIDDEN(sdp) && (oflags & FLG_OF_PROCRED)))) {
if ((sdp->sd_move == NULL) ||
((sdp->sd_flags & FLG_SY_PAREXPN) == 0)) {
if (type != STT_TLS) {
need_bss = TRUE;
bsssize = (Xword)S_ROUND(bsssize,
--- 1517,1527 ----
*
* Also refer to make_mvsections() in sunwmove.c
*/
if ((sym->st_shndx == SHN_COMMON) &&
(((oflags & FLG_OF_RELOBJ) == 0) ||
! ld_sym_reducable(ofl, sdp))) {
if ((sdp->sd_move == NULL) ||
((sdp->sd_flags & FLG_SY_PAREXPN) == 0)) {
if (type != STT_TLS) {
need_bss = TRUE;
bsssize = (Xword)S_ROUND(bsssize,
*** 1566,1576 ****
* Note, a capabilities symbol must remain as visible as a
* global symbol. However, the runtime linker recognizes the
* hidden requirement and ensures the symbol isn't made globally
* available at runtime.
*/
! if (SYM_IS_HIDDEN(sdp) && (oflags & FLG_OF_PROCRED)) {
/*
* If any reductions are being processed, keep a count
* of eliminated symbols, and if the symbol is being
* reduced to local, count it's size for the .symtab.
*/
--- 1569,1579 ----
* Note, a capabilities symbol must remain as visible as a
* global symbol. However, the runtime linker recognizes the
* hidden requirement and ensures the symbol isn't made globally
* available at runtime.
*/
! if (ld_sym_reducable(ofl, sdp)) {
/*
* If any reductions are being processed, keep a count
* of eliminated symbols, and if the symbol is being
* reduced to local, count it's size for the .symtab.
*/
*** 3131,3135 ****
--- 3134,3161 ----
isp->is_sym_name = str;
}
return (isp->is_sym_name);
}
+
+ /*
+ * If we're producing a relocatable object and the symbol is eligible for
+ * COMDAT section, it shouldn't be reduced in scope as that will break the
+ * COMDAT matching when the output object is later consumed. Leave it alone,
+ * and any reduction (and COMDAT) processing will occur then.
+ *
+ * Otherwise, any hidden symbol is reduced when reductions are being processed.
+ */
+ Boolean
+ ld_sym_reducable(Ofl_desc *ofl, Sym_desc *sdp)
+ {
+ Is_desc *isc = sdp->sd_isc;
+
+ if (((ofl->ofl_flags & FLG_OF_RELOBJ) != 0) &&
+ (isc != NULL) &&
+ ((isc->is_flags & FLG_IS_COMDAT) != 0)) {
+ return (FALSE);
+ } else {
+ return (SYM_IS_HIDDEN(sdp) &&
+ (ofl->ofl_flags & FLG_OF_PROCRED));
+ }
+ }