www.digitalmars.com         C & C++   DMDScript  

D.gnu - -fpic option and dynimic so libs

reply Denis R <denis_r telkomsa.net> writes:
Hey, 

I've seen -fpic/-fPIC patch sometime ago, but I dont see it anymore. I've got
gdc now now, so perhaps its already all in ? No patch needed?

Also, are there already examples of how to build *.so from D code ?

How would I make equivalent gdc initialization routes

__attribute__((constructor)) init() { // init stuff }
__attribute__((destructor)) deinit() { // deinit stuff :) }


Gdc doest seem to have __attribute__ as gcc does. 
Jun 11 2005
parent reply David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> writes:
Denis R wrote:
 Hey, 
 
 I've seen -fpic/-fPIC patch sometime ago, but I dont see it anymore. I've got
gdc now now, so perhaps its already all in ? No patch needed?
 
 Also, are there already examples of how to build *.so from D code ?
 
 How would I make equivalent gdc initialization routes
 
 __attribute__((constructor)) init() { // init stuff }
 __attribute__((destructor)) deinit() { // deinit stuff :) }
 
 
 Gdc doest seem to have __attribute__ as gcc does. 
The -fpic patch was rolled into 0.12.1 and 0.13. There is no way to speciy attributes now, but I plan to support them with "pragma(attribute,etc...)" If you are building a shared library that will be linked with an executable, you can just use the normal D static constructors. This works on Linux and some other OSes. If you are loading a module at runtime, you need a workaround. The easiest way is to have C function declared as a constructor calll a D function. David
Jun 12 2005
parent reply Denis R <denis_r telkomsa.net> writes:
On Sun, 12 Jun 2005 09:02:19 -0400
David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> wrote:

Hello David, 
Thank you for reply.

Yes, i was wondering about loading at run time.

I dont really know how to declare a C function to be a constructor, in D. :$
Did you mean just have one function which the user must call explicitly first
thing  after dlopen ?

I thought I would do something like that in D :  extern(C) { void init(); void
deinit();  }, 
and use gcc' s like attributes for them, so that init()/deinit() are
automagically called when needed.


 Denis R wrote:
 Hey, 
 
 I've seen -fpic/-fPIC patch sometime ago, but I dont see it anymore. I've got
gdc now now, so perhaps its already all in ? No patch needed?
 
 Also, are there already examples of how to build *.so from D code ?
 
 How would I make equivalent gdc initialization routes
 
 __attribute__((constructor)) init() { // init stuff }
 __attribute__((destructor)) deinit() { // deinit stuff :) }
 
 
 Gdc doest seem to have __attribute__ as gcc does. 
The -fpic patch was rolled into 0.12.1 and 0.13. There is no way to speciy attributes now, but I plan to support them with "pragma(attribute,etc...)" If you are building a shared library that will be linked with an executable, you can just use the normal D static constructors. This works on Linux and some other OSes. If you are loading a module at runtime, you need a workaround. The easiest way is to have C function declared as a constructor calll a D function. David
Jun 12 2005
parent reply David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> writes:
This is what I had in mind:

--- somecfile.c:

extern void dinit(void);
static void cinit() __attribute__((constructor))
{
    dinit();
}

--- somedfile.d:

extern (C) void dinit()
{
    // D initialization...
}

David

Denis R wrote:
 On Sun, 12 Jun 2005 09:02:19 -0400
 David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> wrote:
 
 Hello David, 
 Thank you for reply.
 
 Yes, i was wondering about loading at run time.
 
 I dont really know how to declare a C function to be a constructor, in D. :$
 Did you mean just have one function which the user must call explicitly first
thing  after dlopen ?
 
 I thought I would do something like that in D :  extern(C) { void init(); void
deinit();  }, 
 and use gcc' s like attributes for them, so that init()/deinit() are
automagically called when needed.
 
 
 
Denis R wrote:

Hey, 

I've seen -fpic/-fPIC patch sometime ago, but I dont see it anymore. I've got
gdc now now, so perhaps its already all in ? No patch needed?

Also, are there already examples of how to build *.so from D code ?

How would I make equivalent gdc initialization routes

__attribute__((constructor)) init() { // init stuff }
__attribute__((destructor)) deinit() { // deinit stuff :) }


Gdc doest seem to have __attribute__ as gcc does. 
The -fpic patch was rolled into 0.12.1 and 0.13. There is no way to speciy attributes now, but I plan to support them with "pragma(attribute,etc...)" If you are building a shared library that will be linked with an executable, you can just use the normal D static constructors. This works on Linux and some other OSes. If you are loading a module at runtime, you need a workaround. The easiest way is to have C function declared as a constructor calll a D function. David
Jun 12 2005
parent Denis R <denis_r telkomsa.net> writes:
Ah, sweet :)

Thanks again

On Sun, 12 Jun 2005 11:24:28 -0400
David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> wrote:

 This is what I had in mind:
 
 --- somecfile.c:
 
 extern void dinit(void);
 static void cinit() __attribute__((constructor))
 {
     dinit();
 }
 
 --- somedfile.d:
 
 extern (C) void dinit()
 {
     // D initialization...
 }
 
 David
 
 Denis R wrote:
 On Sun, 12 Jun 2005 09:02:19 -0400
 David Friedman <d3rdclsmail_a_ _t_earthlink_d_._t_net> wrote:
 
 Hello David, 
 Thank you for reply.
 
 Yes, i was wondering about loading at run time.
 
 I dont really know how to declare a C function to be a constructor, in D. :$
 Did you mean just have one function which the user must call explicitly first
thing  after dlopen ?
 
 I thought I would do something like that in D :  extern(C) { void init(); void
deinit();  }, 
 and use gcc' s like attributes for them, so that init()/deinit() are
automagically called when needed.
 
 
 
Denis R wrote:

Hey, 

I've seen -fpic/-fPIC patch sometime ago, but I dont see it anymore. I've got
gdc now now, so perhaps its already all in ? No patch needed?

Also, are there already examples of how to build *.so from D code ?

How would I make equivalent gdc initialization routes

__attribute__((constructor)) init() { // init stuff }
__attribute__((destructor)) deinit() { // deinit stuff :) }


Gdc doest seem to have __attribute__ as gcc does. 
The -fpic patch was rolled into 0.12.1 and 0.13. There is no way to speciy attributes now, but I plan to support them with "pragma(attribute,etc...)" If you are building a shared library that will be linked with an executable, you can just use the normal D static constructors. This works on Linux and some other OSes. If you are loading a module at runtime, you need a workaround. The easiest way is to have C function declared as a constructor calll a D function. David
Jun 12 2005