@@ -1584,6 +1584,8 @@ obj_directive(enum directive directive, char *value)
15841584 struct Segment * seg ;
15851585 struct External * * extp ;
15861586 int obj_idx ;
1587+ const char * segname ;
1588+ int i ;
15871589
15881590 q = value ;
15891591 while (* q == '.' )
@@ -1612,18 +1614,19 @@ obj_directive(enum directive directive, char *value)
16121614 for (grp = grphead ; grp ; grp = grp -> next ) {
16131615 obj_idx ++ ;
16141616 if (!strcmp (grp -> name , v )) {
1615- nasm_nonfatal ("group `%s' defined twice" , v );
1616- return DIRR_ERROR ;
1617+ break ;
16171618 }
16181619 }
16191620
1620- * grptail = grp = nasm_malloc (sizeof (* grp ));
1621- grp -> next = NULL ;
1622- grptail = & grp -> next ;
1623- grp -> index = seg_alloc ();
1624- grp -> obj_index = obj_idx ;
1625- grp -> nindices = grp -> nentries = 0 ;
1626- grp -> name = NULL ;
1621+ if (!grp ) {
1622+ * grptail = grp = nasm_malloc (sizeof (* grp ));
1623+ grp -> next = NULL ;
1624+ grptail = & grp -> next ;
1625+ grp -> index = seg_alloc ();
1626+ grp -> obj_index = obj_idx ;
1627+ grp -> nindices = grp -> nentries = 0 ;
1628+ grp -> name = NULL ;
1629+ }
16271630
16281631 obj_grp_needs_update = grp ;
16291632 backend_label (v , grp -> index + 1 , 0L );
@@ -1641,6 +1644,30 @@ obj_directive(enum directive directive, char *value)
16411644 /*
16421645 * Now p contains a segment name. Find it.
16431646 */
1647+ for (i = 0 ; i < grp -> nentries ; i ++ ) {
1648+ if (i < grp -> nindices ) {
1649+ segname = NULL ; /* make compiler happy */
1650+ for (seg = seghead ; seg ; seg = seg -> next ) {
1651+ if (grp -> segs [i ].index == seg -> obj_index ) {
1652+ segname = seg -> name ;
1653+ break ;
1654+ }
1655+ }
1656+ }
1657+ else
1658+ segname = grp -> segs [i ].name ;
1659+ /*
1660+ * See if this segment is defined in this group.
1661+ */
1662+ if (!strcmp (segname , p ))
1663+ break ;
1664+ }
1665+ if (i < grp -> nentries ) {
1666+ /*
1667+ * We have already this segment. Skip.
1668+ */
1669+ continue ;
1670+ }
16441671 for (seg = seghead ; seg ; seg = seg -> next )
16451672 if (!strcmp (seg -> name , p ))
16461673 break ;
0 commit comments