@@ -1652,6 +1652,8 @@ obj_directive(enum directive directive, char *value)
16521652 struct Segment * seg ;
16531653 struct External * * extp ;
16541654 int obj_idx ;
1655+ const char * segname ;
1656+ int i ;
16551657
16561658 q = value ;
16571659 while (* q == '.' )
@@ -1680,22 +1682,23 @@ obj_directive(enum directive directive, char *value)
16801682 for (grp = grphead ; grp ; grp = grp -> next ) {
16811683 obj_idx ++ ;
16821684 if (!strcmp (grp -> name , v )) {
1683- nasm_nonfatal ("group `%s' defined twice" , v );
1684- return DIRR_ERROR ;
1685+ break ;
16851686 }
16861687 }
16871688
1688- * grptail = grp = nasm_malloc (sizeof (* grp ));
1689- grp -> next = NULL ;
1690- grptail = & grp -> next ;
1691- grp -> index = seg_alloc ();
1692- grp -> obj_index = obj_idx ;
1693- grp -> nindices = grp -> nentries = 0 ;
1694- grp -> name = NULL ;
1695-
1696- obj_grp_needs_update = grp ;
1697- backend_label (v , grp -> index + 1 , 0L );
1698- obj_grp_needs_update = NULL ;
1689+ if (!grp ) {
1690+ * grptail = grp = nasm_malloc (sizeof (* grp ));
1691+ grp -> next = NULL ;
1692+ grptail = & grp -> next ;
1693+ grp -> index = seg_alloc ();
1694+ grp -> obj_index = obj_idx ;
1695+ grp -> nindices = grp -> nentries = 0 ;
1696+ grp -> name = NULL ;
1697+
1698+ obj_grp_needs_update = grp ;
1699+ backend_label (v , grp -> index + 1 , 0L );
1700+ obj_grp_needs_update = NULL ;
1701+ }
16991702
17001703 while (* q ) {
17011704 p = q ;
@@ -1709,6 +1712,30 @@ obj_directive(enum directive directive, char *value)
17091712 /*
17101713 * Now p contains a segment name. Find it.
17111714 */
1715+ for (i = 0 ; i < grp -> nentries ; i ++ ) {
1716+ if (i < grp -> nindices ) {
1717+ segname = NULL ; /* make compiler happy */
1718+ for (seg = seghead ; seg ; seg = seg -> next ) {
1719+ if (grp -> segs [i ].index == seg -> obj_index ) {
1720+ segname = seg -> name ;
1721+ break ;
1722+ }
1723+ }
1724+ }
1725+ else
1726+ segname = grp -> segs [i ].name ;
1727+ /*
1728+ * See if this segment is defined in this group.
1729+ */
1730+ if (!strcmp (segname , p ))
1731+ break ;
1732+ }
1733+ if (i < grp -> nentries ) {
1734+ /*
1735+ * We have already this segment. Skip.
1736+ */
1737+ continue ;
1738+ }
17121739 for (seg = seghead ; seg ; seg = seg -> next )
17131740 if (!strcmp (seg -> name , p ))
17141741 break ;
0 commit comments