digitalmars.D - [gdc] c and d linking issue
- Michael (29/29) May 18 2004 I'm trying to compile this code on OS X Panther with gdc:
- David Friedman (7/45) May 19 2004 I think the problem is this: The program is starting from the C main in
- Michael (9/58) May 19 2004 Thanks, I figured that may be the problem. I'm actually wondering
- David Friedman (16/81) May 19 2004 I ran into this problem too. What I do now is rename the 'main' in the
- Michael Hampton (4/90) May 19 2004 Thank you. That worked perfectly. I really appreciate you taking the
I'm trying to compile this code on OS X Panther with gdc: [ctest.c] #include <stdio.h> extern void callMe(); int main() { callMe(); } [callme.d] class Foo { this() { } } extern (C) void callMe() { Foo s = new Foo(); // This causes the problem. } I'm compiling and linking like this: gcc -c ctest.c gdc -c callme.d gdc -o ctest callme.o ctest.o Running ctest causes a 'Bus error'. After playing with it for a while, instantiating Foo seems to be the problem. If I comment out that line it compiles and runs just fine. Is this behavior expected? Am I doing something wrong or is this a bug? I'm using gdc 1f with gcc 3.4.0 20040317 on Mac OS 10.3.3. P.S. I wasn't sure if this should have gone in the bugs group, since I don't know if it affects dmd or not. I also am not sure if this is just a mistake on my part or a real bug. If I did put this in the wrong group, I apologize and please let me know for future reference. Thanks.
May 18 2004
I think the problem is this: The program is starting from the C main in ctest.c and garbage collector is not being initialized. The Phobos library contains a C 'main' function which does initialization and calls the D 'main' function (really '_Dmain'). Do you absolutely need the main function to be in C? David Michael wrote:I'm trying to compile this code on OS X Panther with gdc: [ctest.c] #include <stdio.h> extern void callMe(); int main() { callMe(); } [callme.d] class Foo { this() { } } extern (C) void callMe() { Foo s = new Foo(); // This causes the problem. } I'm compiling and linking like this: gcc -c ctest.c gdc -c callme.d gdc -o ctest callme.o ctest.o Running ctest causes a 'Bus error'. After playing with it for a while, instantiating Foo seems to be the problem. If I comment out that line it compiles and runs just fine. Is this behavior expected? Am I doing something wrong or is this a bug? I'm using gdc 1f with gcc 3.4.0 20040317 on Mac OS 10.3.3. P.S. I wasn't sure if this should have gone in the bugs group, since I don't know if it affects dmd or not. I also am not sure if this is just a mistake on my part or a real bug. If I did put this in the wrong group, I apologize and please let me know for future reference. Thanks.
May 19 2004
Thanks, I figured that may be the problem. I'm actually wondering because SDL on OS X uses an objective C stub to initialize the program then call your SDL_main function. I have seen at least one SDL program written in D running on OS X(but without source), so there must be a way. Do I have to use all global functions? Things seem to work if I avoid classes, but I would prefer not to use that approach as it seems likely I might run into other problems down the road. Are there any work arounds? Thanks. On 2004-05-19 10:23:48 -0500, David Friedman <d3rdclsmail earthlink.net> said:I think the problem is this: The program is starting from the C main in ctest.c and garbage collector is not being initialized. The Phobos library contains a C 'main' function which does initialization and calls the D 'main' function (really '_Dmain'). Do you absolutely need the main function to be in C? David Michael wrote:I'm trying to compile this code on OS X Panther with gdc: [ctest.c] #include <stdio.h> extern void callMe(); int main() { callMe(); } [callme.d] class Foo { this() { } } extern (C) void callMe() { Foo s = new Foo(); // This causes the problem. } I'm compiling and linking like this: gcc -c ctest.c gdc -c callme.d gdc -o ctest callme.o ctest.o Running ctest causes a 'Bus error'. After playing with it for a while, instantiating Foo seems to be the problem. If I comment out that line it compiles and runs just fine. Is this behavior expected? Am I doing something wrong or is this a bug? I'm using gdc 1f with gcc 3.4.0 20040317 on Mac OS 10.3.3. P.S. I wasn't sure if this should have gone in the bugs group, since I don't know if it affects dmd or not. I also am not sure if this is just a mistake on my part or a real bug. If I did put this in the wrong group, I apologize and please let me know for future reference. Thanks.
May 19 2004
I ran into this problem too. What I do now is rename the 'main' in the
SDL stub. Because each project has its own copy of the stub as a source
file, this is very clean. The call sequence becomes...
normal D main
-> renamed SDL stub main
-> SDL_main (written as "extern(C) SDL_main(int,char*) {....}" in D)
My old solution was to build another version Phobos that uses
'_d_rtl_start' as an entry point instead of 'main'. I then had the
SDL_main call that. The gdc Makefile for Phobos still has this
libphobosnm.a, but needs shinichiro's fix.
(http://www.digitalmars.com/drn-bin/wwwnews?D.gnu/626)
Neither or these is optimal. I have been thinking that Phobos
initialization and the D 'main' function should be separated. This
would be needed for shared libraries too.
David
Michael wrote:
Thanks, I figured that may be the problem. I'm actually wondering
because SDL on OS X uses an objective C stub to initialize the program
then call your SDL_main function. I have seen at least one SDL program
written in D running on OS X(but without source), so there must be a
way. Do I have to use all global functions? Things seem to work if I
avoid classes, but I would prefer not to use that approach as it seems
likely I might run into other problems down the road. Are there any
work arounds? Thanks.
On 2004-05-19 10:23:48 -0500, David Friedman <d3rdclsmail earthlink.net>
said:
I think the problem is this: The program is starting from the C main
in ctest.c and garbage collector is not being initialized.
The Phobos library contains a C 'main' function which does
initialization and calls the D 'main' function (really '_Dmain').
Do you absolutely need the main function to be in C?
David
Michael wrote:
I'm trying to compile this code on OS X Panther with gdc:
[ctest.c]
#include <stdio.h>
extern void callMe();
int main() {
callMe();
}
[callme.d]
class Foo {
this() {
}
}
extern (C) void callMe() {
Foo s = new Foo(); // This causes the problem.
}
I'm compiling and linking like this:
gcc -c ctest.c
gdc -c callme.d
gdc -o ctest callme.o ctest.o
Running ctest causes a 'Bus error'. After playing with it for a
while, instantiating Foo seems to be the problem. If I comment out
that line it compiles and runs just fine. Is this behavior
expected? Am I doing something wrong or is this a bug?
I'm using gdc 1f with gcc 3.4.0 20040317 on Mac OS 10.3.3.
P.S. I wasn't sure if this should have gone in the bugs group, since
I don't know if it affects dmd or not. I also am not sure if this is
just a mistake on my part or a real bug. If I did put this in the
wrong group, I apologize and please let me know for future
reference. Thanks.
May 19 2004
Thank you. That worked perfectly. I really appreciate you taking the
time to respond and the work you put into gdc.
In article <c8gdn5$2gm$1 digitaldaemon.com>,
David Friedman <d3rdclsmail earthlink.net> wrote:
I ran into this problem too. What I do now is rename the 'main' in the
SDL stub. Because each project has its own copy of the stub as a source
file, this is very clean. The call sequence becomes...
normal D main
-> renamed SDL stub main
-> SDL_main (written as "extern(C) SDL_main(int,char*) {....}" in D)
My old solution was to build another version Phobos that uses
'_d_rtl_start' as an entry point instead of 'main'. I then had the
SDL_main call that. The gdc Makefile for Phobos still has this
libphobosnm.a, but needs shinichiro's fix.
(http://www.digitalmars.com/drn-bin/wwwnews?D.gnu/626)
Neither or these is optimal. I have been thinking that Phobos
initialization and the D 'main' function should be separated. This
would be needed for shared libraries too.
David
Michael wrote:
Thanks, I figured that may be the problem. I'm actually wondering
because SDL on OS X uses an objective C stub to initialize the program
then call your SDL_main function. I have seen at least one SDL program
written in D running on OS X(but without source), so there must be a
way. Do I have to use all global functions? Things seem to work if I
avoid classes, but I would prefer not to use that approach as it seems
likely I might run into other problems down the road. Are there any
work arounds? Thanks.
On 2004-05-19 10:23:48 -0500, David Friedman <d3rdclsmail earthlink.net>
said:
I think the problem is this: The program is starting from the C main
in ctest.c and garbage collector is not being initialized.
The Phobos library contains a C 'main' function which does
initialization and calls the D 'main' function (really '_Dmain').
Do you absolutely need the main function to be in C?
David
Michael wrote:
I'm trying to compile this code on OS X Panther with gdc:
[ctest.c]
#include <stdio.h>
extern void callMe();
int main() {
callMe();
}
[callme.d]
class Foo {
this() {
}
}
extern (C) void callMe() {
Foo s = new Foo(); // This causes the problem.
}
I'm compiling and linking like this:
gcc -c ctest.c
gdc -c callme.d
gdc -o ctest callme.o ctest.o
Running ctest causes a 'Bus error'. After playing with it for a
while, instantiating Foo seems to be the problem. If I comment out
that line it compiles and runs just fine. Is this behavior
expected? Am I doing something wrong or is this a bug?
I'm using gdc 1f with gcc 3.4.0 20040317 on Mac OS 10.3.3.
P.S. I wasn't sure if this should have gone in the bugs group, since
I don't know if it affects dmd or not. I also am not sure if this is
just a mistake on my part or a real bug. If I did put this in the
wrong group, I apologize and please let me know for future
reference. Thanks.
May 19 2004








Michael Hampton <mhamptonNO SPAMmacmail.com>