Object file questions

Johannes Pfau via D.gnu d.gnu at puremagic.com
Sat Aug 16 00:33:26 PDT 2014


Am Sat, 16 Aug 2014 07:06:34 +0000
schrieb "Timo Sintonen" <t.sintonen at luukku.com>:

> On Thursday, 14 August 2014 at 19:05:46 UTC, Johannes Pfau wrote:
> > Am Thu, 14 Aug 2014 17:53:32 +0000
> > schrieb "Timo Sintonen" <t.sintonen at luukku.com>:
> >
> >> On Thursday, 14 August 2014 at 17:13:23 UTC, Johannes Pfau 
> >> wrote:
> >> > Am Thu, 14 Aug 2014 10:07:04 +0000
> >> > schrieb "Timo Sintonen" <t.sintonen at luukku.com>:
> >> >
> >> >> I have been looking at object files to see if I can reduce 
> >> >> the memory usage for minimum systems. There are two things 
> >> >> I have noticed:
> >> >> 
> >> >> 1. In the data segment there is some source code as ascii 
> >> >> text from a template in gcc/atomics.d . This is in the 
> >> >> actual data segment and not in debug info segments and goes 
> >> >> into the data segment of the executable. I do not see any 
> >> >> code using this data. Why is this in the executable and is 
> >> >> it possible to remove it?
> >> >> 
> >> >
> >> > Strange, could you post a testcase?
> >> It seems this comes from libdruntime and it exists in object.o 
> >> and core/atomic.o, Testcase is to compile minlibd library as 
> >> it is currently in the repo using the makefile as such.
> >> But I think it will be in any object file that imports 
> >> gcc.atomics and uses the template in there.
> >> 
> >
> > If you're referring to this:
> > http://dpaste.dzfl.pl/fe75e8c7dfca
> >
> > This seems to be the const variable in __sync_op_and. Try to 
> > change the
> > code to "immutable __sync_op_and = " or "enum __sync_op_and = " 
> > and
> > file a bug report.
> >
> >> >
> >> >> 2. In the data segment there is also __init for all types. 
> >> >> I assume that they contain the initial values that are 
> >> >> copied when a new object of this type is created.
> >> >
> >> > Correct, it's for '.init' (there's especially 
> >> > __..._TypeInfo_init which
> >> > is the initializer for typeinfo. I've implemented -fno-rtti 
> >> > in a private
> >> > git branch to get rid of typeinfo)
> >> >
> >> >> Is this data mutable and should it really be in data 
> >> >> segment and not in rodata?
> >> >> 
> >> >
> >> > I think it should be in rodata.
> >> 
> >> So it is not a bug and not a feature. It is just because it 
> >> does not matter? Maybe a feature request?
> >
> > Seems to happen only for the TypeInfo init symbols. I can't run 
> > the
> > testsuite right now, but try this:
> >
> > diff --git a/gcc/d/d-decls.cc b/gcc/d/d-decls.cc
> > index bd6f5f9..45d433a 100644
> > --- a/gcc/d/d-decls.cc
> > +++ b/gcc/d/d-decls.cc
> > @@ -274,6 +274,8 @@ TypeInfoDeclaration::toSymbol (void)
> >        // given TypeInfo.  It is the actual data, not a 
> > reference
> >        gcc_assert (TREE_CODE (TREE_TYPE (csym->Stree)) ==
> > REFERENCE_TYPE); TREE_TYPE (csym->Stree) = TREE_TYPE (TREE_TYPE
> > (csym->Stree));
> > +      TREE_CONSTANT (csym->Stree) = true;
> > +      TREE_READONLY (csym->Stree) = true;
> >        relayout_decl (csym->Stree);
> >        TREE_USED (csym->Stree) = 1;
> 
> Looks good. Template code is gone and init blocks have moved to 
> rodata. My simple test program compiles and runs.
> 
> There is still some __Class in data segment and init values for 
> structs and arrays in bss segment. Is it possible to move these 
> to rodata too?
> 

Iain recently pushed a commit to put zero initializers into bss, so
that's intentional:
http://bugzilla.gdcproject.org/show_bug.cgi?id=139
But I understand your point that it should be in rodata instead, you'll
have to discuss this with Iain.

Regarding __Class: Can you post a short example?

> 
> In my application there will be several large structs. I never 
> create anything of these types. Instead I use them to point to 
> hardware registers and maybe on top of existing byte arrays like 
> message buffers. There will still be initial values for these 
> structs wasting memory. Is there any way to omit them?
> 

See 
https://github.com/D-Programming-GDC/GDC/pull/82
@attribute("noinit")


More information about the D.gnu mailing list