とりあえずgcc-3.4.4ではこんな感じで大丈夫だった

typedef struct _BASE_BLOCK BASE_BLOCK2; //二重定義にならないよう別名
typedef struct{
   BASE_BLOCK2 *blk;
   char a,b,c;
} DATA1_BLK;

typedef struct{
   BASE_BLOCK2 *blk;
   long a,b,c;
} DATA2_BLK;

typedef struct _BASE_BLOCK{
   DATA1_BLK d1;
   DATA2_BLK d2;
   struct _BASE_BLOCK *next;
   struct _BASE_BLOCK *before;
   int   a;
} BASE_BLOCK;