Skip to content

Commit

Permalink
lazily add .pdata/.xdata sections
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Oct 20, 2012
1 parent 0fac7d2 commit b9a31bf
Showing 1 changed file with 19 additions and 18 deletions.
37 changes: 19 additions & 18 deletions src/backend/mscoffobj.c
Expand Up @@ -91,8 +91,8 @@ static Outbuffer *comdef_symbuf; // Comdef's are stored here

static segidx_t segidx_drectve; // contents of ".drectve" section
static segidx_t segidx_debugs;
static segidx_t segidx_xdata;
static segidx_t segidx_pdata;
static segidx_t segidx_xdata = UNKNOWN;
static segidx_t segidx_pdata = UNKNOWN;

static int jumpTableSeg; // segment index for __jump_table

Expand Down Expand Up @@ -375,6 +375,9 @@ MsCoffObj *MsCoffObj::init(Outbuffer *objbuf, const char *filename, const char *
seg_tlsseg = UNKNOWN;
seg_tlsseg_bss = UNKNOWN;

segidx_pdata = UNKNOWN;
segidx_xdata = UNKNOWN;

// Initialize buffers

if (!string_table)
Expand Down Expand Up @@ -429,13 +432,6 @@ MsCoffObj *MsCoffObj::init(Outbuffer *objbuf, const char *filename, const char *
align |
IMAGE_SCN_MEM_EXECUTE |
IMAGE_SCN_MEM_READ); // CODE
addScnhdr(".pdata", IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_ALIGN_4BYTES |
IMAGE_SCN_MEM_READ); // PDATA
addScnhdr(".xdata", IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_ALIGN_4BYTES |
IMAGE_SCN_MEM_READ);

addScnhdr(".bss", IMAGE_SCN_CNT_UNINITIALIZED_DATA |
IMAGE_SCN_ALIGN_4BYTES |
IMAGE_SCN_MEM_READ |
Expand All @@ -447,27 +443,20 @@ MsCoffObj *MsCoffObj::init(Outbuffer *objbuf, const char *filename, const char *
#define SHI_DEBUGS 2
#define SHI_DATA 3
#define SHI_TEXT 4
#define SHI_PDATA 5
#define SHI_XDATA 6
#define SHI_UDATA 7
#define SHI_UDATA 5

getsegment2(SHI_TEXT);
assert(SegData[CODE]->SDseg == CODE);

getsegment2(SHI_DATA);
assert(SegData[DATA]->SDseg == DATA);

getsegment2(SHI_PDATA);
assert(SegData[CDATA]->SDseg == CDATA);
segidx_drectve = getsegment2(SHI_DRECTVE); // put this here just so UDATA can be seg 4

getsegment2(SHI_UDATA);
assert(SegData[UDATA]->SDseg == UDATA);

segidx_drectve = getsegment2(SHI_DRECTVE);
segidx_debugs = getsegment2(SHI_DEBUGS);
segidx_xdata = getsegment2(SHI_XDATA);
segidx_pdata = CDATA; // kludge for the moment, CDATA should really
// be separate from PDATA

SegData[segidx_drectve]->SDbuf->setsize(0);
SegData[segidx_drectve]->SDbuf->write(" ", 2);
Expand Down Expand Up @@ -1719,11 +1708,23 @@ seg_data *MsCoffObj::tlsseg_bss()

segidx_t MsCoffObj::seg_pdata()
{
if (segidx_pdata == UNKNOWN)
{
segidx_pdata = MsCoffObj::getsegment(".pdata", IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_ALIGN_4BYTES |
IMAGE_SCN_MEM_READ);
}
return segidx_pdata;
}

segidx_t MsCoffObj::seg_xdata()
{
if (segidx_xdata == UNKNOWN)
{
segidx_xdata = MsCoffObj::getsegment(".xdata", IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_ALIGN_4BYTES |
IMAGE_SCN_MEM_READ);
}
return segidx_xdata;
}

Expand Down

0 comments on commit b9a31bf

Please sign in to comment.