Thread overview | |||||
---|---|---|---|---|---|
|
March 26, 2007 Can I use static constructors for registration? | ||||
---|---|---|---|---|
| ||||
In C/C++, the linker will refuse to include a translation unit if there's no call from another translation unit that's already been accepted into the executable. Can the same thing occur in D? I know this is an obscure kind of problem. Here's some code that could be affected by this kind of issue. import myRegistrationMechanism.register static this(){ register(functionNotUsedAnywhereElse); } void functionNotUsedAnywhereElse(inout int x){ x += 17; } |
March 26, 2007 Re: Can I use static constructors for registration? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jason House | Jason House Wrote:
> In C/C++, the linker will refuse to include a translation unit if there's no call from another translation unit that's already been accepted into the executable.
>
> Can the same thing occur in D? I know this is an obscure kind of problem. Here's some code that could be affected by this kind of issue.
>
> import myRegistrationMechanism.register
>
> static this(){
> register(functionNotUsedAnywhereElse);
> }
>
> void functionNotUsedAnywhereElse(inout int x){
> x += 17;
> }
If I remember correctly, OPTLINK (the linker DMD uses under Windows) does this, and gnu link has an option to do it.
Now, using the gnu link option (--gc-sections, I think) *does* cause problems. However, OPTLINK doesn't.
Also, with that example, all the functions *do* get called. Specifically, static this() gets called by the _moduleCtor function, which I believe is generated by the compiler at compile time.
So, long and short of it: yes. :)
-- Daniel
|
March 26, 2007 Re: Can I use static constructors for registration? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Keep Attachments: | Daniel Keep schrieb am 2007-03-26: > Jason House Wrote: > >> In C/C++, the linker will refuse to include a translation unit if there's no call from another translation unit that's already been accepted into the executable. >> >> Can the same thing occur in D? I know this is an obscure kind of problem. Here's some code that could be affected by this kind of issue. >> >> import myRegistrationMechanism.register >> >> static this(){ >> register(functionNotUsedAnywhereElse); >> } >> >> void functionNotUsedAnywhereElse(inout int x){ >> x += 17; >> } > > If I remember correctly, OPTLINK (the linker DMD uses under Windows) does this, and gnu link has an option to do it. > > Now, using the gnu link option (--gc-sections, I think) *does* cause problems. However, OPTLINK doesn't. That isn't due to the linker used but how DMD generates the exception handling code: http://d.puremagic.com/issues/show_bug.cgi?id=879 Thomas |
Copyright © 1999-2021 by the D Language Foundation