Notes on cross-linking applications
[akaros.git] / Documentation / howtos / link-btw-akaros-and-linux.txt
1 Barret Rhoden
2 2013-03-28
3
4 It's possible to take platform independent programs compiled for Akaros or
5 Linux and link them to run on the other OS, within limits.
6
7 The basic way to do this is to simply compile them into .o files, and then
8 link them, like so (for ros-compiled, linux-linked):
9
10 $ i686-ros-gcc -c file1.c -o file1.o (plus flags)
11 $ i686-ros-gcc -c file2.c -o file2.o (plus flags)
12 $ gcc file1.o file2.o -o program
13
14 For linux-compiled, Akaros-linked
15 $ g++ -c file1.cc -o file1.o (plus flags)
16 $ g++ -c file2.cc -o file2.o (plus flags)
17 $ i686-ros-g++ file1.o file2.o -o program
18
19 There are a number of limitations.  Obviously your program needs to be
20 platform independent, regardless of ifdefs.  You can't call syscalls directly
21 or anything, even if those are ifdef _MY_OS_, since they will actually compile
22 for the wrong target.  The code can only interface with libraries.
23
24 Another important limitation is that our libraries (like pthreads) may have
25 the same API as on Linux, but we don't have the same ABI.  For example, the
26 size of a pthread_attr_t on 32 bit linux is 36 bytes.  On Akaros, it is 8
27 bytes (for now!).  In this case, if you compile for Akaros, the compiler only
28 reserves 8 bytes for the attr, but the Linux pthread libraries will expect to
29 be able to write 36 bytes.  Unless your program pads these items, you'll
30 clobber important memory.
31
32 A temporary hack to make one compiler have the correct sizes is to change the
33 header file so the objects your program uses are the 'right' size.  Compile,
34 then change the header back.
35
36 As of the time of this writing, on 32 bit systems:
37 /* On linux:
38  * sizeof pth attr:    36
39  * sizeof pth t:       4
40  * sizeof pth mutex:   24
41  * sizeof pth barrier: 20
42  *
43  * On Akaros:
44  * sizeof pth attr:    8
45  * sizeof pth t:       4
46  * sizeof pth mutex:   8
47  * sizeof pth barrier: 28 */
48
49 Additionally, C++ streams don't seem to work.  There's some sort of segfault
50 in the C++ libraries, probably related to ABI mismatches and memory
51 clobbering.  You could just rewrite your application to not use iostreams, or
52 you could poke around in the gcc stage2 build and see what the problem is.  At
53 least, if you're running on Linux, you have gdb to help you debug!