@@ -1574,6 +1574,8 @@ obj_directive(enum directive directive, char *value)
15741574 struct Segment * seg ;
15751575 struct External * * extp ;
15761576 int obj_idx ;
1577+ const char * segname ;
1578+ int i ;
15771579
15781580 q = value ;
15791581 while (* q == '.' )
@@ -1602,22 +1604,23 @@ obj_directive(enum directive directive, char *value)
16021604 for (grp = grphead ; grp ; grp = grp -> next ) {
16031605 obj_idx ++ ;
16041606 if (!strcmp (grp -> name , v )) {
1605- nasm_nonfatal ("group `%s' defined twice" , v );
1606- return DIRR_ERROR ;
1607+ break ;
16071608 }
16081609 }
16091610
1610- * grptail = grp = nasm_malloc (sizeof (* grp ));
1611- grp -> next = NULL ;
1612- grptail = & grp -> next ;
1613- grp -> index = seg_alloc ();
1614- grp -> obj_index = obj_idx ;
1615- grp -> nindices = grp -> nentries = 0 ;
1616- grp -> name = NULL ;
1617-
1618- obj_grp_needs_update = grp ;
1619- backend_label (v , grp -> index + 1 , 0L );
1620- obj_grp_needs_update = NULL ;
1611+ if (!grp ) {
1612+ * grptail = grp = nasm_malloc (sizeof (* grp ));
1613+ grp -> next = NULL ;
1614+ grptail = & grp -> next ;
1615+ grp -> index = seg_alloc ();
1616+ grp -> obj_index = obj_idx ;
1617+ grp -> nindices = grp -> nentries = 0 ;
1618+ grp -> name = NULL ;
1619+
1620+ obj_grp_needs_update = grp ;
1621+ backend_label (v , grp -> index + 1 , 0L );
1622+ obj_grp_needs_update = NULL ;
1623+ }
16211624
16221625 while (* q ) {
16231626 p = q ;
@@ -1631,6 +1634,30 @@ obj_directive(enum directive directive, char *value)
16311634 /*
16321635 * Now p contains a segment name. Find it.
16331636 */
1637+ for (i = 0 ; i < grp -> nentries ; i ++ ) {
1638+ if (i < grp -> nindices ) {
1639+ segname = NULL ; /* make compiler happy */
1640+ for (seg = seghead ; seg ; seg = seg -> next ) {
1641+ if (grp -> segs [i ].index == seg -> obj_index ) {
1642+ segname = seg -> name ;
1643+ break ;
1644+ }
1645+ }
1646+ }
1647+ else
1648+ segname = grp -> segs [i ].name ;
1649+ /*
1650+ * See if this segment is defined in this group.
1651+ */
1652+ if (!strcmp (segname , p ))
1653+ break ;
1654+ }
1655+ if (i < grp -> nentries ) {
1656+ /*
1657+ * We have already this segment. Skip.
1658+ */
1659+ continue ;
1660+ }
16341661 for (seg = seghead ; seg ; seg = seg -> next )
16351662 if (!strcmp (seg -> name , p ))
16361663 break ;
0 commit comments