www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - ARM targetting cross-toolchain with GDC

reply Dawid =?iso-8859-2?q?Ci=EA=BFarkiewicz?= <dpc ucore.info> writes:
Hi,

# Introduction

I've started some initial work to get a working GDC crosscompiler
targeting ARM platforms. Currently I'm able to compile the
toolchain and produce a working "Hello World!" binary that I'm
able to execute on my BeagleBoard developement platform with
ArchLinux installed. The generated assembly looks sane,
unfortunately the program hangs, but I'm able to debug it in gdb
and I see it loops somewhere at:

       2261    in
/home/dpc/lab/d-cross/test-tc-1/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
       => 0x2f950 <_D2gc3gcx2GC6mallocMFkkPkZPv+648>:  str     r2,
[r4, r9, lsl #2]

I'm going to investigate this and possibly fix with time. Anyone
interested in getting this to work seamlessly is kindly requested
to join efforts and share the results.


# How to compile

There's a crosstool-ng tool that is a great way to assemble and
build (cross-)toolchains. I've added some hacks to integrate the
gdc repository and thus add a gdc support.

I've pushed the forked crosstools-ng here:

https://bitbucket.org/xdpcx/crosstool-ng-dlang/

(I prefer git, but original crosstools-ng is using hg, so I
sticked with it).

Grab that code and learn to how to use ct-ng.

Basically installing crosstool-ng it's just a metter of
downloading and doing:

       ./bootstrap
       ./configure
       make
       make install

(I use `./configure --prefix="$HOME/opt"` for home-local
configuration.)

This will give you `ct-ng` command that you can use in any
directory

      cd ~/my/toolchain/buildir
      mkdir src
      cp ~/config/that/i/prepared/for/you/config .config
      ct-ng menuconfig
      ct-ng build
      ls arm-none-linux-eabi

I attach the mentioned config.

Actually, as I don't know how to attach it I've put it here:
http://pastebin.ca/2121043

If anyone is interested I could upload the compiled binaries
somewhere, as the toolchain is static.

Regards,
Dawid Ciężarkiewicz
Feb 23 2012
next sibling parent reply Johannes Pfau <nospam example.com> writes:
Am Thu, 23 Feb 2012 15:25:59 +0000 (UTC)
schrieb Dawid Ci=C4=99=C5=BCarkiewicz <dpc ucore.info>:

 Hi,
=20
 # Introduction
=20
 I've started some initial work to get a working GDC crosscompiler
 targeting ARM platforms. Currently I'm able to compile the
 toolchain and produce a working "Hello World!" binary that I'm
 able to execute on my BeagleBoard developement platform with
 ArchLinux installed. The generated assembly looks sane,
 unfortunately the program hangs, but I'm able to debug it in gdb
 and I see it loops somewhere at:
=20
        2261    in
 /home/dpc/lab/d-cross/test-tc-1/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
        =3D> 0x2f950 <_D2gc3gcx2GC6mallocMFkkPkZPv+648>:  str     r2,
 [r4, r9, lsl #2]
=20
 I'm going to investigate this and possibly fix with time. Anyone
 interested in getting this to work seamlessly is kindly requested
 to join efforts and share the results.

That's issue 120: https://bitbucket.org/goshawk/gdc/issue/120/fsection-anchors-broken-on-arm
=20
 # How to compile
=20
 There's a crosstool-ng tool that is a great way to assemble and
 build (cross-)toolchains. I've added some hacks to integrate the
 gdc repository and thus add a gdc support.
=20
 I've pushed the forked crosstools-ng here:
=20
 https://bitbucket.org/xdpcx/crosstool-ng-dlang/
=20
 (I prefer git, but original crosstools-ng is using hg, so I
 sticked with it).
=20
 Grab that code and learn to how to use ct-ng.
=20
 Basically installing crosstool-ng it's just a metter of
 downloading and doing:
=20
        ./bootstrap
        ./configure
        make
        make install
=20
 (I use `./configure --prefix=3D"$HOME/opt"` for home-local
 configuration.)
=20
 This will give you `ct-ng` command that you can use in any
 directory
=20
       cd ~/my/toolchain/buildir
       mkdir src
       cp ~/config/that/i/prepared/for/you/config .config
       ct-ng menuconfig
       ct-ng build
       ls arm-none-linux-eabi
=20
 I attach the mentioned config.
=20
 Actually, as I don't know how to attach it I've put it here:
 http://pastebin.ca/2121043

Integrating GDC with crosstools is nice. If you find the time, could you please add a page to the GDC wiki on how to setup/use crosstool-ng?
 If anyone is interested I could upload the compiled binaries
 somewhere, as the toolchain is static.
=20
 Regards,
 Dawid Ci=C4=99=C5=BCarkiewicz

Feb 23 2012
next sibling parent Dawid =?iso-8859-2?q?Ci=EA=BFarkiewicz?= <dpc ucore.info> writes:
Dnia Thu, 23 Feb 2012 19:41:53 +0000, Iain Buclaw napisał(a):

 Does crosstools allow you to build a cross compiler for architecture X?

Yes, exactly. Canadian cross-compilers too. So other architectures could potenatially work, too. I don't have equipement to test them. -- Dawid Ciężarkiewicz
Feb 23 2012
prev sibling next sibling parent Dawid =?iso-8859-2?q?Ci=EA=BFarkiewicz?= <dpc ucore.info> writes:
Dnia Thu, 23 Feb 2012 19:03:46 +0100, Johannes Pfau napisał(a):
 That's issue 120:
 https://bitbucket.org/goshawk/gdc/issue/120/fsection-anchors-broken-on-

Thanks. Must try without -O2 now.
 Integrating GDC with crosstools is nice. If you find the time, could you
 please add a page to the GDC wiki on how to setup/use crosstool-ng?

Quick re-edition of my post is now here: https://bitbucket.org/goshawk/gdc/wiki/crosstool-ng I don't know if I should link the page anywhere. -- Dawid Ciężarkiewicz
Feb 23 2012
prev sibling next sibling parent Andrew Wiley <wiley.andrew.j gmail.com> writes:
2012/2/23 Dawid Ci=EA=BFarkiewicz <dpc ucore.info>:
 Dnia Thu, 23 Feb 2012 19:03:46 +0100, Johannes Pfau napisa=B3(a):
 That's issue 120:
 https://bitbucket.org/goshawk/gdc/issue/120/fsection-anchors-broken-on-

Thanks. Must try without -O2 now.

-O2 is fine as long as you also use -fno-section-anchors.
Feb 23 2012
prev sibling parent "Timofei Bolshakov" <tbolsh gmail.com> writes:
I was able to compile DGC to the Hello, World status for ARM
using crosstools-ng 1.18 eglibc. uclibc would not work, it lack
some of the functions in the library, context switching. There
are several places I cheat ( to get Hello, World! ). Please
advise:

../gcc-4.7.2/libphobos/libdruntime/core/sys/posix/ucontext.d:274:
Error: static assert  "Not implemented"

../gcc-4.7.2/libphobos/libdruntime/core/thread.d:3409: Error:
static assert  "Not implemented"

../gcc-4.7.2/libphobos/libdruntime/core/thread.d:4237: Error:
static assert  "Not implemented"

I simply commented static asserts - and I do not think it will
fly with any real multi threading program. All the places
consider context switching and assembly-level register
manipulation. Can somebody help me with that?
Apr 30 2013
prev sibling next sibling parent Iain Buclaw <ibuclaw ubuntu.com> writes:
On 23 February 2012 18:03, Johannes Pfau <nospam example.com> wrote:
 Am Thu, 23 Feb 2012 15:25:59 +0000 (UTC)
 schrieb Dawid Ci=C4=99=C5=BCarkiewicz <dpc ucore.info>:

 Hi,

 # Introduction

 I've started some initial work to get a working GDC crosscompiler
 targeting ARM platforms. Currently I'm able to compile the
 toolchain and produce a working "Hello World!" binary that I'm
 able to execute on my BeagleBoard developement platform with
 ArchLinux installed. The generated assembly looks sane,
 unfortunately the program hangs, but I'm able to debug it in gdb
 and I see it loops somewhere at:

 =C2=A0 =C2=A0 =C2=A0 =C2=A02261 =C2=A0 =C2=A0in
 /home/dpc/lab/d-cross/test-tc-1/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D> 0x2f950 <_D2gc3gcx2GC6mallocMFkkPkZPv+64=


 [r4, r9, lsl #2]

 I'm going to investigate this and possibly fix with time. Anyone
 interested in getting this to work seamlessly is kindly requested
 to join efforts and share the results.

That's issue 120: https://bitbucket.org/goshawk/gdc/issue/120/fsection-anchors-broken-on-ar=

 # How to compile

 There's a crosstool-ng tool that is a great way to assemble and
 build (cross-)toolchains. I've added some hacks to integrate the
 gdc repository and thus add a gdc support.

 I've pushed the forked crosstools-ng here:

 https://bitbucket.org/xdpcx/crosstool-ng-dlang/

 (I prefer git, but original crosstools-ng is using hg, so I
 sticked with it).

 Grab that code and learn to how to use ct-ng.

 Basically installing crosstool-ng it's just a metter of
 downloading and doing:

 =C2=A0 =C2=A0 =C2=A0 =C2=A0./bootstrap
 =C2=A0 =C2=A0 =C2=A0 =C2=A0./configure
 =C2=A0 =C2=A0 =C2=A0 =C2=A0make
 =C2=A0 =C2=A0 =C2=A0 =C2=A0make install

 (I use `./configure --prefix=3D"$HOME/opt"` for home-local
 configuration.)

 This will give you `ct-ng` command that you can use in any
 directory

 =C2=A0 =C2=A0 =C2=A0 cd ~/my/toolchain/buildir
 =C2=A0 =C2=A0 =C2=A0 mkdir src
 =C2=A0 =C2=A0 =C2=A0 cp ~/config/that/i/prepared/for/you/config .config
 =C2=A0 =C2=A0 =C2=A0 ct-ng menuconfig
 =C2=A0 =C2=A0 =C2=A0 ct-ng build
 =C2=A0 =C2=A0 =C2=A0 ls arm-none-linux-eabi

 I attach the mentioned config.

 Actually, as I don't know how to attach it I've put it here:
 http://pastebin.ca/2121043

Integrating GDC with crosstools is nice. If you find the time, could you please add a page to the GDC wiki on how to setup/use crosstool-ng?
 If anyone is interested I could upload the compiled binaries
 somewhere, as the toolchain is static.

 Regards,
 Dawid Ci=C4=99=C5=BCarkiewicz


Does crosstools allow you to build a cross compiler for architecture X? --=20 Iain Buclaw *(p < e ? p++ : p) =3D (c & 0x0f) + '0';
Feb 23 2012
prev sibling next sibling parent "Timofei Bolshakov" <tbolsh gmail.com> writes:
Hi, Dawid!

On Thursday, 23 February 2012 at 15:25:59 UTC, Dawid 
Ciężarkiewicz wrote:
 Hi,

 # Introduction

 I've started some initial work to get a working GDC 
 crosscompiler
 targeting ARM platforms. Currently I'm able to compile the
 toolchain and produce a working "Hello World!" binary that I'm
 able to execute on my BeagleBoard developement platform with
 ArchLinux installed. The generated assembly looks sane,
 unfortunately the program hangs, but I'm able to debug it in gdb
 and I see it loops somewhere at:

        2261    in
 /home/dpc/lab/d-cross/test-tc-1/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
        => 0x2f950 <_D2gc3gcx2GC6mallocMFkkPkZPv+648>:  str     
 r2,
 [r4, r9, lsl #2]

 I'm going to investigate this and possibly fix with time. Anyone
 interested in getting this to work seamlessly is kindly 
 requested
 to join efforts and share the results.


 # How to compile

 There's a crosstool-ng tool that is a great way to assemble and
 build (cross-)toolchains. I've added some hacks to integrate the
 gdc repository and thus add a gdc support.

 I've pushed the forked crosstools-ng here:

 https://bitbucket.org/xdpcx/crosstool-ng-dlang/

 (I prefer git, but original crosstools-ng is using hg, so I
 sticked with it).

 Grab that code and learn to how to use ct-ng.

 Basically installing crosstool-ng it's just a metter of
 downloading and doing:

        ./bootstrap
        ./configure
        make
        make install

 (I use `./configure --prefix="$HOME/opt"` for home-local
 configuration.)

 This will give you `ct-ng` command that you can use in any
 directory

       cd ~/my/toolchain/buildir
       mkdir src
       cp ~/config/that/i/prepared/for/you/config .config
       ct-ng menuconfig
       ct-ng build
       ls arm-none-linux-eabi

 I attach the mentioned config.

 Actually, as I don't know how to attach it I've put it here:
 http://pastebin.ca/2121043

I tried to do that and build failed: [DEBUG] ==> Executing: 'sh' './gcc/d/setup-gcc.sh' [ALL ] This version of GCC (4.4) is not supported. do you have somewhere corrected code / config?
 If anyone is interested I could upload the compiled binaries
 somewhere, as the toolchain is static.

I will greatly appreciate that!
 Regards,
 Dawid Ciężarkiewicz

Apr 22 2013
prev sibling next sibling parent "Timofei Bolshakoc" <tbolsh gmail.com> writes:
I was able to compile DGC to the Hello, World status for ARM 
using crosstools-ng 1.18 eglibc. uclibc would not work, it lack 
some of the functions in the library, context switching. There 
are several places I cheat ( to get Hello, World! ). Please 
advise:

../gcc-4.7.2/libphobos/libdruntime/core/sys/posix/ucontext.d:274: 
Error: static assert  "Not implemented"

../gcc-4.7.2/libphobos/libdruntime/core/thread.d:3409: Error: 
static assert  "Not implemented"

../gcc-4.7.2/libphobos/libdruntime/core/thread.d:4237: Error: 
static assert  "Not implemented"

I simply commented static asserts - and I do not think it will 
fly with any real multi threading program. All the places 
consider context switching and assembly-level register 
manipulation. Can somebody help me with that?
Apr 30 2013
prev sibling next sibling parent Johannes Pfau <nospam example.com> writes:
Am Tue, 30 Apr 2013 22:40:32 +0200
schrieb "Timofei Bolshakoc" <tbolsh gmail.com>:

 I was able to compile DGC to the Hello, World status for ARM 
 using crosstools-ng 1.18 eglibc. uclibc would not work, it lack 
 some of the functions in the library, context switching. There 
 are several places I cheat ( to get Hello, World! ). Please 
 advise:
 
 ../gcc-4.7.2/libphobos/libdruntime/core/sys/posix/ucontext.d:274: 
 Error: static assert  "Not implemented"

Add this to ucontext.d: https://gist.github.com/jpf91/5502741 You probably also need this for core/sys/posix/sys/stat.d https://gist.github.com/jpf91/5502725
 
 I simply commented static asserts - and I do not think it will 
 fly with any real multi threading program. All the places 
 consider context switching and assembly-level register 
 manipulation. Can somebody help me with that?

The definition of ucontext_t should be enough. But this code is only for fibers real threads don't need this support code and should work fine without it. You probably also need the stat_t definition posted above to do any kind of IO.
May 02 2013
prev sibling next sibling parent "Timofei Bolshakov" <tbolsh gmail.com> writes:
Thank you!
I will check that today. What to do about static asserts in 
thread.d?

On Thursday, 2 May 2013 at 14:54:44 UTC, Johannes Pfau wrote:
 Am Tue, 30 Apr 2013 22:40:32 +0200
 schrieb "Timofei Bolshakoc" <tbolsh gmail.com>:

 I was able to compile DGC to the Hello, World status for ARM 
 using crosstools-ng 1.18 eglibc. uclibc would not work, it 
 lack some of the functions in the library, context switching. 
 There are several places I cheat ( to get Hello, World! ). 
 Please advise:
 
 ../gcc-4.7.2/libphobos/libdruntime/core/sys/posix/ucontext.d:274: 
 Error: static assert  "Not implemented"

Add this to ucontext.d: https://gist.github.com/jpf91/5502741 You probably also need this for core/sys/posix/sys/stat.d https://gist.github.com/jpf91/5502725
 
 I simply commented static asserts - and I do not think it will 
 fly with any real multi threading program. All the places 
 consider context switching and assembly-level register 
 manipulation. Can somebody help me with that?

The definition of ucontext_t should be enough. But this code is only for fibers real threads don't need this support code and should work fine without it. You probably also need the stat_t definition posted above to do any kind of IO.

May 02 2013
prev sibling parent Johannes Pfau <nospam example.com> writes:
Am Thu, 02 May 2013 18:54:28 +0200
schrieb "Timofei Bolshakov" <tbolsh gmail.com>:

 Thank you!
 I will check that today. What to do about static asserts in 
 thread.d?

Those should be fixed by the ucontext changes. The static if(__traits( compiles, ucontext_t )) code path will be used if we make ucontext_t available.
May 02 2013