@@ -1584,6 +1584,8 @@ obj_directive(enum directive directive, char *value)
1584
1584
struct Segment * seg ;
1585
1585
struct External * * extp ;
1586
1586
int obj_idx ;
1587
+ const char * segname ;
1588
+ int i ;
1587
1589
1588
1590
q = value ;
1589
1591
while (* q == '.' )
@@ -1612,18 +1614,19 @@ obj_directive(enum directive directive, char *value)
1612
1614
for (grp = grphead ; grp ; grp = grp -> next ) {
1613
1615
obj_idx ++ ;
1614
1616
if (!strcmp (grp -> name , v )) {
1615
- nasm_nonfatal ("group `%s' defined twice" , v );
1616
- return DIRR_ERROR ;
1617
+ break ;
1617
1618
}
1618
1619
}
1619
1620
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
+ }
1627
1630
1628
1631
obj_grp_needs_update = grp ;
1629
1632
backend_label (v , grp -> index + 1 , 0L );
@@ -1641,6 +1644,29 @@ obj_directive(enum directive directive, char *value)
1641
1644
/*
1642
1645
* Now p contains a segment name. Find it.
1643
1646
*/
1647
+ for (i = 0 ; i < grp -> nentries ; i ++ ) {
1648
+ if (i < grp -> nindices ) {
1649
+ for (seg = seghead ; seg ; seg = seg -> next ) {
1650
+ if (grp -> segs [i ].index == seg -> obj_index ) {
1651
+ segname = seg -> name ;
1652
+ break ;
1653
+ }
1654
+ }
1655
+ }
1656
+ else
1657
+ segname = grp -> segs [i ].name ;
1658
+ /*
1659
+ * See if this segment is defined in this group.
1660
+ */
1661
+ if (!strcmp (segname , p ))
1662
+ break ;
1663
+ }
1664
+ if (i < grp -> nentries ) {
1665
+ /*
1666
+ * We have already this segment. Skip.
1667
+ */
1668
+ continue ;
1669
+ }
1644
1670
for (seg = seghead ; seg ; seg = seg -> next )
1645
1671
if (!strcmp (seg -> name , p ))
1646
1672
break ;
0 commit comments