190 lines
16 KiB
Plaintext
190 lines
16 KiB
Plaintext
|
|
Episode: 1706
|
||
|
|
Title: HPR1706: Cross-compilers part 1
|
||
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1706/hpr1706.mp3
|
||
|
|
Transcribed: 2025-10-18 08:04:02
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
This is HPR episode 1,706 entitled Cross Compilers Part 1.
|
||
|
|
It is hosted by Mike Ray and is about 27 minutes long.
|
||
|
|
The summary is what is cross-compiling and why I might want need to do it.
|
||
|
|
This episode of HPR is brought to you by an honesthost.com.
|
||
|
|
Get 15% discount on all shared hosting with the offer code HPR15.
|
||
|
|
That's HPR15.
|
||
|
|
Better web hosting that's honest and fair at An Honesthost.com.
|
||
|
|
Hello, welcome to Hacker Public Radio.
|
||
|
|
My name is Mike Ray and you'll notice that I've dropped that corny morse code at the start
|
||
|
|
of the show.
|
||
|
|
So on was what I had to talk about today.
|
||
|
|
Now this was supposed to be a show entitled Raspberry Pi version 2, First Impressions.
|
||
|
|
I reserved the slot for 1,706 a couple of weeks ago when the Raspberry Pi version 2 was
|
||
|
|
announced and I got a hold of a couple quite quickly.
|
||
|
|
I woke up on a Sunday morning without any clue that this was going to happen.
|
||
|
|
I had no idea that the Raspberry Pi 2 was out, was going to be released but I got up on
|
||
|
|
Sunday morning, looked at my email, saw a few emails from the serial inexcuser group about
|
||
|
|
the Raspberry Pi 2 and immediately went to mod my Pi in order a couple, managed to get
|
||
|
|
in before they sold out.
|
||
|
|
I think there's quite a lot of difficulty with actually getting any of these at the moment.
|
||
|
|
The two Pi's I ordered arrived Tuesday, Wednesday, a couple of weeks ago, three or three days
|
||
|
|
after I ordered them so I immediately started tinkering.
|
||
|
|
At that time I reserved the 1,706 slot because I thought, you know, within a couple of weeks
|
||
|
|
I'll have some things to talk about but like everything else, when I start doing one
|
||
|
|
thing I get distracted and I go off at a tangent and end up doing something else and that's
|
||
|
|
true for this.
|
||
|
|
How this occurred was that the Raspberry Pi 2 is a different ARM processor.
|
||
|
|
The original Raspberry Pi is an ARM Cortex A6 architecture and the Raspberry Pi 2 is an
|
||
|
|
ARM Cortex A7 so in order to cross compile a kernel I needed another cross-compiler.
|
||
|
|
Now so we come on to the subject of cross-compilers.
|
||
|
|
The title of this show is now cross-compilers Part 1 and I'm going to describe to you what
|
||
|
|
cross-compilers actually are, why you might be interested in using them or why in fact
|
||
|
|
you might actually need to use them, it might be an imperative there.
|
||
|
|
So what is a cross-compiler?
|
||
|
|
Now as a Linux user we're all familiar with the usual process of using the GNU tools,
|
||
|
|
PCC, G++, LD, etc. to compile and link C or C++, possibly Fortran on Linux to run on Linux.
|
||
|
|
Typically if you're sitting in front of for example a 64-bit machine you're running
|
||
|
|
x8664 Linux, you're right in code or downloading code, you're compiling it on the x8664 machine
|
||
|
|
to run on the x8664 machine, that's great, that's just plain old vanilla building and
|
||
|
|
everybody is familiar with the very familiar sequence.slash configure, make sudo make install
|
||
|
|
and everybody will be familiar with gcc-o programname, programname.c which will produce
|
||
|
|
compile and link programname from programname.c source code.
|
||
|
|
Now what do you do if you're writing code for a platform where there is no C compiler,
|
||
|
|
possibly even no display of sorts, no console to log into, no keyboard, no text editor
|
||
|
|
for you to hack away at your code, supposing you're writing code for an embedded system.
|
||
|
|
And of course Linux is showing up on lots of domestic devices now, lots of handheld electronic
|
||
|
|
gadgetry. Now suppose you work for a company that makes kitchen appliances and your latest
|
||
|
|
product is going to be a microwave oven which has an embedded microcontroller in it,
|
||
|
|
which lots of machines need it because building something complex with discrete components
|
||
|
|
is far more expensive, far more complicated than using these wonderful little programmable
|
||
|
|
chips nowadays. Now of course a microwave oven doesn't have a monitor, keyboard, editor
|
||
|
|
all the stuff I was talking about so this is where you're going to need to cross compile
|
||
|
|
and what cross compiling is writing, compiling and linking code to run on an architecture
|
||
|
|
from a different architecture. So for example, if your microwave oven has got an ARM chip in it,
|
||
|
|
you may be using a cross compiler to write code on x86, 64 Linux to run on the ARM processor
|
||
|
|
on the microwave oven. So that's where the term cross compiler comes from, you're actually
|
||
|
|
compiling on one architecture to run on another architecture. Now the tools that we need for
|
||
|
|
doing that are typically known as a tool chain. It's called a tool chain because it contains
|
||
|
|
quite a bit more apart from just the C compiler, there's the compiler, C libraries, other libraries
|
||
|
|
that are needed by the tool chain, the linker and other familiar new tools like AR, RunLib etc.
|
||
|
|
So this is a cross compiler tool chain. Building a tool chain involves actually compiling a compiler,
|
||
|
|
which is quite a tricky task and it involves compiling bin utils, stuff that will
|
||
|
|
the C libraries etc. So it's quite a tricky business. Luckily there is a fantastic tool which I
|
||
|
|
found called cross tool ng, which I'll go into in a minute. Now this is slightly out of correct
|
||
|
|
order, but to talk about why I got into this cross compiling business and why I was distracted
|
||
|
|
from actually evaluating the Raspberry Pi 2 to get into the business of cross compiling,
|
||
|
|
you can actually download a cross compiler tool chain from the Raspberry Pi foundation, from Git Hub,
|
||
|
|
but unfortunately it only runs on a 32 bit environment. So if like me you have a 64 bit PC running 64
|
||
|
|
bit Debian, the Raspberry Pi foundation tool chain will not function. So then I got into trying to
|
||
|
|
run a virtual machine using virtual box and something called vagrant, which is sort of a virtual machine
|
||
|
|
management tool if you like. And then of course the Raspberry Pi 2 came along, so I needed an ARM
|
||
|
|
Cortex A7 cross compiler and the only ones I could find online for download were 64 bit.
|
||
|
|
So I had, so I'd created a 32 bit virtual machine, a Ubuntu precise 32 bit using vagrant and
|
||
|
|
virtual box and then I tried to create a 64 bit virtual machine because when I tried to use the
|
||
|
|
cross compiler that I downloaded on my 64 bit Debian machine, the C libraries I have were not
|
||
|
|
up to the version required and I wasn't prepared to miss about updating C libraries on Debian,
|
||
|
|
Debian Weezy just to get the cross compiler to work. So that is when I looked further into
|
||
|
|
cross tool ng, which I'd sort of already used, but I now had a greater degree of urgency
|
||
|
|
to actually get to use it and to build a pair of tool chains, one for ARM Cortex A6 and one for
|
||
|
|
ARM Cortex A7 so that I could compile for both the older Raspberry Pi and the version 2.
|
||
|
|
Now I think also ARM Cortex A7 I think will also compile for banana Pi, but that's another story.
|
||
|
|
So then I started looking around for information about configuring the build for the tool
|
||
|
|
change. Now cross tool ng is quite easy to configure. Now the show notes by the way are very
|
||
|
|
comprehensive or the HTML version. The show notes are very comprehensive. Tell you all about how to
|
||
|
|
install cross tool ng and how to configure it. It's very clever. If you ever done a kernel
|
||
|
|
compile you'll be familiar with the .config file which you need in order to set up a compile
|
||
|
|
and to pick all of the right settings modules and kernel modules etc before you actually build
|
||
|
|
a kernel. And there is a tool called menu config which you can run which gives you an
|
||
|
|
in-curse screen to make adjustments to this config file. Now Clato did an excellent show about
|
||
|
|
compiling a kernel. So I'm not going to dig too deeply into that but suffice to say
|
||
|
|
it will be familiar to you if you've ever set up for a kernel compile the
|
||
|
|
cross tool ng's configuration tool will be very familiar. Accessibility is not fantastical in
|
||
|
|
curses and as I can't see I struggle a little bit with in curses applications so I then went
|
||
|
|
looking for online to see if anybody had already done what I wanted to do and fantastically I discovered
|
||
|
|
on the Arch Linux ARM site that there is a set of .config files for cross tool ng for there's
|
||
|
|
actually three of them. ARM Cortex A5, ARM Cortex A6 and ARM Cortex A7. So I downloaded the A6 and A7
|
||
|
|
configs and used them to drive a build of a pair of tool chains. I need to talk now about something
|
||
|
|
which really screwed up my head when I first started looking at cross compiling because
|
||
|
|
there was a piece of information I was missing and it was one of these things where
|
||
|
|
you constantly look online and Google for the answers to the questions and you never find it
|
||
|
|
and you start to think all of these blogs and all of these tutorials that I've read and I can't
|
||
|
|
find the answer. Is it something which is so obvious that all of the authors of these pages
|
||
|
|
simply don't have to mention it and if so why is it taking me so long to find the answer?
|
||
|
|
Is it something, you know, am I stupid? Am I doing something wrong? And the question was
|
||
|
|
how do I tell the cross compiler when I'm building code on my Linux machine to run on my Raspberry Pi
|
||
|
|
where to look for the libraries which it will need to include in the software. For example,
|
||
|
|
if I'm running it, if I'm compiling something like I've written and it needs, for example,
|
||
|
|
Pthreads, you know, Pthreads is a very common library. I can't link in the Pthreads library that
|
||
|
|
I'll find under user lib x8664 GNU because that's x8664 code so that won't work. So where do I put
|
||
|
|
the library, the ARM version of the library so that it will be found by my cross compiler and the
|
||
|
|
answer is something called Sysroot, S-Y-S-R-W-T. Every GNU tool, certainly GCC and LD,
|
||
|
|
has internally set a Sysroot and what this is is a value which will be a string path
|
||
|
|
which will be pre-pended to any search paths for libraries. Now if you do on your Linux machine
|
||
|
|
just type GCC, space, dash, print, dash, Sysroot, you'll probably get back either as just a slash
|
||
|
|
or an empty string because there is no, you know, Sysroot is root on the native platform.
|
||
|
|
But if you have a cross compiler tool chain built then the Sysroot will be somewhere deep within
|
||
|
|
where you've installed the cross compiler tool chain and this is something which
|
||
|
|
actually caused me a problem when I first built a tool chain because I built it in a directory
|
||
|
|
under my home directory and then I moved it because I like these things tool chains,
|
||
|
|
kernel source etc to be under slash OPT. Now when you generate a tool chain the Sysroot gets
|
||
|
|
hard coded into GCC and LD and other tools and if you move the tool chain it will then be wrong.
|
||
|
|
There is a switch dash, dash, Sysroot equals blah, blah, blah which will allow you to
|
||
|
|
set the Sysroot but you don't want to have to do that each time. You certainly don't want to have
|
||
|
|
to do that if you're doing standard builds, you know, dot slash configure, make, make, install,
|
||
|
|
etc. So it's important to when you're using cross tool ng to build your tool chain to actually
|
||
|
|
build it and install it where it's going to live for the rest of its life which in my case
|
||
|
|
was slash OPT slash tool chains slash ARMV7 for the ARM Cortex A7 tool chain.
|
||
|
|
A little bit about sort of doing this inside the chaotic order but a bit little bit about
|
||
|
|
compiling the kernel for a Raspberry Pi. This will give you a good demonstration of why you might want
|
||
|
|
to cross compile. When I first started fiddling about with Raspberry Pi's I compiled a kernel
|
||
|
|
on a Pi, an original 512 megabyte Model B Pi and it took 15 hours.
|
||
|
|
So I thought I don't want to do that again. So then I cross compiled originally using the
|
||
|
|
Raspberry Pi Foundation cross compiler tool chain and on my quad core machine which is 1.4 gigahertz
|
||
|
|
clock speed which is not mega fast and it's got 8 gigs around. The kernel compiled took 15
|
||
|
|
minutes so from 15 hours to 15 minutes. I could do 60 kernel compiles in a second time.
|
||
|
|
It's ridiculous. That's a very extreme example but you wouldn't want to spend your life
|
||
|
|
compiling a kernel on such a slow machine as a Raspberry Pi when with a little bit of effort
|
||
|
|
and help from a cross compiler tool chain you can do it much much more quickly.
|
||
|
|
There is another type of cross compiling activity which I will describe here for the sake of
|
||
|
|
completeness. I've not had to do this and I might have a go at doing it just for the experience but
|
||
|
|
this is called a Canadian build cross compile and what it is and you'll have to be patient
|
||
|
|
and think carefully here because it's quite complicated and straightforward cross compile.
|
||
|
|
Now suppose you wanted a cross compiler which would run on windows to create and to compile
|
||
|
|
and link code to run on a Raspberry Pi but you're going to create and build that tool chain,
|
||
|
|
that cross compiler tool chain on a Linux x8664. So there's three things involved.
|
||
|
|
Linux x8664 to make the tool chain which will run on windows which will compile and link code
|
||
|
|
to run on another platform like a Raspberry Pi. Three things this is called a Canadian build and the
|
||
|
|
reason it's called a Canadian build apparently is quite interesting is because at the time that that
|
||
|
|
name was coined the political landscape in Canada was dominated by three political parties so
|
||
|
|
some clever person termed it as a Canadian build. Now as I said I've never had to do that. I can't
|
||
|
|
think why I might have to do that although I might have a go at doing it with cross tool entry just
|
||
|
|
for the sake of finding out how to do it. It might be quite good fun. On the other hand it might be
|
||
|
|
a total brain aching experience. A few comments about the show notes. I've created a HTML version
|
||
|
|
of the show notes because they're 12 kilobytes, 12 kilobytes of show notes. Pretty comprehensive,
|
||
|
|
tells you all about why I've been doing this stuff, about how to install cross tool ng on Debian,
|
||
|
|
about how I configure where the cross tool ng tool will live and where the tool chains will live
|
||
|
|
and gives you details about why I've been doing this and there's a bunch of links and there's links to
|
||
|
|
clatus kernel compile show which was pretty good. Links to CTNG, cross tool ng, vagrant, virtual box,
|
||
|
|
arch Linux, ARM, Raspberry Pi website etc. So loads of links, loads of stuff.
|
||
|
|
There's also a dot tar dot gz file which contains the two dot config files for ARM V6 and ARM V7
|
||
|
|
which I grabbed from arch Linux ARM website and tinkered with to install the tool chain where I wanted it
|
||
|
|
and all of that is documented in the show notes. So if you just install cross tool ng the way I did
|
||
|
|
use the configuration files I use you should be able to end up with a cross tool,
|
||
|
|
cross compiler tool chain which will work and you should be able to compile code for
|
||
|
|
ARM Cortex A6 and ARM Cortex A7 both types of Raspberry Pi.
|
||
|
|
Audio, since my last show I've cranked down the microphone gain a little bit so hopefully
|
||
|
|
my siblings are not splitting your head wide open every time I say a word that begins with S.
|
||
|
|
I listen back to the recording so far and it sounds much better. I'm going to do a part two to
|
||
|
|
this and that will be setting up for an actual Raspberry Pi kernel compile using the cross
|
||
|
|
compiler tool chain that we built which I built which gave rise to this show. So that will be in a
|
||
|
|
while building the Raspberry Pi kernel on an arch Linux desktop, not an arch Linux, an X86, 64 desktop
|
||
|
|
machine, cross compiling the kernel run on Raspberry Pi. So there we go and in the next few days I
|
||
|
|
will possibly get around to doing that Raspberry Pi to first impressions show maybe.
|
||
|
|
You've been listening to Hecker Public Radio at Hecker Public Radio.
|
||
|
|
We are a community podcast network that releases shows every weekday Monday through Friday.
|
||
|
|
Today's show, like all our shows, was contributed by an HPR listener like yourself.
|
||
|
|
If you ever thought of recording a podcast then click on our contribute link to find out how
|
||
|
|
easy it really is. Hecker Public Radio was founded by the Digital Dove Pound and the
|
||
|
|
Infonomicon Computer Club and is part of the binary revolution at binrev.com. If you have
|
||
|
|
comments on today's show please email the host directly leave a comment on the website or record
|
||
|
|
a follow-up episode yourself. Unless otherwise status, today's show is released on the creative
|
||
|
|
comments, attribution, share a like, 3.0 license.
|