Print this page
3616 SHF_GROUP sections should not be discarded via other COMDAT mechanisms
3709 need sloppy relocation for GNU .debug_macro
Reviewed by: Joshua M. Clulow <josh@sysmgr.org>
Reviewed by: Robert Mustacchi <rm@joyent.com>

@@ -3461,5 +3461,51 @@
         if (aplist_append(&ofl->ofl_maptext, isec, AL_CNT_OFL_MAPSECS) == NULL)
                 return ((Is_desc *)S_ERROR);
 
         return (isec);
 }
+
+void
+ld_comdat_validate(Ofl_desc *ofl, Ifl_desc *ifl)
+{
+        int i;
+
+        for (i = 0; i < ifl->ifl_shnum; i++) {
+                Is_desc *isp = ifl->ifl_isdesc[i];
+                int types = 0;
+                char buf[1024] = "";
+                Group_desc *gr = NULL;
+
+                if ((isp == NULL) || (isp->is_flags & FLG_IS_COMDAT) == 0)
+                        continue;
+
+                if (isp->is_shdr->sh_type == SHT_SUNW_COMDAT) {
+                        types++;
+                        (void) strlcpy(buf, MSG_ORIG(MSG_STR_SUNW_COMDAT),
+                            sizeof (buf));
+                }
+
+                if (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE), isp->is_name,
+                    MSG_SCN_GNU_LINKONCE_SIZE) == 0) {
+                        types++;
+                        if (types > 1)
+                                (void) strlcat(buf, ", ", sizeof (buf));
+                        (void) strlcat(buf, MSG_ORIG(MSG_SCN_GNU_LINKONCE),
+                            sizeof (buf));
+                }
+
+                if ((isp->is_shdr->sh_flags & SHF_GROUP) &&
+                    ((gr = ld_get_group(ofl, isp)) != NULL) &&
+                    (gr->gd_data[0] & GRP_COMDAT)) {
+                        types++;
+                        if (types > 1)
+                                (void) strlcat(buf, ", ", sizeof (buf));
+                        (void) strlcat(buf, MSG_ORIG(MSG_STR_GROUP),
+                            sizeof (buf));
+                }
+
+                if (types > 1)
+                        ld_eprintf(ofl, ERR_FATAL,
+                            MSG_INTL(MSG_SCN_MULTICOMDAT), ifl->ifl_name,
+                            EC_WORD(isp->is_scnndx), isp->is_name, buf);
+        }
+}