Segfault in shared object when writeln
ed via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 3 21:54:29 PDT 2014
On Wednesday, 4 June 2014 at 04:46:59 UTC, ed wrote:
> On Wednesday, 4 June 2014 at 03:49:25 UTC, Harpo wrote:
>> Hello I am having the following problem. I am trying to turn a
>> program I have written into a shared object. I have ran into
>> some problems however. When I use writeln instead of printf my
>> program segfaults. I have edited the code to just the parts
>> causing the problem.
>>
>> =================main.d the so========================
>>
>> import std.stdio;
>> import core.stdc.stdio;
>>
>> extern (C) void main(){
>> writeln("Does it work?");
>> printf("Works");
>> }
>>
>> ==============main.c the main executable======================
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <dlfcn.h>
>>
>> int main() {
>> printf("+main()\n");
>>
>> void *lh = dlopen("THE PATH EDITED FOR MY SECURITY",
>> RTLD_LAZY);
>> if (!lh) {
>> fprintf(stderr, "dlopen error: %s\n", dlerror());
>> exit(1);
>> }
>> printf("libdll.so is loaded\n");
>>
>> void (*fn)() = dlsym(lh, "main");
>> char *error = dlerror();
>> if (error) {
>> fprintf(stderr, "dlsym error: %s\n", error);
>> exit(1);
>> }
>> printf("dll() function is found\n");
>> (*fn)();
>>
>> printf("unloading libdll.so\n");
>> dlclose(lh);
>>
>> printf("-main()\n");
>> return 0;
>> }
>>
>> ========================The compile script===============
>>
>> dmd -c main.d -fPIC
>>
>> dmd -oflibdll.so main.o -shared -defaultlib=libphobos2.so
>> -L-rpath=/usr/lib/x86_64-linux-gnu -L-ldl -gc
>>
>> gcc -c main.c
>> gcc -rdynamic main.o -o main -ldl
>>
>> =====================================================================
>> When I have just printf is works. When I have writeln it
>> segfaults.
>>
>> This fails
>>
>> import std.stdio;
>>
>> extern (C) void main(){
>> writeln("Does it work?");
>> }
>>
>> This works
>>
>> import core.stdc.stdio;
>>
>> extern (C) void main(){
>> printf("Works");
>> }
>>
>> ===========================================================================
>>
>> Any one know whats up? Thanks!
>> -Harpo
>
> I believe you need to initialise the D runtime in your D code
> before using Phobos or druntime itself in this manner. The
> printf call just wraps the C runtime but writeln requires the D
> runtime to be initialised.
>
> Check out
> http://dlang.org/phobos/core_runtime.html#.Runtime.initialize
> http://dlang.org/phobos/core_runtime.html#.Runtime.terminate
>
> Cheers,
> ed
>
>
>
> Cheers,
> ed
I just remembered you can do this on the C side, which is easier
to manage
http://dlang.org/phobos/core_runtime.html#.rt_init
http://dlang.org/phobos/core_runtime.html#.rt_term
Cheers,
ed
More information about the Digitalmars-d-learn
mailing list