@@ -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,22 +1614,23 @@ 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 ;
1627
-
1628
- obj_grp_needs_update = grp ;
1629
- backend_label (v , grp -> index + 1 , 0L );
1630
- obj_grp_needs_update = 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
+
1630
+ obj_grp_needs_update = grp ;
1631
+ backend_label (v , grp -> index + 1 , 0L );
1632
+ obj_grp_needs_update = NULL ;
1633
+ }
1631
1634
1632
1635
while (* q ) {
1633
1636
p = q ;
@@ -1641,6 +1644,30 @@ 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
+ 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
+ }
1644
1671
for (seg = seghead ; seg ; seg = seg -> next )
1645
1672
if (!strcmp (seg -> name , p ))
1646
1673
break ;
0 commit comments