Skip to content

Commit

Permalink
Merge pull request #1707 from dawgfoto/MSCOFF
Browse files Browse the repository at this point in the history
use group sections to order and merge sections
  • Loading branch information
WalterBright committed Mar 2, 2013
1 parent 0a1c009 commit 2cb7f74
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 56 deletions.
80 changes: 27 additions & 53 deletions src/backend/mscoffobj.c
Expand Up @@ -1277,17 +1277,9 @@ void MsCoffObj::ehtables(Symbol *sfunc,targ_size_t size,Symbol *ehsym)

int align = I64 ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES; // align to NPTRSIZE

MsCoffObj::getsegment("._deh_bg", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

// The size is sizeof(struct FuncTable) in deh2.d
int seg =
MsCoffObj::getsegment("._deh_eh", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

MsCoffObj::getsegment("._deh_en", IMAGE_SCN_CNT_INITIALIZED_DATA |
// The size is sizeof(struct FuncTable) in deh2.d
const int seg =
MsCoffObj::getsegment("._deh$B", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

Expand Down Expand Up @@ -1316,30 +1308,25 @@ void MsCoffObj::ehsections()
{
int align = I64 ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES;

int segdeh_bg =
MsCoffObj::getsegment("._deh_bg", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

// The size is sizeof(struct FuncTable) in deh2.d
MsCoffObj::getsegment("._deh_eh", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
const int segdeh_bg =
MsCoffObj::getsegment("._deh$A", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

int segdeh_en =
MsCoffObj::getsegment("._deh_en", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
const int segdeh_en =
MsCoffObj::getsegment("._deh$C", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

/* Create symbol _eh_beg that sits just before the .minfodt segment
/* Create symbol _eh_beg that sits just before the ._deh$B section
*/
symbol *eh_beg = symbol_name("_deh_beg", SCglobal, tspvoid);
eh_beg->Sseg = segdeh_bg;
eh_beg->Soffset = 0;
symbuf->write(&eh_beg, sizeof(eh_beg));
MsCoffObj::bytes(segdeh_bg, 0, I64 ? 8 * 3 : 4 * 3, NULL);

/* Create symbol _eh_end that sits just after the ._deh_eh segment
/* Create symbol _eh_end that sits just after the ._deh$B section
*/
symbol *eh_end = symbol_name("_deh_end", SCglobal, tspvoid);
eh_end->Sseg = segdeh_en;
Expand All @@ -1355,27 +1342,24 @@ void MsCoffObj::ehsections()
*/
int align = I64 ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES;

int segbg =
MsCoffObj::getsegment(".minfobg", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
MsCoffObj::getsegment(".minfodt", IMAGE_SCN_CNT_INITIALIZED_DATA |
const int segbg =
MsCoffObj::getsegment(".minfo$A", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
int segen =
MsCoffObj::getsegment(".minfoen", IMAGE_SCN_CNT_INITIALIZED_DATA |
const int segen =
MsCoffObj::getsegment(".minfo$C", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);

/* Create symbol _minfo_beg that sits just before the .minfodt segment
/* Create symbol _minfo_beg that sits just before the .minfo$B section
*/
symbol *minfo_beg = symbol_name("_minfo_beg", SCglobal, tspvoid);
minfo_beg->Sseg = segbg;
minfo_beg->Soffset = 0;
symbuf->write(&minfo_beg, sizeof(minfo_beg));
MsCoffObj::bytes(segbg, 0, I64 ? 8 : 4, NULL);

/* Create symbol _minfo_end that sits just after the .minfodt segment
/* Create symbol _minfo_end that sits just after the .minfo$B section
*/
symbol *minfo_end = symbol_name("_minfo_end", SCglobal, tspvoid);
minfo_end->Sseg = segen;
Expand All @@ -1393,29 +1377,25 @@ void MsCoffObj::ehsections()
int align = I64 ? IMAGE_SCN_ALIGN_16BYTES : IMAGE_SCN_ALIGN_4BYTES;

int segbg =
MsCoffObj::getsegment(".tls$A", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE);
MsCoffObj::getsegment(".tls$", IMAGE_SCN_CNT_INITIALIZED_DATA |
MsCoffObj::getsegment(".tls$AAA", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE);
int segen =
MsCoffObj::getsegment(".tls$ZZZ", IMAGE_SCN_CNT_INITIALIZED_DATA |
MsCoffObj::getsegment(".tls$AAC", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE);

/* Create symbol _minfo_beg that sits just before the .minfodt segment
/* Create symbol _minfo_beg that sits just before the .tls$AAB section
*/
symbol *minfo_beg = symbol_name("_tlsstart", SCglobal, tspvoid);
minfo_beg->Sseg = segbg;
minfo_beg->Soffset = 0;
symbuf->write(&minfo_beg, sizeof(minfo_beg));
MsCoffObj::bytes(segbg, 0, I64 ? 8 : 4, NULL);

/* Create symbol _minfo_end that sits just after the .minfodt segment
/* Create symbol _minfo_end that sits just after the .tls$AAB section
*/
symbol *minfo_end = symbol_name("_tlsend", SCglobal, tspvoid);
minfo_end->Sseg = segen;
Expand Down Expand Up @@ -1461,7 +1441,7 @@ int MsCoffObj::comdat(Symbol *s)
{
s->Sfl = FLtlsdata;
align = 16;
s->Sseg = MsCoffObj::getsegment(".tls$", IMAGE_SCN_CNT_INITIALIZED_DATA |
s->Sseg = MsCoffObj::getsegment(".tls$AAB", IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_LNK_COMDAT |
IMAGE_SCN_ALIGN_16BYTES |
IMAGE_SCN_MEM_READ |
Expand Down Expand Up @@ -1629,7 +1609,7 @@ seg_data *MsCoffObj::tlsseg()
if (seg_tlsseg == UNKNOWN)
{
int align = I64 ? IMAGE_SCN_ALIGN_16BYTES : IMAGE_SCN_ALIGN_8BYTES;
seg_tlsseg = MsCoffObj::getsegment(".tls$", IMAGE_SCN_CNT_INITIALIZED_DATA |
seg_tlsseg = MsCoffObj::getsegment(".tls$AAB", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE);
Expand Down Expand Up @@ -2537,14 +2517,8 @@ void MsCoffObj::moduleinfo(Symbol *scc)

/* Module info sections
*/
MsCoffObj::getsegment(".minfobg", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
int seg =
MsCoffObj::getsegment(".minfodt", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
MsCoffObj::getsegment(".minfoen", IMAGE_SCN_CNT_INITIALIZED_DATA |
const int seg =
MsCoffObj::getsegment(".minfo$B", IMAGE_SCN_CNT_INITIALIZED_DATA |
align |
IMAGE_SCN_MEM_READ);
//printf("MsCoffObj::moduleinfo(%s) seg = %d:x%x\n", scc->Sident, seg, Offset(seg));
Expand Down
3 changes: 0 additions & 3 deletions src/link.c
Expand Up @@ -232,9 +232,6 @@ int runLINK()
cmdbuf.writestring("/DLL");
}

cmdbuf.writestring(" /MERGE:.minfobg=.minfodt /MERGE:.minfoen=.minfodt");
cmdbuf.writestring(" /MERGE:._deh_bg=._deh_eh /MERGE:._deh_en=._deh_eh");

for (size_t i = 0; i < global.params.linkswitches->dim; i++)
{
cmdbuf.writeByte(' ');
Expand Down

0 comments on commit 2cb7f74

Please sign in to comment.