From 31094560f786ea29b96e095efbbbbdc955d39407 Mon Sep 17 00:00:00 2001 From: Martin Nowak Date: Tue, 22 Apr 2014 15:45:49 +0200 Subject: [PATCH 1/3] use const data segments for Mach-O - add __DATA,__const section as CDATAREL for const data with relocations --- src/backend/machobj.c | 3 ++- src/backend/out.c | 8 +------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/backend/machobj.c b/src/backend/machobj.c index 02ba7f269b45..7d83a0e27331 100644 --- a/src/backend/machobj.c +++ b/src/backend/machobj.c @@ -482,9 +482,10 @@ Obj *Obj::init(Outbuffer *objbuf, const char *filename, const char *csegname) seg_count = 0; int align = I64 ? 4 : 2; // align to 16 bytes for floating point MachObj::getsegment("__text", "__TEXT", 2, S_REGULAR | S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS); - MachObj::getsegment("__data", "__DATA", align, S_REGULAR); // DATA + MachObj::getsegment("__data", "__DATA", align, S_REGULAR); // DATA MachObj::getsegment("__const", "__TEXT", 2, S_REGULAR); // CDATA MachObj::getsegment("__bss", "__DATA", 4, S_ZEROFILL); // UDATA + MachObj::getsegment("__const", "__DATA", align, S_REGULAR); // CDATAREL if (config.fulltypes) dwarf_initfile(filename); diff --git a/src/backend/out.c b/src/backend/out.c index 55cc1ee988d4..d23362b1a5c1 100644 --- a/src/backend/out.c +++ b/src/backend/out.c @@ -514,7 +514,7 @@ void outcommon(symbol *s,targ_size_t n) void out_readonly(symbol *s) { // The default is DATA -#if ELFOBJ +#if ELFOBJ || MACHOBJ /* Cannot have pointers in CDATA when compiling PIC code, because * they require dynamic relocations of the read-only segment. * Instead use the .data.rel.ro section. See Bugzilla 11171. @@ -524,12 +524,6 @@ void out_readonly(symbol *s) else s->Sseg = CDATA; #endif -#if MACHOBJ - /* Because of PIC and CDATA being in the _TEXT segment; - * cannot have pointers in CDATA. - * Should check s->Sdt and make it CDATA if it has no pointers. - */ -#endif #if OMFOBJ // Haven't really worked out where immutable read-only data can go. #endif From 46e3d2e01702d7d86f5b4c9712c5f71d0375089d Mon Sep 17 00:00:00 2001 From: Martin Nowak Date: Tue, 22 Apr 2014 15:58:23 +0200 Subject: [PATCH 2/3] use CDATA for strings on x86_64 - not sure why it was disabled - also remove similar old code in elfobj.c --- src/backend/elfobj.c | 22 +++++----------------- src/backend/machobj.c | 22 +++++----------------- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/src/backend/elfobj.c b/src/backend/elfobj.c index d7fbf7c20e04..edf5ec0869ca 100644 --- a/src/backend/elfobj.c +++ b/src/backend/elfobj.c @@ -634,23 +634,11 @@ symbol *Obj::sym_cdata(tym_t ty,char *p,int len) int Obj::data_readonly(char *p, int len, int *pseg) { - int oldoff; - /*if (OPT_IS_SET(OPTfwritable_strings)) - { - oldoff = Doffset; - SegData[DATA]->SDbuf->reserve(len); - SegData[DATA]->SDbuf->writen(p,len); - Doffset += len; - *pseg = DATA; - } - else*/ - { - oldoff = CDoffset; - SegData[CDATA]->SDbuf->reserve(len); - SegData[CDATA]->SDbuf->writen(p,len); - CDoffset += len; - *pseg = CDATA; - } + int oldoff = CDoffset; + SegData[CDATA]->SDbuf->reserve(len); + SegData[CDATA]->SDbuf->writen(p,len); + CDoffset += len; + *pseg = CDATA; return oldoff; } diff --git a/src/backend/machobj.c b/src/backend/machobj.c index 7d83a0e27331..39c3e9e90bfb 100644 --- a/src/backend/machobj.c +++ b/src/backend/machobj.c @@ -384,23 +384,11 @@ symbol * Obj::sym_cdata(tym_t ty,char *p,int len) int Obj::data_readonly(char *p, int len, int *pseg) { - int oldoff; - if (I64) - { - oldoff = Doffset; - SegData[DATA]->SDbuf->reserve(len); - SegData[DATA]->SDbuf->writen(p,len); - Doffset += len; - *pseg = DATA; - } - else - { - oldoff = CDoffset; - SegData[CDATA]->SDbuf->reserve(len); - SegData[CDATA]->SDbuf->writen(p,len); - CDoffset += len; - *pseg = CDATA; - } + int oldoff = CDoffset; + SegData[CDATA]->SDbuf->reserve(len); + SegData[CDATA]->SDbuf->writen(p,len); + CDoffset += len; + *pseg = CDATA; return oldoff; } From a48547e6060c75de8648f384f7549f8e425a1e25 Mon Sep 17 00:00:00 2001 From: Martin Nowak Date: Wed, 23 Apr 2014 00:07:33 +0200 Subject: [PATCH 3/3] fix for code->cdata relocation - The codegen assumes an indirect access to data, but cdata was treated as code segment so a direct relocation was emitted. --- src/backend/machobj.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/machobj.c b/src/backend/machobj.c index 39c3e9e90bfb..15018d6e2f43 100644 --- a/src/backend/machobj.c +++ b/src/backend/machobj.c @@ -162,6 +162,12 @@ static IDXSTR extdef; int seg_data::isCode() { + // The codegen assumes that code->data references are indirect, + // but when CDATA is treated as code reftoident will emit a direct + // relocation. + if (this == SegData[CDATA]) + return false; + if (I64) { //printf("SDshtidx = %d, x%x\n", SDshtidx, SecHdrTab64[SDshtidx].flags);