On Monday, 9 April 2012 at 19:59:18 UTC, Iain Buclaw wrote:
On 9 April 2012 20:37,  <"Timo Westkämper\"
<timo.westkam...@gmail.com>"@puremagic.com> wrote:
On Monday, 9 April 2012 at 15:14:45 UTC, Ellery Newcomer wrote:

Well, if you're really hankering for a shared lib, try ldc. I have gotten
it to compile working shared libs in the past.

On 04/09/2012 01:24 AM, "Timo Westkämper" <timo.westkam...@gmail.com>"
wrote:

On Sunday, 8 April 2012 at 17:59:28 UTC, Timo Westkämper wrote:

Does someone know why the lib (.a) packaging instead of objects (.o)
works better in this case?


Didn't work after all with -lib. I mixed up outputs.


Thanks, I might switch to ldc, if dmd and gdc fail here.

I found this tls.S script in the druntime sources (src/rt/tls.S). Do you think it could be included in the library to make tls initialization work?

#if linux

/* The memory between the addresses of _tlsstart and _tlsend is the storage
for
 * thread-local data in D 2.0.  Both of these rely on the default linker
script
 * of:
 *      .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
 *      .tbss  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
 * to group the sections in that order.
 *
 * Sadly, this does not work because ld orders .tdata after .tdata.*,
despite
 * what the linker script says.
 */

.file "tls.S"

.globl _tlsstart
   .section .tdata,"awT",@progbits
   .align 4
   .type   _tlsstart, @object
   .size   _tlsstart, 4
_tlsstart:
   .long   3

.globl _tlsend
   .section .tcommon,"awT",@nobits
   .align 4
   .type   _tlsend, @object
   .size   _tlsend, 4
_tlsend:
   .zero   4

#endif



That assembly file does nothing for shared library support. I have been meaning to finish up a solution to help support shared libs, would mean more deviation from the dmd compiler's runtime library, but
that's fine.

Ok. Good to know. Here is what I came up with for now.

I have not yet much knowledge of DMD internals so I just played around with declarations:

import std.stdio;

// FIXME
__gshared extern(C) void* __data_start;

// FIXME tls marks
extern(C) int _tlsstart;
extern(C) int _tlsend;

// FIXME exception handling markers
extern(C) void _deh_beg() { }
extern(C) void _deh_end() { }

// hooks for init and term
extern (C) void rt_init();
extern (C) void rt_term();

extern (C) void hiD() {
  rt_init();
  writeln("hi from D lib");
  rt_term();
}

//void main();

/*extern(C) {

  void _init() {
    rt_init();
  }

  void _fini() {
    rt_term();
  }

}*/


For some reasons, the _init and _fini parts don't yet work properly.

And here the part of the Makefile that created the library:

  dmd -c -g test.d -fPIC
  ld -shared -o libtest.so test.o -lrt -lphobos2 -lpthread

This mostly reflects Jacob Carlborg's comment in the beginning of what features are still missing

* Proper initialization of TLS data
* Setting up exception handling tables
* Setting up module info

Reply via email to